diff --git a/packages/engine/src/game.ts b/packages/engine/src/game.ts index 2c94189..8273600 100644 --- a/packages/engine/src/game.ts +++ b/packages/engine/src/game.ts @@ -173,6 +173,10 @@ export interface GameConfig { playerIds: PlayerId[]; seed: number; sets: CardSet[]; + /** Chosen wizard colors, per player (index 0-5 into the six physical + * standees: green, red, magenta, blue, light blue, yellow). Defaults to + * seat order. */ + colors?: number[]; } export interface GameState { diff --git a/packages/engine/src/view.ts b/packages/engine/src/view.ts index 4a6db57..2a8a204 100644 --- a/packages/engine/src/view.ts +++ b/packages/engine/src/view.ts @@ -27,6 +27,8 @@ export interface PlayerPublicView { lostTurns: number; extraTurns: number; displayed: CardInstance[]; + /** Which of the six physical wizard colors this player plays. */ + colorIndex: number; } export interface GameView { @@ -85,8 +87,9 @@ export function viewFor(state: GameState, playerId: PlayerId): GameView { turn: state.turn, activePlayerId: state.players[state.turn.activeIndex]!.id, board, - players: state.players.map((p) => ({ + players: state.players.map((p, i) => ({ id: p.id, + colorIndex: state.config.colors?.[i] ?? i, position: p.position, home: p.home, life: p.life, diff --git a/packages/web/src/App.svelte b/packages/web/src/App.svelte index 1e94c84..f91dd41 100644 --- a/packages/web/src/App.svelte +++ b/packages/web/src/App.svelte @@ -16,6 +16,13 @@ let showHelp = $state(false); let hotseatCount = $state(2); let setupName = $state(""); + let setupColor = $state(0); + // Default each new wizard to the first unclaimed standee. + $effect(() => { + if (local.setup && local.setup.colors.includes(setupColor)) { + setupColor = [0, 1, 2, 3, 4, 5].find((c) => !local.setup!.colors.includes(c)) ?? 0; + } + }); /** Tap-to-inspect: hide the enlarged card for the current selection. */ let inspectorHidden = $state(false); $effect(() => { @@ -456,7 +463,8 @@ const PLAYER_COLORS = ["#1a9c46", "#d3352b", "#c9308f", "#3a3ac0", "#2ab0c9", "#c9a72a"]; function playerColor(id: string): string { - const idx = view?.players.findIndex((p) => p.id === id) ?? 0; + const p = view?.players.find((p) => p.id === id); + const idx = p?.colorIndex ?? (view?.players.findIndex((q) => q.id === id) ?? 0); return PLAYER_COLORS[idx % PLAYER_COLORS.length]!; } @@ -503,9 +511,23 @@