From: Benjamin Auder Date: Fri, 27 Jan 2023 20:03:05 +0000 (+0100) Subject: Some more debug on Checkered (still not ready: turn/color issues..) X-Git-Url: https://git.auder.net/game/doc/html/current/DESCRIPTION?a=commitdiff_plain;h=b57b726c569a1a0f21b7f3ca00956bc2f26a6f3e;p=xogo.git Some more debug on Checkered (still not ready: turn/color issues..) --- diff --git a/base_rules.js b/base_rules.js index ec2571a..a8dad15 100644 --- a/base_rules.js +++ b/base_rules.js @@ -1849,9 +1849,7 @@ export default class ChessRules { { captureTarget: [x, y], captureSteps: [{steps: [s], range: a.range}], - segments: o.segments, - attackOnly: true, - one: false //one and captureTarget are mutually exclusive + segments: o.segments }, allowed ); @@ -1989,7 +1987,7 @@ export default class ChessRules { oppCols.includes(this.getColor(x, this.epSquare.y)) ) { const [epx, epy] = [this.epSquare.x, this.epSquare.y]; - this.board[epx][epy] = this.board[x][this.epSquares.y]; + this.board[epx][epy] = this.board[x][this.epSquare.y]; let enpassantMove = this.getBasicMove([x, y], [epx, epy]); this.board[epx][epy] = ""; const lastIdx = enpassantMove.vanish.length - 1; //think Rifle @@ -2167,36 +2165,30 @@ export default class ChessRules { color = this.turn; const oppCols = this.getOppCols(color); let kingPos = this.searchKingPos(color); - let filtered = {}; //avoid re-checking similar moves (promotions...) return moves.filter(m => { - const key = m.start.x + m.start.y + '.' + m.end.x + m.end.y; - if (!filtered[key]) { - this.playOnBoard(m); - let newKingPP = null, - sqIdx = 0, - res = true; //a priori valid - const oldKingPP = - m.vanish.find(v => this.isKing(0, 0, v.p) && v.c == color); - if (oldKingPP) { - // Search king in appear array: - newKingPP = - m.appear.find(a => this.isKing(0, 0, a.p) && a.c == color); - if (newKingPP) { - sqIdx = kingPos.findIndex(kp => - kp[0] == oldKingPP.x && kp[1] == oldKingPP.y); - kingPos[sqIdx] = [newKingPP.x, newKingPP.y]; - } - else - res = false; //king vanished + this.playOnBoard(m); + let newKingPP = null, + sqIdx = 0, + res = true; //a priori valid + const oldKingPP = + m.vanish.find(v => this.isKing(0, 0, v.p) && v.c == color); + if (oldKingPP) { + // Search king in appear array: + newKingPP = + m.appear.find(a => this.isKing(0, 0, a.p) && a.c == color); + if (newKingPP) { + sqIdx = kingPos.findIndex(kp => + kp[0] == oldKingPP.x && kp[1] == oldKingPP.y); + kingPos[sqIdx] = [newKingPP.x, newKingPP.y]; } - res &&= !this.underCheck(kingPos, oppCols); - if (oldKingPP && newKingPP) - kingPos[sqIdx] = [oldKingPP.x, oldKingPP.y]; - this.undoOnBoard(m); - filtered[key] = res; - return res; + else + res = false; //king vanished } - return filtered[key]; + res &&= !this.underCheck(kingPos, oppCols); + if (oldKingPP && newKingPP) + kingPos[sqIdx] = [oldKingPP.x, oldKingPP.y]; + this.undoOnBoard(m); + return res; }); } @@ -2400,9 +2392,9 @@ export default class ChessRules { if (kingPos[this.turn].length == 0 && kingPos[oppTurn].length == 0) return "1/2"; if (kingPos[this.turn].length == 0) - return (color == "w" ? "0-1" : "1-0"); + return (this.turn == "w" ? "0-1" : "1-0"); if (kingPos[oppTurn].length == 0) - return (color == "w" ? "1-0" : "0-1"); + return (this.turn == "w" ? "1-0" : "0-1"); if (this.atLeastOneMove(this.turn)) return "*"; // No valid move: stalemate or checkmate? diff --git a/variants/Checkered/class.js b/variants/Checkered/class.js index 35bfc79..e0872f6 100644 --- a/variants/Checkered/class.js +++ b/variants/Checkered/class.js @@ -34,7 +34,7 @@ export default class CheckeredRules extends ChessRules { return C.GetColorClass(c); } - static board2fen(b) { + board2fen(b) { const checkered_codes = { p: "s", q: "t", @@ -47,7 +47,7 @@ export default class CheckeredRules extends ChessRules { return super.board2fen(b); } - static fen2board(f) { + fen2board(f) { // Tolerate upper-case versions of checkered pieces (why not?) const checkered_pieces = { s: "p", @@ -119,24 +119,33 @@ export default class CheckeredRules extends ChessRules { pieces(color, x, y) { let baseRes = super.pieces(color, x, y); - if ( - this.getPiece(x, y) == 'p' && - this.stage == 2 && - this.getColor(x, y) == 'c' - ) { + if (this.getPiece(x, y) == 'p' && color == 'c') { + const pawnShift = this.getPawnShift(this.turn); //cannot trust color + const initRank = ( + (this.stage == 2 && [1, 6].includes(x)) || + (this.stage == 1 && + ((x == 1 && this.turn == 'b') || (x == 6 && this.turn == 'w')) + ) + ); // Checkered pawns on stage 2 are bidirectional - const initRank = ((color == 'w' && x >= 6) || (color == 'b' && x <= 1)); + let moveSteps = [[pawnShift, 0]], + attackSteps = [[pawnShift, 1], [pawnShift, -1]]; + if (this.stage == 2) { + moveSteps.push([-pawnShift, 0]); + Array.prototype.push.apply(attackSteps, + [[-pawnShift, 1], [-pawnShift, -1]]); + } baseRes['p'] = { "class": "pawn", moves: [ { - steps: [[1, 0], [-1, 0]], + steps: moveSteps, range: (initRank ? 2 : 1) } ], attack: [ { - steps: [[1, 1], [1, -1], [-1, 1], [-1, -1]], + steps: attackSteps, range: 1 } ] @@ -324,16 +333,25 @@ export default class CheckeredRules extends ChessRules { // Must consider both kings (attacked by checkered side) kingPos = [kingPos, super.searchKingPos(C.GetOppTurn(this.turn))]; const oppCols = this.getOppCols(color); - return moves.filter(m => { + // Artificial turn change required, because canTake uses turn info. + // canTake is called from underCheck --> ... --> findDestSquares + this.turn = C.GetOppTurn(this.turn); + const filteredMoves = moves.filter(m => { this.playOnBoard(m); + if (m.vanish[0].p == 'k') + kingPos[0] = [m.appear[0].x, m.appear[0].y]; let res = true; if (this.stage == 1) res = !this.oppositeMoves(this.cmove, m); if (res && m.appear.length > 0) res = !this.underCheck(kingPos, oppCols); + if (m.vanish[0].p == 'k') + kingPos[0] = [m.vanish[0].x, m.vanish[0].y]; this.undoOnBoard(m); return res; }); + this.turn = C.GetOppTurn(this.turn); + return filteredMoves; } atLeastOneMove(color) {