ts refactor
This commit is contained in:
184
src/types.ts
Normal file
184
src/types.ts
Normal 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;
|
||||
};
|
||||
Reference in New Issue
Block a user