X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fcomponents%2FBaseGame.vue;h=61c67dece3d7555b76d4c1ddb1cfdb7e5e630ac2;hb=1b56b73614509d1dca8c4353f18fb78349940cf8;hp=79f089e1f3bcaf07eaee1b0ed50590d551b5cc96;hpb=00eef1ca12534a43cb8e2e12155a46c00353eac2;p=vchess.git diff --git a/client/src/components/BaseGame.vue b/client/src/components/BaseGame.vue index 79f089e1..61c67dec 100644 --- a/client/src/components/BaseGame.vue +++ b/client/src/components/BaseGame.vue @@ -51,6 +51,7 @@ div#baseGame :firstNum="firstMoveNumber" :moves="moves" :cursor="cursor" + :vname="game.vname" @download="download" @showrules="showRules" @analyze="toggleAnalyze" @@ -86,6 +87,7 @@ export default { endgameMessage: "", orientation: "w", mode: "", + gameMode: "", score: "*", //'*' means 'unfinished' moves: [], cursor: -1, //index of the move just played @@ -140,7 +142,7 @@ export default { }, canAnalyze: function() { return ( - !!this.game.mode && this.game.mode != "analyze" && + (!this.game.mode || this.game.mode != "analyze") && !!this.vr && this.vr.canAnalyze ); }, @@ -228,35 +230,34 @@ export default { const firstMoveColor = parsedFen.turn; this.firstMoveNumber = Math.floor(parsedFen.movesCount / 2) + 1; let L = this.moves.length; - if (L == 0) { - // Could be started on a random position in analysis mode: - this.incheck = this.vr.getCheckSquares(); - this.score = this.vr.getCurrentScore(); - if (this.score != '*') { - // Show score on screen - const message = getScoreMessage(this.score); - this.showEndgameMsg(this.score + " . " + this.st.tr[message]); - } - } - else { - this.moves.forEach((move,idx) => { - // Strategy working also for multi-moves: - if (!Array.isArray(move)) move = [move]; - const Lm = move.length; - move.forEach((m,idxM) => { - m.notation = this.vr.getNotation(m); - m.unambiguous = V.GetUnambiguousNotation(m); - this.vr.play(m); - const checkSquares = this.vr.getCheckSquares(); - if (checkSquares.length > 0) m.notation += "+"; - if (idxM == Lm - 1) m.fen = this.vr.getFen(); - if (idx == L - 1 && idxM == Lm - 1) { - this.incheck = checkSquares; - this.score = this.vr.getCurrentScore(); - if (["1-0", "0-1"].includes(this.score)) m.notation += "#"; - } - }); + this.moves.forEach((move,idx) => { + // Strategy working also for multi-moves: + if (!Array.isArray(move)) move = [move]; + move.forEach(m => { + m.notation = this.vr.getNotation(m); + m.unambiguous = V.GetUnambiguousNotation(m); + this.vr.play(m); }); + const Lm = move.length; + move[Lm - 1].fen = this.vr.getFen(); + if (idx < L - 1 && this.vr.getCheckSquares().length > 0) + move[Lm - 1].notation += "+"; + }); + this.incheck = this.vr.getCheckSquares(); + this.score = this.vr.getCurrentScore(); + if (L >= 1) { + const move = + !Array.isArray(this.moves[L - 1]) + ? [this.moves[L - 1]] + : this.moves[L - 1]; + const Lm = move.length; + if (["1-0", "0-1"].includes(this.score)) move[Lm - 1].notation += "#"; + else if (this.incheck.length > 0) move[Lm - 1].notation += "+"; + } + if (this.score != '*') { + // Show score on screen + const message = getScoreMessage(this.score); + this.showEndgameMsg(this.score + " . " + this.st.tr[message]); } if (firstMoveColor == "b") { // 'start' & 'end' is required for Board component @@ -288,16 +289,16 @@ export default { } if (this.mode != "analyze") { // Enter analyze mode: + this.gameMode = this.mode; //was not 'analyze' this.mode = "analyze"; if (this.inMultimove) this.cancelCurrentMultimove(); - this.gameMode = this.mode; //was not 'analyze' this.gameCursor = this.cursor; this.gameMoves = JSON.parse(JSON.stringify(this.moves)); document.getElementById("analyzeBtn").classList.add("active"); } else { // Exit analyze mode: - this.mode = this.gameMode ; + this.mode = this.gameMode; this.cursor = this.gameCursor; this.moves = this.gameMoves; let fen = this.game.fenStart; @@ -431,8 +432,11 @@ export default { }, clickSquare: function(square) { // Some variants make use of a single click at specific times: - const move = this.vr.doClick(square); - if (!!move) this.play(move); + const move_s = this.vr.doClick(square); + if (!!move_s) { + if (!Array.isArray(move_s)) this.play(move_s); + else this.$refs["board"].choices = move_s; + } }, // "light": if gotoMove() or gotoEnd() play: function(move, received, light, autoplay) { @@ -463,11 +467,11 @@ export default { this.stackToPlay.unshift(move); return; } - this.inPlay = true; if (this.mode == "analyze") this.toggleAnalyze(); if (this.cursor < this.moves.length - 1) // To play a received move, cursor must be at the end of the game: this.gotoEnd(); + this.inPlay = true; } // The board may show some possible moves: (TODO: bad solution) this.$refs["board"].resetCurrentAttempt(); @@ -480,9 +484,6 @@ export default { this.lastMove = [this.lastMove, smove]; else this.lastMove.push(smove); } - // Is opponent (or me) in check? - this.incheck = this.vr.getCheckSquares(); - if (this.incheck.length > 0) smove.notation += "+"; if (!this.inMultimove) { // First sub-move: this.lastMove = smove; @@ -514,8 +515,9 @@ export default { (function executeMove() { const smove = move[moveIdx++]; // NOTE: condition "smove.start.x >= 0" required for Dynamo, - // because second move may be empty. - if (animate && smove.start.x >= 0) { + // because second move may be empty. noHighlight condition + // is used at least for Chakart. + if (animate && smove.start.x >= 0 && !smove.end.noHighlight) { self.animateMove(smove, () => { playSubmove(smove); if (moveIdx < move.length) setTimeout(executeMove, 500); @@ -554,6 +556,8 @@ export default { smove.fen = this.vr.getFen(); this.emitFenIfAnalyze(); this.inMultimove = false; + this.incheck = this.vr.getCheckSquares(); + if (this.incheck.length > 0) smove.notation += "+"; this.score = computeScore(); if (this.autoplay) { if (this.cursor < this.moves.length - 1)