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);
+ }
+ });
});
});
});