From 37467c7377d51e18de1d9b2ce40d7b082b0eaa6c Mon Sep 17 00:00:00 2001 From: James Ketrenos Date: Thu, 10 Feb 2022 18:17:56 -0800 Subject: [PATCH] Added more Robber processing Signed-off-by: James Ketrenos --- client/src/Board.css | 27 ++++++- client/src/Board.js | 93 ++++++++++++++++++---- client/src/Table.css | 6 ++ client/src/Table.js | 64 ++++++++++++--- client/src/assets/man-robber.png | Bin 0 -> 27474 bytes client/src/assets/woman-robber.png | Bin 0 -> 24496 bytes server/routes/games.js | 122 ++++++++++++++++++++++++++++- 7 files changed, 282 insertions(+), 30 deletions(-) create mode 100755 client/src/assets/man-robber.png create mode 100755 client/src/assets/woman-robber.png diff --git a/client/src/Board.css b/client/src/Board.css index aff39ba..547531e 100644 --- a/client/src/Board.css +++ b/client/src/Board.css @@ -33,13 +33,15 @@ background-size: 600% auto; /* pip-numbers is a 6x6 grid of pip images */ width: 2em; height: 2em; - transform: translate(-50%, -50%); + transform: translate(-50%, -50%); } .Pip.Active { filter: drop-shadow(0px 0px 5px rgba(255, 255, 0, 0.9)); } +.Pips[disabled], +.Tiles[disabled], .Roads[disabled], .Corners[disabled] { pointer-events: none; @@ -107,19 +109,40 @@ right: 0px; top: 0px; bottom: 0px; - clip-path: circle(50%); + /* clip-path: circle(50%);*/ } +.Tile-Shape { + display: flex; + position: absolute; + left: 0px; + right: 0px; + top: 0px; + bottom: 0px; + clip-path: polygon(25% 0%,75% 0%,100% 50%,75% 100%,25% 100%,0% 50%); +} .Option { + cursor: pointer; pointer-events: all; } +.Option .Pip-Shape, +.Option .Tile-Shape, .Option .Corner-Shape, .Option .Road-Shape { background-color: rgba(255, 255, 255, 0.5); } +.Robber .Pip-Shape, +.Pip-Shape:hover { + clip-path: circle(45%); /* show through the border */ + background-size: contain; + background-position: center; + background-image:url("./assets/woman-robber.png"); +} + +.Tile-Shape:hover, .Corner-Shape:hover, .Road-Shape:hover { background-color: white; diff --git a/client/src/Board.js b/client/src/Board.js index 4e1deb2..e4cfae3 100644 --- a/client/src/Board.js +++ b/client/src/Board.js @@ -47,8 +47,8 @@ const Board = ({ table, game }) => { height: `${tileImageHeight}px`, backgroundImage: `url(${assetsPath}/gfx/tiles-${tile.type}.png)`, backgroundPositionY: `-${tile.card*tileHeight}px` - }} - />; + }} + >
; }; const Road = ({road}) => { @@ -85,6 +85,27 @@ const Board = ({ table, game }) => { >
; }; + const Pip = ({pip}) => { + const onClick = (event) => { + console.log(`Pip ${pip.index}:`, game.layout.corners[pip.index]); + table.placeRobber(pip.index); + return; + }; + + return
; + }; + const generateRoads = () => { let row = 0, rowCount = 0; let y = -2.5 + tileHalfWidth - (rows.length - 1) * 0.5 * tileWidth, @@ -229,20 +250,21 @@ const Board = ({ table, game }) => { let row = 0, rowCount = 0; let y = tileHalfWidth - (rows.length - 1) * 0.5 * tileWidth, x = -(rows[row] - 1) * 0.5 * tileHeight; + let index = 0; + let pip; return game.pipOrder.map(order => { - const pip = game.pips[order]; - const div =
; + />; if (++rowCount === rows[row]) { row++; @@ -389,10 +411,11 @@ const Board = ({ table, game }) => { } }); /* Clear all 'Option' targets */ - const nodes = document.querySelectorAll(`.Option`); + let nodes = document.querySelectorAll(`.Option`); for (let i = 0; i < nodes.length; i++) { nodes[i].classList.remove('Option'); } + /* Add 'Option' based on game.turn.limits */ if (game.turn && game.turn.limits) { if (game.turn.limits['roads']) { @@ -413,6 +436,38 @@ const Board = ({ table, game }) => { el.classList.add('Option'); }); } + if (game.turn.limits['tiles']) { + game.turn.limits['tiles'].forEach(index => { + const el = document.querySelector(`.Tile[data-index="${index}"]`); + if (!el) { + return; + } + el.classList.add('Option'); + }); + } + if (game.turn.limits['pips']) { + game.turn.limits['pips'].forEach(index => { + const el = document.querySelector(`.Pip[data-index="${index}"]`); + if (!el) { + return; + } + el.classList.add('Option'); + }); + } + } + } + + if (game) { + let nodes = document.querySelectorAll(`.Pip .Robber`); + for (let i = 0; i < nodes.length; i++) { + nodes[i].classList.remove('Robber'); + } + + if (game.robber) { + const el = document.querySelector(`.Pip[data-index="${game.robber}"]`); + if (el) { + el.classList.add('Robber'); + } } } @@ -424,9 +479,13 @@ const Board = ({ table, game }) => {
{ borders } - { tiles } - { pips } { game && <> +
+ { tiles } +
+
+ { pips } +
{ corners }
diff --git a/client/src/Table.css b/client/src/Table.css index 0901d1c..287182d 100755 --- a/client/src/Table.css +++ b/client/src/Table.css @@ -306,9 +306,15 @@ } .Hand { + display: flex; min-height: calc(7.2em + 0.5em); } +.Hand > button { + align-self: center; + justify-self: center; +} + .Hand:hover .Stack:hover > *:not(:first-child) { margin-left: -2em; } diff --git a/client/src/Table.js b/client/src/Table.js index 09702fc..94e3b67 100755 --- a/client/src/Table.js +++ b/client/src/Table.js @@ -136,6 +136,7 @@ const Resource = ({ type, count }) => {
{ React.Children.map(array, i => (
@@ -336,6 +337,16 @@ const GameOrder = ({table}) => { }; const Action = ({ table }) => { + const discardClick = (event) => { + const nodes = document.querySelectorAll('.Hand .Selected'), + discarding = { wheat: 0, brick: 0, sheep: 0, stone: 0, wood: 0 }; + for (let i = 0; i < nodes.length; i++) { + discarding[nodes[i].getAttribute("data-type")]++; + nodes[i].classList.remove('Selected'); + } + return table.discard(discarding); + } + const newTableClick = (event) => { return table.shuffleTable(); }; @@ -357,7 +368,9 @@ const Action = ({ table }) => { return (); } - const inLobby = table.game.state === 'lobby'; + const inLobby = table.game.state === 'lobby', + player = table.game ? table.game.player : undefined; + return ( { inLobby && <> @@ -368,6 +381,9 @@ const Action = ({ table }) => { + { table.game.turn.roll === 7 && player && player.mustDiscard > 0 && + + } } { !inLobby && @@ -493,6 +509,7 @@ class Table extends React.Component { this.rollDice = this.rollDice.bind(this); this.setGameState = this.setGameState.bind(this); this.shuffleTable = this.shuffleTable.bind(this); + this.discard = this.discard.bind(this); this.passTurn = this.passTurn.bind(this); this.updateGame = this.updateGame.bind(this); this.setPlayerName = this.setPlayerName.bind(this); @@ -577,6 +594,10 @@ class Table extends React.Component { }); } + discard(resources) { + return this.sendAction('discard', undefined, resources); + } + passTurn() { return this.sendAction('pass'); }; @@ -662,6 +683,10 @@ class Table extends React.Component { }); } + placeRobber(robber) { + return this.sendAction('place-robber', robber); + }; + placeSettlement(settlement) { return this.sendAction('place-settlement', settlement); } @@ -813,6 +838,24 @@ class Table extends React.Component { case '': message = <>{message}The game is in a wonky state. Sorry :(; break; + case 'normal': + if (this.game && this.game.turn) { + if (this.game.turn.roll === 7) { + message = <>{message}Robber was rolled!; + let move = true; + for (let color in this.game.players) { + const discard = this.game.players[color].mustDiscard; + if (discard) { + move = false; + message = <>{message} needs to discard {discard} resources.; + } + } + if (move) { + message = <>{message} {this.game.turn.name} needs to move the robber. + } + } + } + break; default: message = <>{message}Game state is: {this.game.state}; break; @@ -909,15 +952,16 @@ class Table extends React.Component {
- - { player !== undefined &&
- - - - - -
} + + { player !== undefined &&
+ + + + + +
}
+ { game &&
{ this.state.message } {(this.state.pickName || !game.name) && } @@ -934,7 +978,7 @@ class Table extends React.Component { { game && game.turn && game.turn.color !== game.color && (game.state === 'initial-placement' || game.state === 'normal') && - + (!game.player || !game.player.mustDiscard) && } { game && game.showCards && diff --git a/client/src/assets/man-robber.png b/client/src/assets/man-robber.png new file mode 100755 index 0000000000000000000000000000000000000000..52d2b7d17844c2ca204585f1a89a269927c57178 GIT binary patch literal 27474 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 literal 0 HcmV?d00001 diff --git a/client/src/assets/woman-robber.png b/client/src/assets/woman-robber.png new file mode 100755 index 0000000000000000000000000000000000000000..007a774d550c45718302910146d3141ac1bee207 GIT binary patch literal 24496 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 literal 0 HcmV?d00001 diff --git a/server/routes/games.js b/server/routes/games.js index 075a573..e539491 100755 --- a/server/routes/games.js +++ b/server/routes/games.js @@ -291,7 +291,11 @@ const distributeResources = (game, roll) => { for (let i = 0; i < game.pipOrder.length; i++) { let index = game.pipOrder[i]; if (assetData.pips[index].roll === roll) { - tiles.push(i); + if (game.robber === i) { + addChatMessage(game, null, `That pesky Robber stole resources!`); + } else { + tiles.push(i); + } } } @@ -350,10 +354,40 @@ const processRoll = (game, dice) => { game.turn.roll = game.dice[0] + game.dice[1]; if (game.turn.roll === 7) { addChatMessage(game, null, `ROBBER! ROBBER! ROBBER!`); + for (let id in game.sessions) { + const player = game.sessions[id].player; + if (player) { + let discard = player.stone + player.wheat + player.brick + player.wood + player.sheep; + if (discard > 7) { + discard = Math.floor(discard / 2); + + player.mustDiscard = discard; + addChatMessage(game, null, `${game.sessions[id].name} must discard ${discard} resource cards.`); + } else { + delete player.mustDiscard; + } + } + } + /* + if you roll a 7, no one receives any resource cards. + instead, every player who has more than 7 resource cards must select + half (rounded down) of their + resource cards and return them to the bank. + then you muyst move the robber: + 1. you must move the robber immediately to the number token of any other + terrain ohex or to the desert hex, + 2. you then steal 1 (random) resourcde card from an opponent who has a settlement or city + adjacent to the target terrain hex. the player who is robbed holds their resource cards + face down. you then take 1 card at random. if the target hex is adjacent to 2 or + more player's settlements or cities, you choose which one you want to steal from. + If the production number for the hex containing the robber is rolled, the owners of + adjacent settlements and citieis do not receive resourcres. The robber prevents it. + */ } else { distributeResources(game, game.turn.roll); } } + const getPlayer = (game, color) => { if (!game) { return { @@ -846,6 +880,34 @@ router.put("/:id/:action/:value?", async (req, res) => { addChatMessage(game, null, `It is ${next}'s turn.`); } break; + case 'place-robber': + if (game.state !== 'normal' && game.turn.roll !== 7) { + error = `You cannot place robber unless 7 was rolled!`; + break; + } + if (game.turn.name !== name) { + error = `You cannot place the robber when it isn't your turn.`; + break; + } + for (let color in game.players) { + if (game.players[color].status === 'Not active') { + continue; + } + if (game.players[color].mustDiscard > 0) { + error = `You cannot place the robber until everyone has discarded!`; + break; + } + } + const robber = parseInt(value); + if (game.robber === robber) { + error = `You must move the robber to a new location!`; + break; + } + game.robber = robber; + game.turn.placedRobber = true; + addChatMessage(game, session, `Robber has been moved!`); + addChatMessage(game, null, 'TODO: Look up which players are on tile, then allow robber-roller to select which player to steal from.'); + break; case 'place-settlement': if (game.state !== 'initial-placement' && game.state !== 'normal') { error = `You cannot place an item unless the game is active.`; @@ -979,6 +1041,33 @@ router.put("/:id/:action/:value?", async (req, res) => { case 'place-city': error = `City placement not yet implemented!`; break; + case 'discard': + if (game.turn.roll !== 7) { + error = `You can only discard due to the Robber!`; + break; + } + const discards = req.body, player = session.player; + let sum = 0; + for (let type in discards) { + if (player[type] < parseInt(discards[type])) { + error = `You have requested to discard more ${type} than you have.` + break; + } + sum += parseInt(discards[type]); + } + if (sum > player.mustDiscard) { + error = `You have requested to discard more cards than you are allowed!`; + break; + } + for (let type in discards) { + player[type] -= parseInt(discards[type]); + player.mustDiscard -= parseInt(discards[type]) + } + addChatMessage(game, null, `${session.name} discarded ${sum} resource cards.`); + if (player.mustDiscard) { + addChatMessage(game, null, `${session.name} must discard ${player.mustDiscard} more cards.`); + } + break; case "state": const state = value; if (!state) { @@ -1048,6 +1137,28 @@ const sendGame = async (req, res, game, error) => { } game.active = active; + /* If the current turn is a robber placement, and everyone has + * discarded, set the limits for where the robber can be placed */ + if (game.turn.roll === 7) { + let move = true; + for (let color in game.players) { + const discard = game.players[color].mustDiscard; + if (discard) { + move = false; + } + } + if (move && !game.turn.placedRobber) { + game.turn.actions = [ 'place-robber' ]; + game.turn.limits = { pips: [] }; + for (let i = 0; i < 19; i++) { + if (i === game.robber) { + continue; + } + game.turn.limits.pips.push(i); + } + } + } + /* Update the session lastActive clock */ let session; if (req.session) { @@ -1117,6 +1228,14 @@ const resetGame = (game) => { roads: [] }; + for (let key in game.players) { + game.players[key].wheat = + game.players[key].sheep = + game.players[key].stone = + game.players[key].brick = + game.players[key].wood = 0; + } + for (let i = 0; i < layout.corners.length; i++) { game.placements.corners[i] = { color: undefined, @@ -1247,6 +1366,7 @@ const shuffleBoard = (game) => { * the target pip value to the currently incremeneting * pip value. */ if (game.tiles[game.tileOrder[target]].type === 'desert') { + game.robber = target; game.pipOrder[target] = 18; } else { game.pipOrder[target] = p++;