78 líneas
1.7 KiB
TypeScript
78 líneas
1.7 KiB
TypeScript
// Domino game types and interfaces
|
|
|
|
export type DominoTile = {
|
|
id: string;
|
|
left: number;
|
|
right: number;
|
|
isDouble: boolean;
|
|
};
|
|
|
|
export type Position = {
|
|
x: number;
|
|
y: number;
|
|
};
|
|
|
|
export type Orientation = 'horizontal' | 'vertical';
|
|
|
|
export type PlacedTile = {
|
|
tile: DominoTile;
|
|
position: Position;
|
|
orientation: Orientation;
|
|
rotation: number;
|
|
};
|
|
|
|
export type Player = {
|
|
id: string;
|
|
name: string;
|
|
tiles: DominoTile[];
|
|
score: number;
|
|
isAI: boolean;
|
|
isReady: boolean;
|
|
};
|
|
|
|
export type BoardEnd = {
|
|
value: number;
|
|
position: Position;
|
|
side: 'left' | 'right' | 'top' | 'bottom';
|
|
};
|
|
|
|
export type GameState = {
|
|
id: string;
|
|
players: Player[];
|
|
currentPlayerIndex: number;
|
|
board: PlacedTile[];
|
|
boneyard: DominoTile[];
|
|
boardEnds: BoardEnd[];
|
|
winner: string | null;
|
|
isGameOver: boolean;
|
|
turnsPassed: number;
|
|
gameMode: 'waiting' | 'playing' | 'finished';
|
|
};
|
|
|
|
export type GameMove = {
|
|
playerId: string;
|
|
tile: DominoTile;
|
|
side: 'left' | 'right';
|
|
pass?: boolean;
|
|
};
|
|
|
|
export type SocketEvents = {
|
|
// Client to Server
|
|
'create-room': () => void;
|
|
'join-room': (roomId: string, playerName: string) => void;
|
|
'player-ready': (roomId: string) => void;
|
|
'make-move': (roomId: string, move: GameMove) => void;
|
|
'draw-tile': (roomId: string) => void;
|
|
'leave-room': (roomId: string) => void;
|
|
|
|
// Server to Client
|
|
'room-created': (roomId: string) => void;
|
|
'room-joined': (gameState: GameState, playerId: string) => void;
|
|
'game-state-updated': (gameState: GameState) => void;
|
|
'game-started': (gameState: GameState) => void;
|
|
'invalid-move': (message: string) => void;
|
|
'player-joined': (player: Player) => void;
|
|
'player-left': (playerId: string) => void;
|
|
'error': (message: string) => void;
|
|
};
|