diff --git a/server/routes/games.js b/server/routes/games.js index f4ad761..075a573 100755 --- a/server/routes/games.js +++ b/server/routes/games.js @@ -270,14 +270,7 @@ const roll = (game, session) => { error = `You already rolled this turn.`; break; } - game.dice = [ Math.ceil(Math.random() * 6), Math.ceil(Math.random() * 6) ]; - addChatMessage(game, session, `${name} rolled ${game.dice[0]}, ${game.dice[1]}.`); - game.turn.roll = game.dice[0] + game.dice[1]; - if (game.turn.roll === 7) { - addChatMessage(game, null, `ROBBER! ROBBER! ROBBER!`); - } else { - distributeResources(game, game.turn.roll); - } + processRoll(game, [ Math.ceil(Math.random() * 6), Math.ceil(Math.random() * 6) ]); break; default: @@ -341,6 +334,26 @@ const distributeResources = (game, roll) => { } } +const processRoll = (game, dice) => { + let session; + for (let id in game.sessions) { + if (game.sessions[id].name === game.turn.name) { + session = game.sessions[id]; + } + } + if (!session) { + console.error(`Cannot process roll without an active player session`); + return; + } + game.dice = dice; + addChatMessage(game, session, `${session.name} rolled ${game.dice[0]}, ${game.dice[1]}.`); + game.turn.roll = game.dice[0] + game.dice[1]; + if (game.turn.roll === 7) { + addChatMessage(game, null, `ROBBER! ROBBER! ROBBER!`); + } else { + distributeResources(game, game.turn.roll); + } +} const getPlayer = (game, color) => { if (!game) { return { @@ -471,20 +484,37 @@ const adminActions = (game, action, value) => { break; case "roll": - let dice = value.replace(/.*-/, ''); - switch (value.replace(/-.*/, '')) { - case 'orange': color = 'O'; break; - case 'red': color = 'R'; break; - case 'blue': color = 'B'; break; - case 'white': color = 'W'; break; + let parts = value.match(/^([1-6])(-([1-6]))?$/); + if (!parts) { + return `Unable to parse roll request.`; } - if (!color) { - return `Unable to find player ${value.replace(/-.*/, '')}` + let dice = [ parseInt(parts[1]) ]; + if (parts[3]) { + dice.push(parseInt(parts[3])); + } + let session; + for (let id in game.sessions) { + if (game.sessions[id].name === game.turn.name) { + session = game.sessions[id]; + } + } + if (!session) { + return `Unable to determine current player turn for admin roll.`; + } + console.log(dice, parts); + addChatMessage(game, null, `Admin rolling ${dice.join(', ')} for ${game.turn.name}.`); + switch (game.state) { + case 'game-order': + game.dice = dice; + message = `${game.turn.name} rolled ${game.dice[0]}.`; + addChatMessage(game, session, message); + message = undefined; + processGameOrder(game, session.player, game.dice[0]); + break; + case 'normal': + processRoll(game, dice); + break; } - - addChatMessage(game, null, `Admin rolled ${dice} for ${color}.`); - player = game.players[color]; - processGameOrder(game, player, dice); break; case "kick":