export type MessageType = | 'CREATE_ROOM' | 'ROOM_CREATED' | 'JOIN_ROOM' | 'ROOM_STATE' | 'PLACE_MOVE' | 'MOVE_APPLIED' | 'MOVE_REJECTED' | 'GAME_WIN' | 'GAME_DRAW' | 'PLAYER_JOINED' | 'PLAYER_LEFT' | 'REQUEST_REMATCH' | 'REMATCH_ACCEPTED' | 'CHANGE_NAME' | 'NAME_CHANGED' | 'ERROR' | 'PLAYER_ONLINE' | 'PLAYER_OFFLINE' | 'PLAYER_RECONNECTING' | 'SET_SYMBOL' | 'SYMBOL_CHANGED' | 'GET_MATCHES' | 'MATCHES_DATA' | 'GET_MATCH' | 'MATCH_DATA' | 'GET_GENERATED_REPLAYS' | 'GENERATED_REPLAYS_DATA' | 'GET_GENERATED_REPLAY' | 'GENERATED_REPLAY_DATA' | 'GET_LEADERBOARD' | 'LEADERBOARD_DATA' | 'REGISTER_ENGINE' | 'ENGINE_REGISTERED' | 'ENGINE_CREATE_ROOM' | 'ENGINE_JOIN_ROOM' | 'ENGINE_ROOM_JOINED' | 'ENGINE_LIST_ROOMS' | 'ENGINE_ROOMS_LIST' | 'SWAP2_CHOICE' | 'REQUEST_SWAP' export interface WSMessage { type: MessageType payload: unknown } export interface RoomState { roomId: string players: string[] board: SerializedBitBoard currentPlayer: number status: 'waiting' | 'active' | 'win' | 'draw' playerIndex: number scores?: RoomScores symbols?: [string, string] boardSize?: number } export interface MovePayload { x: number y: number } export interface MoveAppliedPayload { x: number y: number player: number symbol: string currentPlayer: number } export interface GameWinPayload { playerId: string cells: { x: number; y: number }[] } export interface GameDrawPayload { message?: string } export interface RoomScores { [playerId: string]: { wins: number; losses: number; draws: number } } export interface ErrorPayload { message: string } export interface MoveRejectedPayload { message: string x: number y: number } export interface PlayerPresencePayload { playerIndex: number playerName: string } export interface SymbolPayload { symbol: string } export interface GameRules { swap2?: boolean noOverlines?: boolean boardSize?: number } export interface Cell { playerId: string symbol: string timestamp: number } export interface SerializedBitBoard { boardSize: number words: number[] occupiedCount: number } export interface RegisterEnginePayload { name: string } export interface EngineRegisteredPayload { engineId: string } export interface EngineCreateRoomPayload { engineName: string } export interface EngineJoinRoomPayload { roomId: string engineName: string } export interface EngineRoomJoinedPayload { roomId: string playerIndex: number roomState: RoomState } export interface EngineRoomsListPayload { rooms: { roomId: string; engineName: string }[] } export interface GameExportData { id: string player1: string player2: string winner: number | null moves: { x: number; y: number; player: number; symbol: string }[] createdAt: string }