X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fviews%2FGame.vue;h=0735b76b0490a4c41390a8a41b4f3489ed1ca670;hb=ad030c7d24804fbfa06158e93d89a3f101d2c8b3;hp=919a7ebca986bd7edd2dd87ed5a5ed713863539d;hpb=b4f2488a58c5c92e1673cd64c6bba13afcafbf66;p=vchess.git diff --git a/client/src/views/Game.vue b/client/src/views/Game.vue index 919a7ebc..0735b76b 100644 --- a/client/src/views/Game.vue +++ b/client/src/views/Game.vue @@ -212,9 +212,6 @@ export default { curDiag: "", //for corr moves confirmation conn: null, roomInitialized: false, - // If newmove has wrong index: ask fullgame again: - askGameTime: 0, - gameIsLoading: false, // If asklastate got no reply, ask again: gotLastate: false, gotMoveIdx: -1, //last move index received @@ -357,8 +354,6 @@ export default { this.rematchOffer = ""; this.lastate = undefined; this.roomInitialized = false; - this.askGameTime = 0; - this.gameIsLoading = false; this.gotLastate = false; this.gotMoveIdx = -1; this.opponentGotMove = false; @@ -536,27 +531,6 @@ export default { this.$router.push( "/game/" + nextGid + "/?next=" + JSON.stringify(this.nextIds)); }, - askGameAgain: function() { - this.gameIsLoading = true; - const currentUrl = document.location.href; - const doAskGame = () => { - if (document.location.href != currentUrl) return; //page change - this.fetchGame((game) => { - if (!!game) - // This is my game: just reload. - this.loadGame(game); - else - // Just ask fullgame again (once!), this is much simpler. - // If this fails, the user could just reload page :/ - this.send("askfullgame"); - }); - }; - // Delay of at least 2s between two game requests - const now = Date.now(); - const delay = Math.max(2000 - (now - this.askGameTime), 0); - this.askGameTime = now; - setTimeout(doAskGame, delay); - }, socketMessageListener: function(msg) { if (!this.conn) return; const data = JSON.parse(msg.data); @@ -753,6 +727,8 @@ export default { // Got opponent infos about last move this.gotLastate = true; this.lastate = data.data; + if (this.lastate.movesCount - 1 > this.gotMoveIdx) + this.gotMoveIdx = this.lastate.movesCount - 1; if (this.game.rendered) // Game is rendered (Board component) this.processLastate(); @@ -760,78 +736,77 @@ export default { break; } case "newmove": { + +// DEBUG: +console.log("Receive move"); +console.log(data.data); +//moveslist not updated when receiving a move? (see in baseGame) + const movePlus = data.data; const movesCount = this.game.moves.length; - if (movePlus.index > movesCount) { - // This can only happen if I'm an observer and missed a move. - if (this.gotMoveIdx < movePlus.index) - this.gotMoveIdx = movePlus.index; - if (!this.gameIsLoading) this.askGameAgain(); + if ( + movePlus.index < movesCount || + this.gotMoveIdx >= movePlus.index + ) { + // Opponent re-send but we already have the move: + // (maybe he didn't receive our pingback...) + this.send("gotmove", {data: movePlus.index, target: data.from}); } else { - if ( - movePlus.index < movesCount || - this.gotMoveIdx >= movePlus.index - ) { - // Opponent re-send but we already have the move: - // (maybe he didn't receive our pingback...) - this.send("gotmove", {data: movePlus.index, target: data.from}); - } else { - this.gotMoveIdx = movePlus.index; - const receiveMyMove = (movePlus.color == this.game.mycolor); - const moveColIdx = ["w", "b"].indexOf(movePlus.color); - if (!receiveMyMove && !!this.game.mycolor) { - // Notify opponent that I got the move: - this.send( - "gotmove", - { data: movePlus.index, target: data.from } + this.gotMoveIdx = movePlus.index; + const receiveMyMove = (movePlus.color == this.game.mycolor); + const moveColIdx = ["w", "b"].indexOf(movePlus.color); + if (!receiveMyMove && !!this.game.mycolor) { + // Notify opponent that I got the move: + this.send( + "gotmove", + { data: movePlus.index, target: data.from } + ); + // And myself if I'm elsewhere: + if (!this.focus) { + notify( + "New move", + { + body: + (this.game.players[moveColIdx].name || "@nonymous") + + " just played." + } ); - // And myself if I'm elsewhere: - if (!this.focus) { - notify( - "New move", - { - body: - (this.game.players[moveColIdx].name || "@nonymous") + - " just played." - } - ); - } } - if (movePlus.cancelDrawOffer) { - // Opponent refuses draw - this.drawOffer = ""; - // NOTE for corr games: drawOffer reset by player in turn - if ( - this.game.type == "live" && - !!this.game.mycolor && - !receiveMyMove - ) { - GameStorage.update(this.gameRef, { drawOffer: "" }); - } + } + if (movePlus.cancelDrawOffer) { + // Opponent refuses draw + this.drawOffer = ""; + // NOTE for corr games: drawOffer reset by player in turn + if ( + this.game.type == "live" && + !!this.game.mycolor && + !receiveMyMove + ) { + GameStorage.update(this.gameRef, { drawOffer: "" }); } - this.$refs["basegame"].play(movePlus.move, "received"); - // Freeze time while the move is being play - // (TODO: a callback would be cleaner here) - clearInterval(this.clockUpdate); - this.clockUpdate = null; - const freezeDuration = ["all", "highlight"].includes(V.ShowMoves) - // 250 = length of animation, 500 = delay between sub-moves - ? 250 + 750 * - (Array.isArray(movePlus.move) ? movePlus.move.length - 1 : 0) - // Incomplete information: no move animation - : 0; - setTimeout( - () => { - this.game.clocks[moveColIdx] = movePlus.clock; - this.processMove( - movePlus.move, - { receiveMyMove: receiveMyMove } - ); - }, - freezeDuration - ); } + this.$refs["basegame"].play(movePlus.move, "received"); + // Freeze time while the move is being play + // (TODO: a callback would be cleaner here) + clearInterval(this.clockUpdate); + this.clockUpdate = null; + const freezeDuration = ["all", "highlight"].includes(V.ShowMoves) + // 250 = length of animation, 500 = delay between sub-moves + ? 250 + 750 * + (Array.isArray(movePlus.move) ? movePlus.move.length - 1 : 0) + // Incomplete information: no move animation + : 0; + setTimeout( + () => { + this.game.clocks[moveColIdx] = movePlus.clock; + this.processMove( + movePlus.move, + { receiveMyMove: receiveMyMove } + ); + }, + freezeDuration + ); } break; } @@ -1253,30 +1228,22 @@ export default { game ); this.$refs["basegame"].re_setVariables(this.game); - if (!this.gameIsLoading) { - // Initial loading: - this.gotMoveIdx = game.moves.length - 1; - // If we arrive here after 'nextGame' action, the board might be hidden - let boardDiv = document.querySelector(".game"); - if (!!boardDiv && boardDiv.style.visibility == "hidden") - boardDiv.style.visibility = "visible"; - } + // Initial loading: + this.gotMoveIdx = game.moves.length - 1; + // If we arrive here after 'nextGame' action, the board might be hidden + let boardDiv = document.querySelector(".game"); + if (!!boardDiv && boardDiv.style.visibility == "hidden") + boardDiv.style.visibility = "visible"; this.re_setClocks(); this.$nextTick(() => { this.game.rendered = true; // Did lastate arrive before game was rendered? - if (this.lastate) this.processLastate(); + if (!!this.lastate) this.processLastate(); }); if (this.lastateAsked) { this.lastateAsked = false; this.sendLastate(game.oppsid); } - if (this.gameIsLoading) { - this.gameIsLoading = false; - if (this.gotMoveIdx >= game.moves.length) - // Some moves arrived meanwhile... - this.askGameAgain(); - } if (!!callback) callback(); }, loadVariantThenGame: async function(game, callback) { @@ -1504,7 +1471,7 @@ export default { this.opponentGotMove = false; this.send("newmove", {data: sendMove}); // If the opponent doesn't reply gotmove soon enough, re-send move: - // Do this at most 2 times, because mpore would mean network issues, + // Do this at most 2 times, because more would mean network issues, // opponent would then be expected to disconnect/reconnect. let counter = 1; const currentUrl = document.location.href; @@ -1536,6 +1503,7 @@ export default { }; if ( this.game.type == "corr" && + V.CorrConfirm && moveCol == this.game.mycolor && !data.receiveMyMove ) { @@ -1579,7 +1547,8 @@ export default { }); document.querySelector("#confirmDiv > .card").style.width = boardDiv.offsetWidth + "px"; - } else { + } + else { // Incomplete information: just ask confirmation // Hide the board, because otherwise it could reveal infos boardDiv.style.visibility = "hidden";