diff --git a/packages/server/services/Game.js b/packages/server/services/Game.js index 04f79e5..fcf679e 100644 --- a/packages/server/services/Game.js +++ b/packages/server/services/Game.js @@ -232,6 +232,7 @@ const Game = ({gameData = {}, gameRecord = []} = {}) => { || ( game.turn === -1 && player === 'white' ); if (isTurn) { if (point.legal) { + game.pass = 0; game.addToRecord({ player, pos: { x, y } }); if (this.kos.length) helper.clearKo.call(this); point.makeMove(game); @@ -269,6 +270,10 @@ const Game = ({gameData = {}, gameRecord = []} = {}) => { if (player !== 'black' && player !== 'white') { return { ...this, success: false }; } + if (this.pass > 0) { + return this.endGame(); + } + this.pass = 1; this.addToRecord({ player, pos: { x: null, y: null } }); if (this.kos.length) helper.clearKo.call(this); this.turn = player === 'black' ? -1 : 1; @@ -281,6 +286,12 @@ const Game = ({gameData = {}, gameRecord = []} = {}) => { if (player === 'white') this.winner = 1; this.turn = 0; return this; + }, + + endGame: function() { + // TODO manage territory counting + this.turn = 0; + return this; } } }; diff --git a/packages/server/test/Game.spec.js b/packages/server/test/Game.spec.js index b233a3d..6149bb3 100644 --- a/packages/server/test/Game.spec.js +++ b/packages/server/test/Game.spec.js @@ -509,6 +509,40 @@ describe('Game end logic', () => { Game().initGame().submitPass('black').getMeta() .gameRecord.should.eql([ { player: 'black', pos: { x: null, y: null } } ]) done(); + }); + + it('move after makes normal change in game state', done => { + Game().initGame() + .makeMove({ player: 'black', pos: { x: 4, y: 4 } }) + .makeMove({ player: 'white', pos: { x: 4, y: 5 } }) + .makeMove({ player: 'black', pos: { x: 5, y: 3 } }) + .submitPass('white') + .makeMove({ player: 'black', pos: { x: 16, y: 16 } }) + .legalMoves.should.eql({...emptyBoard, '4-4': 1, '4-5': -1, '5-3': 1, '16-16': 1}) + done(); + }); + + it('two nonconsecutive passes continue game', done => { + Game().initGame() + .makeMove({ player: 'black', pos: { x: 4, y: 4 } }) + .makeMove({ player: 'white', pos: { x: 4, y: 5 } }) + .makeMove({ player: 'black', pos: { x: 5, y: 3 } }) + .submitPass('white') + .makeMove({ player: 'black', pos: { x: 16, y: 16 } }) + .submitPass('white') + .getMeta().should.eql({...initialMeta, pass: 1, turn: 1, gameRecord: [ { player: 'black', pos: { x: 4, y: 4 } }, { player: 'white', pos: { x: 4, y: 5 } }, { player: 'black', pos: { x: 5, y: 3 } }, { player: 'white', pos: { x: null, y: null } }, { player: 'black', pos: { x: 16, y: 16 } }, { player: 'white', pos: { x: null, y: null } } ]}) + done(); + }); + + it('consecutive passes end game', done => { + Game().initGame() + .makeMove({ player: 'black', pos: { x: 4, y: 4 } }) + .makeMove({ player: 'white', pos: { x: 4, y: 5 } }) + .makeMove({ player: 'black', pos: { x: 5, y: 3 } }) + .submitPass('white') + .submitPass('black') + .turn.should.eql(0); + done(); }) })