X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fcomponents%2FBaseGame.vue;h=630c83884880a6bdab273fb896e3f92302bd6262;hb=5701c228a422bed7570452b2d24b3193f7653a19;hp=f10420d7a8a7b9ef6168f9931466d3d3c5620383;hpb=41cb9b940084d6f56351a772f0340ebf0bc8d1bc;p=vchess.git diff --git a/client/src/components/BaseGame.vue b/client/src/components/BaseGame.vue index f10420d7..630c8388 100644 --- a/client/src/components/BaseGame.vue +++ b/client/src/components/BaseGame.vue @@ -1,28 +1,27 @@ @@ -52,6 +51,7 @@ export default { moves: [], cursor: -1, //index of the move just played lastMove: null, + gameHasEnded: false, //to avoid showing end message twice }; }, watch: { @@ -59,8 +59,16 @@ export default { "game.fenStart": function() { this.re_setVariables(); }, - "game.score": function() { - this.score = this.game.score; + // 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); + } }, }, computed: { @@ -80,10 +88,37 @@ export default { this.re_setVariables(); }, methods: { + focusBg: function() { + // TODO: small blue border appears... + document.getElementById("baseGame").focus(); + }, + handleKeys: function(e) { + if ([32,37,38,39,40].includes(e.keyCode)) + e.preventDefault(); + switch (e.keyCode) + { + case 37: + this.undo(); + break; + case 39: + this.play(); + break; + case 38: + this.gotoBegin(); + break; + case 40: + this.gotoEnd(); + break; + case 32: + this.flip(); + break; + } + }, 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) @@ -96,18 +131,19 @@ export default { vr_tmp.play(move); move.fen = vr_tmp.getFen(); }); + if (this.game.fenStart.indexOf(" b ") >= 0 || + (this.moves.length > 0 && this.moves[0].color == "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); }, - // For corr games, potential message with each move sent - curMoveMessage: function() { - if (this.cursor < 0) - return ""; - return this.game.moves[this.cursor].message || ""; - }, - setCurrentMessage: function(message) { - this.game.moves[this.game.moves.length-1].message = message; + gotoFenContent: function(event) { + this.$router.push("/analyze/" + this.game.vname + + "/?fen=" + event.target.innerText.replace(/ /g, "_")); }, download: function() { const content = this.getPgn(); @@ -167,12 +203,14 @@ export default { modalBox.checked = true; setTimeout(() => { modalBox.checked = false; }, 2000); }, - endGame: function(score, message) { + endGame: function(score, message, bubbleUp) { + this.gameHasEnded = true; this.score = score; if (!message) message = this.getScoreMessage(score); this.showEndgameMsg(score + " . " + message); - this.$emit("gameover", score); + if (bubbleUp) + this.$emit("gameover", score); }, animateMove: function(move) { let startSquare = document.getElementById(getSquareId(move.start)); @@ -254,7 +292,7 @@ export default { if (score != "*") { if (!this.analyze) - this.endGame(score); + this.endGame(score, undefined, true); else { // Just show score on screen (allow undo) @@ -287,8 +325,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);