Keep Atreides special inspection available until plan reveal

Allow native Advanced use after declining the first offer, including a sealed
target. Reuse projected card/target permission in persistent controls and
minimal bots; retain sealed plans and finish target-last public reveal once.

Source: authorized supplied physical27 F. Ordinary preparation priority and
target-first ordering remain provisional; no new reading acknowledgement.

Verified: 11 affected offline files126/126, types/lint, production build, five
actual control/gameplay/GameTable SSR journeys and eight legal profile paths.
No saved-room, D1, reset, restart or deployment operation.
This commit is contained in:
Quintine committed 2026-10-24 18:49:22 +11:00
1 parent 660b0a0c25
commit 61828150b9
15 files changed
+917 -70

No files matched your search

+18 -2
View File
@@ -222,7 +222,22 @@ void test('Atreides may inspect an unrelated battle without giving its ally the
g = applyAction(g, 'e', targetPlan);
assert.equal(g.battle?.revealed, true);
});
void test('declining preserves the power and card, offers independently of hidden cards, and cannot be reopened mid-battle', () => {
void test('unrelated Atreides may decline then inspect an already sealed combatant without granting its ally access', () => {
let g = offer(fixture(true));
g.players[0].ally = 'b';
g.players[3].ally = 'a';
g = applyAction(g, 'a', { type: 'decision', decline: true });
g = applyAction(g, 'g', { type: 'battlePlan', dial: 0, support: 0, leader: 'guild-0' });
const sealed = structuredClone(g.battle!.plans.g);
g = inspect(g, 'g');
assert.deepEqual(viewGame(g, 'a').battle?.fullPlanInsight?.plan, sealed);
for (const actor of ['b', 'e', 'g'])
assert.equal(viewGame(g, actor).battle?.fullPlanInsight, null);
assert.deepEqual(g.battle?.plans.g, sealed);
g = applyAction(g, 'e', targetPlan);
assert.equal(g.battle?.revealed, true);
});
void test('declining preserves the power and card and allows later use before reveal without reopening the offer', () => {
const before = fixture();
const offered = offer(before);
before.players[0].hand = [];
@@ -233,7 +248,8 @@ void test('declining preserves the power and card, offers independently of hidde
});
assert.equal(declined.players[0].specialKaramaUsed, undefined);
assert.ok(declined.players[0].hand.some((c) => c.id === karama.id));
assert.throws(() => inspect(declined), /preparation/);
assert.equal(declined.decision, null);
assert.equal(inspect(declined).battle?.fullPlan?.target, 'e');
assert.ok(applyAction(declined, 'a', ownPlan).battle?.plans.a);
});
void test('ordinary prescience cancellation does not suppress special inspection', () => {