X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fcomponents%2FBaseGame.vue;h=1996ded67110bb374dbdce4f5fb054a0f5d6fe66;hb=93ce6119a67b8510762dd68a07936b6f22f2ad67;hp=1ec412e1dc775edcf3b8e9c17d23a16f449556f9;hpb=5e1bc6519d4c81aeac40aec7390c64c913cbf566;p=vchess.git diff --git a/client/src/components/BaseGame.vue b/client/src/components/BaseGame.vue index 1ec412e1..1996ded6 100644 --- a/client/src/components/BaseGame.vue +++ b/client/src/components/BaseGame.vue @@ -54,6 +54,7 @@ div#baseGame @showrules="showRules" @analyze="analyzePosition" @goto-move="gotoMove" + @reset-arrows="resetArrows" ) .clearer @@ -110,7 +111,7 @@ export default { : "" ); }, - // TODO: is it OK to pass "computed" as propoerties? + // TODO: is it OK to pass "computed" as properties? // Also, some are seemingly not recomputed when vr is initialized. showMoves: function() { return this.game.score != "*" @@ -186,6 +187,10 @@ export default { if (e.deltaY < 0) this.undo(); else if (e.deltaY > 0) this.play(); }, + resetArrows: function() { + // TODO: make arrows scale with board, and remove this + this.$refs["board"].cancelResetArrows(); + }, showRules: function() { //this.$router.push("/variants/" + this.game.vname); window.open("#/variants/" + this.game.vname, "_blank"); //better @@ -206,6 +211,7 @@ export default { // Strategy working also for multi-moves: if (!Array.isArray(move)) move = [move]; move.forEach((m,idx) => { + m.index = this.vr.movesCount; m.notation = this.vr.getNotation(m); m.unambiguous = V.GetUnambiguousNotation(m); this.vr.play(m); @@ -216,6 +222,7 @@ export default { if (firstMoveColor == "b") { // 'start' & 'end' is required for Board component this.moves.unshift({ + index: parsedFen.movesCount, notation: "...", unambiguous: "...", start: { x: -1, y: -1 }, @@ -250,11 +257,8 @@ export default { this.game.vname + "/?fen=" + this.vr.getFen().replace(/ /g, "_"); - if (this.game.mycolor) - newUrl += "&side=" + this.game.mycolor; - // Open in same tab in live games (against cheating) - if (this.game.type == "live") this.$router.push(newUrl); - else window.open("#" + newUrl); + if (!!this.game.mycolor) newUrl += "&side=" + this.game.mycolor; + window.open("#" + newUrl); }, download: function() { const content = this.getPgn(); @@ -269,25 +273,38 @@ export default { let pgn = ""; pgn += '[Site "vchess.club"]\n'; pgn += '[Variant "' + this.game.vname + '"]\n'; - pgn += '[Date "' + getDate(new Date()) + '"]\n'; + const gdt = getDate(new Date(this.game.created || Date.now())); + pgn += '[Date "' + gdt + '"]\n'; pgn += '[White "' + this.game.players[0].name + '"]\n'; pgn += '[Black "' + this.game.players[1].name + '"]\n'; pgn += '[Fen "' + this.game.fenStart + '"]\n'; pgn += '[Result "' + this.game.score + '"]\n'; - if (!!this.game.id) - pgn += '[URL "' + params.serverUrl + '/game/' + this.game.id + '"]\n'; + if (!!this.game.id) { + pgn += '[Cadence "' + this.game.cadence + '"]\n'; + pgn += '[Url "' + params.serverUrl + '/game/' + this.game.id + '"]\n'; + } pgn += '\n'; for (let i = 0; i < this.moves.length; i += 2) { if (i > 0) pgn += " "; - pgn += (i/2+1) + "." + getFullNotation(this.moves[i]); + // Adjust dots notation for a better display: + let fullNotation = getFullNotation(this.moves[i]); + if (fullNotation == "...") fullNotation = ".."; + pgn += (this.moves[i].index / 2 + 1) + "." + fullNotation; if (i+1 < this.moves.length) pgn += " " + getFullNotation(this.moves[i+1]); } pgn += "\n\n"; for (let i = 0; i < this.moves.length; i += 2) { - pgn += getFullNotation(this.moves[i], "unambiguous") + "\n"; - if (i+1 < this.moves.length) - pgn += getFullNotation(this.moves[i+1], "unambiguous") + "\n"; + const moveNumber = this.moves[i].index / 2 + 1; + // Skip "dots move", useless for machine reading: + if (this.moves[i].notation != "...") { + pgn += moveNumber + ".w " + + getFullNotation(this.moves[i], "unambiguous") + "\n"; + } + if (i+1 < this.moves.length) { + pgn += moveNumber + ".b " + + getFullNotation(this.moves[i+1], "unambiguous") + "\n"; + } } return pgn; }, @@ -314,8 +331,14 @@ export default { this.autoplayLoop = null; } else { this.autoplay = true; - infinitePlay(); - this.autoplayLoop = setInterval(infinitePlay, 1500); + setTimeout( + () => { + infinitePlay(); + this.autoplayLoop = setInterval(infinitePlay, 1500); + }, + // Small delay otherwise the first move is played too fast + 500 + ); } }, // Animate an elementary move @@ -372,6 +395,8 @@ export default { play: function(move, received, light, noemit) { // Freeze while choices are shown: if (this.$refs["board"].choices.length > 0) return; + // The board may show some the possible moves: (TODO: bad solution) + this.$refs["board"].resetCurrentAttempt(); if (!!noemit) { if (this.inPlay) { // Received moves in observed games can arrive too fast: @@ -386,6 +411,8 @@ export default { smove.unambiguous = V.GetUnambiguousNotation(smove); this.vr.play(smove); this.lastMove = smove; + // Is opponent (or me) in check? + this.incheck = this.vr.getCheckSquares(this.vr.turn); if (!this.inMultimove) { // Condition is "!navigate" but we mean "!this.autoplay" if (!navigate) { @@ -400,8 +427,7 @@ export default { const L = this.moves.length; if (!Array.isArray(this.moves[L-1])) this.$set(this.moves, L-1, [this.moves[L-1], smove]); - else - this.$set(this.moves, L-1, this.moves.concat([smove])); + else this.moves[L-1].push(smove); } }; const playMove = () => { @@ -448,8 +474,6 @@ export default { if (!smove.fen) // NOTE: only FEN of last sub-move is required (=> setting it here) smove.fen = this.vr.getFen(); - // Is opponent in check? - this.incheck = this.vr.getCheckSquares(this.vr.turn); this.emitFenIfAnalyze(); this.inMultimove = false; this.score = computeScore(); @@ -507,7 +531,7 @@ export default { const L = this.moves.length; let move = this.moves[L-1]; if (!Array.isArray(move)) move = [move]; - for (let i=move.length -1; i >= 0; i--) this.vr.undo(move[i]); + for (let i = move.length - 1; i >= 0; i--) this.vr.undo(move[i]); this.moves.pop(); this.cursor--; this.inMultimove = false; @@ -521,6 +545,7 @@ export default { undo: function(move, light) { // Freeze while choices are shown: if (this.$refs["board"].choices.length > 0) return; + this.$refs["board"].resetCurrentAttempt(); if (this.inMultimove) { this.cancelCurrentMultimove(); this.incheck = this.vr.getCheckSquares(this.vr.turn); @@ -533,6 +558,7 @@ export default { if (this.cursor < minCursor) return; //no more moves move = this.moves[this.cursor]; } + this.$refs["board"].resetCurrentAttempt(); undoMove(move, this.vr); if (light) this.cursor--; else { @@ -544,6 +570,7 @@ export default { }, gotoMove: function(index) { if (this.$refs["board"].choices.length > 0) return; + this.$refs["board"].resetCurrentAttempt(); if (this.inMultimove) this.cancelCurrentMultimove(); if (index == this.cursor) return; if (index < this.cursor) { @@ -562,6 +589,7 @@ export default { }, gotoBegin: function() { if (this.$refs["board"].choices.length > 0) return; + this.$refs["board"].resetCurrentAttempt(); if (this.inMultimove) this.cancelCurrentMultimove(); const minCursor = this.moves.length > 0 && this.moves[0].notation == "..." @@ -574,6 +602,7 @@ export default { }, gotoEnd: function() { if (this.$refs["board"].choices.length > 0) return; + this.$refs["board"].resetCurrentAttempt(); if (this.cursor == this.moves.length - 1) return; this.gotoMove(this.moves.length - 1); this.emitFenIfAnalyze();