X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fbase_rules.js;h=f9574004f5973f2e6cef6911a392b04754c9085d;hb=6f2f94374f1e73c375edf732d9425e575e81fff7;hp=71fa13cfaa4e756d96b7e04445ec009d14964620;hpb=bb688df52df0713aba7b2c1c068614544f5ae96d;p=vchess.git diff --git a/client/src/base_rules.js b/client/src/base_rules.js index 71fa13cf..f9574004 100644 --- a/client/src/base_rules.js +++ b/client/src/base_rules.js @@ -128,11 +128,11 @@ export const ChessRules = class ChessRules { 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]); @@ -142,8 +142,8 @@ export const ChessRules = class ChessRules { } 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; } @@ -367,6 +367,13 @@ export const ChessRules = class ChessRules { // 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; @@ -375,7 +382,7 @@ export const ChessRules = class ChessRules { else { if (emptyCount > 0) { // Add empty squares in-between - position += emptyCount; + position += format(emptyCount); emptyCount = 0; } position += V.board2fen(this.board[i][j]); @@ -383,7 +390,7 @@ export const ChessRules = class ChessRules { } if (emptyCount > 0) { // "Flush remainder" - position += emptyCount; + position += format(emptyCount); } if (i < V.size.x - 1) position += "/"; //separate rows } @@ -672,7 +679,7 @@ export const ChessRules = class ChessRules { enpassantMove.vanish.push({ x: x, y: epSquare.y, - p: "p", + p: this.getPiece(x, epSquare.y), c: this.getColor(x, epSquare.y) }); } @@ -829,7 +836,7 @@ export const ChessRules = class ChessRules { castleSide++ //large, then small ) { if (this.castleFlags[c][castleSide] >= V.size.y) continue; - // If this code is reached, rooks and king are on initial position + // If this code is reached, rook and king are on initial position // NOTE: in some variants this is not a rook, but let's keep variable name const rookPos = this.castleFlags[c][castleSide]; @@ -1187,7 +1194,7 @@ export const ChessRules = class ChessRules { 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; }