X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=variants%2FCheckered%2Fclass.js;h=f73ed0ea27e7d120c57b1a6ba51cc23db76ac2d0;hb=4fcd7ab062f5250757804d633df01bd0d06da137;hp=35bfc79a2564c7c5b6431ef7a2fbdcc9b274ceea;hpb=616a8d7ae5ee96fe23d393cf6e4554b2cf3b9245;p=xogo.git diff --git a/variants/Checkered/class.js b/variants/Checkered/class.js index 35bfc79..f73ed0e 100644 --- a/variants/Checkered/class.js +++ b/variants/Checkered/class.js @@ -12,7 +12,7 @@ export default class CheckeredRules extends ChessRules { label: "Allow switching", variable: "withswitch", type: "checkbox", - defaut: false + defaut: true } ], styles: [ @@ -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 } ] @@ -218,6 +227,7 @@ export default class CheckeredRules extends ChessRules { } postProcessPotentialMoves(moves) { + moves = super.postProcessPotentialMoves(moves); if (this.stage == 2 || moves.length == 0) return moves; const color = this.turn; @@ -322,18 +332,25 @@ export default class CheckeredRules extends ChessRules { let kingPos = super.searchKingPos(color); if (this.stage == 2) // Must consider both kings (attacked by checkered side) - kingPos = [kingPos, super.searchKingPos(C.GetOppTurn(this.turn))]; + kingPos.push(super.searchKingPos(C.GetOppTurn(this.turn))[0]); const oppCols = this.getOppCols(color); - return moves.filter(m => { + const filteredMoves = moves.filter(m => { + if (m.vanish.length == 0 && m.appear.length == 0) + return true; //switch move 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; }); + return filteredMoves; } atLeastOneMove(color) { @@ -363,9 +380,14 @@ export default class CheckeredRules extends ChessRules { } underCheck(square_s, oppCols) { - if (this.stage == 2 && oppCol != this.sideCheckered) + if (this.stage == 2 && this.turn == this.sideCheckered) return false; //checkered pieces is me, I'm not under check - return square_s.some(sq => super.underAttack(sq, oppCols)); + // Artificial turn change required, because canTake uses turn info. + // canTake is called from underCheck --> ... --> findDestSquares + this.turn = C.GetOppTurn(this.turn); + const res = square_s.some(sq => super.underAttack(sq, oppCols)); + this.turn = C.GetOppTurn(this.turn); + return res; } prePlay(move) { @@ -386,6 +408,8 @@ export default class CheckeredRules extends ChessRules { if (move.appear.length == 0 && move.vanish.length == 0) { this.stage = 2; this.sideCheckered = this.turn; + if (this.playerColor != this.turn) + super.displayMessage(null, "Autonomous checkered!", "info-text", 2000); } else super.postPlay(move);