From 2beba6db1bec978f55ff0da465f6a17cd40346da Mon Sep 17 00:00:00 2001 From: Benjamin Auder Date: Sun, 9 Feb 2020 16:10:20 +0100 Subject: [PATCH] Forbid castling when king doesn't move and is under check --- client/src/base_rules.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/client/src/base_rules.js b/client/src/base_rules.js index cc8292c4..20e123b3 100644 --- a/client/src/base_rules.js +++ b/client/src/base_rules.js @@ -748,10 +748,11 @@ export const ChessRules = class ChessRules continue; // If this code is reached, rooks and king are on initial position - // Nothing on the path of the king ? - // (And no checks; OK also if y==finalSquare) - let step = finalSquares[castleSide][0] < y ? -1 : 1; - for (i=y; i!=finalSquares[castleSide][0]; i+=step) + // Nothing on the path of the king ? (and no checks) + const finDist = finalSquares[castleSide][0] - y; + let step = finDist / Math.max(1, Math.abs(finDist)); + i = y; + do { if (this.isAttacked([x,i], [oppCol]) || (this.board[x][i] != V.EMPTY && // NOTE: next check is enough, because of chessboard constraints @@ -760,10 +761,12 @@ export const ChessRules = class ChessRules { continue castlingCheck; } + i += step; } + while (i!=finalSquares[castleSide][0]); // Nothing on the path to the rook? - step = castleSide == 0 ? -1 : 1; + step = (castleSide == 0 ? -1 : 1); for (i = y + step; i != this.INIT_COL_ROOK[c][castleSide]; i += step) { if (this.board[x][i] != V.EMPTY) -- 2.44.0