Preserve Caladan Sneak Attack child arrivals
This commit is contained in:
1 parent
2e4aba9630
commit
f0ebdf9c87
16 files changed
+1065
-44
No files matched your search
+17
-3
@@ -1,5 +1,6 @@
|
||||
import type { Game } from './engine';
|
||||
import { caladanOwnsTerrorEntry } from './caladan-arrival';
|
||||
import { caladanOwnsTerrorEntry, validateCaladanChildArrival, caladanEntryParentTuple,
|
||||
validCaladanEntryParent, type CaladanEntryParent } from './caladan-arrival';
|
||||
import { currentHomeworldRevivalArrival } from './homeworld-revival-return';
|
||||
import { validateRevivalArrivalSource, revivalOwnsTerrorEntry, validRevivalEntryParent,
|
||||
revivalEntryParentTuple, type RevivalEntryParent } from './revival-terror-entry';
|
||||
@@ -14,6 +15,10 @@ function sameRevivalSource(left: RevivalEntryParent | undefined, right: RevivalE
|
||||
return validRevivalEntryParent(left) && validRevivalEntryParent(right) &&
|
||||
JSON.stringify(revivalEntryParentTuple(left)) === JSON.stringify(revivalEntryParentTuple(right));
|
||||
}
|
||||
function sameCaladanSource(left: CaladanEntryParent | undefined, right: CaladanEntryParent | undefined) {
|
||||
return validCaladanEntryParent(left) && validCaladanEntryParent(right) &&
|
||||
JSON.stringify(caladanEntryParentTuple(left)) === JSON.stringify(caladanEntryParentTuple(right));
|
||||
}
|
||||
|
||||
/** The immutable trigger, not later owner choices or child stages. */
|
||||
export function arrivalOverlapSignature(record: Overlap): string {
|
||||
@@ -22,7 +27,8 @@ export function arrivalOverlapSignature(record: Overlap): string {
|
||||
record.resume, record.ecaz, record.moritani, record.first,
|
||||
record.ambassadorToken, record.terrorTokens,
|
||||
...(record.revivalArrival === undefined ? [] : [revivalEntryParentTuple(record.revivalArrival)]),
|
||||
...(record.victoryEvent === undefined ? [] : [['caladanVictory', record.victoryEvent]])]);
|
||||
...(record.victoryEvent === undefined ? [] : [['caladanVictory', record.victoryEvent]]),
|
||||
...(record.caladanArrival === undefined ? [] : [caladanEntryParentTuple(record.caladanArrival)])]);
|
||||
}
|
||||
|
||||
/** A fresh discard belongs to the active owner of an ordinary or bound revived entry.
|
||||
@@ -33,7 +39,10 @@ function ordinaryDiscardOverlap(g: DiscardContext, owner: Overlap['first']): Ove
|
||||
overlap.turn !== g.turn || overlap.phase !== g.phase ||
|
||||
overlap.resume !== 'none' ||
|
||||
!['first', 'second'].includes(overlap.stage)) return null;
|
||||
if (overlap.revivalArrival !== undefined) {
|
||||
if (overlap.caladanArrival !== undefined) {
|
||||
try { validateCaladanChildArrival(g,overlap.caladanArrival,overlap); }
|
||||
catch { return null; }
|
||||
} else if (overlap.revivalArrival !== undefined) {
|
||||
try {
|
||||
validateRevivalArrivalSource(g, overlap.revivalArrival, overlap);
|
||||
} catch { return null; }
|
||||
@@ -54,12 +63,16 @@ function ordinaryDiscardOverlap(g: DiscardContext, owner: Overlap['first']): Ove
|
||||
export function overlapOwnsAmbassadorDiscard(g: DiscardContext, entry: AmbassadorEntry): boolean {
|
||||
const overlap = ordinaryDiscardOverlap({ ...g, pendingAmbassador: entry }, 'ambassador');
|
||||
const arrival = currentHomeworldRevivalArrival(g.homeworldRevivalReturn)?.ambassadors?.find(record => record.event === entry.event);
|
||||
const caladan = g.homeworldVictoryReinforcement?.ambassadors?.find(record => record.event === entry.event);
|
||||
return !!overlap && entry.stage === 'cards' && entry.resume === 'none' &&
|
||||
entry.event === overlap.ambassadorEvent && entry.owner === overlap.ecaz &&
|
||||
entry.token === overlap.ambassadorToken && entry.entrant === overlap.entrant &&
|
||||
entry.territory === overlap.territory && entry.sector === overlap.sector &&
|
||||
entry.arrivalCause === overlap.cause && entry.turn === overlap.turn && entry.phase === overlap.phase &&
|
||||
(overlap.victoryEvent === undefined || entry.victoryEvent === overlap.victoryEvent) &&
|
||||
(overlap.caladanArrival === undefined || entry.victoryEvent === overlap.caladanArrival.event &&
|
||||
!!caladan?.terror && sameCaladanSource(overlap.caladanArrival,{event:entry.victoryEvent,
|
||||
terror:caladan.terror,...(caladan.spiritual ? {spiritual:caladan.spiritual} : {})})) &&
|
||||
(overlap.revivalArrival === undefined || entry.revivalEvent === overlap.revivalArrival.event &&
|
||||
!!arrival && sameRevivalSource(overlap.revivalArrival, { event: overlap.revivalArrival.event,
|
||||
...(arrival.spiritual === undefined ? {} : { spiritual: arrival.spiritual }),
|
||||
@@ -74,6 +87,7 @@ export function overlapOwnsTerrorDiscard(g: DiscardContext, entry: TerrorEntry,
|
||||
entry.amount === overlap.amount && entry.elite === overlap.elite &&
|
||||
entry.cause === overlap.cause && entry.turn === overlap.turn && entry.phase === overlap.phase &&
|
||||
(overlap.victoryEvent === undefined || entry.victoryEvent === overlap.victoryEvent) &&
|
||||
(overlap.caladanArrival === undefined || sameCaladanSource(overlap.caladanArrival,entry.caladanArrival)) &&
|
||||
(overlap.revivalArrival === undefined ||
|
||||
sameRevivalSource(overlap.revivalArrival, entry.revivalArrival) && revivalOwnsTerrorEntry(g, entry));
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user