Enable Basic Nexus Kull and native reactions
Verify and publish checkpoint container / container (push) Successful in 11m12s

This commit is contained in:
Quintine committed 2026-10-30 18:26:05 +11:00
1 parent 5b66628399
commit 95ebd7f976
15 files changed
+388 -21

No files matched your search

+38 -2
View File
@@ -36,6 +36,20 @@ type NexusCoreConfiguration = Partial<FactionModuleProfile> & Pick<FactionModule
sandtrout?: unknown; moritaniAssassinatePreview?: unknown;
};
/** The pre-existing Nexus Kull audit also accepts Advanced CHOAM/classic
* seats; retain its native reaction stamps without opening a public mode. */
function nexusKullCore(game: NexusCoreConfiguration): boolean {
return typeof game.advanced === 'boolean' && !!game.nexusCards &&
game.kullPreview === true && game.nexusKullPreview === true && !game.semutaPreview &&
game.expansions.length === 2 && game.expansions.includes('ix') && game.expansions.includes('choam') &&
!!game.players?.some(player => player.faction === 'choam') &&
game.players.every(player => player.faction === 'choam' ||
FACTIONS.some(faction => faction.id === player.faction && faction.expansion === 'base')) &&
!game.homeworlds && !game.leaderSkills && !game.techTokens && !game.strongholdCards &&
!game.ecazTreachery && !game.discoveryEnabled && !game.discoveries && !game.discoveryStash &&
!game.greatMaker && !game.advancedPreview && !game.richeseBetrayalPreview;
}
/** Classic Nexus12 with selected base33/independent36, optional all14, original
* Homeworlds and phase modules. Native effect stamps are not selected overlays. */
export function classicNexusCoreProfile(game: NexusCoreConfiguration): boolean {
@@ -79,6 +93,27 @@ export function selectedDiscoverySkillsSemutaProfile(game: NexusCoreConfiguratio
selectedDiscoveryWithoutCardsProfile({...game, semutaPreview: undefined});
}
/** Fresh Basic E1/E2 Nexus without additional modules. Native reaction stamps
* are part of this core; Semuta and Nexus Kull keep their physical prerequisites. */
function basicNativeNexusCore(game: NexusCoreConfiguration): boolean {
const players = game.players;
if (game.advanced !== false || !game.nexusCards || !players || !game.expansions.length ||
!game.expansions.every(id => id === 'ix' || id === 'choam') ||
game.homeworlds || game.leaderSkills || game.techTokens || game.strongholdCards ||
game.ecazTreachery || game.discoveryEnabled || game.discoveries || game.discoveryStash || game.greatMaker ||
game.advancedPreview || game.richeseBetrayalPreview) return false;
if (game.semutaPreview && (game.semutaPreview !== true || game.kullPreview || game.nexusKullPreview ||
!game.expansions.includes('choam') || !players.some(player => player.faction === 'richese'))) return false;
if (game.kullPreview || game.nexusKullPreview) {
if (game.kullPreview !== true || game.nexusKullPreview !== true || game.semutaPreview ||
game.expansions.length !== 2 || !game.expansions.includes('ix') || !game.expansions.includes('choam') ||
!players.some(player => player.faction === 'choam') ||
players.some(player => player.faction !== 'choam' &&
!FACTIONS.some(faction => faction.id === player.faction && faction.expansion === 'base'))) return false;
}
return true;
}
/** Original selected decks do not require their native factions or the
* independent three-card variant. Hidden E3/Harkonnen compositions retain
* their existing separately scoped paths. */
@@ -88,7 +123,7 @@ export function selectedNexusWithoutCardsProfile(game: NexusCoreConfiguration):
!game.expansions.length || !nexusCoreRosterProfile(game, true, game.discoveryEnabled === true)) return false;
if (game.advanced && players.some(player => player.faction === 'harkonnen') &&
players.some(player => player.faction === 'ecaz' || player.faction === 'moritani')) return false;
return game.expansions.some(expansion => !players.some(player =>
return basicNativeNexusCore(game) || game.expansions.some(expansion => !players.some(player =>
FACTIONS.some(faction => faction.id === player.faction && faction.expansion === expansion)));
}
@@ -100,11 +135,12 @@ export function nexusCoreProfile(game: NexusCoreConfiguration): boolean {
function nexusCoreRosterProfile(game: NexusCoreConfiguration, selectedDecks: boolean, discovery = false): boolean {
const players = game.players;
const basicNative = selectedDecks && (basicNativeNexusCore(game) || nexusKullCore(game));
if (typeof game.advanced !== 'boolean' || (!discovery && !game.nexusCards) ||
!players || players.length < (game.techTokens ? 3 : 2) || players.length > 6 ||
(game.strongholdCards && !game.advanced) ||
(!discovery && (game.discoveryEnabled || game.discoveries || game.discoveryStash || game.greatMaker)) ||
game.semutaPreview || game.advancedPreview || game.kullPreview || game.nexusKullPreview ||
(game.semutaPreview || game.kullPreview || game.nexusKullPreview) && !basicNative || game.advancedPreview ||
game.richeseBetrayalPreview ||
(!game.nexusCards && (game.guildBetrayalPreview || game.nexusIxianReplacementPreview ||
game.nexusIxianBetrayalPreview || game.nexusHarkonnenBetrayalPreview)) ||