diff --git a/public/games/age-of-dwarves/docs/military/COMMUNICATIONS.md b/public/games/age-of-dwarves/docs/military/COMMUNICATIONS.md index 6be3b46c..0c950f4e 100644 --- a/public/games/age-of-dwarves/docs/military/COMMUNICATIONS.md +++ b/public/games/age-of-dwarves/docs/military/COMMUNICATIONS.md @@ -72,7 +72,7 @@ These events are the AI's only asynchronous inputs. The perception filter materi ### 7. Capital-loss blackout -When a player loses their capital, all in-flight outbound envelopes are dropped, comm_tier on remaining links drops by 1, and decay timers accelerate by 50% until a new seat-of-power is named. A capital siege is not just symbolic; it deafens an entire civilization for the duration of the interregnum. +When a player loses their capital, all in-flight outbound envelopes are dropped, comm_tier on remaining links drops by 1, and decay timers accelerate by 50% until a new seat-of-power is named. **The player names a new capital on their next turn** — it is a forced choice surfaced at start-of-turn (pick any surviving city). Blackout lasts a single turn unless the player ends turn without choosing; an auto-promote fallback (highest-pop city, tie-break by lowest `city_id`) prevents AI stalls. A capital siege is not just symbolic; it deafens an entire civilization for the duration of the interregnum, but the interregnum is short by design. ### 8. Beacon-tap counter-intel diff --git a/public/games/age-of-dwarves/docs/military/COMMUNICATIONS_PHASE3.md b/public/games/age-of-dwarves/docs/military/COMMUNICATIONS_PHASE3.md index f847c69e..d921e010 100644 --- a/public/games/age-of-dwarves/docs/military/COMMUNICATIONS_PHASE3.md +++ b/public/games/age-of-dwarves/docs/military/COMMUNICATIONS_PHASE3.md @@ -34,10 +34,10 @@ pub struct BlackoutState { ### Duration and recovery -Blackout ends when the player names a new seat-of-power. Two paths: +Blackout ends when the player names a new seat-of-power. **The player names a new capital on their very next turn** — this is a forced choice surfaced at start-of-turn while the blackout is active. Two paths exist: -- **Player / AI explicit action**: a new `PlayerAction::NameSeatOfPower { city_id }` becomes legal whenever `blackout.is_some()` and the player owns at least one city. The action consumes nothing (no gold, no production); it is a one-click civics declaration. On execution it sets `player.capital_position` to the named city's hex, flips that city's `is_capital = true`, and calls `mc_comms::blackout::end_blackout`. -- **Auto-promote fallback**: if `turn >= blackout.auto_promote_at_turn` and the player still has cities, the turn processor auto-selects the highest-population surviving city (ties broken by lowest `city_id` for determinism) and runs the same `NameSeatOfPower` effect. This guards against AI stalls and surfaces a "capital auto-relocated" event in the replay log. +- **Player / AI explicit action (primary path)**: a new `PlayerAction::NameSeatOfPower { city_id }` becomes legal whenever `blackout.is_some()` and the player owns at least one city. While blackout is active, this action is **required before end-turn** for human players — the end-turn button surfaces a "you must name a new seat of power" gate. The action consumes nothing (no gold, no production); it is a one-click civics declaration. On execution it sets `player.capital_position` to the named city's hex, flips that city's `is_capital = true`, and calls `mc_comms::blackout::end_blackout`. +- **Auto-promote stall guard**: with `auto_promote_after_turns: 1` in `comms.json`, if a player ends their next turn without naming a seat-of-power (AI stall, human mis-click past the gate, headless test), the turn processor auto-selects the highest-population surviving city (ties broken by lowest `city_id` for determinism) and runs the same `NameSeatOfPower` effect. This is a safety net, not a design feature — the intended experience is "you pick on the next turn, blackout lasts one turn". `end_blackout(state, player, turn, new_capital_city_id)` clears `player.blackout = None` and emits the `CapitalBlackoutEnded` event below. Comm-tier penalty disappears at view-time; decay thresholds revert. Future `LastSeen` entries age at full duration again.