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' &&
|
||||
|
||||
Reference in new issue
Block a user