diff --git a/packages/play-node-go/src/components/GameUI/PlayerArea/PlayerArea.js b/packages/play-node-go/src/components/GameUI/PlayerArea/PlayerArea.js index e0b9d75..1f13574 100644 --- a/packages/play-node-go/src/components/GameUI/PlayerArea/PlayerArea.js +++ b/packages/play-node-go/src/components/GameUI/PlayerArea/PlayerArea.js @@ -1,7 +1,12 @@ import React from "react"; import "./PlayerArea.scss"; -const PlayerArea = ({ handleResignClick, playerMeta, turn }) => { +const PlayerArea = ({ + handleResignClick, + handlePassClick, + playerMeta, + turn, +}) => { const { stones, player, rank, captures } = playerMeta; const isTurn = (stones === "black" && turn === 1) || (stones === "white" && turn === -1); @@ -10,7 +15,9 @@ const PlayerArea = ({ handleResignClick, playerMeta, turn }) => {
handlePassClick(stones) } + : null)} >

Pass?

diff --git a/packages/play-node-go/src/pages/Game/Game.js b/packages/play-node-go/src/pages/Game/Game.js index cb34e49..8b9c563 100644 --- a/packages/play-node-go/src/pages/Game/Game.js +++ b/packages/play-node-go/src/pages/Game/Game.js @@ -70,6 +70,15 @@ const Game = (props) => { dispatch(action); }; + const handlePassClick = (player) => { + const action = { + type: "SOCKET", + message: "PASS", + body: { game, player }, + }; + dispatch(action); + }; + return (
@@ -94,6 +103,7 @@ const Game = (props) => {
{ /> { return { ...state, board: action.body.board, + territory: action.body.territory, meta: { gameRecord, pass, turn, winner, playerState }, }; } diff --git a/packages/play-node-go/src/reducers/socket/reducer.socket.js b/packages/play-node-go/src/reducers/socket/reducer.socket.js index 882da99..4e1f0a1 100644 --- a/packages/play-node-go/src/reducers/socket/reducer.socket.js +++ b/packages/play-node-go/src/reducers/socket/reducer.socket.js @@ -38,6 +38,10 @@ export const socketReducer = (state, action) => { return resign(state, action); } + case "PASS": { + return pass(state, action); + } + default: return state; } @@ -72,3 +76,9 @@ function resign(state, action) { socket.emit("resign", { ...action.body }); return state; } + +function pass(state, action) { + const socket = state.socket; + socket.emit("pass", { ...action.body }); + return state; +} diff --git a/packages/server/services/Game.js b/packages/server/services/Game.js index c92f16a..38d3521 100644 --- a/packages/server/services/Game.js +++ b/packages/server/services/Game.js @@ -199,6 +199,7 @@ const Game = ({ gameData = {}, gameRecord = [] } = {}) => { score: 0, groups: {}, // key is Symbol(position): {points: Set(), liberties: Set()} boardState: {}, + territory: {}, kos: [], gameRecord: gameRecord, playerState: gameData.playerState || { @@ -241,6 +242,7 @@ const Game = ({ gameData = {}, gameRecord = [] } = {}) => { if (this.pass > 1) { return { ...this, success: false }; } + if (x === 0) return this.submitPass(player); let game = this; let success = false; const point = game.boardState[`${x}-${y}`]; @@ -342,7 +344,7 @@ const Game = ({ gameData = {}, gameRecord = [] } = {}) => { this.boardState = boardState; // submit board state to users this.turn = 0; - return this; + return { ...this, territory: getTerritory(this) }; }, toggleTerritory: function (key) { diff --git a/packages/server/services/gameServices.js b/packages/server/services/gameServices.js index 22028e0..5a915a8 100644 --- a/packages/server/services/gameServices.js +++ b/packages/server/services/gameServices.js @@ -59,6 +59,7 @@ const GameService = (moveQueries) => { getDataForUI: (id) => { return { board: gamesInProgress[id].legalMoves, + territory: gamesInProgress[id].territory, ...gamesInProgress[id].getMeta(), }; }, @@ -74,6 +75,31 @@ const GameService = (moveQueries) => { resign: ({ id, player }) => { return gamesInProgress[id].submitResign(player).getMeta(); }, + + async pass({ id, player }) { + gamesInProgress[id] = gamesInProgress[id].submitPass(player); + if (gamesInProgress[id].success === false) + return { message: "illegal move" }; + try { + if (moveQueries) { + const priorMove = gamesInProgress[id].gameRecord.length; + const movePass = { + gameId: id, + player, + x: 0, + y: 0, + gameRecord: true, + priorMove, + }; + let moveDbResult; + moveDbResult = await moveQueries.addMove(movePass); + } + } catch { + gamesInProgress[id].returnToMove(-1); + } finally { + return this.getDataForUI(id); + } + }, }; }; diff --git a/packages/server/socket.js b/packages/server/socket.js index 03aa3d2..2cfaedd 100644 --- a/packages/server/socket.js +++ b/packages/server/socket.js @@ -28,6 +28,8 @@ io.on("connection", async (socket) => { io.of(room).to(game).emit("game_connected", { board, meta }); }); }); + + // MAKE MOVE socket.on("make_move", async (data) => { const { user, move, board, game, room } = data; const gameNsp = `game-${data.game.id}`; @@ -50,6 +52,8 @@ io.on("connection", async (socket) => { }); } }); + + // RESIGN socket.on("resign", async ({ game, player }) => { const { id, room } = game; const gameNsp = `game-${id}`; @@ -65,6 +69,29 @@ io.on("connection", async (socket) => { console.log(e); } }); + // PASS + socket.on("pass", async ({ game, player }) => { + const { id, room } = game; + const gameNsp = `game${id}`; + try { + const { + board, + message, + territory, + ...meta + } = await gameServices.pass({ + id, + player, + }); + socket.join(gameNsp, () => { + io.of(room) + .to(gameNsp) + .emit("update_board", { board, message, territory, meta }); + }); + } catch (e) { + console.log(e); + } + }); }); }); });