add support for ending game from game record to game service

This commit is contained in:
sorrelbri 2020-07-01 14:32:03 -07:00
parent cbf9d461ba
commit c4192f2e33
3 changed files with 30 additions and 4 deletions

View file

@ -181,13 +181,18 @@ const Game = ({ gameData = {}, gameRecord = [] } = {}) => {
this.kos = []; this.kos = [];
}, },
}; };
if (gameRecord.length) { if (gameRecord.length) {
// play through all the moves // play through all the moves
return gameRecord.reduce( const game = gameRecord.reduce(
(game, move) => game.makeMove(move), (game, move) => game.makeMove(move),
Game({ gameData }).initGame() Game({ gameData }).initGame()
); );
// ? why is this being wrapped?
if (gameData.gameData.winner) {
const { winner, score } = gameData.gameData;
return game.manualEnd({ winner, score });
}
return game;
} }
return { return {
winner: gameData.winner || null, winner: gameData.winner || null,
@ -389,6 +394,14 @@ const Game = ({ gameData = {}, gameRecord = [] } = {}) => {
this.playerState.bScore - (this.playerState.wScore + this.komi); this.playerState.bScore - (this.playerState.wScore + this.komi);
return { ...this, score, winner: score > 0 ? 1 : -1 }; return { ...this, score, winner: score > 0 ? 1 : -1 };
}, },
// for playing historic games
manualEnd: function ({ winner, score }) {
this.turn = 0;
this.winner = winner;
this.score = score;
return this;
},
}; };
}; };

View file

@ -11,7 +11,6 @@ const GameService = ({ moveQueries, gameQueries }) => {
initGame({ id, gameRecord = [], ...gameData }) { initGame({ id, gameRecord = [], ...gameData }) {
if (gamesInProgress[id]) return this.getDataForUI(id); if (gamesInProgress[id]) return this.getDataForUI(id);
if (gameRecord.length) { if (gameRecord.length) {
console.log("here");
gamesInProgress[id] = Game({ gameData, gameRecord }); gamesInProgress[id] = Game({ gameData, gameRecord });
} else { } else {
gamesInProgress[id] = Game({ gameData }).initGame(); gamesInProgress[id] = Game({ gameData }).initGame();

View file

@ -24,8 +24,22 @@ io.on("connection", async (socket) => {
socket.on("connect_game", (data) => { socket.on("connect_game", (data) => {
const game = `game-${data.game.id}`; const game = `game-${data.game.id}`;
socket.join(game, async () => { socket.join(game, async () => {
const gameData = await gameQueries.findGameById(data.game.id);
const convertWinType = (winType) => {
if (winType.includes("B")) return 1;
if (winType.includes("W")) return -1;
if (winType.includes("0")) return "D";
return "?";
};
gameData.winner = gameData.win_type
? convertWinType(gameData.win_type)
: 0;
const gameRecord = await moveQueries.findGameRecord(data.game.id); const gameRecord = await moveQueries.findGameRecord(data.game.id);
await gameServices.initGame({ id: data.game.id, gameRecord }); await gameServices.initGame({
id: data.game.id,
gameRecord,
gameData,
});
const { board, ...meta } = await gameServices.getDataForUI( const { board, ...meta } = await gameServices.getDataForUI(
data.game.id data.game.id
); );