ts refactor

This commit is contained in:
2026-04-08 16:44:16 -04:00
parent 2ce04c7bbb
commit 4034ca55cf
12 changed files with 1831 additions and 2 deletions

184
src/types.ts Normal file
View File

@@ -0,0 +1,184 @@
export type PlayerId = number;
export type NodeKey = `${number}:${number}`;
export type PlayerPalette = {
name: string;
primary: string;
glow: string;
};
export type Position = {
row: number;
column: number;
};
export type SetupState = {
playerCount: number;
columns: number;
rows: number;
startingNodesPerPlayer: number;
sunbeamChance: number;
diseaseChance: number;
seedInputs: string[];
paletteOrder: number[];
shuffleTurnOrder: boolean;
};
export type Player = {
id: PlayerId;
name: string;
color: string;
glow: string;
totalScore: number;
roundScore: number;
growthPoints: number;
bankedPoints: number;
bonusPoints: number;
passed: boolean;
};
export type GameConfig = {
columns: number;
rows: number;
playerCount: number;
startingNodesPerPlayer: number;
playerPaletteOrder: number[];
};
export type NodeState = {
ownerId: PlayerId;
};
export type Edge = {
from: Position;
to: Position;
ownerId: PlayerId;
};
export type GrowDirection = "vertical" | "left" | "right";
export type GrowTarget = Position & {
cost: number;
direction: GrowDirection;
};
export type ShiftMove = {
type: "shift";
cost: number;
direction: "left" | "right";
movedNodes: Array<{
fromKey: NodeKey;
toKey: NodeKey;
row: number;
fromColumn: number;
toColumn: number;
}>;
movedEdges: Array<{
before: Edge;
after: Edge;
}>;
undoKeys: NodeKey[];
selectKey: NodeKey;
};
export type GrowMove = {
type: "grow";
from: Position;
to: Position;
cost: number;
targetKey: NodeKey;
undoKeys: NodeKey[];
selectKey: NodeKey;
};
export type TurnMove = GrowMove | ShiftMove;
export type ColumnEnergy = {
column: number;
terminalRow: number;
intercepted: boolean;
ownerId: PlayerId | null;
hitNode: Position | null;
rootKey: NodeKey | null;
branchNodes: Position[];
branchEdges: Array<{ from: Position; to: Position }>;
};
export type RootBurst = {
key: NodeKey;
playerId: PlayerId;
count: number;
};
export type EnergySimulation = {
scores: number[];
columns: ColumnEnergy[];
rootBursts: RootBurst[];
};
export type RoundAnimationTrace = {
playerId: PlayerId;
verticalCells: Position[];
ray: { x: number; y: number };
rootKey: NodeKey | null;
branchNodes: Position[];
};
export type RoundAnimation = {
phase: "sunlight" | "branches" | "bonus" | "events";
columns: ColumnEnergy[];
traces: RoundAnimationTrace[];
rootBursts: RootBurst[];
sunbeamPlayerId: PlayerId | null;
bonusTrace: RoundAnimationTrace | null;
bonusBurst: RootBurst | null;
diseaseKeys: NodeKey[];
};
export type ColumnResult = {
column: number;
ownerId: PlayerId | null;
topRow: number | null;
tied: boolean;
};
export type RoundSummary = {
scores: number[];
columnResults: ColumnResult[];
event: string | null;
};
export type ScoreSnapshot = {
totalScore: number;
roundScore: number;
growthPoints: number;
bankedPoints: number;
};
export type ColumnLeader = {
ownerId: PlayerId | null;
row: number | null;
tied: boolean;
};
export type RandomEffects = {
sunbeamChance: number;
diseaseChance: number;
};
export type GameState = {
config: GameConfig;
players: Player[];
nodes: Map<NodeKey, NodeState>;
edges: Edge[];
round: number;
activePlayerId: PlayerId;
turnMoves: TurnMove[];
selectedSource: NodeKey | null;
availableTargets: GrowTarget[];
animation: RoundAnimation | null;
randomEffects: RandomEffects;
gameOver: boolean;
history: string[];
roundSummary: RoundSummary | null;
};