+ },
+ handleScroll: function(e) {
+ // NOTE: since game.mode=="analyze" => no score, next condition is enough
+ if (this.game.score != "*") {
+ e.preventDefault();
+ if (e.deltaY < 0) this.undo();
+ else if (e.deltaY > 0) this.play();
+ }
+ },
+ showRules: function() {
+ //this.$router.push("/variants/" + this.game.vname);
+ window.open("#/variants/" + this.game.vname, "_blank"); //better
+ },
+ re_setVariables: function() {
+ this.endgameMessage = "";
+ this.orientation = this.game.mycolor || "w"; //default orientation for observed games
+ this.moves = JSON.parse(JSON.stringify(this.game.moves || []));
+ // Post-processing: decorate each move with color + current FEN:
+ // (to be able to jump to any position quickly)
+ let vr_tmp = new V(this.game.fenStart); //vr is already at end of game
+ this.firstMoveNumber = Math.floor(
+ V.ParseFen(this.game.fenStart).movesCount / 2
+ );
+ this.moves.forEach(move => {
+ // NOTE: this is doing manually what play() function below achieve,
+ // but in a lighter "fast-forward" way
+ move.color = vr_tmp.turn;
+ move.notation = vr_tmp.getNotation(move);
+ vr_tmp.play(move);
+ move.fen = vr_tmp.getFen();
+ });
+ if (
+ (this.moves.length > 0 && this.moves[0].color == "b") ||
+ (this.moves.length == 0 && vr_tmp.turn == "b")
+ ) {
+ // 'end' is required for Board component to check lastMove for e.p.
+ this.moves.unshift({
+ color: "w",
+ notation: "...",
+ end: { x: -1, y: -1 }
+ });
+ }
+ const L = this.moves.length;
+ this.cursor = L - 1;
+ this.lastMove = L > 0 ? this.moves[L - 1] : null;
+ this.incheck = this.vr.getCheckSquares(this.vr.turn);
+ },
+ analyzePosition: function() {
+ const newUrl =
+ "/analyse/" +
+ this.game.vname +
+ "/?fen=" +
+ this.vr.getFen().replace(/ /g, "_");
+ // Open in same tab in live games (against cheating)
+ if (this.game.type == "live") this.$router.push(newUrl);
+ else window.open("#" + newUrl);