// Check if FEN describes a board situation correctly
static IsGoodFen(fen) {
+console.log("ddd");
const fenParsed = V.ParseFen(fen);
// 1) Check position
if (!V.IsGoodPosition(fenParsed.position)) return false;
// Squares of white and black king:
this.kingPos = { w: [-1, -1], b: [-1, -1] };
const fenRows = V.ParseFen(fen).position.split("/");
- const startRow = { 'w': V.size.x - 1, 'b': 0 };
for (let i = 0; i < fenRows.length; i++) {
let k = 0; //column index on board
for (let j = 0; j < fenRows[i].length; j++) {
a(href="http://www.zillions-of-games.com/") zillions-of-games.com
a(href="https://en.wikipedia.org/wiki/Fairy_chess_piece") Fairy chess pieces
a(href="http://www.pion.ch/echecs/liste_variantes.php") pion.ch
+ a(href="https://www.jatektan.hu/_2018_vissza/2011_ig/uj2001/isakk1.html")
+ | List of variants
a(href="http://abrobecker.free.fr/chess/fairyblitz.htm") fairyblitz.htm
a(href="https://chessvariants.training/") chessvariants.training
a(href="https://en.wikipedia.org/wiki/Fairy_chess_piece")
| Piezas de ajedrez magicas
a(href="http://www.pion.ch/echecs/liste_variantes.php") pion.ch
+ a(href="https://www.jatektan.hu/_2018_vissza/2011_ig/uj2001/isakk1.html")
+ | Listado de variantes
a(href="http://abrobecker.free.fr/chess/fairyblitz.htm") fairyblitz.htm
a(href="https://chessvariants.training/") chessvariants.training
a(href="https://en.wikipedia.org/wiki/Fairy_chess_piece")
| Pièces d'échecs féériques
a(href="http://www.pion.ch/echecs/liste_variantes.php") pion.ch
+ a(href="https://www.jatektan.hu/_2018_vissza/2011_ig/uj2001/isakk1.html")
+ | Liste de variantes
a(href="http://abrobecker.free.fr/chess/fairyblitz.htm") fairyblitz.htm
a(href="https://chessvariants.training/") chessvariants.training
) {
this.kingPos[c] = [-1, -1];
this.castleFlags[c] = [8, 8];
- } else {
+ }
+ else {
// Now check if init rook(s) exploded
if (Math.abs(move.end.x - firstRank[c]) <= 1) {
if (Math.abs(move.end.y - this.castleFlags[c][0]) <= 1)
return smove;
}
- play(move) {
- move.flags = JSON.stringify(this.aggregateFlags()); //save flags (for undo)
- this.epSquares.push(this.getEpSquare(move));
+ play(move, noFlag) {
+ if (!noFlag) {
+ move.flags = JSON.stringify(this.aggregateFlags());
+ this.epSquares.push(this.getEpSquare(move));
+ }
// Do not play on board (would reveal the move...)
this.turn = V.GetOppCol(this.turn);
this.movesCount++;
move.smove = smove;
}
- undo(move) {
- this.epSquares.pop();
- this.disaggregateFlags(JSON.parse(move.flags));
+ undo(move, noFlag) {
+ if (!noFlag) {
+ this.epSquares.pop();
+ this.disaggregateFlags(JSON.parse(move.flags));
+ }
if (this.turn == 'w')
// Back to the middle of the move
V.UndoOnBoard(this.board, move.smove);
if (color == 'b') {
// kingPos must be reset for appropriate highlighting:
var lastMove = JSON.parse(JSON.stringify(this.whiteMove));
- this.undo(lastMove); //will erase whiteMove, thus saved above
+ this.undo(lastMove, "noFlag"); //will erase whiteMove, thus saved above
}
let res = [];
if (this.kingPos['w'][0] >= 0 && this.underCheck('w'))
res.push(JSON.parse(JSON.stringify(this.kingPos['w'])));
if (this.kingPos['b'][0] >= 0 && this.underCheck('b'))
res.push(JSON.parse(JSON.stringify(this.kingPos['b'])));
- if (color == 'b') this.play(lastMove);
+ if (color == 'b') this.play(lastMove, "noFlag");
return res;
}
this.board = initBoard;
const movesInit = super.getPotentialMovesFrom([x, y]);
this.board = saveBoard;
- const target = appeared.find(a => a.c == oppCol);
+ const target = appeared.find(a => a.c == oppCol) || { x: -1, y: -1 };
let movesNow = super.getPotentialMovesFrom([x, y]).filter(m => {
return (
m.end.x == target.x &&
);
});
const passTarget =
- (x != this.kingPos[c][0] || y != this.kingPos[c][1]) ? c : oppCol;
+ (x != this.kingPos[c][0] || y != this.kingPos[c][0]) ? c : oppCol;
movesNow.push(
new Move({
start: { x: x, y: y },
return this.filterValid(this.getPotentialMovesFrom([x, y]));
}
- play(move) {
+ getAllValidMoves() {
+ const moves = this.filterValid(super.getAllPotentialMoves());
+ if (this.movesCount % 4 <= 1) return moves;
+ const emptyIdx = moves.findIndex(m => m.vanish.length == 0);
+ if (emptyIdx >= 0)
+ // Keep only one pass move (for computer play)
+ return moves.filter((m, i) => m.vanish.length > 0 || i == emptyIdx);
+ return moves;
+ }
+
+ play(move, noFlag) {
if (this.movesCount % 4 == 0) this.initfenStack.push(this.getBaseFen());
- move.flags = JSON.stringify(this.aggregateFlags());
+ if (!noFlag) move.flags = JSON.stringify(this.aggregateFlags());
// Do not play on board (would reveal the move...)
this.turn = V.GetOppCol(this.turn);
this.movesCount++;
move.smove = smove;
}
- undo(move) {
- this.disaggregateFlags(JSON.parse(move.flags));
+ undo(move, noFlag) {
+ if (!noFlag) this.disaggregateFlags(JSON.parse(move.flags));
if (this.turn == 'w')
// Back to the middle of the move
V.UndoOnBoard(this.board, move.smove);
return (whiteCanMove ? "1-0" : "0-1");
}
+ getComputerMove() {
+ if (this.movesCount % 4 <= 1) return super.getComputerMove();
+ const moves = this.getAllValidMoves();
+ return moves[randInt(moves.length)];
+ }
+
getNotation(move) {
if (move.vanish.length == 0) return "pass";
return super.getNotation(move);