X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FBerolina.js;h=b14b19e8ef24fabc387ad57fba34ee8c0707567b;hb=32f6285ee325a14286562a53baefc647201df2af;hp=5f8d9c093d4adb52a68fbcfe41243d2bc2b9a088;hpb=8265530cb006919f68a73d83535a88b535f33768;p=vchess.git diff --git a/client/src/variants/Berolina.js b/client/src/variants/Berolina.js index 5f8d9c09..b14b19e8 100644 --- a/client/src/variants/Berolina.js +++ b/client/src/variants/Berolina.js @@ -1,6 +1,6 @@ import { ChessRules } from "@/base_rules"; -export const VariantRules = class BerolinaRules extends ChessRules { +export class BerolinaRules extends ChessRules { // En-passant after 2-sq jump getEpSquare(moveOrSquare) { if (!moveOrSquare) return undefined; @@ -18,14 +18,41 @@ export const VariantRules = class BerolinaRules extends ChessRules { const move = moveOrSquare; const [sx, ex, sy] = [move.start.x, move.end.x, move.start.y]; if (this.getPiece(sx, sy) == V.PAWN && Math.abs(sx - ex) == 2) { - return { - x: (ex + sx) / 2, - y: (move.end.y + sy) / 2 - }; + return [ + { + x: (ex + sx) / 2, + y: (move.end.y + sy) / 2 + }, + // The arrival column must be remembered, because + // potentially two pawns could be candidates to be captured: + // one on our left, and one on our right. + move.end.y + ]; } return undefined; //default } + static IsGoodEnpassant(enpassant) { + if (enpassant != "-") { + const epParts = enpassant.split(","); + const epSq = V.SquareToCoords(epParts[0]); + if (isNaN(epSq.x) || isNaN(epSq.y) || !V.OnBoard(epSq)) return false; + const arrCol = V.ColumnToCoord(epParts[1]); + if (isNaN(arrCol) || arrCol < 0 || arrCol >= V.size.y) return false; + } + return true; + } + + getEnpassantFen() { + const L = this.epSquares.length; + if (!this.epSquares[L - 1]) return "-"; //no en-passant + return ( + V.CoordsToSquare(this.epSquares[L - 1][0]) + + "," + + V.CoordToColumn(this.epSquares[L - 1][1]) + ); + } + // Special pawns movements getPotentialPawnMoves([x, y]) { const color = this.turn; @@ -49,6 +76,7 @@ export const VariantRules = class BerolinaRules extends ChessRules { ); } if ( + V.PawnSpecs.twoSquares && x == startRank && y + 2 * shiftY >= 0 && y + 2 * shiftY < sizeY && @@ -72,43 +100,47 @@ export const VariantRules = class BerolinaRules extends ChessRules { ); } - // En passant - const Lep = this.epSquares.length; - const epSquare = this.epSquares[Lep - 1]; //always at least one element - if ( - !!epSquare && - epSquare[0].x == x + shiftX && - epSquare[0].y == y && - Math.abs(epSquare[1] - y) == 1 - ) { - let enpassantMove = this.getBasicMove([x, y], [x + shiftX, y]); - enpassantMove.vanish.push({ - x: x, - y: epSquare[1], - p: "p", - c: this.getColor(x, epSquare[1]) - }); - moves.push(enpassantMove); + // Next condition so that other variants could inherit from this class + if (V.PawnSpecs.enPassant) { + // En passant + const Lep = this.epSquares.length; + const epSquare = this.epSquares[Lep - 1]; //always at least one element + if ( + !!epSquare && + epSquare[0].x == x + shiftX && + epSquare[0].y == y + ) { + let enpassantMove = this.getBasicMove([x, y], [x + shiftX, y]); + enpassantMove.vanish.push({ + x: x, + y: epSquare[1], + p: "p", + c: this.getColor(x, epSquare[1]) + }); + moves.push(enpassantMove); + } } return moves; } - isAttackedByPawn([x, y], colors) { - for (let c of colors) { - let pawnShift = c == "w" ? 1 : -1; - if (x + pawnShift >= 0 && x + pawnShift < V.size.x) { - if ( - this.getPiece(x + pawnShift, y) == V.PAWN && - this.getColor(x + pawnShift, y) == c - ) { - return true; - } + isAttackedByPawn([x, y], color) { + let pawnShift = (color == "w" ? 1 : -1); + if (x + pawnShift >= 0 && x + pawnShift < V.size.x) { + if ( + this.getPiece(x + pawnShift, y) == V.PAWN && + this.getColor(x + pawnShift, y) == color + ) { + return true; } } return false; } + static get SEARCH_DEPTH() { + return 2; + } + getNotation(move) { const piece = this.getPiece(move.start.x, move.start.y); if (piece == V.PAWN) { @@ -124,7 +156,7 @@ export const VariantRules = class BerolinaRules extends ChessRules { notation = startSquare + finalSquare; } if (move.appear[0].p != V.PAWN) - //promotion + // Promotion notation += "=" + move.appear[0].p.toUpperCase(); return notation; }