import { ChessRules } from "@/base_rules";
-export const VariantRules = class ZenRules extends ChessRules {
- // NOTE: enPassant, if enabled, would need to redefine carefully getEpSquare
- static get HasEnpassant() {
- return false;
+export class ZenRules extends ChessRules {
+ getEpSquare(moveOrSquare) {
+ if (!moveOrSquare) return undefined;
+ if (typeof moveOrSquare === "string") {
+ const square = moveOrSquare;
+ if (square == "-") return undefined;
+ return V.SquareToCoords(square);
+ }
+ const move = moveOrSquare;
+ const s = move.start,
+ e = move.end;
+ if (
+ // Exclude captures (of rooks for example)
+ move.vanish.length == 1 &&
+ s.y == e.y &&
+ Math.abs(s.x - e.x) == 2 &&
+ move.appear[0].p == V.PAWN
+ ) {
+ return {
+ x: (s.x + e.x) / 2,
+ y: s.y
+ };
+ }
+ return undefined;
}
// TODO(?): some duplicated code in 2 next functions
// if met piece is opponent and same movement (asA): eat it!
findCaptures_aux([x, y], asA) {
const color = this.getColor(x, y);
- var moves = [];
+ let moves = [];
const steps =
asA != V.PAWN
? asA == V.QUEEN
[1, -1],
[1, 1]
];
- const oneStep = asA == V.KNIGHT || asA == V.PAWN; //we don't capture king
+ const oneStep = [V.KNIGHT,V.PAWN].includes(asA); //we don't capture king
const lastRank = color == "w" ? 0 : V.size.x - 1;
const promotionPieces = [V.ROOK, V.KNIGHT, V.BISHOP, V.QUEEN];
outerLoop: for (let loop = 0; loop < steps.length; loop++) {
return moves;
}
- getPotentialPawnMoves([x, y]) {
- const color = this.getColor(x, y);
- let moves = [];
- const sizeY = V.size.y;
- const shift = color == "w" ? -1 : 1;
- const startRank = color == "w" ? sizeY - 2 : 1;
- const firstRank = color == "w" ? sizeY - 1 : 0;
- const lastRank = color == "w" ? 0 : sizeY - 1;
-
- if (x + shift != lastRank) {
- // Normal moves
- if (this.board[x + shift][y] == V.EMPTY) {
- moves.push(this.getBasicMove([x, y], [x + shift, y]));
- if (
- [startRank, firstRank].includes(x) &&
- this.board[x + 2 * shift][y] == V.EMPTY
- ) {
- //two squares jump
- moves.push(this.getBasicMove([x, y], [x + 2 * shift, y]));
- }
- }
- } //promotion
- else {
- let promotionPieces = [V.ROOK, V.KNIGHT, V.BISHOP, V.QUEEN];
- promotionPieces.forEach(p => {
- // Normal move
- if (this.board[x + shift][y] == V.EMPTY)
- moves.push(
- this.getBasicMove([x, y], [x + shift, y], { c: color, p: p })
- );
- });
- }
-
- // No en passant here
+ canTake(sq1, sq2) {
+ return false; //captures handled separately
+ }
+ getPotentialPawnMoves([x, y]) {
+ let moves = super.getPotentialPawnMoves([x, y]);
// Add "zen" captures
Array.prototype.push.apply(moves, this.findCaptures([x, y]));
-
return moves;
}
return "0-0";
}
- // Translate initial square (because pieces may fly unusually in this variant!)
+ // Translate initial square (because pieces may fly unusually!)
const initialSquare = V.CoordsToSquare(move.start);
// Translate final square