From ab69f97cfa995ece96935590e28cb79d9e464e11 Mon Sep 17 00:00:00 2001 From: Quintine <15965533+Quintine@users.noreply.github.com> Date: Sun, 25 Oct 2026 21:36:05 +1100 Subject: [PATCH] Connect revived force arrivals to Bene Gesserit responses --- components/game-table.tsx | 6 +- components/homeworld-revival-deployment.tsx | 7 + docs/CURRENT_STATUS.md | 29 +++ docs/HOMEWORLD_REVIVAL_DEPLOYMENT_RULES.md | 84 +++++++ docs/HOMEWORLD_REVIVAL_DEPLOYMENT_RUNTIME.md | 11 + docs/IMPLEMENTATION_STATUS.md | 51 ++++ docs/RULE_DECISIONS.md | 3 +- game/advisor-automatic-flip.ts | 9 +- game/ambassador-phase.ts | 2 +- game/engine.ts | 66 +++-- game/homeworld-arrival.ts | 101 ++++++-- game/homeworld-revival-destinations.ts | 20 +- game/karama-movement-cancellation.ts | 24 ++ game/reference.ts | 1 + game/spiritual-advisor.ts | 37 ++- tests/advisor-automatic-flip-quote.test.ts | 2 +- tests/fixture-revival-arrival-reactions.ts | 201 +++++++++++++++ ...omeworld-revival-ambassador-engine.test.ts | 127 ++++++---- tests/homeworld-revival-destinations.test.ts | 14 +- ...omeworld-revival-spiritual-arrival.test.ts | 237 ++++++++++++++++++ .../revival-arrival-reactions-runtime.test.ts | 179 +++++++++++++ tests/spiritual-advisor-revival.test.ts | 179 +++++++++++++ 22 files changed, 1269 insertions(+), 121 deletions(-) create mode 100644 tests/fixture-revival-arrival-reactions.ts create mode 100644 tests/homeworld-revival-spiritual-arrival.test.ts create mode 100644 tests/revival-arrival-reactions-runtime.test.ts create mode 100644 tests/spiritual-advisor-revival.test.ts diff --git a/components/game-table.tsx b/components/game-table.tsx index 31ade69b..4b14f562 100644 --- a/components/game-table.tsx +++ b/components/game-table.tsx @@ -2544,6 +2544,7 @@ export function GameTable({ {g.players.find((player) => player.id === g.response?.owner)?.name} declared {g.response.amount ?? 1} free {(g.response.amount ?? 1) === 1 ? 'force' : 'forces'} to {territory(splitLocation(g.response.location ?? 'polar_sink:0').territory).name}. {' '}Allow the arrival or cancel Spiritual Advisors. Canceling prevents the whole declared group. {g.response.spiritualAdvisorSource&&<> Matching or an alone conversion may follow separately. The other faction’s shipment is already committed.} + {g.response.spiritualAdvisorSource?.revivalEvent&&<> The revived group stays placed; this response does not cancel its revival.}

)} {g.response.kind === 'moritaniRetention' && @@ -3755,7 +3756,10 @@ export function GameTable({ ) : g.decision.kind === 'advisor' ? ( <>

- Another faction has shipped from off-planet. You may send + {g.decision.revivalEvent + ? 'Tleilaxu’s free-revived group has arrived from off-planet. You may send' + : 'Another faction has shipped from off-planet. You may send'} + {' '} up to {g.homeworldMobility?.advisorSinkMaximum ?? 1} reserve forces to the Polar Sink for free.

{g.advanced&&

Retained fighters outside the Polar Sink require Polar Sink or decline, unless Intrusion already changed them to advisors. Polar matching and an alone conversion have separate responses.

} diff --git a/components/homeworld-revival-deployment.tsx b/components/homeworld-revival-deployment.tsx index c68e5678..0e60bd7a 100644 --- a/components/homeworld-revival-deployment.tsx +++ b/components/homeworld-revival-deployment.tsx @@ -54,6 +54,13 @@ function DeploymentChoice({ game, act, busy }: Props) {

{offer.normal} ordinary · {offer.elite} starred · {amount} total

+ {game.players.some(player => player.faction === 'beneGesserit') &&

+ {offer.kind === 'tleilax' + ? 'Arrakis placement is followed by the normal Bene Gesserit free-force choice.' + : 'In Advanced play, entry into Bene Gesserit fighters permits Intrusion.'} + {' '}The revived group is already placed before those responses. Preventing + a Bene Gesserit power does not undo your revival or use your ordinary shipment. +

}