X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FApocalypse.js;h=abcfd703c07c0003899f79dc65ea1a1582ba1a33;hb=2c5d7b20742b802d9c47916915c1114bcfc9a9c3;hp=1eb482ec5440c94161caba1b54734998016de7c7;hpb=54f51146ad1f5cb2e3a09ac31cb6c017af80dd37;p=vchess.git diff --git a/client/src/variants/Apocalypse.js b/client/src/variants/Apocalypse.js index 1eb482ec..abcfd703 100644 --- a/client/src/variants/Apocalypse.js +++ b/client/src/variants/Apocalypse.js @@ -69,12 +69,12 @@ export class ApocalypseRules extends ChessRules { // 4) Check whiteMove if ( ( - fenParsed.turn == "w" && + fenParsed.turn == "b" && // NOTE: do not check really JSON stringified move... (!fenParsed.whiteMove || fenParsed.whiteMove == "-") ) || - (fenParsed.turn == "b" && fenParsed.whiteMove != "-") + (fenParsed.turn == "w" && fenParsed.whiteMove != "-") ) { return false; } @@ -377,10 +377,6 @@ export class ApocalypseRules extends ChessRules { } play(move) { - if (!this.states) this.states = []; - const stateFen = this.getFen(); - this.states.push(stateFen); - // Do not play on board (would reveal the move...) move.flags = JSON.stringify(this.aggregateFlags()); this.turn = V.GetOppCol(this.turn); @@ -410,10 +406,6 @@ export class ApocalypseRules extends ChessRules { this.turn = V.GetOppCol(this.turn); this.movesCount--; this.postUndo(move); - - const stateFen = this.getFen(); - if (stateFen != this.states[this.states.length-1]) debugger; - this.states.pop(); } postUndo(move) { @@ -462,31 +454,36 @@ export class ApocalypseRules extends ChessRules { // TODO: this situation should not happen return null; - if (Math.random() < 0.5) - // Return a random move - return moves[randInt(moves.length)]; - // Rank moves at depth 1: + let validMoves = []; + let illegalMoves = []; moves.forEach(m => { - // Warning: m.vanish[0] might refer to an empty square! Or self - const skipPlayUndo = ( - m.vanish.length == 2 && - ( - m.vanish[1].c == m.vanish[0].c || - this.board[m.vanish[1].x][m.vanish[1].y] == V.EMPTY - ) - ); - if (!skipPlayUndo) V.PlayOnBoard(this.board, m); - m.eval = this.evalPosition(); - if (!skipPlayUndo) V.UndoOnBoard(this.board, m); + // Warning: m might be illegal! + if (!m.illegal) { + V.PlayOnBoard(this.board, m); + m.eval = this.evalPosition(); + V.UndoOnBoard(this.board, m); + validMoves.push(m); + } else illegalMoves.push(m); }); - moves.sort((a, b) => { + + const illegalRatio = illegalMoves.length / moves.length; + if (Math.random() < illegalRatio) + // Return a random illegal move + return illegalMoves[randInt(illegalMoves.length)]; + + validMoves.sort((a, b) => { return (color == "w" ? 1 : -1) * (b.eval - a.eval); }); let candidates = [0]; - for (let i = 1; i < moves.length && moves[i].eval == moves[0].eval; i++) + for ( + let i = 1; + i < validMoves.length && validMoves[i].eval == moves[0].eval; + i++ + ) { candidates.push(i); - return moves[candidates[randInt(candidates.length)]]; + } + return validMoves[candidates[randInt(candidates.length)]]; } getNotation(move) {