// NOTE: initial setup differs from the original; see
// https://www.chessvariants.com/large.dir/freeling.html
-export const VariantRules = class GrandRules extends ChessRules {
+export class GrandRules extends ChessRules {
static IsGoodFen(fen) {
if (!ChessRules.IsGoodFen(fen)) return false;
const fenParsed = V.ParseFen(fen);
return super.getFen() + " " + this.getCapturedFen();
}
+ getFenForRepeat() {
+ return super.getFenForRepeat() + "_" + this.getCapturedFen();
+ }
+
getCapturedFen() {
let counts = [...Array(14).fill(0)];
let i = 0;
return { x: 10, y: 10 };
}
+ // Rook + knight:
static get MARSHALL() {
return "m";
- } //rook+knight
+ }
+
+ // Bishop + knight
static get CARDINAL() {
return "c";
- } //bishop+knight
+ }
static get PIECES() {
return ChessRules.PIECES.concat([V.MARSHALL, V.CARDINAL]);
for (let epsq of epSquare) {
// TODO: some redundant checks
if (epsq.x == x + shiftX && Math.abs(epsq.y - y) == 1) {
- var enpassantMove = this.getBasicMove([x, y], [epsq.x, epsq.y]);
+ let enpassantMove = this.getBasicMove([x, y], [epsq.x, epsq.y]);
// WARNING: the captured pawn may be diagonally behind us,
// if it's a 3-squares jump and we take on 1st passing square
const px = this.board[x][epsq.y] != V.EMPTY ? x : x - shiftX;
);
}
- isAttacked(sq, colors) {
+ isAttacked(sq, color) {
return (
- super.isAttacked(sq, colors) ||
- this.isAttackedByMarshall(sq, colors) ||
- this.isAttackedByCardinal(sq, colors)
+ super.isAttacked(sq, color) ||
+ this.isAttackedByMarshall(sq, color) ||
+ this.isAttackedByCardinal(sq, color)
);
}
- isAttackedByMarshall(sq, colors) {
+ isAttackedByMarshall(sq, color) {
return (
- this.isAttackedBySlideNJump(sq, colors, V.MARSHALL, V.steps[V.ROOK]) ||
+ this.isAttackedBySlideNJump(sq, color, V.MARSHALL, V.steps[V.ROOK]) ||
this.isAttackedBySlideNJump(
sq,
- colors,
+ color,
V.MARSHALL,
V.steps[V.KNIGHT],
"oneStep"
);
}
- isAttackedByCardinal(sq, colors) {
+ isAttackedByCardinal(sq, color) {
return (
- this.isAttackedBySlideNJump(sq, colors, V.CARDINAL, V.steps[V.BISHOP]) ||
+ this.isAttackedBySlideNJump(sq, color, V.CARDINAL, V.steps[V.BISHOP]) ||
this.isAttackedBySlideNJump(
sq,
- colors,
+ color,
V.CARDINAL,
V.steps[V.KNIGHT],
"oneStep"
);
}
- updateVariables(move) {
- super.updateVariables(move);
+ postPlay(move) {
+ super.postPlay(move);
if (move.vanish.length == 2 && move.appear.length == 1) {
// Capture: update this.captured
this.captured[move.vanish[1].c][move.vanish[1].p]++;
}
}
- unupdateVariables(move) {
- super.unupdateVariables(move);
+ postUndo(move) {
+ super.postUndo(move);
if (move.vanish.length == 2 && move.appear.length == 1)
this.captured[move.vanish[1].c][move.vanish[1].p]--;
if (move.vanish[0].p != move.appear[0].p)
}
static GenRandInitFen(randomness) {
- if (!randomness) randomness = 2;
if (randomness == 0) {
- return "rnbqkmcbnr/pppppppppp/10/10/10/10/10/10/PPPPPPPPPP/RNBQKMCBNR " +
- "w 0 1111 - 00000000000000";
+ // No castling in the official initial setup
+ return "r8r/1nbqkmcbn1/pppppppppp/10/10/10/10/PPPPPPPPPP/1NBQKMCBN1/R8R " +
+ "w 0 zzzz - 00000000000000";
}
let pieces = { w: new Array(10), b: new Array(10) };