// TODO? atLeastOneMove() would be more efficient if rewritten here
// (less sideBoard computations)
export class AliceRules extends ChessRules {
+
static get ALICE_PIECES() {
return {
s: "p",
return undefined; //default
}
+ // king can be l or L (on the other mirror side)
+ static IsGoodPosition(position) {
+ if (position.length == 0) return false;
+ const rows = position.split("/");
+ if (rows.length != V.size.x) return false;
+ let kings = { "k": 0, "K": 0, 'l': 0, 'L': 0 };
+ for (let row of rows) {
+ let sumElts = 0;
+ for (let i = 0; i < row.length; i++) {
+ if (['K','k','L','l'].includes(row[i])) kings[row[i]]++;
+ if (V.PIECES.includes(row[i].toLowerCase())) sumElts++;
+ else {
+ const num = parseInt(row[i], 10);
+ if (isNaN(num)) return false;
+ sumElts += num;
+ }
+ }
+ if (sumElts != V.size.y) return false;
+ }
+ if (kings['k'] + kings['l'] != 1 || kings['K'] + kings['L'] != 1)
+ return false;
+ return true;
+ }
+
setOtherVariables(fen) {
super.setOtherVariables(fen);
const rows = V.ParseFen(fen).position.split("/");
this.kingPos["w"] = [i, k];
break;
default: {
- const num = parseInt(rows[i].charAt(j));
+ const num = parseInt(rows[i].charAt(j), 10);
if (!isNaN(num)) k += num - 1;
}
}
m.vanish.length == 2 &&
this.board[m.end.x][m.end.y] == V.EMPTY
) {
- m.vanish[1].c = V.GetOppCol(this.getColor(x, y));
- // In the special case of en-passant, if
- // - board1 takes board2 : vanish[1] --> Alice
- // - board2 takes board1 : vanish[1] --> normal
- let van = m.vanish[1];
- if (mirrorSide == 1 && codes.includes(this.getPiece(van.x, van.y)))
- van.p = V.ALICE_CODES[van.p];
- else if (
- mirrorSide == 2 &&
- pieces.includes(this.getPiece(van.x, van.y))
- )
- van.p = V.ALICE_PIECES[van.p];
+ m.vanish[1].c = V.GetOppCol(this.turn);
+ const [epX, epY] = [m.vanish[1].x, m.vanish[1].y];
+ m.vanish[1].p = this.getPiece(epX, epY);
}
return true;
});
return res;
}
- getEnpassantCaptures([x, y], shiftX) {
- const Lep = this.epSquares.length;
- const epSquare = this.epSquares[Lep - 1]; //always at least one element
- let enpassantMove = null;
- if (
- !!epSquare &&
- epSquare.x == x + shiftX &&
- Math.abs(epSquare.y - y) == 1
- ) {
- enpassantMove = this.getBasicMove([x, y], [epSquare.x, epSquare.y]);
- // May capture in same world or different:
- const capturedPiece =
- this.board[x][epSquare.y] != V.EMPTY
- ? this.getPiece(x, epSquare.y)
- : ['p','s'][1 - "ps".indexOf(this.getPiece(x, y))];
- enpassantMove.vanish.push({
- x: x,
- y: epSquare.y,
- p: capturedPiece,
- c: V.GetOppCol(this.turn)
- });
- }
- return !!enpassantMove ? [enpassantMove] : [];
- }
-
filterValid(moves, sideBoard) {
if (moves.length == 0) return [];
if (!sideBoard) sideBoard = [this.getSideBoard(1), this.getSideBoard(2)];
// Piece or pawn movement
let notation = piece.toUpperCase() + pawnMark + captureMark + finalSquare;
- if (["s", "p"].includes(piece) && !["s", "p"].includes(move.appear[0].p)) {
+ if (["s", "p"].includes(piece) && !["s", "p"].includes(move.appear[0].p))
// Promotion
notation += "=" + move.appear[0].p.toUpperCase();
- }
return notation;
}
+
};