Compose original mixed and paired Nexus optional modules

This commit is contained in:
Quintine committed 2026-10-07 14:12:47 +11:00
1 parent 0e1797d4e0
commit 05ab2c92b0
30 files changed
+2268 -203

No files matched your search

+6 -5
View File
@@ -3,8 +3,8 @@ import type { Game } from './engine';
import { acquireDuke, DUKE_VIDAL_ID, type DukeSource } from './duke-vidal';
import { nexusCardMode } from './nexus-cards';
import { nexusCleanPlayBlocked } from './nexus-play-boundary';
import { standaloneE3NexusLeaderSkillsProfile } from './leader-skill-profile';
import { standaloneE3NexusProfile } from './nexus-module-profile';
import { pairedE3NexusLeaderSkillsProfile, standaloneE3NexusLeaderSkillsProfile } from './leader-skill-profile';
import { pairedE3NexusProfile, standaloneE3NexusProfile } from './nexus-module-profile';
const SUPPORTED_FACTIONS: Partial<Record<FactionId, true>> = {
ecaz: true, moritani: true, atreides: true, harkonnen: true,
@@ -66,7 +66,7 @@ export function quoteNexusEcazDuke(g: Game, owner: string, automaticPending = fa
if (g.advanced && g.players.some(player => player.faction === 'harkonnen'))
blocked = 'Duke Vidal battle use is unavailable with Advanced Harkonnen.';
else if (!nexusEcazDukeModeSupported(g) || nexusCardMode('ecaz', holder.faction, roster) !== 'cunning')
blocked = 'Ecaz Nexus Cunning requires the paired Nexus-only roster or a fresh supported standalone Ecaz Nexus profile.';
blocked = 'Ecaz Nexus Cunning requires a supported original paired or standalone Ecaz Nexus profile.';
else if (holder.ally) blocked = 'Use Ecaz Nexus Cunning while unallied.';
else if (g.status !== 'playing' || g.phase !== 6)
blocked = 'Use Ecaz Nexus Cunning at the Battle phase boundary.';
@@ -88,10 +88,11 @@ export function quoteNexusEcazDuke(g: Game, owner: string, automaticPending = fa
}
export function nexusEcazDukeModeSupported(g: Game): boolean {
if (standaloneE3NexusProfile(g) && g.players.some(player => player.faction === 'ecaz') &&
if ((standaloneE3NexusProfile(g) || pairedE3NexusProfile(g)) &&
g.players.some(player => player.faction === 'ecaz') &&
!g.sandtrout && !(g.advanced && g.players.some(player => player.faction === 'harkonnen')))
return !!g.nexusCards?.cards && g.players.length >= 3;
if (g.leaderSkills && standaloneE3NexusLeaderSkillsProfile(g) &&
if (g.leaderSkills && (standaloneE3NexusLeaderSkillsProfile(g) || pairedE3NexusLeaderSkillsProfile(g)) &&
g.players.some(player => player.faction === 'ecaz') && !g.sandtrout)
return !!g.nexusCards?.cards && g.players.length >= 3;
return !!g.nexusCards?.cards && g.players.length >= 3 && g.players.length <= 6 &&