From edde72f44a6a83a1f8d033570f2e13ad5b952e43 Mon Sep 17 00:00:00 2001 From: James Ketrenos Date: Sun, 27 Feb 2022 13:56:31 -0800 Subject: [PATCH] Reset all game data in resetGame Signed-off-by: James Ketrenos --- client/src/PlayerColor.js | 4 +- server/routes/games.js | 186 +++++++++++++++++--------------------- 2 files changed, 84 insertions(+), 106 deletions(-) diff --git a/client/src/PlayerColor.js b/client/src/PlayerColor.js index 7fcc749..362d99f 100644 --- a/client/src/PlayerColor.js +++ b/client/src/PlayerColor.js @@ -22,8 +22,8 @@ const useStyles = makeStyles((theme) => ({ backgroundColor: orange[500], }, W: { - color: theme.palette.getContrastText(grey[500]), - backgroundColor: grey[500], + color: theme.palette.getContrastText(grey[50]), + backgroundColor: grey[50], }, B: { color: theme.palette.getContrastText(lightBlue[500]), diff --git a/server/routes/games.js b/server/routes/games.js index 288a920..42e9511 100755 --- a/server/routes/games.js +++ b/server/routes/games.js @@ -40,7 +40,7 @@ function shuffle(array) { return array; } -const assetData = { +const staticData = { tiles: [ { type: "desert", card: 0 }, { type: "wood", card: 0 }, @@ -90,27 +90,8 @@ const assetData = { [ undefined, "wood", undefined ], [ "bank", undefined, "wheat" ], [ undefined, "stone", undefined ] - ], - developmentCards: [ ] }; -for (let i = 1; i <= 14; i++) { - assetData.developmentCards.push({ - type: 'army', - card: i - }); -} - -[ 'monopoly', 'road-1', 'road-2', 'year-of-plenty'].forEach(card => assetData.developmentCards.push({ - type: 'progress', - card: card -})); - -[ 'market', 'library', 'palace', 'university'].forEach(card => assetData.developmentCards.push({ - type: 'vp', - card: card -})); - const games = {}; const processTies = (players) => { @@ -301,7 +282,7 @@ const distributeResources = (game, roll) => { let tiles = []; for (let i = 0; i < game.pipOrder.length; i++) { let index = game.pipOrder[i]; - if (assetData.pips[index].roll === roll) { + if (staticData.pips[index].roll === roll) { if (game.robber === i) { addChatMessage(game, null, `That pesky ${game.robberName} Roberson stole resources!`); } else { @@ -418,24 +399,28 @@ const processRoll = (game, dice) => { } } +const newPlayer = () => { + return { + roads: MAX_ROADS, + cities: MAX_CITIES, + settlements: MAX_SETTLEMENTS, + points: 0, + status: "Not active", + lastActive: 0, + order: 0, + stone: 0, + wheat: 0, + sheep: 0, + wood: 0, + brick: 0, + army: 0, + development: [] + }; +} + const getPlayer = (game, color) => { if (!game) { - return { - roads: MAX_ROADS, - cities: MAX_CITIES, - settlements: MAX_SETTLEMENTS, - points: 0, - status: "Not active", - lastActive: 0, - order: 0, - stone: 0, - wheat: 0, - sheep: 0, - wood: 0, - brick: 0, - army: 0, - development: [] - }; + return newPlayer(); } return game.players[color]; @@ -514,7 +499,7 @@ const loadGame = async (id) => { if (!game.pips || !game.borders || !game.tiles) { [ "pips", "borders", "tiles" ].forEach((field) => { - game[field] = assetData[field] + game[field] = staticData[field] }); } @@ -792,9 +777,9 @@ const setPlayerName = (game, session, name) => { const tmp = game.sessions[key]; if (tmp.name && tmp.name.toLowerCase() === name.toLowerCase()) { if (!tmp.player || (Date.now() - tmp.player.lastActive) > 60000) { - tmp.player = game.sessions[key]; - session.color = game.sessions[key].color; - session.initialSettlement = game.sessions[key].initialSettlement; + session.color = tmp.color; + session.player = tmp.player; + session.initialSettlement = tmp.initialSettlement; delete game.sessions[key]; } else { return `${name} is already taken and has been active in the last minute.`; @@ -2440,7 +2425,7 @@ router.put("/:id/:action/:value?", async (req, res) => { if (session.initialSettlement) { layout.tiles.forEach((tile, index) => { if (tile.corners.indexOf(session.initialSettlement) !== -1) { - const resource = assetData.tiles[game.tileOrder[index]].type; + const resource = staticData.tiles[game.tileOrder[index]].type; if (!(resource in receives)) { receives[resource] = 0; } @@ -2734,55 +2719,29 @@ const sendGame = async (req, res, game, error) => { const resetGame = (game) => { - game.state = 'lobby'; - game.turns = 0; - - game.placements = { - corners: [], - roads: [] - }; - Object.assign(game, { + state: 'lobby', + turn: 0, sheep: 19, ore: 19, wool: 19, brick: 19, wheat: 19, - longestRoad: null, - largestArmy: null, - developmentCards: assetData.developmentCards.slice(), - turn: {} + placements: { + corners: [], + roads: [] + }, + developmentCards: [], + turn: {}, }); - for (let key in game.players) { - Object.assign(game.players[key], { - wheat: 0, - sheep: 0, - stone: 0, - brick: 0, - wood: 0, - roads: MAX_ROADS, - cities: MAX_CITIES, - settlements: MAX_SETTLEMENTS, - points: 0, - development: [], - banks: [], - army: 0, - playedCard: 0, - haveResources: false, - unplayed: 0, - longestRoad: 0, - mustDiscard: 0, - gives: [], - gets: [] - }); - game.players[key].order = 0; - delete game.players[key].orderRoll; - delete game.players[key].orderStatus; - } - - shuffle(game.developmentCards); - + delete game.longestRoad; + delete game.longestArmy; + delete game.longestRoadLength; + delete game.winner; + delete game.longestRoad; + + /* Populate the game corner and road placement data as cleared */ for (let i = 0; i < layout.corners.length; i++) { game.placements.corners[i] = { color: undefined, @@ -2796,6 +2755,44 @@ const resetGame = (game) => { type: undefined }; } + + /* Populate the game development cards with a fresh deck */ + for (let i = 1; i <= 14; i++) { + game.developmentCards.push({ + type: 'army', + card: i + }); + } + + [ 'monopoly', 'road-1', 'road-2', 'year-of-plenty'] + .forEach(card => game.developmentCards.push({ + type: 'progress', + card: card + })); + + [ 'market', 'library', 'palace', 'university'] + .forEach(card => game.developmentCards.push({ + type: 'vp', + card: card + })); + + shuffle(game.developmentCards); + + /* Reset all player data */ + game.players = { + R: getPlayer(), + O: getPlayer(), + B: getPlayer(), + W: getPlayer() + }; + + /* Reconnect sessions to new player objects */ + for (let key in game.sessions) { + const session = game.sessions[key]; + if (session.color) { + session.player = game.players[session.color]; + } + } } const createGame = (id) => { @@ -2814,26 +2811,6 @@ const createGame = (id) => { } const game = { - startTime: Date.now(), - turns: 0, - state: "lobby", /* lobby, active, finished */ - tokens: [], - players: { - R: getPlayer(), - O: getPlayer(), - B: getPlayer(), - W: getPlayer() - }, - developmentCards: assetData.developmentCards.slice(), - dice: [ 0, 0 ], - sheep: 19, - ore: 19, - wool: 19, - brick: 19, - wheat: 19, - longestRoad: null, - largestArmy: null, - chat: [], id: id }; @@ -2842,13 +2819,14 @@ const createGame = (id) => { `New game created with Beginner's Layout: ${game.id}`); [ "pips", "borders", "tiles" ].forEach((field) => { - game[field] = assetData[field] + game[field] = staticData[field] }); resetGame(game); games[game.id] = game; setBeginnerGame(game); + return game; };