+ data: { gid: this.gameRef },
+ success: (res) => {
+ res.game.moves.forEach(m => {
+ m.squares = JSON.parse(m.squares);
+ });
+ callback(res.game);
+ }
+ }
+ );
+ } else
+ // Local game (or live remote)
+ GameStorage.get(this.gameRef, callback);
+ },
+ re_setClocks: function() {
+ this.virtualClocks = this.game.clocks.map(s => ppt(s).split(':'));
+ if (this.game.moves.length < 2 || this.game.score != "*") {
+ // 1st move not completed yet, or game over: freeze time
+ return;
+ }
+ const currentTurn = this.vr.turn;
+ const currentMovesCount = this.game.moves.length;
+ const colorIdx = ["w", "b"].indexOf(currentTurn);
+ this.clockUpdate = setInterval(
+ () => {
+ if (
+ this.game.clocks[colorIdx] < 0 ||
+ this.game.moves.length > currentMovesCount ||
+ this.game.score != "*"
+ ) {
+ clearInterval(this.clockUpdate);
+ if (this.game.clocks[colorIdx] < 0)
+ this.gameOver(
+ currentTurn == "w" ? "0-1" : "1-0",
+ "Time"
+ );
+ } else {
+ this.$set(
+ this.virtualClocks,
+ colorIdx,
+ ppt(Math.max(0, --this.game.clocks[colorIdx])).split(':')
+ );
+ }
+ },
+ 1000
+ );
+ },
+ // Update variables and storage after a move:
+ processMove: function(move, data) {
+ if (!data) data = {};
+ const moveCol = this.vr.turn;
+ const colorIdx = ["w", "b"].indexOf(moveCol);
+ const nextIdx = 1 - colorIdx;
+ const doProcessMove = () => {
+ const origMovescount = this.game.moves.length;
+ // The move is (about to be) played: stop clock
+ clearInterval(this.clockUpdate);
+ if (moveCol == this.game.mycolor && !data.receiveMyMove) {
+ if (this.drawOffer == "received")
+ // I refuse draw
+ this.drawOffer = "";
+ if (this.game.type == "live" && origMovescount >= 2) {
+ this.game.clocks[colorIdx] += this.game.increment;
+ // For a correct display in casqe of disconnected opponent:
+ this.$set(
+ this.virtualClocks,
+ colorIdx,
+ ppt(this.game.clocks[colorIdx]).split(':')
+ );
+ GameStorage.update(this.gameRef, {
+ // It's not my turn anymore:
+ initime: null
+ });
+ }
+ }
+ // Update current game object:
+ playMove(move, this.vr);
+ if (!data.score)
+ // Received move, score is computed in BaseGame, but maybe not yet.
+ // ==> Compute it here, although this is redundant (TODO)
+ data.score = this.vr.getCurrentScore();
+ if (data.score != "*") this.gameOver(data.score);
+ this.game.moves.push(move);
+ this.game.fen = this.vr.getFen();
+ if (this.game.type == "corr") {
+ // In corr games, just reset clock to mainTime:
+ this.game.clocks[colorIdx] = extractTime(this.game.cadence).mainTime;
+ }
+ // If repetition detected, consider that a draw offer was received:
+ const fenObj = this.vr.getFenForRepeat();
+ this.repeat[fenObj] =
+ !!this.repeat[fenObj]
+ ? this.repeat[fenObj] + 1
+ : 1;
+ if (this.repeat[fenObj] >= 3) this.drawOffer = "threerep";
+ else if (this.drawOffer == "threerep") this.drawOffer = "";
+ if (!!this.game.mycolor && !data.receiveMyMove) {
+ // NOTE: 'var' to see that variable outside this block
+ var filtered_move = getFilteredMove(move);
+ }
+ if (moveCol == this.game.mycolor && !data.receiveMyMove) {
+ // Notify turn on MyGames page:
+ this.notifyMyGames(
+ "turn",