Support selected Nexus decks with leader skills
Verify and publish checkpoint container / container (push) Successful in 11m54s

This commit is contained in:
Quintine committed 2026-10-29 20:26:46 +11:00
1 parent 91d45d1dec
commit 00e01a7cd2
13 files changed
+314 -23

No files matched your search

+15 -7
View File
@@ -1,5 +1,5 @@
import { FACTIONS } from './catalog';
import { independentDiscoveryProfile, independentNexusProfile, classicNexusCoreProfile, nexusCoreProfile, mixedE3NexusRosterProfile } from './faction-module-profile';
import { independentDiscoveryProfile, independentNexusProfile, classicNexusCoreProfile, nexusCoreProfile, mixedE3NexusRosterProfile, selectedNexusWithoutCardsProfile } from './faction-module-profile';
import { classicDiscoveryLeaderSkillsProfile } from './discovery-module-profile';
/** Public configuration only; never gate a skill on a hidden card or random deal. */
@@ -204,6 +204,13 @@ export function mixedE3NexusLeaderSkillsProfile(game: LeaderSkillProfile): boole
mixedE3NexusRosterProfile(game, true);
}
/** Original selected decks with Nexus and Skills do not require a seat from
* every selected family. Keep independent cards and other previews on their
* own paths, including the Advanced hidden E3/Harkonnen capture boundary. */
export function selectedNexusLeaderSkillsProfile(game: LeaderSkillProfile): boolean {
return selectedNexusWithoutCardsProfile(game);
}
/** Discovery keeps original native roster predicates; only this module envelope
* differs. Live token/entry/Great Maker frames are original consumers. */
function discoveryLeaderSkillModulesSupported(game: LeaderSkillProfile): boolean {
@@ -298,7 +305,7 @@ export function classicTechLeaderSkillsProfile(game: LeaderSkillProfile): boolea
export function strongholdLeaderSkillsProfile(game: LeaderSkillProfile): boolean {
if (!game.strongholdCards || game.advanced !== true) return false;
if (independentTreacheryLeaderSkillsProfile(game)) return true;
if (game.expansions.length) return selectedDeckLeaderSkillsProfile(game) ||
if (game.expansions.length) return selectedNexusLeaderSkillsProfile(game) || selectedDeckLeaderSkillsProfile(game) ||
advancedMoritaniLeaderSkillsProfile(game) || nativeEcazLeaderSkillsProfile(game);
const players = game.players;
if (!players || players.length < (game.techTokens ? 3 : 2) || players.length > 6 ||
@@ -321,7 +328,7 @@ export function strongholdLeaderSkillsProfile(game: LeaderSkillProfile): boolean
/** Bounded integration of the ordinary Moritani roster, not Advanced assassination. */
export function basicMoritaniLeaderSkillsProfile(game: LeaderSkillProfile): boolean {
if (game.advanced === false && game.players?.some(player => player.faction === 'moritani') &&
selectedDeckLeaderSkillsProfile(game)) return true;
(selectedNexusLeaderSkillsProfile(game) || selectedDeckLeaderSkillsProfile(game))) return true;
return game.advanced === false && game.expansions.length === 1 &&
game.expansions[0] === 'ecaz' && e3LeaderSkillModulesSupported(game) &&
!!game.players?.some(player => player.faction === 'moritani') &&
@@ -332,7 +339,7 @@ export function basicMoritaniLeaderSkillsProfile(game: LeaderSkillProfile): bool
/** Existing bounded Advanced assassination roster, composed with native skills. */
export function advancedMoritaniLeaderSkillsProfile(game: LeaderSkillProfile): boolean {
if (game.advanced === true && game.players?.some(player => player.faction === 'moritani') &&
selectedDeckLeaderSkillsProfile(game)) return true;
(selectedNexusLeaderSkillsProfile(game) || selectedDeckLeaderSkillsProfile(game))) return true;
const players = game.players;
if (game.advanced !== true || game.expansions.length !== 1 ||
game.expansions[0] !== 'ecaz' || !players || players.length < 2 || players.length > 6 ||
@@ -358,7 +365,8 @@ export function advancedMoritaniLeaderSkillsProfile(game: LeaderSkillProfile): b
/** Ecaz's five native discs; the separate temporarily controlled Duke is not an assignment disc. */
export function nativeEcazLeaderSkillsProfile(game: LeaderSkillProfile): boolean {
if (game.players?.some(player => player.faction === 'ecaz') && selectedDeckLeaderSkillsProfile(game)) return true;
if (game.players?.some(player => player.faction === 'ecaz') &&
(selectedNexusLeaderSkillsProfile(game) || selectedDeckLeaderSkillsProfile(game))) return true;
const players = game.players;
if (typeof game.advanced !== 'boolean' || game.expansions.length !== 1 ||
game.expansions[0] !== 'ecaz' || !players || players.length < 2 || players.length > 6 ||
@@ -434,7 +442,7 @@ export function selectedDeckLeaderSkillsProfile(game: LeaderSkillProfile): boole
export function nativeExpansionLeaderSkillsProfile(game: LeaderSkillProfile): boolean {
return (game.expansions.length > 0 && independentTreacheryLeaderSkillsProfile(game)) ||
mixedE3NexusLeaderSkillsProfile(game) || mixedE1E2NexusLeaderSkillsProfile(game) || pairedE3NexusLeaderSkillsProfile(game) ||
selectedNexusLeaderSkillsProfile(game) || mixedE3NexusLeaderSkillsProfile(game) || mixedE1E2NexusLeaderSkillsProfile(game) || pairedE3NexusLeaderSkillsProfile(game) ||
basicMoritaniLeaderSkillsProfile(game) || selectedDeckLeaderSkillsProfile(game) ||
advancedMoritaniLeaderSkillsProfile(game) || nativeEcazLeaderSkillsProfile(game);
}
@@ -529,7 +537,7 @@ export function ordinaryLeaderSkillModeSupported(game: LeaderSkillProfile): bool
(!game.expansions.length || nativeExpansionLeaderSkillsProfile(game) ||
(game.expansions.length === 1 && game.expansions[0] === 'choam'))) ||
classicTechLeaderSkillsProfile(game) || nativeTechLeaderSkillsProfile(game) ||
strongholdLeaderSkillsProfile(game) || classicNexusLeaderSkillsProfile(game) ||
strongholdLeaderSkillsProfile(game) || classicNexusLeaderSkillsProfile(game) || selectedNexusLeaderSkillsProfile(game) ||
guildBetrayalNexusLeaderSkillsProfile(game) ||
singleE1E2NexusLeaderSkillsProfile(game) ||
mixedE3NexusLeaderSkillsProfile(game) || mixedE1E2NexusLeaderSkillsProfile(game) || pairedE3NexusLeaderSkillsProfile(game) ||