X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FPacosako.js;h=d219916deaa8e8af3484f25c6c3528cdee06db0a;hb=d2af3400944331ffd0c770f83857257c2f48e487;hp=cde503977b372bfb3addc8b40dd02fd09bb2fdd1;hpb=8ec71052706a106ea3d04316d7f76a48aff98bec;p=vchess.git diff --git a/client/src/variants/Pacosako.js b/client/src/variants/Pacosako.js index cde50397..d219916d 100644 --- a/client/src/variants/Pacosako.js +++ b/client/src/variants/Pacosako.js @@ -139,6 +139,8 @@ export class PacosakoRules extends ChessRules { end: ChessRules.SquareToCoords(umove.substr(2)) }); } + // Local stack of positions to avoid redundant moves: + this.repetitions = []; } static IsGoodFen(fen) { @@ -705,10 +707,34 @@ export class PacosakoRules extends ChessRules { getCheckSquares() { return []; } + filterValid(moves) { if (moves.length == 0) return []; const L = this.umoves.length; //at least 1: init from FEN - return moves.filter(m => !this.oppositeMoves(this.umoves[L - 1], m)); + return moves.filter(m => { + if (this.oppositeMoves(this.umoves[L - 1], m)) return false; + if (!m.end.released) return true; + // Check for repetitions: + V.PlayOnBoard(this.board, m); + const newState = { + piece: m.end.released, + square: { x: m.end.x, y: m.end.y }, + position: this.getBaseFen() + }; + const repet = + this.repetitions.some(r => { + return ( + r.piece == newState.piece && + ( + r.square.x == newState.square.x && + r.square.y == newState.square.y && + ) && + r.position == newState.position + ); + }); + V.UndoOnBoard(this.board, m); + return !repet; + }); } updateCastleFlags(move, piece) { @@ -778,6 +804,16 @@ export class PacosakoRules extends ChessRules { } V.PlayOnBoard(this.board, move); this.umoves.push(this.getUmove(move)); + if (!move.end.released) this.repetitions = []; + else { + this.repetitions.push( + { + piece: move.end.released, + square: { x: move.end.x, y: move.end.y }, + position: this.getBaseFen() + } + ); + } } undo(move) { @@ -790,6 +826,7 @@ export class PacosakoRules extends ChessRules { this.movesCount--; } this.umoves.pop(); + if (!!move.end.released) this.repetitions.pop(); this.postUndo(move); } @@ -833,6 +870,7 @@ export class PacosakoRules extends ChessRules { for (let i = mvArray.length - 1; i >= 0; i--) this.undo(mvArray[i]); if (!mv.end.released) return (mvArray.length > 1 ? mvArray : mvArray[0]); } + return null; //never reached } // NOTE: evalPosition() is wrong, but unused since bot plays at random @@ -870,8 +908,13 @@ export class PacosakoRules extends ChessRules { // Add potential promotion indications: const firstLastRank = (c == 'w' ? [7, 0] : [0, 7]); if (move.end.x == firstLastRank[1] && piece == V.PAWN) { - const up = this.getUnionPieces(move.appear[0].c, move.appear[0].p); - notation += "=" + up[c].toUpperCase(); + notation += "="; + if (ChessRules.PIECES.includes(move.appear[0].p)) + notation += move.appear[0].p.toUpperCase(); + else { + const up = this.getUnionPieces(move.appear[0].c, move.appear[0].p); + notation += up[c].toUpperCase(); + } } else if ( move.end.x == firstLastRank[0] &&