import { ChessRules, PiPo, Move } from "@/base_rules";
import { ArrayFun } from "@/utils/array";
-import { randInt } from "@/utils/alea";
+import { shuffle } from "@/utils/alea";
-export const VariantRules = class BaroqueRules extends ChessRules {
+export class BaroqueRules extends ChessRules {
static get HasFlags() {
return false;
}
- static get HasCastle() {
- return false;
- }
-
static get HasEnpassant() {
return false;
}
}
return true; //immobilizer isn't neutralized
}
- // Chameleons can't be immobilized twice, because there is only one immobilizer
+ // Chameleons can't be immobilized twice,
+ // because there is only one immobilizer
if (oppPiece == V.BISHOP && piece == V.IMMOBILIZER) return true;
}
}
const color = this.turn;
const oppCol = V.GetOppCol(color);
moves.forEach(m => {
- if (!!byChameleon && m.start.x != m.end.x && m.start.y != m.end.y) return; //chameleon not moving as pawn
+ if (!!byChameleon && m.start.x != m.end.x && m.start.y != m.end.y)
+ // Chameleon not moving as pawn
+ return;
// Try capturing in every direction
for (let step of steps) {
const sq2 = [m.end.x + 2 * step[0], m.end.y + 2 * step[1]];
) {
continue;
}
- // last(thing), cur(thing) : stop if "cur" is our color, or beyond board limits,
- // or if "last" isn't empty and cur neither. Otherwise, if cur is empty then
- // add move until cur square; if cur is occupied then stop if !!byChameleon and
- // the square not occupied by a leaper.
+ // last(thing), cur(thing) : stop if "cur" is our color,
+ // or beyond board limits, or if "last" isn't empty and cur neither.
+ // Otherwise, if cur is empty then add move until cur square;
+ // if cur is occupied then stop if !!byChameleon and the square not
+ // occupied by a leaper.
let last = [i, j];
let cur = [i + step[0], j + step[1]];
let vanished = [new PiPo({ x: x, y: y, c: color, p: piece })];
this.getColor(i, j) == color &&
this.getPiece(i, j) == V.ROOK
) {
- if (this.isImmobilized([i, j])) return false; //because only one rook
- // Can it reach a capturing square?
- // Easy but quite suboptimal way (TODO): generate all moves (turn is OK)
+ if (this.isImmobilized([i, j]))
+ // Because only one rook:
+ return false;
+ // Can it reach a capturing square? Easy but quite suboptimal way
+ // (TODO: generate all moves (turn is OK))
const moves = this.getPotentialMovesFrom([i, j]);
for (let move of moves) {
if (
return true;
continue outerLoop;
}
- // [else] Our color, could be captured *if there was an empty space*
+ // [else] Our color,
+ // could be captured *if there was an empty space*
if (this.board[i + step[0]][j + step[1]] != V.EMPTY)
continue outerLoop;
i -= step[0];
break;
}
- let positions = ArrayFun.range(8);
// Get random squares for every piece, totally freely
-
- let randIndex = randInt(8);
- const bishop1Pos = positions[randIndex];
- positions.splice(randIndex, 1);
-
- randIndex = randInt(7);
- const bishop2Pos = positions[randIndex];
- positions.splice(randIndex, 1);
-
- randIndex = randInt(6);
- const knight1Pos = positions[randIndex];
- positions.splice(randIndex, 1);
-
- randIndex = randInt(5);
- const knight2Pos = positions[randIndex];
- positions.splice(randIndex, 1);
-
- randIndex = randInt(4);
- const queenPos = positions[randIndex];
- positions.splice(randIndex, 1);
-
- randIndex = randInt(3);
- const kingPos = positions[randIndex];
- positions.splice(randIndex, 1);
-
- randIndex = randInt(2);
- const rookPos = positions[randIndex];
- positions.splice(randIndex, 1);
- const immobilizerPos = positions[0];
-
- pieces[c][bishop1Pos] = "b";
- pieces[c][bishop2Pos] = "b";
- pieces[c][knight1Pos] = "n";
- pieces[c][knight2Pos] = "n";
- pieces[c][queenPos] = "q";
- pieces[c][kingPos] = "k";
- pieces[c][rookPos] = "r";
- pieces[c][immobilizerPos] = "m";
+ let positions = shuffle(ArrayFun.range(8));
+ const composition = ['r', 'n', 'b', 'q', 'k', 'b', 'n', 'm'];
+ for (let i = 0; i < 8; i++) pieces[c][positions[i]] = composition[i];
}
return (
pieces["b"].join("") +