import { ArrayFun } from "@/utils/array";
// NOTE: alternative implementation, probably cleaner = use only 1 board
-// TODO? atLeastOneMove() would be more efficient if rewritten here (less sideBoard computations)
-export const VariantRules = class AliceRules extends ChessRules {
+// TODO? atLeastOneMove() would be more efficient if rewritten here
+// (less sideBoard computations)
+export class AliceRules extends ChessRules {
static get ALICE_PIECES() {
return {
s: "p",
super.setOtherVariables(fen);
const rows = V.ParseFen(fen).position.split("/");
if (this.kingPos["w"][0] < 0 || this.kingPos["b"][0] < 0) {
- // INIT_COL_XXX won't be required if Alice kings are found (means 'king moved')
+ // INIT_COL_XXX won't be required if Alice kings are found
+ // (it means 'king moved')
for (let i = 0; i < rows.length; i++) {
let k = 0; //column index on board
for (let j = 0; j < rows[i].length; j++) {
return sideBoard;
}
- // NOTE: castle & enPassant https://www.chessvariants.com/other.dir/alice.html
+ // NOTE: castle & enPassant
+ // https://www.chessvariants.com/other.dir/alice.html
getPotentialMovesFrom([x, y], sideBoard) {
const pieces = Object.keys(V.ALICE_CODES);
const codes = Object.keys(V.ALICE_PIECES);
// Finally filter impossible moves
const res = moves.filter(m => {
if (m.appear.length == 2) {
- //castle
- // appear[i] must be an empty square on the other board
+ // Castle: appear[i] must be an empty square on the other board
for (let psq of m.appear) {
- if (this.getSquareOccupation(psq.x, psq.y, 3 - mirrorSide) != V.EMPTY)
+ if (
+ this.getSquareOccupation(psq.x, psq.y, 3 - mirrorSide) != V.EMPTY
+ ) {
return false;
+ }
}
} else if (this.board[m.end.x][m.end.y] != V.EMPTY) {
// Attempt to capture
// If the move is computed on board1, m.appear change for Alice pieces.
if (mirrorSide == 1) {
m.appear.forEach(psq => {
- //forEach: castling taken into account
+ // forEach: castling taken into account
psq.p = V.ALICE_CODES[psq.p]; //goto board2
});
- } //move on board2: mark vanishing pieces as Alice
+ }
else {
+ // Move on board2: mark vanishing pieces as Alice
m.vanish.forEach(psq => {
psq.p = V.ALICE_CODES[psq.p];
});
return res;
}
- updateVariables(move) {
- super.updateVariables(move); //standard king
+ postPlay(move) {
+ super.postPlay(move); //standard king
const piece = move.vanish[0].p;
const c = move.vanish[0].c;
// "l" = Alice king
if (piece == "l") {
this.kingPos[c][0] = move.appear[0].x;
this.kingPos[c][1] = move.appear[0].y;
- this.castleFlags[c] = [false, false];
+ this.castleFlags[c] = [8, 8];
}
}
- unupdateVariables(move) {
- super.unupdateVariables(move);
+ postUndo(move) {
+ super.postUndo(move);
const c = move.vanish[0].c;
- if (move.vanish[0].p == "l") this.kingPos[c] = [move.start.x, move.start.y];
+ if (move.vanish[0].p == "l")
+ this.kingPos[c] = [move.start.x, move.start.y];
}
getCurrentScore() {
- if (this.atLeastOneMove())
- // game not over
- return "*";
-
+ if (this.atLeastOneMove()) return "*";
const pieces = Object.keys(V.ALICE_CODES);
const color = this.turn;
const kp = this.kingPos[color];
);
}
+ static get SEARCH_DEPTH() {
+ return 2;
+ }
+
getNotation(move) {
if (move.appear.length == 2 && move.appear[0].p == V.KING) {
if (move.end.y < move.start.y) return "0-0-0";