X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=public%2Fjavascripts%2Fcomponents%2Fgame.js;h=ac03c8fc327ae78e5a028ffc732b801de273f8c1;hb=69f3d8014e594ef949792d04d97b8286e9c2c268;hp=085dafa3a61671a329104cc6e1370a5325144052;hpb=4f7723a1a0d1554f16c699017ae308079aa43a69;p=vchess.git diff --git a/public/javascripts/components/game.js b/public/javascripts/components/game.js index 085dafa3..ac03c8fc 100644 --- a/public/javascripts/components/game.js +++ b/public/javascripts/components/game.js @@ -62,9 +62,8 @@ Vue.component('my-game', { }, [h('i', { 'class': { "material-icons": true } }, "accessibility")]) ); - if (variant != "Dark" && - (["idle","computer","friend"].includes(this.mode) - || ["friend","human"].includes(this.mode) && this.score != "*")) + if (["idle","computer","friend"].includes(this.mode) + || (this.mode == "human" && this.score != "*")) { actionArray.push( h('button', @@ -81,9 +80,8 @@ Vue.component('my-game', { [h('i', { 'class': { "material-icons": true } }, "computer")]) ); } - if (variant != "Dark" && - (["idle","friend"].includes(this.mode) - || ["computer","human"].includes(this.mode) && this.score != "*")) + if (variant != "Dark" && (["idle","friend"].includes(this.mode) + || (["computer","human"].includes(this.mode) && this.score != "*"))) { actionArray.push( h('button', @@ -1105,7 +1103,7 @@ Vue.component('my-game', { this.conn.onclose = socketCloseListener; // Listen to keyboard left/right to navigate in game document.onkeydown = event => { - if (["idle","chat"].includes(this.mode) && + if (["human","computer"].includes(this.mode) && !!this.vr && this.vr.moves.length > 0 && [37,39].includes(event.keyCode)) { event.preventDefault(); @@ -1120,13 +1118,24 @@ Vue.component('my-game', { const self = this; this.compWorker.onmessage = function(e) { let compMove = e.data; - compMove.computer = true; //TODO: imperfect attempt to avoid ghost move + if (!compMove) + return; //may happen if MarseilleRules and subTurn==2 (TODO: a bit ugly...) + if (!Array.isArray(compMove)) + compMove = [compMove]; //to deal with MarseilleRules + // TODO: imperfect attempt to avoid ghost move: + compMove.forEach(m => { m.computer = true; }); // (first move) HACK: small delay to avoid selecting elements // before they appear on page: const delay = Math.max(500-(Date.now()-self.timeStart), 0); setTimeout(() => { + const animate = (variant!="Dark" ? "animate" : null); if (self.mode == "computer") //warning: mode could have changed! - self.play(compMove, "animate") + self.play(compMove[0], animate); + if (compMove.length == 2) + setTimeout( () => { + if (self.mode == "computer") + self.play(compMove[1], animate); + }, 750); }, delay); } }, @@ -1278,6 +1287,12 @@ Vue.component('my-game', { }, clickComputerGame: function(e) { this.getRidOfTooltip(e.currentTarget); + if (this.mode == "computer" && this.score == "*" + && this.vr.turn != this.mycolor) + { + // Wait for computer reply first (avoid potential "ghost move" bug) + return; + } this.newGame("computer"); }, clickFriendGame: function(e) { @@ -1335,8 +1350,6 @@ Vue.component('my-game', { return; } } - else if (score == "*") - return this.continueGame("computer"); } } else if (mode == "friend") @@ -1407,7 +1420,7 @@ Vue.component('my-game', { else if (mode == "computer") { this.compWorker.postMessage(["init",fen]); - if (this.mycolor != this.vr.turn) + if (score == "*" && this.mycolor != this.vr.turn) this.playComputerMove(); } //else: nothing special to do in friend mode @@ -1588,24 +1601,24 @@ Vue.component('my-game', { // Send the move to web worker (TODO: including his own moves?!) this.compWorker.postMessage(["newmove",move]); } + const eog = this.vr.checkGameOver(); + if (eog != "*") + { + if (["human","computer"].includes(this.mode)) + this.endGame(eog); + else + { + // Just show score on screen (allow undo) + this.score = eog; + this.showScoreMsg(); + } + } } else { VariantRules.PlayOnBoard(this.vr.board, move); this.$forceUpdate(); //TODO: ?! } - const eog = this.vr.checkGameOver(); - if (eog != "*") - { - if (["human","computer"].includes(this.mode)) - this.endGame(eog); - else - { - // Just show score on screen (allow undo) - this.score = eog; - this.showScoreMsg(); - } - } if (["human","computer","friend"].includes(this.mode)) this.updateStorage(); //after our moves and opponent moves if (this.mode == "computer" && this.vr.turn != this.mycolor && this.score == "*")