Compose independent cards with Discovery and optional Nexus

Connect original selected-deck Discovery setup, optional Nexus/World/Skills/phase modules and physical card consumers through shared public capabilities. Retain Cunning revealed-location arrival, Sandtrout suppression, paid nested R/Harass and actual later Recruits revival. Preserve native trained-capture and unrelated-preview boundaries.

Validation: frozen 15-file118/118, types/lint/build and six finite original-action/rendered-control programmes; four minimal legal policies. External smoke corrections changed no application source. Existing persistent notices also rechecked23/23. Full combinations, assurance and deployed acceptance remain open; no saved-game, restart or deployment operation.
This commit is contained in:
Quintine committed 2026-10-18 11:48:45 +11:00
1 parent b4157aaa9b
commit 677ad7aa3c
21 files changed
+1000 -37

No files matched your search

+21 -7
View File
@@ -42,19 +42,33 @@ export function selectedIndependentNexusProfile(game: NexusCoreConfiguration): b
return game.ecazTreachery === true && game.expansions.length > 0 && nexusCoreRosterProfile(game, true);
}
/** Common consumers of the classic and selected-independent fresh Nexus core. */
export function nexusCoreProfile(game: NexusCoreConfiguration): boolean {
return classicNexusCoreProfile(game) || selectedIndependentNexusProfile(game);
/** Independent Discovery composes selected decks and original optional modules.
* Nexus remains optional; live tokens and encounters are runtime state, not selections. */
export function independentDiscoveryProfile(game: NexusCoreConfiguration): boolean {
return game.ecazTreachery === true && game.discoveryEnabled === true &&
nexusCoreRosterProfile(game, true, true);
}
function nexusCoreRosterProfile(game: NexusCoreConfiguration, selectedDecks: boolean): boolean {
export function independentDiscoveryNexusProfile(game: NexusCoreConfiguration): boolean {
return !!game.nexusCards && independentDiscoveryProfile(game);
}
/** Common consumers of the classic and selected-independent fresh Nexus core. */
export function nexusCoreProfile(game: NexusCoreConfiguration): boolean {
return classicNexusCoreProfile(game) || selectedIndependentNexusProfile(game) ||
independentDiscoveryNexusProfile(game);
}
function nexusCoreRosterProfile(game: NexusCoreConfiguration, selectedDecks: boolean, discovery = false): boolean {
const players = game.players;
if (typeof game.advanced !== 'boolean' || !game.nexusCards ||
if (typeof game.advanced !== 'boolean' || (!discovery && !game.nexusCards) ||
!players || players.length < (game.techTokens ? 3 : 2) || players.length > 6 ||
(game.strongholdCards && !game.advanced) || game.sandtrout ||
game.discoveryEnabled || game.discoveries || game.discoveryStash || game.greatMaker ||
(game.strongholdCards && !game.advanced) ||
(!discovery && (game.discoveryEnabled || game.discoveries || game.discoveryStash || game.greatMaker)) ||
game.semutaPreview || game.advancedPreview || game.kullPreview || game.nexusKullPreview ||
game.richeseBetrayalPreview ||
(!game.nexusCards && (game.guildBetrayalPreview || game.nexusIxianReplacementPreview ||
game.nexusIxianBetrayalPreview || game.nexusHarkonnenBetrayalPreview)) ||
(game.moritaniAssassinatePreview && (!selectedDecks || !game.advanced ||
!players.some(player => player.faction === 'moritani'))) ||
(game.nexusIxianBetrayalPreview && (!selectedDecks || !players.some(player => player.faction === 'ixians')))) return false;