Compose independent Skills with original Tech and Stronghold modules

Unify fresh/live classic and native phase admission, retaining original counts, earned custody, separate income ledgers and physical card/skill continuations. Plain paired E3 phases no longer require cards or Nexus. Coupled44-file471/471, types/lint/build, genuine programmes and390px normal entry pass. Controlled card inputs explicit; no save retrofit or deployment.
This commit is contained in:
Quintine committed 2026-10-17 22:12:44 +11:00
1 parent 17adffa6a7
commit b9330d489e
31 files changed
+797 -104

No files matched your search

+6 -1
View File
@@ -18,7 +18,7 @@ import { nextStrongholdFactionsNativeStep } from './fixture-stronghold-factions'
import { quoteIndependentSkillsBattle } from './fixture-independent-skills-battle';
export type IxIndependentSkillsStep = { actor: string; action: Action };
export type IxIndependentSkillsOptions = { advanced?: boolean };
export type IxIndependentSkillsOptions = { advanced?: boolean; tech?: boolean; strongholds?: boolean };
export const ixIndependentSkillsPlayer = (game: Game, actor: string): Player => {
const player = game.players.find(p => p.id === actor); assert.ok(player); return player;
};
@@ -67,6 +67,8 @@ export function ixIndependentSkillsPolicyActions(game: Game, actor: string, diff
export function nextIxIndependentSkillsStep(game: Game): IxIndependentSkillsStep | null {
if (!game.phaseOpening && !game.response) {
const d = game.decision;
if (d?.kind === 'techToken') return { actor: d.player,
action: { type: 'decision', token: d.choices[0] } };
if (d?.kind === 'leaderSkillVisibility') return { actor: d.player,
action: { type: 'leaderSkillVisibility', event: d.event, hide: d.player === 'ixians' } };
if (d?.kind === 'guildTiming') return { actor: d.player, action: { type: 'decision', take: false } };
@@ -153,6 +155,9 @@ export function createIxIndependentSkillsFixture(options: IxIndependentSkillsOpt
actions.push(structuredClone(step)); game = stepIxIndependentSkills(game, step);
return game;
};
for (const [type, enabled] of [
['techTokens', options.tech ?? false], ['strongholdCards', options.strongholds ?? false],
] as const) if (enabled) record({ actor: game.host, action: { type, enabled } });
for (const option of ['leaderSkills', 'ecazTreachery'] as const)
record({ actor: game.host, action: { type: 'moduleOption', module: option, enabled: true } });
for (const p of game.players) record({ actor: p.id, action: { type: 'ready' } });