+ type: gtype,
+ increment: tc.increment,
+ mycolor: mycolor,
+ // opponent sid not strictly required (or available), but easier
+ // at least oppsid or oppid is available anyway:
+ oppsid: myIdx < 0 ? undefined : game.players[1 - myIdx].sid,
+ oppid: myIdx < 0 ? undefined : game.players[1 - myIdx].uid,
+ movesCount: game.moves.length
+ },
+ game,
+ );
+ this.re_setClocks();
+ this.$nextTick(() => {
+ this.game.rendered = true;
+ // Did lastate arrive before game was rendered?
+ if (this.lastate) this.processLastate();
+ });
+ if (callback) callback();
+ };
+ if (game) {
+ afterRetrieval(game);
+ return;
+ }
+ if (this.gameRef.rid) {
+ // Remote live game: forgetting about callback func... (TODO: design)
+ this.send("askfullgame", { target: this.gameRef.rid });
+ } else {
+ // Local or corr game
+ // NOTE: afterRetrieval() is never called if game not found
+ GameStorage.get(this.gameRef.id, afterRetrieval);
+ }
+ },
+ re_setClocks: function() {
+ if (this.game.movesCount < 2 || this.game.score != "*") {
+ // 1st move not completed yet, or game over: freeze time
+ this.virtualClocks = this.game.clocks.map(s => ppt(s));
+ return;
+ }
+ const currentTurn = this.vr.turn;
+ const currentMovesCount = this.game.moves.length;
+ const colorIdx = ["w", "b"].indexOf(currentTurn);
+ let countdown =
+ this.game.clocks[colorIdx] -
+ (Date.now() - this.game.initime[colorIdx]) / 1000;
+ this.virtualClocks = [0, 1].map(i => {
+ const removeTime =
+ i == colorIdx ? (Date.now() - this.game.initime[colorIdx]) / 1000 : 0;
+ return ppt(this.game.clocks[i] - removeTime);
+ });
+ let clockUpdate = setInterval(() => {
+ if (
+ countdown < 0 ||
+ this.game.moves.length > currentMovesCount ||
+ this.game.score != "*"
+ ) {
+ clearInterval(clockUpdate);
+ if (countdown < 0)
+ this.gameOver(
+ currentTurn == "w" ? "0-1" : "1-0",
+ "Time"
+ );
+ } else
+ this.$set(
+ this.virtualClocks,
+ colorIdx,
+ ppt(Math.max(0, --countdown))
+ );
+ }, 1000);
+ },
+ // Post-process a (potentially partial) move (which was just played in BaseGame)
+ // TODO?: wait for AJAX return to finish processing a move,
+ // and for opponent pingback in case of live game : if none received after e.g. 500ms, re-send newmove
+ // ...and provide move index with newmove event for basic check after receiving
+ processMove: function(move, data) {
+ const moveCol = this.vr.turn;
+ const doProcessMove = () => {
+ const colorIdx = ["w", "b"].indexOf(moveCol);
+ const nextIdx = 1 - colorIdx;
+ if (this.game.mycolor) {
+ // NOTE: 'var' to see that variable outside this block
+ var filtered_move = getFilteredMove(move);
+ }
+ // Send move ("newmove" event) to people in the room (if our turn)
+ let addTime = (data && this.game.type == "live") ? data.addTime : 0;
+ if (moveCol == this.game.mycolor) {
+ if (this.drawOffer == "received")
+ // I refuse draw
+ this.drawOffer = "";
+ // 'addTime' is irrelevant for corr games:
+ if (this.game.type == "live" && this.game.movesCount >= 2) {
+ const elapsed = Date.now() - this.game.initime[colorIdx];
+ // elapsed time is measured in milliseconds
+ addTime = this.game.increment - elapsed / 1000;