X-Git-Url: https://git.auder.net/?p=vchess.git;a=blobdiff_plain;f=client%2Fsrc%2Fcomponents%2FComputerGame.vue;h=605b3b14618aa41445abbae89e5da694337363a9;hp=1181971bed97a23f618b5ade7365ab74d19eb9c9;hb=e6ca903027ba7c4867393ac8fe8c58b5fa6e0efe;hpb=f446ee645526d617c8369add83de66888d2db6ce diff --git a/client/src/components/ComputerGame.vue b/client/src/components/ComputerGame.vue index 1181971b..605b3b14 100644 --- a/client/src/components/ComputerGame.vue +++ b/client/src/components/ComputerGame.vue @@ -2,9 +2,7 @@ BaseGame( ref="basegame" :game="game" - :vr="vr" @newmove="processMove" - @gameover="gameOver" ) @@ -12,6 +10,8 @@ BaseGame( import BaseGame from "@/components/BaseGame.vue"; import { store } from "@/store"; import { CompgameStorage } from "@/utils/compgameStorage"; +import { getScoreMessage } from "@/utils/scoring"; +import { playMove, getFilteredMove } from "@/utils/playUndo"; import Worker from "worker-loader!@/playCompMove"; export default { name: "my-computer-game", @@ -37,31 +37,24 @@ export default { this.compWorker = new Worker(); this.compWorker.onmessage = e => { let compMove = e.data; - if (!compMove) { - this.compThink = false; - this.$emit("game-stopped"); //no more moves: mate or stalemate - return; //after game ends, no more moves, nothing to do - } - if (!Array.isArray(compMove)) compMove = [compMove]; //potential multi-move // Small delay for the bot to appear "more human" - const delay = Math.max(500 - (Date.now() - this.timeStart), 0); + const minDelay = this.gameInfo.mode == "versus" ? 500 : 1000; + const delay = Math.max(minDelay - (Date.now() - this.timeStart), 0); + let self = this; setTimeout(() => { if (this.currentUrl != document.location.href) return; //page change - // NOTE: do not animate move if special display (ShowMoves != "all") - const animate = V.ShowMoves == "all"; - const animDelay = animate ? 250 : 0; - let moveIdx = 0; - let self = this; - (function executeMove() { - // NOTE: BaseGame::play() will trigger processMove() here - self.$refs["basegame"].play(compMove[moveIdx++], "received"); - if (moveIdx >= compMove.length) { + self.$refs["basegame"].play(compMove, "received"); + const animationLength = + // 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.compThink = false; - if (self.game.score != "*") - // User action - self.$emit("game-stopped"); - } else setTimeout(executeMove, 500 + animDelay); - })(); + self.processMove(compMove); + }, + animationLength + ); }, delay); }; }, @@ -71,22 +64,29 @@ export default { if (!game) { game = { vname: this.gameInfo.vname, - fenStart: V.GenRandInitFen(), + fenStart: V.GenRandInitFen(this.st.settings.randomness), moves: [] }; game.fen = game.fenStart; - if (this.gameInfo.mode == "versus") - CompgameStorage.add(game); + if (this.gameInfo.mode == "versus") CompgameStorage.add(game); } - if (this.gameInfo.mode == "versus" && !game.mycolor) - game.mycolor = Math.random() < 0.5 ? "w" : "b"; + +// TODO: debug Hiddenqueen +//game.fen = "rbnqbknr/pppptppp/8/8/8/8/TPPPPPPP/RBNQBKNR w 0 ahah -"; +//game.fenStart = "rbnqbknr/pppptppp/8/8/8/8/TPPPPPPP/RBNQBKNR w 0 ahah -"; +//game.mycolor = 'w'; + + 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 this.game = game; + this.$refs["basegame"].re_setVariables(game); this.compWorker.postMessage(["init", game.fen]); if (this.gameInfo.mode == "auto" || game.mycolor != this.vr.turn) this.playComputerMove(); @@ -98,36 +98,36 @@ export default { this.compThink = true; this.compWorker.postMessage(["askmove"]); }, - processMove: function(move) { - if (this.game.score != "*") return; + processMove: function(move, scoreObj) { + playMove(move, this.vr); + // 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; + } // Send the move to web worker (including his own moves) this.compWorker.postMessage(["newmove", move]); - // subTurn condition for Marseille (and Avalanche) rules - if ( - (!this.vr.subTurn || this.vr.subTurn <= 1) && - (this.gameInfo.mode == "auto" || this.vr.turn != this.game.mycolor) - ) { + if (this.gameInfo.mode == "auto" || this.vr.turn != this.game.mycolor) this.playComputerMove(); - } // Finally, update storage: if (this.gameInfo.mode == "versus") { - const allowed_fields = ["appear", "vanish", "start", "end"]; - const filtered_move = Object.keys(move) - .filter(key => allowed_fields.includes(key)) - .reduce((obj, key) => { - obj[key] = move[key]; - return obj; - }, {}); CompgameStorage.update(this.gameInfo.vname, { - move: filtered_move, - fen: move.fen + move: getFilteredMove(move), + fen: this.vr.getFen() }); } }, - gameOver: function(score, scoreMsg) { + gameOver: function(score) { this.game.score = score; - this.game.scoreMsg = scoreMsg; - if (!this.compThink) this.$emit("game-stopped"); //otherwise wait for comp + this.game.scoreMsg = getScoreMessage(score); + // If comp is thinking, let him finish: + if (!this.compThink) this.$emit("game-stopped"); } } };