import { ChessRules, PiPo } from "@/base_rules";
-export const VariantRules = class AtomicRules extends ChessRules {
+export class AtomicRules extends ChessRules {
getPotentialMovesFrom([x, y]) {
let moves = super.getPotentialMovesFrom([x, y]);
return moves.concat(this.getCastleMoves([x, y]));
}
- isAttacked(sq, colors) {
+ isAttacked(sq, color) {
if (
this.getPiece(sq[0], sq[1]) == V.KING &&
- this.isAttackedByKing(sq, colors)
- )
- return false; //king cannot take...
+ this.isAttackedByKing(sq, color)
+ ) {
+ // A king next to the enemy king is immune to attacks
+ return false;
+ }
return (
- this.isAttackedByPawn(sq, colors) ||
- this.isAttackedByRook(sq, colors) ||
- this.isAttackedByKnight(sq, colors) ||
- this.isAttackedByBishop(sq, colors) ||
- this.isAttackedByQueen(sq, colors)
+ this.isAttackedByPawn(sq, color) ||
+ this.isAttackedByRook(sq, color) ||
+ this.isAttackedByKnight(sq, color) ||
+ this.isAttackedByBishop(sq, color) ||
+ this.isAttackedByQueen(sq, color)
+ // No "attackedByKing": it cannot take
);
}
- updateVariables(move) {
- super.updateVariables(move);
+ postPlay(move) {
+ super.postPlay(move);
if (move.appear.length == 0) {
- //capture
+ // Capture
const firstRank = { w: 7, b: 0 };
for (let c of ["w", "b"]) {
// Did we explode king of color c ? (TODO: remove move earlier)
Math.abs(this.kingPos[c][1] - move.end.y) <= 1
) {
this.kingPos[c] = [-1, -1];
- this.castleFlags[c] = [false, false];
+ this.castleFlags[c] = [8, 8];
} else {
// Now check if init rook(s) exploded
if (Math.abs(move.end.x - firstRank[c]) <= 1) {
- if (Math.abs(move.end.y - this.INIT_COL_ROOK[c][0]) <= 1)
- this.castleFlags[c][0] = false;
- if (Math.abs(move.end.y - this.INIT_COL_ROOK[c][1]) <= 1)
- this.castleFlags[c][1] = false;
+ if (Math.abs(move.end.y - this.castleFlags[c][0]) <= 1)
+ this.castleFlags[c][0] = 8;
+ if (Math.abs(move.end.y - this.castleFlags[c][1]) <= 1)
+ this.castleFlags[c][1] = 8;
}
}
}
}
}
- unupdateVariables(move) {
- super.unupdateVariables(move);
- const c = move.vanish[0].c;
+ postUndo(move) {
+ super.postUndo(move);
+ const c = this.turn;
const oppCol = V.GetOppCol(c);
- if (
- [this.kingPos[c][0], this.kingPos[oppCol][0]].some(e => {
- return e < 0;
- })
- ) {
+ if ([this.kingPos[c][0], this.kingPos[oppCol][0]].some(e => e < 0)) {
// There is a chance that last move blowed some king away..
for (let psq of move.vanish) {
if (psq.p == "k")
// If opponent king disappeared, move is valid
else if (this.kingPos[oppCol][0] < 0) res = false;
// Otherwise, if we remain under check, move is not valid
- else res = this.isAttacked(this.kingPos[color], [oppCol]);
+ else res = this.isAttacked(this.kingPos[color], oppCol);
return res;
}
- getCheckSquares(color) {
+ getCheckSquares() {
+ const color = this.turn;
let res = [];
if (
this.kingPos[color][0] >= 0 && //king might have exploded
- this.isAttacked(this.kingPos[color], [V.GetOppCol(color)])
+ this.isAttacked(this.kingPos[color], V.GetOppCol(color))
) {
res = [JSON.parse(JSON.stringify(this.kingPos[color]))];
}
const color = this.turn;
const kp = this.kingPos[color];
if (kp[0] < 0)
- //king disappeared
+ // King disappeared
return color == "w" ? "0-1" : "1-0";
- if (this.atLeastOneMove())
- // game not over
- return "*";
- if (!this.isAttacked(kp, [V.GetOppCol(color)])) return "1/2";
+ if (this.atLeastOneMove()) return "*";
+ if (!this.isAttacked(kp, V.GetOppCol(color))) return "1/2";
return color == "w" ? "0-1" : "1-0"; //checkmate
}
};