From 3b7894f644973aac0a49f1ed20d4d680d2fd77a4 Mon Sep 17 00:00:00 2001 From: Jose134 Date: Wed, 22 Jan 2025 11:55:31 +0100 Subject: [PATCH] Turns and rounds mode --- index.js | 42 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index 3be3d2e..5abbe9c 100644 --- a/index.js +++ b/index.js @@ -94,7 +94,7 @@ const handleTileClick = (socket, data) => { // Find the player and make sure they are alive and have not already selected a tile const player = room.players.find(player => player.socketId === socket.id); - if (!player || player.tombstone || (room.gameMode === "turns" && player.confirmedSelection)) { + if (!player || player.tombstone || (room.gameMode === "rounds" && player.confirmedSelection)) { return; } @@ -104,7 +104,7 @@ const handleTileClick = (socket, data) => { return; } - if (room.gameMode === "turns") { + if (room.gameMode === "rounds") { const player = room.players.find(player => player.socketId === socket.id) if (player) { player.selection = tile.id; @@ -113,7 +113,18 @@ const handleTileClick = (socket, data) => { return; } } - else if (room.gameMode === "realtime") { + else { + if (room.gameMode === "turns") { + // Check that the current player is the one who has the turn + if (room.currentPlayer !== socket.id) { + return; + } + } + else if (room.gameMode !== "realtime") { + // Unrecognized gameMode + return; + } + if (tile.bomb === true) { console.log('bomb clicked'); room.players.find(user => user.socketId === socket.id).tombstone = tile.id; @@ -130,6 +141,7 @@ const handleTileClick = (socket, data) => { else if (checkWinCondition(room.players, room.board)) { room.gameState = "won"; } + room.currentPlayer = getNextPlayer(room.players, room.currentPlayer); } io.to(room.id).emit('updateRoom', buildRoomView(room)); @@ -143,8 +155,8 @@ const handleTileSelect = (socket, data) => { return; } - if (room.gameMode !== "turns") { - console.log('game mode is not turns'); + if (room.gameMode !== "rounds") { + console.log('game mode is not rounds'); return; } @@ -211,6 +223,10 @@ const handleTileFlag = (socket, data) => { return; } + if (room.gameMode === "turns" && room.currentPlayer !== socket.id) { + return; + } + // Find the tile that was clicked and select it if it is not already selected by another player const tile = room.board.tiles.find(tile => tile.id === data.tileId); if (!tile || tile.revealed || room.players.some(player => player.selection === data.tileId)) { @@ -247,6 +263,7 @@ const buildRoom = (userId, username, rows, cols, bombs, autoflag, gameMode) => { players: [user], gameMode: gameMode, gameState: "playing", + currentPlayer: user.socketId, board: board }; }; @@ -321,6 +338,7 @@ const buildRoomView = (room) => { players: room.players, gameMode: room.gameMode, gameState: room.gameState, + currentPlayer: room.currentPlayer, board: buildBoardView(room.board, room.gameState) }; }; @@ -388,3 +406,17 @@ const isSelectableTile = (tile, players, currentPlayerId) => { && players.filter(player => player.socketId != currentPlayerId).every(player => player.selection !== tile.id) && players.every(player => player.tombstone !== tile.id); } + +const getNextPlayer = (players, currentPlayerId) => { + if (players.every(player => player.tombstone)) { + return null; + } + + let currentPlayerIdx = players.findIndex(player => player.socketId === currentPlayerId); + let nextPlayerIdx; + do { + nextPlayerIdx = (currentPlayerIdx + 1) % players.length; + currentPlayerIdx = nextPlayerIdx; + } while (players[nextPlayerIdx].tombstone); + return players[nextPlayerIdx].socketId; +} \ No newline at end of file