X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fcomponents%2FBaseGame.vue;h=1ea862fbe05264fd7de870a3c18984ea41c44d94;hb=63ca2b89cfe577efd168c6b2e26750cb01b66d64;hp=e02462e578396744d76b069545c84fa39810e892;hpb=9ca1e26b79ec1873aa6ac914013160f8593d52cf;p=vchess.git diff --git a/client/src/components/BaseGame.vue b/client/src/components/BaseGame.vue index e02462e5..1ea862fb 100644 --- a/client/src/components/BaseGame.vue +++ b/client/src/components/BaseGame.vue @@ -6,23 +6,23 @@ div#baseGame(tabindex=-1 @click="() => focusBg()" @keydown="handleKeys") label.modal-close(for="modalEog") h3#eogMessage.section {{ endgameMessage }} .row - .col-sm-12.col-md-9.col-lg-8 - Board(:vr="vr" :last-move="lastMove" :analyze="analyze" + #boardContainer.col-sm-12.col-md-9 + Board(:vr="vr" :last-move="lastMove" :analyze="game.mode=='analyze'" :user-color="game.mycolor" :orientation="orientation" :vname="game.vname" @play-move="play") - .button-group + #controls button(@click="gotoBegin") << button(@click="() => undo()") < button(@click="flip") ⇅ button(@click="() => play()") > button(@click="gotoEnd") >> - #fenDiv(v-if="showFen && !!vr") - p(@click="gotoFenContent") {{ vr.getFen() }} #pgnDiv a#download(href="#") button(@click="download") {{ st.tr["Download PGN"] }} - .col-sm-12.col-md-3.col-lg-4 - MoveList(v-if="showMoves" + button(v-if="game.mode!='analyze'" @click="analyzePosition") + | {{ st.tr["Analyze"] }} + .col-sm-12.col-md-3 + MoveList(v-if="showMoves" :score="game.score" :message="game.scoreMsg" :moves="moves" :cursor="cursor" @goto-move="gotoMove") @@ -51,7 +51,6 @@ export default { moves: [], cursor: -1, //index of the move just played lastMove: null, - gameHasEnded: false, //to avoid showing end message twice }; }, watch: { @@ -60,27 +59,14 @@ export default { this.re_setVariables(); }, // Received a new move to play: - "game.moveToPlay": function() { - this.play(this.game.moveToPlay, "receive", this.game.vname=="Dark"); - }, - "game.score": function(score) { - if (!this.gameHasEnded && score != "*") - { - // "false" says "don't bubble up": the parent already knows - this.endGame(score, this.game.scoreMsg, false); - } + "game.moveToPlay": function(newMove) { + if (!!newMove) //if stop + launch new game, get undefined move + this.play(newMove, "receive"); }, }, computed: { showMoves: function() { - return true; - //return window.innerWidth >= 768; - }, - showFen: function() { - return this.game.vname != "Dark" || this.score != "*"; - }, - analyze: function() { - return this.game.mode == "analyze" || this.score != "*"; + return this.game.vname != "Dark" || this.game.mode=="analyze"; }, }, created: function() { @@ -93,6 +79,8 @@ export default { document.getElementById("baseGame").focus(); }, handleKeys: function(e) { + if ([32,37,38,39,40].includes(e.keyCode)) + e.preventDefault(); switch (e.keyCode) { case 37: @@ -101,14 +89,13 @@ export default { case 39: this.play(); break; - case 28: + case 38: this.gotoBegin(); break; case 40: this.gotoEnd(); break; case 32: - e.preventDefault(); this.flip(); break; } @@ -116,8 +103,6 @@ export default { re_setVariables: function() { this.endgameMessage = ""; this.orientation = this.game.mycolor || "w"; //default orientation for observed games - this.score = this.game.score || "*"; //mutable (if initially "*") - this.gameHasEnded = (this.score != "*"); 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) @@ -140,9 +125,11 @@ export default { this.cursor = L-1; this.lastMove = (L > 0 ? this.moves[L-1] : null); }, - gotoFenContent: function(event) { - this.$router.push("/analyze/" + this.game.vname + - "/?fen=" + event.target.innerText.replace(/ /g, "_")); + analyzePosition: function() { + const newUrl = "/analyze/" + this.game.vname + + "/?fen=" + this.vr.getFen().replace(/ /g, "_"); + //window.open("#" + newUrl); //to open in a new tab + this.$router.push(newUrl); //better }, download: function() { const content = this.getPgn(); @@ -160,7 +147,7 @@ export default { 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.score + '"]\n\n'; + pgn += '[Result "' + this.game.score + '"]\n\n'; let counter = 1; let i = 0; while (i < this.moves.length) @@ -202,16 +189,7 @@ export default { modalBox.checked = true; setTimeout(() => { modalBox.checked = false; }, 2000); }, - endGame: function(score, message, bubbleUp) { - this.gameHasEnded = true; - this.score = score; - if (!message) - message = this.getScoreMessage(score); - this.showEndgameMsg(score + " . " + message); - if (bubbleUp) - this.$emit("gameover", score); - }, - animateMove: function(move) { + animateMove: function(move, callback) { let startSquare = document.getElementById(getSquareId(move.start)); let endSquare = document.getElementById(getSquareId(move.end)); let rectStart = startSquare.getBoundingClientRect(); @@ -236,69 +214,65 @@ export default { for (let i=0; i { + if (!!receive && this.cursor < this.moves.length-1) this.gotoEnd(); //required to play the move - return this.animateMove(move); - } - if (!navigate) - { - move.color = this.vr.turn; - move.notation = this.vr.getNotation(move); - } - // Not programmatic, or animation is over - this.vr.play(move); - this.cursor++; - this.lastMove = move; - if (this.st.settings.sound == 2) - new Audio("/sounds/move.mp3").play().catch(err => {}); - if (!navigate) - { - move.fen = this.vr.getFen(); - if (this.score == "*" || this.analyze) + if (navigate) + { + if (this.cursor == this.moves.length-1) + return; //no more moves + move = this.moves[this.cursor+1]; + } + else { + move.color = this.vr.turn; + move.notation = this.vr.getNotation(move); + } + this.vr.play(move); + this.cursor++; + this.lastMove = move; + if (this.st.settings.sound == 2) + new Audio("/sounds/move.mp3").play().catch(err => {}); + if (!navigate) + { + move.fen = this.vr.getFen(); // Stack move on movesList at current cursor if (this.cursor == this.moves.length) this.moves.push(move); else this.moves = this.moves.slice(0,this.cursor).concat([move]); } - } - if (!this.analyze) - this.$emit("newmove", move); //post-processing (e.g. computer play) - // Is opponent in check? - this.incheck = this.vr.getCheckSquares(this.vr.turn); - const score = this.vr.getCurrentScore(); - if (score != "*") - { - if (!this.analyze) - this.endGame(score, undefined, true); - else + if (this.game.mode != "analyze") + this.$emit("newmove", move); //post-processing (e.g. computer play) + // Is opponent in check? + this.incheck = this.vr.getCheckSquares(this.vr.turn); + const score = this.vr.getCurrentScore(); + if (score != "*") { - // Just show score on screen (allow undo) const message = this.getScoreMessage(score); - this.showEndgameMsg(score + " . " + message); + if (this.game.mode != "analyze") + this.$emit("gameover", score, message); + else //just show score on screen (allow undo) + this.showEndgameMsg(score + " . " + message); } - } + }; + if (!!receive && this.game.vname != "Dark") + this.animateMove(move, doPlayMove); + else + doPlayMove(); }, undo: function(move) { const navigate = !move; @@ -324,8 +298,16 @@ export default { }, gotoBegin: function() { this.vr.re_init(this.game.fenStart); - this.cursor = -1; - this.lastMove = null; + if (this.moves.length > 0 && this.moves[0].notation == "...") + { + this.cursor = 0; + this.lastMove = this.moves[0]; + } + else + { + this.cursor = -1; + this.lastMove = null; + } }, gotoEnd: function() { this.gotoMove(this.moves.length-1); @@ -336,3 +318,29 @@ export default { }, }; + +