From 2beba6db1bec978f55ff0da465f6a17cd40346da Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
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