Combat
Every fight is a WebSocket match against the server, including the ones against the house. There is no offline mode and no client-side resolution: the browser sends the name of an action and receives the consequence.
A round
A round is two turns, yours and the opponent's. You start each turn with 5 action points, 5 cards in hand, and 15 seconds.
Unspent action points do not carry over. Cards that grant AP fill a bank spent at the start of the next round and then cleared, capped at 9. See Cards and action points for why it works that way.
Running out of time does not lose the match. The server force-ends the turn, which costs you that turn and nothing more. Going dark in a versus match is different: see PvP.
A match lasts at most 16 rounds. If nobody has fallen by then, the fight is decided on what is left.
Three actions
There are only three things a client may send.
| Action | Meaning |
|---|---|
PLAY | play the card at this index of your hand |
END | end your turn |
INTENT | declare the order you intend to play in |
Everything else (damage, status, draws, the opponent's whole turn) is a consequence the server computes and sends back.
Intent
Declaring an intent is a visible commitment. Once declared, the server accepts plays only in the order you named. The house declares too, and its intent is broadcast before it resolves, so you see what is coming while it still matters.
Only the kinds cross the wire: attack, defend, status. Which card is coming stays hidden. The aircraft is visible in a dogfight; the hand behind it is not.
What the opponent can see
The server redacts per seat. You receive your own hand as card ids and the opponent's as a count. There is no view in which one player's connection carries the other's cards, and an automated test watches every frame of a full match looking for a leak.
The second player
Moving second is a disadvantage the rules pay for directly: the second seat draws one extra card, and damage against it is halved for the first round.
Statuses
Bleed, Shield, Stunned, Vulnerable, Weak, Regen, Evade, Counter and Amplify. Each carries a potency, a duration and a stack count, and the strip under each aircraft shows all three.
Stun immunity exists for a reason. A stun costs a whole turn, and two stun cards in one deck could keep an opponent from ever acting. On screen that read as the enemy simply never taking a turn, so a seat that was stunned last turn cannot be stunned again immediately.
The proof
When a match ends, the server replays its own action log from the seed and hashes the result. Clients receive a verified flag, not the proof itself, because shipping it would mean shipping both loadouts, and a replay reconstructs the opponent's hidden deck. The proof is disclosed only to a caller holding the internal secret.