import { ArrayFun } from "@/utils/array";
import { randInt, shuffle } from "@/utils/alea";
-export const VariantRules = class CylinderRules extends ChessRules {
+export class CylinderRules extends ChessRules {
// Output basically x % 8 (circular board)
static ComputeY(y) {
let res = y % V.size.y;
getSlideNJumpMoves([x, y], steps, oneStep) {
let moves = [];
+ // Don't add move twice when running on an infinite rank:
+ let infiniteSteps = {};
outerLoop: for (let step of steps) {
+ if (!!infiniteSteps[(-step[0]) + "." + (-step[1])]) continue;
let i = x + step[0];
let j = V.ComputeY(y + step[1]);
while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
i += step[0];
j = V.ComputeY(j + step[1]);
}
- if (V.OnBoard(i, j) && this.canTake([x, y], [i, j]))
- moves.push(this.getBasicMove([x, y], [i, j]));
+ if (V.OnBoard(i, j)) {
+ if (i == x && j == y)
+ // Looped back onto initial square
+ infiniteSteps[step[0] + "." + step[1]] = true;
+ else if (this.canTake([x, y], [i, j]))
+ moves.push(this.getBasicMove([x, y], [i, j]));
+ }
}
return moves;
}
return moves;
}
- isAttackedByPawn([x, y], colors) {
- for (let c of colors) {
- let pawnShift = c == "w" ? 1 : -1;
- if (x + pawnShift >= 0 && x + pawnShift < V.size.x) {
- for (let i of [-1, 1]) {
- const nextFile = V.ComputeY(y + i);
- if (
- this.getPiece(x + pawnShift, nextFile) == V.PAWN &&
- this.getColor(x + pawnShift, nextFile) == c
- ) {
- return true;
- }
+ isAttackedByPawn([x, y], color) {
+ let pawnShift = (color == "w" ? 1 : -1);
+ if (x + pawnShift >= 0 && x + pawnShift < V.size.x) {
+ for (let i of [-1, 1]) {
+ const nextFile = V.ComputeY(y + i);
+ if (
+ this.getPiece(x + pawnShift, nextFile) == V.PAWN &&
+ this.getColor(x + pawnShift, nextFile) == color
+ ) {
+ return true;
}
}
}
return false;
}
- isAttackedBySlideNJump([x, y], colors, piece, steps, oneStep) {
+ isAttackedBySlideNJump([x, y], color, piece, steps, oneStep) {
for (let step of steps) {
let rx = x + step[0],
ry = V.ComputeY(y + step[1]);
}
if (
V.OnBoard(rx, ry) &&
- this.getPiece(rx, ry) === piece &&
- colors.includes(this.getColor(rx, ry))
+ this.getPiece(rx, ry) == piece &&
+ this.getColor(rx, ry) == color
) {
return true;
}
return false;
}
+ static get SEARCH_DEPTH() {
+ return 2;
+ }
+
static get VALUES() {
return {
p: 1,