X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fviews%2FGame.vue;h=00414d9136469758b6d339327d7fcb17d3d7d9a3;hb=72ccbd6730241771e6ba86b6a5b62597b4c7e2f4;hp=94b5dc70e10be3fd04d5b2153b10e32dbf6514d9;hpb=7aa548e72ba8a4af4e2c7f63e7723ad10d2cd3a4;p=vchess.git diff --git a/client/src/views/Game.vue b/client/src/views/Game.vue index 94b5dc70..00414d91 100644 --- a/client/src/views/Game.vue +++ b/client/src/views/Game.vue @@ -48,6 +48,7 @@ export default { drawOffer: "", //TODO: use for button style people: [], //players + observers lastate: undefined, //used if opponent send lastate before game is ready + repeat: {}, //detect position repetition }; }, watch: { @@ -199,7 +200,7 @@ export default { break; case "newmove": this.corrMsg = data.move.message; //may be empty - this.game.moveToPlay = data.move; + this.$set(this.game, "moveToPlay", data.move); //TODO: Vue3... break; case "lastate": //got opponent infos about last move { @@ -247,7 +248,7 @@ export default { if (data.movesCount > L) { // Just got last move from him - this.game.moveToPlay = data.lastMove; + this.$set(this.game, "moveToPlay", data.lastMove); if (data.score != "*" && this.game.score == "*") { // Opponent resigned or aborted game, or accepted draw offer @@ -261,7 +262,7 @@ export default { }, setScore: function(score, message) { this.game.scoreMsg = message; - this.game.score = score; + this.$set(this.game, "score", score); //TODO: Vue3... }, offerDraw: function() { if (this.drawOffer == "received") @@ -407,6 +408,7 @@ export default { oppid: (myIdx < 0 ? undefined : game.players[1-myIdx].uid), } ); + this.repeat = {}; //reset if (!!this.lastate) //lastate arrived before game was loaded: this.processLastate(); callback(); @@ -505,10 +507,21 @@ 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(); + // If repetition detected, consider that a draw offer was received: + const fenObj = V.ParseFen(move.fen); + let repIdx = fenObj.position + "_" + fenObj.turn; + if (!!fenObj.flags) + repIdx += "_" + fenObj.flags; + this.repeat[repIdx] = (!!this.repeat[repIdx] + ? this.repeat[repIdx]+1 + : 1); + if (this.repeat[repIdx] >= 3) + this.drawOffer = "received"; //TODO: will print "mutual agreement"... }, gameOver: function(score) { this.game.mode = "analyze"; - this.game.score = score; + this.game.score = score; //until Vue3, this property change isn't seen + //by child (and doesn't need to be) const myIdx = this.game.players.findIndex(p => { return p.sid == this.st.user.sid || p.uid == this.st.user.id; }); @@ -520,5 +533,15 @@ export default {