Execute gameplay turns: move via debug GPS, claim hexes, attack enemies, pick up troops, and verify state through SignalR updates
This skill drives deterministic turn execution during the Playing phase. All movement uses the debug GPS panel. All game actions go through SignalR invocations. Every action is verified through state updates before advancing.
Use this skill when the playtester needs to:
Playing phase (use landgrab-host-and-start first).data-testid="debug-gps-toggle").carriedTroopsUse these tools first during gameplay; they wrap the real UI/gameplay flow but avoid brittle map clicking:
state_game_snapshot, state_hex_snapshot, state_player_snapshotplayer_select_hex, player_claim_hex, player_attack_hex, player_pickup_troops, player_reclaim_hexmap_center_on_player, map_pan_to_hex, map_get_visible_hexes, map_select_hex_near_playerstate_wait_for, state_wait_for_event, assert_hex_state, assert_player_state, assert_sessions_in_syncevidence_checkpoint after significant actionsPlaying and the player has a valid position on the grid.Recommended first call: state_game_snapshot or state_player_snapshot for the acting session.
data-testid="debug-gps-panel").data-testid="debug-gps-toggle" is active).data-testid="debug-gps-step-north" (dq=0, dr=+1)data-testid="debug-gps-step-south" (dq=0, dr=-1)data-testid="debug-gps-step-east" (dq=+1, dr=0)data-testid="debug-gps-step-west" (dq=-1, dr=0)UpdatePlayerLocation(lat, lng) after each step.Use state_wait_for with playerHexQ / playerHexR after movement instead of assuming the step completed.
To claim an unowned tile or reinforce an owned tile:
player_claim_hex for claim or reinforce flows.state_hex_snapshot before acting.StateUpdated event confirming the tile ownership change.carriedTroops decreases by 1.To attack a hex owned by another player or alliance:
player_attack_hex, which requests a combat preview and then performs the attack through the current gameplay flow.CombatResult SignalR event: {q, r, winnerId, winnerName}.player_reclaim_hex (implemented through the current PlaceTroops flow; the old dedicated ReClaimHex hub method is no longer active).CombatResult event is received and the hex state matches the outcome.To collect troops from a tile:
PickUpTroops(q, r, count, lat, lng).StateUpdated event confirming the pickup.carriedTroops increases and the tile's troop count decreases.Recommended verification:
state_wait_for_event for CombatResult, NeutralClaimResult, or StateUpdatedassert_hex_state on the affected hexassert_sessions_in_sync across at least two sessions after each major actionAfter each action, verify that all player sessions reflect the same state:
| Direction | Method | Purpose |
|---|---|---|
| Invoke | UpdatePlayerLocation(lat, lng) | Broadcast location (sent by debug GPS) |
| Invoke | PlaceTroops(q, r, lat, lng, attackCount, claimForSelf) | Claim, reinforce, or attack |
| Invoke | PickUpTroops(q, r, count, lat, lng) | Pick up troops from tile |
| Event | StateUpdated(state) | State change broadcast |
| Event | CombatResult(result) | Combat outcome: winnerId, winnerName |
| Event | TileLost(data) | Notification that a tile was captured |
| Event | Error(message) | Action error from the hub |
"q,r" (e.g., "3,-2").gameState.grid is a Record<string, HexCell> keyed by "q,r".For a deterministic playtest with 2 players:
(1,0) via debug GPS → claims it.(-1,0) via debug GPS → claims it.(2,0) → claims it.(0,0) → claims it (if unowned) or attacks it.Adapt the sequence based on the specific test scenario requested.
CombatResult events with deterministic outcomes.combatResult, currentHexActions, and the target hex with state_game_snapshot / state_hex_snapshot before retrying.Playing.TileLost event fires unexpectedly, capture the event data and hex state as evidence.