@@ -33,6 +33,7 @@ function createGameState(roomId: string): GameState {
|
||||
isGameOver: false,
|
||||
turnsPassed: 0,
|
||||
gameMode: 'waiting',
|
||||
rematchRequests: [],
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
33
lib/store.ts
33
lib/store.ts
@@ -26,6 +26,7 @@ interface GameStore {
|
||||
selectTile: (tile: DominoTile | null) => void;
|
||||
leaveRoom: () => void;
|
||||
setError: (error: string | null) => void;
|
||||
requestRematch: () => void;
|
||||
|
||||
// AI actions
|
||||
startAIGame: (playerName: string) => void;
|
||||
@@ -134,6 +135,18 @@ export const useGameStore = create<GameStore>((set, get) => ({
|
||||
setTimeout(() => set({ error: null }), 3000);
|
||||
});
|
||||
|
||||
socket.on('rematch-started', (gameState: GameState) => {
|
||||
set({ gameState, selectedTile: null });
|
||||
|
||||
// Check if AI starts
|
||||
const currentPlayer = gameState.players[gameState.currentPlayerIndex];
|
||||
if (currentPlayer?.isAI) {
|
||||
setTimeout(() => {
|
||||
get().executeAITurn();
|
||||
}, 1500);
|
||||
}
|
||||
});
|
||||
|
||||
set({ socket });
|
||||
},
|
||||
|
||||
@@ -246,6 +259,25 @@ export const useGameStore = create<GameStore>((set, get) => ({
|
||||
});
|
||||
},
|
||||
|
||||
requestRematch: () => {
|
||||
const { socket, roomId, gameState, currentPlayerId } = get();
|
||||
|
||||
// AI mode - start new game immediately
|
||||
if (roomId?.startsWith('AI-') && gameState && currentPlayerId) {
|
||||
const humanPlayer = gameState.players.find(p => !p.isAI);
|
||||
if (humanPlayer) {
|
||||
// Just restart with same settings
|
||||
get().startAIGame(humanPlayer.name);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Online mode - send rematch request to server
|
||||
if (socket && roomId) {
|
||||
socket.emit('request-rematch', roomId);
|
||||
}
|
||||
},
|
||||
|
||||
setError: (error: string | null) => {
|
||||
set({ error });
|
||||
if (error) {
|
||||
@@ -297,6 +329,7 @@ export const useGameStore = create<GameStore>((set, get) => ({
|
||||
isGameOver: false,
|
||||
turnsPassed: 0,
|
||||
gameMode: 'playing',
|
||||
rematchRequests: [],
|
||||
};
|
||||
|
||||
set({ gameState, currentPlayerId: 'human', roomId });
|
||||
|
||||
@@ -47,6 +47,7 @@ export type GameState = {
|
||||
isGameOver: boolean;
|
||||
turnsPassed: number;
|
||||
gameMode: 'waiting' | 'playing' | 'finished';
|
||||
rematchRequests: string[]; // Player IDs who requested rematch
|
||||
};
|
||||
|
||||
export type GameMove = {
|
||||
@@ -64,6 +65,7 @@ export type SocketEvents = {
|
||||
'make-move': (roomId: string, move: GameMove) => void;
|
||||
'draw-tile': (roomId: string) => void;
|
||||
'leave-room': (roomId: string) => void;
|
||||
'request-rematch': (roomId: string) => void;
|
||||
|
||||
// Server to Client
|
||||
'room-created': (roomId: string) => void;
|
||||
@@ -74,4 +76,6 @@ export type SocketEvents = {
|
||||
'player-joined': (player: Player) => void;
|
||||
'player-left': (playerId: string) => void;
|
||||
'error': (message: string) => void;
|
||||
'rematch-requested': (playerId: string) => void;
|
||||
'rematch-started': (gameState: GameState) => void;
|
||||
};
|
||||
|
||||
Referencia en una nueva incidencia
Block a user