10
app/page.tsx
10
app/page.tsx
@@ -60,14 +60,6 @@ export default function Home() {
|
|||||||
const handlePlaceTile = (side: 'left' | 'right') => {
|
const handlePlaceTile = (side: 'left' | 'right') => {
|
||||||
if (!selectedTile || !currentPlayerId || !gameState) return;
|
if (!selectedTile || !currentPlayerId || !gameState) return;
|
||||||
|
|
||||||
console.log('handlePlaceTile called', {
|
|
||||||
selectedTile,
|
|
||||||
side,
|
|
||||||
currentPlayerId,
|
|
||||||
boardEnds: gameState.boardEnds,
|
|
||||||
validMoves
|
|
||||||
});
|
|
||||||
|
|
||||||
// Verificar si el movimiento es válido
|
// Verificar si el movimiento es válido
|
||||||
const isValid = validMoves.some(m =>
|
const isValid = validMoves.some(m =>
|
||||||
m.tile.id === selectedTile.id &&
|
m.tile.id === selectedTile.id &&
|
||||||
@@ -75,12 +67,10 @@ export default function Home() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (!isValid && gameState.boardEnds.length > 0) {
|
if (!isValid && gameState.boardEnds.length > 0) {
|
||||||
console.error('Invalid move: tile cannot be placed on this side', { selectedTile, side, validMoves });
|
|
||||||
setError(`Cannot place tile ${selectedTile.left}-${selectedTile.right} on the ${side} side. It doesn't match the board end.`);
|
setError(`Cannot place tile ${selectedTile.left}-${selectedTile.right} on the ${side} side. It doesn't match the board end.`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('Making move:', { playerId: currentPlayerId, tile: selectedTile, side });
|
|
||||||
makeMove({
|
makeMove({
|
||||||
playerId: currentPlayerId,
|
playerId: currentPlayerId,
|
||||||
tile: selectedTile,
|
tile: selectedTile,
|
||||||
|
|||||||
@@ -48,12 +48,10 @@ export const useGameStore = create<GameStore>((set, get) => ({
|
|||||||
});
|
});
|
||||||
|
|
||||||
socket.on('connect', () => {
|
socket.on('connect', () => {
|
||||||
console.log('Connected to socket server');
|
|
||||||
set({ isConnected: true, socket });
|
set({ isConnected: true, socket });
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.on('disconnect', () => {
|
socket.on('disconnect', () => {
|
||||||
console.log('Disconnected from socket server');
|
|
||||||
set({ isConnected: false });
|
set({ isConnected: false });
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -166,7 +164,6 @@ export const useGameStore = create<GameStore>((set, get) => ({
|
|||||||
|
|
||||||
// Modo AI (offline)
|
// Modo AI (offline)
|
||||||
if (roomId?.startsWith('AI-') && gameState) {
|
if (roomId?.startsWith('AI-') && gameState) {
|
||||||
console.log('AI mode: executing move', move);
|
|
||||||
const newGameState = executeMove(gameState, move);
|
const newGameState = executeMove(gameState, move);
|
||||||
set({ gameState: newGameState, selectedTile: null });
|
set({ gameState: newGameState, selectedTile: null });
|
||||||
|
|
||||||
@@ -182,7 +179,6 @@ export const useGameStore = create<GameStore>((set, get) => ({
|
|||||||
|
|
||||||
// Modo multijugador (online)
|
// Modo multijugador (online)
|
||||||
if (socket && roomId) {
|
if (socket && roomId) {
|
||||||
console.log('Online mode: sending move to server', move);
|
|
||||||
socket.emit('make-move', roomId, move);
|
socket.emit('make-move', roomId, move);
|
||||||
set({ selectedTile: null });
|
set({ selectedTile: null });
|
||||||
}
|
}
|
||||||
@@ -200,7 +196,6 @@ export const useGameStore = create<GameStore>((set, get) => ({
|
|||||||
|
|
||||||
// Check if there are tiles in the boneyard
|
// Check if there are tiles in the boneyard
|
||||||
if (gameState.boneyard.length === 0) {
|
if (gameState.boneyard.length === 0) {
|
||||||
console.log('No tiles in boneyard');
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -223,8 +218,6 @@ export const useGameStore = create<GameStore>((set, get) => ({
|
|||||||
players: updatedPlayers,
|
players: updatedPlayers,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log('Drew tile in AI mode:', drawnTile);
|
|
||||||
}
|
}
|
||||||
// Online mode - send to server
|
// Online mode - send to server
|
||||||
else if (socket && roomId) {
|
else if (socket && roomId) {
|
||||||
|
|||||||
28
server.mjs
28
server.mjs
@@ -141,8 +141,6 @@ app.prepare().then(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
io.on('connection', (socket) => {
|
io.on('connection', (socket) => {
|
||||||
console.log('Client connected:', socket.id);
|
|
||||||
|
|
||||||
socket.on('create-room', () => {
|
socket.on('create-room', () => {
|
||||||
const roomId = generateRoomId();
|
const roomId = generateRoomId();
|
||||||
const gameState = createGameState(roomId);
|
const gameState = createGameState(roomId);
|
||||||
@@ -150,7 +148,6 @@ app.prepare().then(() => {
|
|||||||
|
|
||||||
socket.join(roomId);
|
socket.join(roomId);
|
||||||
socket.emit('room-created', roomId);
|
socket.emit('room-created', roomId);
|
||||||
console.log('Room created:', roomId);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.on('join-room', (roomId, playerName) => {
|
socket.on('join-room', (roomId, playerName) => {
|
||||||
@@ -186,8 +183,6 @@ app.prepare().then(() => {
|
|||||||
socket.join(roomId);
|
socket.join(roomId);
|
||||||
socket.emit('room-joined', gameState, socket.id);
|
socket.emit('room-joined', gameState, socket.id);
|
||||||
socket.to(roomId).emit('player-joined', player);
|
socket.to(roomId).emit('player-joined', player);
|
||||||
|
|
||||||
console.log(`Player ${playerName} joined room ${roomId}`);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.on('player-ready', (roomId) => {
|
socket.on('player-ready', (roomId) => {
|
||||||
@@ -205,18 +200,14 @@ app.prepare().then(() => {
|
|||||||
if (allReady) {
|
if (allReady) {
|
||||||
const startedGame = startGame(roomId);
|
const startedGame = startGame(roomId);
|
||||||
io.to(roomId).emit('game-started', startedGame);
|
io.to(roomId).emit('game-started', startedGame);
|
||||||
console.log('Game started in room:', roomId);
|
|
||||||
} else {
|
} else {
|
||||||
io.to(roomId).emit('game-state-updated', gameState);
|
io.to(roomId).emit('game-state-updated', gameState);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.on('make-move', (roomId, move) => {
|
socket.on('make-move', (roomId, move) => {
|
||||||
console.log('Received make-move:', { roomId, move, socketId: socket.id });
|
|
||||||
|
|
||||||
const gameState = gameRooms.get(roomId);
|
const gameState = gameRooms.get(roomId);
|
||||||
if (!gameState) {
|
if (!gameState) {
|
||||||
console.log('Game state not found for room:', roomId);
|
|
||||||
socket.emit('error', 'Game not found');
|
socket.emit('error', 'Game not found');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -224,26 +215,22 @@ app.prepare().then(() => {
|
|||||||
const currentPlayer = gameState.players[gameState.currentPlayerIndex];
|
const currentPlayer = gameState.players[gameState.currentPlayerIndex];
|
||||||
|
|
||||||
if (currentPlayer.id !== socket.id) {
|
if (currentPlayer.id !== socket.id) {
|
||||||
console.log('Not player turn:', { currentPlayerId: currentPlayer.id, socketId: socket.id });
|
|
||||||
socket.emit('invalid-move', 'Not your turn');
|
socket.emit('invalid-move', 'Not your turn');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const player = gameState.players.find(p => p.id === move.playerId);
|
const player = gameState.players.find(p => p.id === move.playerId);
|
||||||
if (!player) {
|
if (!player) {
|
||||||
console.log('Player not found:', move.playerId);
|
|
||||||
socket.emit('error', 'Player not found');
|
socket.emit('error', 'Player not found');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (move.pass) {
|
if (move.pass) {
|
||||||
console.log('Player passing turn');
|
|
||||||
gameState.currentPlayerIndex = (gameState.currentPlayerIndex + 1) % gameState.players.length;
|
gameState.currentPlayerIndex = (gameState.currentPlayerIndex + 1) % gameState.players.length;
|
||||||
gameState.turnsPassed++;
|
gameState.turnsPassed++;
|
||||||
} else {
|
} else {
|
||||||
const tileIndex = player.tiles.findIndex(t => t.id === move.tile.id);
|
const tileIndex = player.tiles.findIndex(t => t.id === move.tile.id);
|
||||||
if (tileIndex === -1) {
|
if (tileIndex === -1) {
|
||||||
console.log('Tile not found in player hand:', move.tile.id);
|
|
||||||
socket.emit('invalid-move', 'Tile not found');
|
socket.emit('invalid-move', 'Tile not found');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -256,21 +243,17 @@ app.prepare().then(() => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (!targetEnd) {
|
if (!targetEnd) {
|
||||||
console.log('Invalid side:', move.side);
|
|
||||||
socket.emit('invalid-move', 'Invalid side');
|
socket.emit('invalid-move', 'Invalid side');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const canPlace = move.tile.left === targetEnd.value || move.tile.right === targetEnd.value;
|
const canPlace = move.tile.left === targetEnd.value || move.tile.right === targetEnd.value;
|
||||||
if (!canPlace) {
|
if (!canPlace) {
|
||||||
console.log('Tile does not match:', { tile: move.tile, targetEnd: targetEnd.value });
|
|
||||||
socket.emit('invalid-move', 'Tile does not match board end');
|
socket.emit('invalid-move', 'Tile does not match board end');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('Placing tile:', { tile: move.tile, side: move.side });
|
|
||||||
|
|
||||||
// Remover la ficha de la mano del jugador
|
// Remover la ficha de la mano del jugador
|
||||||
player.tiles.splice(tileIndex, 1);
|
player.tiles.splice(tileIndex, 1);
|
||||||
|
|
||||||
@@ -313,7 +296,6 @@ app.prepare().then(() => {
|
|||||||
left: move.tile.right,
|
left: move.tile.right,
|
||||||
right: move.tile.left,
|
right: move.tile.left,
|
||||||
};
|
};
|
||||||
console.log('Flipping tile from', move.tile, 'to', tileToPlace);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (move.side === 'right') {
|
if (move.side === 'right') {
|
||||||
@@ -368,10 +350,8 @@ app.prepare().then(() => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('Updating game state and emitting to room:', roomId);
|
|
||||||
gameRooms.set(roomId, gameState);
|
gameRooms.set(roomId, gameState);
|
||||||
io.to(roomId).emit('game-state-updated', gameState);
|
io.to(roomId).emit('game-state-updated', gameState);
|
||||||
console.log('Game state updated successfully');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.on('draw-tile', (roomId) => {
|
socket.on('draw-tile', (roomId) => {
|
||||||
@@ -398,8 +378,6 @@ app.prepare().then(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
socket.on('leave-room', (roomId) => {
|
socket.on('leave-room', (roomId) => {
|
||||||
console.log('Player leaving room:', { socketId: socket.id, roomId });
|
|
||||||
|
|
||||||
const gameState = gameRooms.get(roomId);
|
const gameState = gameRooms.get(roomId);
|
||||||
if (!gameState) return;
|
if (!gameState) return;
|
||||||
|
|
||||||
@@ -417,7 +395,6 @@ app.prepare().then(() => {
|
|||||||
if (gameState.players.length === 0) {
|
if (gameState.players.length === 0) {
|
||||||
// No players left, delete room
|
// No players left, delete room
|
||||||
gameRooms.delete(roomId);
|
gameRooms.delete(roomId);
|
||||||
console.log('Room deleted - no players remaining:', roomId);
|
|
||||||
} else {
|
} else {
|
||||||
// Check if only one human player remains
|
// Check if only one human player remains
|
||||||
const remainingHumanPlayers = gameState.players.filter(p => !p.isAI);
|
const remainingHumanPlayers = gameState.players.filter(p => !p.isAI);
|
||||||
@@ -428,7 +405,6 @@ app.prepare().then(() => {
|
|||||||
gameState.isGameOver = true;
|
gameState.isGameOver = true;
|
||||||
gameState.winner = winner.id;
|
gameState.winner = winner.id;
|
||||||
gameState.gameMode = 'finished';
|
gameState.gameMode = 'finished';
|
||||||
console.log(`Player ${winner.name} wins - only player remaining in room ${roomId}`);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adjust currentPlayerIndex if needed
|
// Adjust currentPlayerIndex if needed
|
||||||
@@ -439,7 +415,6 @@ app.prepare().then(() => {
|
|||||||
gameRooms.set(roomId, gameState);
|
gameRooms.set(roomId, gameState);
|
||||||
io.to(roomId).emit('player-left', socket.id);
|
io.to(roomId).emit('player-left', socket.id);
|
||||||
io.to(roomId).emit('game-state-updated', gameState);
|
io.to(roomId).emit('game-state-updated', gameState);
|
||||||
console.log(`Player ${leavingPlayer.name} left room ${roomId}. ${gameState.players.length} players remaining.`);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -457,7 +432,6 @@ app.prepare().then(() => {
|
|||||||
|
|
||||||
if (gameState.players.length === 0) {
|
if (gameState.players.length === 0) {
|
||||||
gameRooms.delete(roomId);
|
gameRooms.delete(roomId);
|
||||||
console.log('Room deleted:', roomId);
|
|
||||||
} else {
|
} else {
|
||||||
// Check if only one human player remains after disconnect
|
// Check if only one human player remains after disconnect
|
||||||
const remainingHumanPlayers = gameState.players.filter(p => !p.isAI);
|
const remainingHumanPlayers = gameState.players.filter(p => !p.isAI);
|
||||||
@@ -468,7 +442,6 @@ app.prepare().then(() => {
|
|||||||
gameState.isGameOver = true;
|
gameState.isGameOver = true;
|
||||||
gameState.winner = winner.id;
|
gameState.winner = winner.id;
|
||||||
gameState.gameMode = 'finished';
|
gameState.gameMode = 'finished';
|
||||||
console.log(`Player ${winner.name} wins - only player remaining in room ${roomId}`);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adjust currentPlayerIndex if needed
|
// Adjust currentPlayerIndex if needed
|
||||||
@@ -482,7 +455,6 @@ app.prepare().then(() => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log('Client disconnected:', socket.id);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Referencia en una nueva incidencia
Block a user