if (position.length == 0) return false;
const rows = position.split("/");
if (rows.length != V.size.x) return false;
- let kings = {};
+ let kings = { "k": 0, "K": 0 };
for (let row of rows) {
let sumElts = 0;
for (let i = 0; i < row.length; i++) {
- if (['K','k'].includes(row[i])) kings[row[i]] = true;
+ if (['K','k'].includes(row[i])) kings[row[i]]++;
if (V.PIECES.includes(row[i].toLowerCase())) sumElts++;
else {
const num = parseInt(row[i]);
}
if (sumElts != V.size.y) return false;
}
- // Both kings should be on board:
- if (Object.keys(kings).length != 2) return false;
+ // Both kings should be on board. Exactly one per color.
+ if (Object.values(kings).some(v => v != 1)) return false;
return true;
}
// Position part of the FEN string
getBaseFen() {
+ const format = (count) => {
+ // if more than 9 consecutive free spaces, break the integer,
+ // otherwise FEN parsing will fail.
+ if (count <= 9) return count;
+ // Currently only boards of size up to 11 or 12:
+ return "9" + (count - 9);
+ };
let position = "";
for (let i = 0; i < V.size.x; i++) {
let emptyCount = 0;
else {
if (emptyCount > 0) {
// Add empty squares in-between
- position += emptyCount;
+ position += format(emptyCount);
emptyCount = 0;
}
position += V.board2fen(this.board[i][j]);
}
if (emptyCount > 0) {
// "Flush remainder"
- position += emptyCount;
+ position += format(emptyCount);
}
if (i < V.size.x - 1) position += "/"; //separate rows
}
enpassantMove.vanish.push({
x: x,
y: epSquare.y,
- p: "p",
+ p: this.getPiece(x, epSquare.y),
c: this.getColor(x, epSquare.y)
});
}
return V.INFINITY;
}
- // Search depth: 2 for high branching factor, 4 for small (Loser chess, eg.)
+ // Search depth: 1,2 for high branching factor, 4 for small (Loser chess, eg.)
static get SEARCH_DEPTH() {
return 3;
}