X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fviews%2FGame.vue;h=5199154ac537f5d0f5774c560892bd9eabb65793;hb=7e355d68b5962aad106e28a9d669a47f3cbec43a;hp=56c98d271cf6a60b86dd0ad537d51d66049696ee;hpb=760adbcee11c8953d97514768a5d5382ef518953;p=vchess.git diff --git a/client/src/views/Game.vue b/client/src/views/Game.vue index 56c98d27..5199154a 100644 --- a/client/src/views/Game.vue +++ b/client/src/views/Game.vue @@ -9,6 +9,7 @@ button(@click="offerDraw") Draw button(@click="abortGame") Abort button(@click="resign") Resign + div(v-if="game.type=='corr'") {{ game.corrMsg }} textarea(v-if="game.score=='*'" v-model="corrMsg") Chat(:players="game.players") @@ -52,9 +53,9 @@ export default { this.loadGame(); }, "game.clocks": function(newState) { - if (this.game.moves.length < 2) + if (this.game.moves.length < 2 || this.game.score != "*") { - // 1st move not completed yet: freeze time + // 1st move not completed yet, or game over: freeze time this.virtualClocks = newState.map(s => ppt(s)); return; } @@ -73,10 +74,7 @@ export default { { clearInterval(clockUpdate); if (countdown < 0) - { - this.$refs["basegame"].endGame( - this.vr.turn=="w" ? "0-1" : "1-0", "Time"); - } + this.setScore(this.vr.turn=="w" ? "0-1" : "1-0", "Time"); } else { @@ -196,9 +194,8 @@ export default { game:myGame, target:data.from})); break; case "newmove": - // NOTE: this call to play() will trigger processMove() - this.$refs["basegame"].play(data.move, - "receive", this.game.vname!="Dark" ? "animate" : null); + this.corrMsg = data.move.message; //may be empty + this.game.moveToPlay = data.move; break; case "lastate": //got opponent infos about last move { @@ -209,14 +206,13 @@ export default { break; } case "resign": - this.$refs["basegame"].endGame( - (data.side=="b" ? "1-0" : "0-1"), "Resign"); + this.setScore(data.side=="b" ? "1-0" : "0-1", "Resign"); break; case "abort": - this.$refs["basegame"].endGame("?", "Abort"); + this.setScore("?", "Abort"); break; case "draw": - this.$refs["basegame"].endGame("1/2", "Mutual agreement"); + this.setScore("1/2", "Mutual agreement"); break; case "drawoffer": this.drawOffer = "received"; //TODO: observers don't know who offered draw @@ -247,21 +243,23 @@ export default { if (data.movesCount > L) { // Just got last move from him - this.$refs["basegame"].play(data.lastMove, - "receive", this.game.vname!="Dark" ? "animate" : null); + this.game.moveToPlay = data.lastMove; if (data.score != "*" && this.game.score == "*") { // Opponent resigned or aborted game, or accepted draw offer // (this is not a stalemate or checkmate) - this.$refs["basegame"].endGame(data.score, "Opponent action"); + this.setScore(data.score, "Opponent action"); } this.game.clocks = data.clocks; //TODO: check this? if (!!data.lastMove.draw) this.drawOffer = "received"; } }, + setScore: function(score, message) { + this.game.scoreMsg = message; + this.game.score = score; + }, offerDraw: function() { - // TODO: also for corr games if (this.drawOffer == "received") { if (!confirm("Accept draw?")) @@ -270,10 +268,14 @@ export default { if (p.sid != this.st.user.sid) this.st.conn.send(JSON.stringify({code:"draw", target:p.sid})); }); - this.$refs["basegame"].endGame("1/2", "Mutual agreement"); + this.setScore("1/2", "Mutual agreement"); } else if (this.drawOffer == "sent") + { this.drawOffer = ""; + if (this.game.type == "corr") + GameStorage.update(this.gameRef.id, {drawOffer: false}); + } else { if (!confirm("Offer draw?")) @@ -283,13 +285,14 @@ export default { if (p.sid != this.st.user.sid) this.st.conn.send(JSON.stringify({code:"drawoffer", target:p.sid})); }); + if (this.game.type == "corr") + GameStorage.update(this.gameRef.id, {drawOffer: true}); } }, abortGame: function() { if (!confirm(this.st.tr["Terminate game?"])) return; - // Next line will trigger a "gameover" event, bubbling up till here - this.$refs["basegame"].endGame("?", "Abort"); + this.setScore("?", "Abort"); this.people.forEach(p => { if (p.sid != this.st.user.sid) { @@ -310,9 +313,7 @@ export default { side:this.game.mycolor, target:p.sid})); } }); - // Next line will trigger a "gameover" event, bubbling up till here - this.$refs["basegame"].endGame( - this.game.mycolor=="w" ? "0-1" : "1-0", "Resign"); + this.setScore(this.game.mycolor=="w" ? "0-1" : "1-0", "Resign"); }, // 3 cases for loading a game: // - from indexedDB (running or completed live game I play) @@ -336,22 +337,27 @@ export default { // corr game: needs to compute the clocks + initime // NOTE: clocks in seconds, initime in milliseconds game.clocks = [tc.mainTime, tc.mainTime]; - game.initime = [0, 0]; - const L = game.moves.length; game.moves.sort((m1,m2) => m1.idx - m2.idx); //in case of - if (L >= 3) + if (game.score == "*") //otherwise no need to bother with time { - let addTime = [0, 0]; - for (let i=2; i= 3) { - addTime[i%2] += tc.increment - - (game.moves[i].played - game.moves[i-1].played) / 1000; + let addTime = [0, 0]; + for (let i=2; i= 1) + game.initime[L%2] = game.moves[L-1].played; + if (game.drawOffer) + this.drawOffer = "received"; } - if (L >= 1) - game.initime[L%2] = game.moves[L-1].played; // Now that we used idx and played, re-format moves as for live games game.moves = game.moves.map( (m) => { const s = m.squares; @@ -370,15 +376,18 @@ export default { if (gtype == "live" && game.clocks[0] < 0) //game unstarted { game.clocks = [tc.mainTime, tc.mainTime]; - game.initime[0] = Date.now(); - if (myIdx >= 0) + if (game.score == "*") { - // I play in this live game; corr games don't have clocks+initime - GameStorage.update(game.id, + game.initime[0] = Date.now(); + if (myIdx >= 0) { - clocks: game.clocks, - initime: game.initime, - }); + // I play in this live game; corr games don't have clocks+initime + GameStorage.update(game.id, + { + clocks: game.clocks, + initime: game.initime, + }); + } } } this.game = Object.assign({}, @@ -449,12 +458,6 @@ export default { })); } }); - if (this.game.type == "corr" && this.corrMsg != "") - { - // Add message to last move in BaseGame: - // TODO: not very good style... - this.$refs["basegame"].setCurrentMessage(this.corrMsg); - } } else addTime = move.addTime; //supposed transmitted @@ -468,10 +471,10 @@ export default { GameStorage.update(this.gameRef.id, { fen: move.fen, + message: this.corrMsg, move: { squares: filtered_move, - message: this.corrMsg, played: Date.now(), //TODO: on server? idx: this.game.moves.length, }, @@ -498,9 +501,6 @@ export default { //TODO: (Vue3) just this.game.clocks[colorIdx] += addTime; this.$set(this.game.clocks, colorIdx, this.game.clocks[colorIdx] + addTime); this.game.initime[nextIdx] = Date.now(); - // Finally reset curMoveMessage if needed - if (this.game.type == "corr" && move.color == this.game.mycolor) - this.corrMsg = ""; }, gameOver: function(score) { this.game.mode = "analyze";