Compose the Sneak Attack arrival with the Bene Gesserit reactions
A positive Moritani Sneak Attack now resolves its committed Terror entry first — placing the reserve forces and accruing the Heighliners token — and then offers the Bene Gesserit reactions under the same adopted shipment classification used for ordinary off-planet arrivals: an eligible Advanced Intrusion choice when Bene Gesserit fighters stand in the destination, carrying the free spiritual-advisor follow-up, and the advisor shipment itself when the intrusion is declined, with its existing territory, storm and occupancy validation. A zero-force resolution still opens none of them, and the last "Sneak Attack combined with Bene Gesserit arrival reactions" guard is removed rather than left as a duplicate check. This selected order is an implementation interpretation, not a located ruling; the source note, the pending-interpretation registry, the component inventory, the player reference and the status log record it. Evidence: tests/moritani-force-leader.test.ts asserts the post-entry Intrusion offer and the full decline -> advisor decision -> placement chain with nothing left pending; the former gated-interaction pin was replaced by the composed behaviour. Offline suite 7,798/7,798 with typecheck and lint clean, plus the reference guide tests 10/10. No game, seat, saved state or deployment changes.
This commit is contained in:
1 parent
972b781d0a
commit
3bebc68cd5
8 files changed
+96
-26
No files matched your search
+14
-8
@@ -16943,14 +16943,6 @@ function sneakAttackOptions(
|
||||
if (!(error instanceof RuleError)) throw error;
|
||||
blocked = error.message;
|
||||
}
|
||||
const bg = byFaction(g, 'beneGesserit');
|
||||
if (
|
||||
!blocked &&
|
||||
bg &&
|
||||
(bg.reserves > 0 || (g.advanced && fighterCount(bg, entry.territory) > 0))
|
||||
)
|
||||
blocked =
|
||||
'Sneak Attack combined with Bene Gesserit arrival reactions is still being implemented.';
|
||||
return { maximum, blocked };
|
||||
}
|
||||
function terrorAllianceBlocked(
|
||||
@@ -17199,6 +17191,20 @@ function decideTerror(g: Game, p: Player, action: Action) {
|
||||
);
|
||||
} else log(g, `${p.name} sent no forces through Sneak Attack.`);
|
||||
finishTerrorEntry(g);
|
||||
// The Terror effect is the arrival itself, so the adopted order resolves
|
||||
// the committed entry first and then offers the Bene Gesserit reactions
|
||||
// the same off-planet reserve entry already uses for ordinary shipments.
|
||||
if (amount > 0) {
|
||||
const bg = byFaction(g, 'beneGesserit');
|
||||
const followup =
|
||||
bg &&
|
||||
bg.id !== p.id &&
|
||||
spiritualAdvisorMaximum(g, bg.id) > 0
|
||||
? { shipment: p.id, destination: location(entry.territory, entry.sector) }
|
||||
: undefined;
|
||||
if (!intrusion(g, p, entry.territory, followup ? { followup } : undefined) && followup)
|
||||
g.decision = { kind: 'advisor', player: bg!.id, ...followup };
|
||||
}
|
||||
} else if (entry.stage === 'robbery') {
|
||||
requireRule(
|
||||
token.kind === 'robbery' &&
|
||||
|
||||
+1
-1
@@ -2892,7 +2892,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
'Robbery: choose between taking half the entrant’s spice, rounded up, and drawing the top Treachery Card. If the draw exceeds your hand limit, choose a card to discard afterward; a full hand does not remove the draw option.',
|
||||
'Sabotage: randomly draw and discard a Treachery Card from the entrant if possible. Then you may give that player a card of your choice from your own hand. Giving a card is optional.',
|
||||
'Sneak Attack: send up to five of your reserve forces into the triggered territory at no cost, respecting storm and occupancy restrictions. This particular entry is allowed even when Atomics Aftermath is present.',
|
||||
'Before revealing Sneak Attack, inspect its private available maximum and any reason positive entry is blocked. You may keep it hidden. Revealing spends the token even if you then choose Send no forces. For a supported entry, select zero through the displayed maximum; forces enter the arrival’s territory and sector without consuming your ordinary shipment or movement turn. Zero remains available when positive entry is blocked. Aftermath’s printed exception allows this reserve entry even after Atomics resolves. A positive entry during Shipment and Movement is treated as an off-planet shipment for the Heighliners token, which accrues its once-per-turn income for its owner.',
|
||||
'Before revealing Sneak Attack, inspect its private available maximum and any reason positive entry is blocked. You may keep it hidden. Revealing spends the token even if you then choose Send no forces. For a supported entry, select zero through the displayed maximum; forces enter the arrival’s territory and sector without consuming your ordinary shipment or movement turn. Zero remains available when positive entry is blocked. Aftermath’s printed exception allows this reserve entry even after Atomics resolves. A positive entry during Shipment and Movement is treated as an off-planet shipment for the Heighliners token, which accrues its once-per-turn income for its owner, and the committed entry finishes before Bene Gesserit may answer it with an Intrusion choice or a free spiritual-advisor shipment.',
|
||||
'The random Assassination token is separate from the advanced Assassinate Leaders advantage. Neither ability supplies the other’s selection or timing rules.',
|
||||
],
|
||||
related: [
|
||||
|
||||
Reference in new issue
Block a user