Allow Semuta recovery before native Ghola income

Reuse the exact ordinary-discard income qualification for admission and
parent validation. Preserve physical revival and native conditional income
through claim, decline, full-hand exchange and original allow/cancel.
This commit is contained in:
Quintine committed 2026-10-24 16:48:20 +11:00
1 parent 19e554666e
commit 047011e243
11 files changed
+524 -19

No files matched your search

+7 -12
View File
@@ -1,3 +1,4 @@
import { ordinaryDiscardIncomeMatches } from './ordinary-discard-income';
import { gholaForcePreparations } from './ghola-force-preparation';
import { earlyAuctionFunding } from './early-auction-funding';
import { recordMovementDiscardKnowledge, knownMovementDiscards, recordMovementBoxKnowledge, recordMovementClaimKnowledge, clearMovementDiscardKnowledge, type MovementDiscardKnowledge } from './movement-discard-knowledge';
@@ -6440,16 +6441,8 @@ function treacheryDiscardIntegrity(g: Game) {
!c.resume.decision && !c.resume.pendingKarama && !c.resume.phaseOpening,
'The ordinary card has an unexpected suspended decision.',
);
const income = c.resume.response,
tleilaxu = byFaction(g, 'tleilaxu');
requireRule(
c.effect === 'ghola' && tleilaxu
? income?.kind === 'revivalIncome' &&
income.owner === tleilaxu.id &&
income.recipient === c.player &&
income.amount === 1 &&
income.passed.length === 0
: !income,
ordinaryDiscardIncomeMatches(g, c),
'The consumed card no longer matches its pending revival income.',
);
requireRule(
@@ -7779,9 +7772,11 @@ function semutaOfferSupported(
continuation.kind === 'karamaEmperorShareDiscard' ||
continuation.kind === 'karamaIncomeDiscard' ||
continuation.kind === 'karamaShipmentDiscard' ||
((continuation.kind === 'ornithopterDiscard' && continuation.source === 'cunning'
? continuation.resume.response?.kind === 'nexusGuildCunning'
: !continuation.resume.response) && !continuation.resume.decision &&
((continuation.kind === 'ordinaryCardDiscard'
? ordinaryDiscardIncomeMatches(g, continuation)
: continuation.kind === 'ornithopterDiscard' && continuation.source === 'cunning'
? continuation.resume.response?.kind === 'nexusGuildCunning'
: !continuation.resume.response) && !continuation.resume.decision &&
!continuation.resume.pendingKarama &&
(continuation.kind === 'amalDiscard'
? continuation.resume.phaseOpening?.passed.length === 0