Enable Residual Poison against Advanced Harkonnen captives
Include available ordinary captives, captured foreign gholas and shared Duke in the original random pool. Apply one public ordinary death without execution income, preserve foreign revival custody and other concealed captives, and end Duke tenure. Find the signed Semuta victim by canonical physical identity after captivity ends. Explain the provisional normal-Tanks source composition in controls and developer reference. Validation:9 files74/74, types/lint/build and two actual-rule/rendered-table programmes plus four finite policy continuations pass on one frozen source. Details and exact unchanged-source proof are recorded in the canonical Residual Poison contract. Genuine public Advanced cache purchase, funded deployments, native victory/capture/keep and second battle cover native and captive deaths plus finite completion. Four minimal profiles use legal offered card/readiness actions. Separate controlled cases cover ghola/Duke, last-native return and Semuta claim; no strategic AI refinement. This interpretation remains provisional. Wider interactions, complete modes, final assurance and browser/deployed acceptance remain open. No saved-room/database/reset/restart/deployment operation.
This commit is contained in:
1 parent
6c83148ead
commit
377e9c5160
13 files changed
+619
-28
No files matched your search
+7
-17
@@ -6565,9 +6565,11 @@ function treacheryDiscardIntegrity(g: Game) {
|
||||
saphoAggressorIntegrity(g);
|
||||
} else if (continuation?.kind === 'residualPoisonDiscard') {
|
||||
const c = continuation, entry = batch.entries[0], battle = g.battle;
|
||||
const victim = g.players.some(p => p.id === c.target)
|
||||
? controlledLeaders(g, getPlayer(g, c.target)).find(l => l.id === c.victim)
|
||||
: null;
|
||||
// Death has already ended capture/temporary Duke control. Find the physical
|
||||
// disc at its home, rather than requiring its former controller to own it.
|
||||
const victims = [...g.players.flatMap(p => p.leaders),
|
||||
...(g.dukeVidal ? [g.dukeVidal.leader] : [])].filter(l => l.id === c.victim);
|
||||
const victim = victims.length === 1 ? victims[0] : null;
|
||||
requireRule(
|
||||
g.phase === 6 && battle && battle.event === c.battleEvent &&
|
||||
!battle.revealed && !Object.keys(battle.plans).length &&
|
||||
@@ -21479,22 +21481,8 @@ function validateResidualPoison(
|
||||
);
|
||||
const reserved = transferCardBlock(g, p, card);
|
||||
requireRule(!reserved, reserved ?? 'The card is committed.');
|
||||
// Guard on public configuration, never on whether a particular hidden captive exists.
|
||||
requireRule(
|
||||
!(g.advanced && byFaction(g, 'harkonnen')),
|
||||
'Residual Poison with advanced Harkonnen capture awaits the secret-captive disclosure ruling.',
|
||||
);
|
||||
const target = getPlayer(g, targetId),
|
||||
controlled = controlledLeaders(g, target);
|
||||
requireRule(
|
||||
!controlled.some(
|
||||
(l) =>
|
||||
l.concealed ||
|
||||
(l.capturedBy && l.gholaBy) ||
|
||||
(l.id === DUKE_VIDAL_ID && (l.capturedBy || l.gholaBy)),
|
||||
),
|
||||
'This exceptional leader custody is not yet supported for Residual Poison.',
|
||||
);
|
||||
const candidates = noFieldRule(() =>
|
||||
residualPoisonCandidates(controlled, b.territory),
|
||||
);
|
||||
@@ -21533,6 +21521,8 @@ function playResidualPoison(
|
||||
Object.assign(victim, dead);
|
||||
delete victim.usedAt;
|
||||
if (victim.capturedBy) {
|
||||
// Residual Poison is an ordinary public death, not Harkonnen's separate
|
||||
// face-down execution for two spice. Only the selected captive is revealed.
|
||||
delete victim.capturedBy;
|
||||
delete victim.concealed;
|
||||
}
|
||||
|
||||
+8
-4
@@ -860,7 +860,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
'An available leader must be alive and eligible for this battle territory. A leader used in this same territory remains eligible; one used elsewhere does not. Cheap Hero cards are not leader discs. The card is discarded once, the victim enters the Tanks, and no spice bounty or battle victory is awarded. Force counts and ordinary battle preparation continue.',
|
||||
'In games with Richese seated, both combatants finish a shared preparation opportunity before submitting plans or a leader-valued Prescience answer. This application timing procedure appears independently of both hands and does not reveal who holds a preparation card. Active responses, decisions and Truthtrance resolve first. A completed readiness step does not itself choose a leader.',
|
||||
'A foreign ghola retains its recorded revival custody when killed. Duke Vidal is the same physical disc with its death history retained, and his temporary control ends. An involuntary death releases impossible battle promises and can require a previously answered non-leader Prescience question to be answered again; it never redraws the victim to preserve an answer.',
|
||||
'The handling of a still-secret Harkonnen captive after this death is unresolved. Advanced games with Harkonnen seated therefore guard this card based on that public configuration, independently of any hidden captive. This is a development limitation, not a printed ban. Legacy battles without a saved preparation event are not retroactively reopened.',
|
||||
'Available Harkonnen captives are included. If selected, the captive suffers one public death and captivity ends; unselected living captives stay concealed. This ordinary Tanks interpretation is provisional, distinct from face-down execution for two spice. Foreign Ghola revival custody remains; the shared Duke returns dead and set aside. Legacy battles without a saved preparation event are not retroactively reopened.',
|
||||
'Saved battle events bind readiness and card actions. Reconnect preserves the opportunity and a committed death. Competing actions use room versions: a stale request cannot repeat the discard or death and must refresh before retrying. All four AI profiles use only their entitled card availability and opponent information.',
|
||||
],
|
||||
related: [
|
||||
@@ -874,7 +874,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
area: 'Implementation',
|
||||
status: 'Partial',
|
||||
detail:
|
||||
'Pre-leader timing, uniform eligible-disc selection, automatic death, single discard, custody, promise reconciliation and exact event validation are integrated. Advanced Harkonnen disclosure and full expansion combinations remain unresolved.',
|
||||
'Pre-leader timing, uniform eligible-disc selection, automatic death, single discard, custody, promise reconciliation and exact event validation are integrated. Advanced Harkonnen now uses provisional ordinary public captive death; wider combinations remain incomplete.',
|
||||
},
|
||||
{
|
||||
area: 'Player controls',
|
||||
@@ -892,18 +892,22 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
area: 'Documentation',
|
||||
status: 'Partial',
|
||||
detail:
|
||||
'Explains printed timing and disposal, the shared application opportunity, casualty custody and explicit unresolved disclosure.',
|
||||
'Explains printed timing/disposal, shared application opportunity, casualty custody and the provisional public captive-death composition.',
|
||||
},
|
||||
{
|
||||
area: 'Verification',
|
||||
status: 'Partial',
|
||||
detail:
|
||||
'Pure selection, twelve-holder engine, independent review, four-profile AI and persisted concurrent-action tests cover supported boundaries. Full expansion games remain unverified.',
|
||||
'Current 74-case affected batch, types/lint/build and two real Advanced cache2/capture/battle programmes cover native/captive death, with four finite legal-policy continuations. Controlled Ghola/Duke/last-native/Semuta probes are separate. Historical persisted evidence does not certify final assurance or full expansion games.',
|
||||
evidence: [
|
||||
'tests/residual-poison.test.ts',
|
||||
'tests/residual-poison-engine.test.ts',
|
||||
'tests/residual-poison-engine-review.test.ts',
|
||||
'tests/residual-poison-bots.test.ts',
|
||||
'tests/residual-poison-custody.test.ts',
|
||||
'tests/residual-poison-capture-engine.test.ts',
|
||||
'tests/fixture-residual-poison-capture.ts',
|
||||
'docs/RICHESE_RESIDUAL_POISON_ENGINE_AUDIT.md',
|
||||
'tests/residual-poison-recovery.test.ts',
|
||||
],
|
||||
},
|
||||
|
||||
Reference in new issue
Block a user