X-Git-Url: https://git.auder.net/?p=vchess.git;a=blobdiff_plain;f=client%2Fsrc%2Fcomponents%2FComputerGame.vue;h=b212d0fdf4e90641683eb57f95a749e6aca58655;hp=f611167da0896cab35010f7a4fc7aa27a51f4638;hb=eb2d61de8d569470fa329a484efe9bab420b2b82;hpb=bc0b9205e41c5db0552e4ccf060b945342e36ed0 diff --git a/client/src/components/ComputerGame.vue b/client/src/components/ComputerGame.vue index f611167d..b212d0fd 100644 --- a/client/src/components/ComputerGame.vue +++ b/client/src/components/ComputerGame.vue @@ -44,36 +44,42 @@ export default { setTimeout(() => { if (this.currentUrl != document.location.href) return; //page change self.$refs["basegame"].play(compMove, "received"); - const animationLength = + let animationLength = 0; + const mvArray = (Array.isArray(compMove) ? compMove : [compMove]); + const realLength = + mvArray.filter(m => m.start.x >= 0 && !m.end.noHighlight).length; + if (realLength >= 1) // 250 = length of animation, 500 = delay between sub-moves // TODO: a callback would be cleaner. - 250 + (Array.isArray(compMove) ? (compMove.length - 1) * 750 : 0); - setTimeout(() => self.processMove(compMove), animationLength); - self.compThink = false; - if (self.game.score != "*") - // User action - self.$emit("game-stopped"); + animationLength = 250 + (realLength - 1) * 750; + setTimeout( + () => { + self.compThink = false; + self.processMove(compMove); + }, + animationLength + ); }, delay); }; }, methods: { - launchGame: function(game) { + launchGame: function(game, options) { this.compWorker.postMessage(["scripts", this.gameInfo.vname]); if (!game) { game = { vname: this.gameInfo.vname, - fenStart: V.GenRandInitFen(this.st.settings.randomness), + fenStart: V.GenRandInitFen(options), moves: [] }; game.fen = game.fenStart; - if (this.gameInfo.mode == "versus") - CompgameStorage.add(game); + if (this.gameInfo.mode == "versus") CompgameStorage.add(game); } if (!game.mycolor) game.mycolor = (Math.random() < 0.5 ? "w" : "b"); this.compWorker.postMessage(["init", game.fen]); this.vr = new V(game.fen); - game.players = [{ name: "Myself" }, { name: "Computer" }]; - if (game.mycolor == "b") game.players = game.players.reverse(); + game.players = [{ name: "Computer" }, { name: "Computer" }]; + if (this.gameInfo.mode == "versus") + game.players[game.mycolor == 'w' ? 0 : 1] = { name: "Myself" }; game.score = "*"; //finished games are removed game.mode = this.gameInfo.mode; this.currentUrl = document.location.href; //to avoid playing outside page @@ -92,15 +98,17 @@ export default { }, processMove: function(move, scoreObj) { playMove(move, this.vr); - // This move could have ended the game: + // Maybe the user stopped the game: + if (this.game.score != "*") { + this.$emit("game-stopped"); + return; + } + // This move could have ended the game if (!scoreObj) scoreObj = { score: this.vr.getCurrentScore() }; if (scoreObj.score != "*") { this.gameOver(scoreObj.score); return; } - if (this.game.score != "*") - // The game already ended, probably because of a user action - return; // Send the move to web worker (including his own moves) this.compWorker.postMessage(["newmove", move]); if (this.gameInfo.mode == "auto" || this.vr.turn != this.game.mycolor) @@ -115,7 +123,7 @@ export default { }, gameOver: function(score) { this.game.score = score; - this.game.scoreMsg = getScoreMessage(score); + this.game.scoreMsg = getScoreMessage(score, V.ReverseColors); // If comp is thinking, let him finish: if (!this.compThink) this.$emit("game-stopped"); }