From 85a1dcbab08bdab51c26c27fb8df95bc461617d4 Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
Date: Sat, 23 May 2020 12:49:54 +0200
Subject: [PATCH] Fix Koopa variant: always allow castlin with a non-stunned
 rook

---
 client/src/base_rules.js     |  9 +++++++--
 client/src/variants/Koopa.js | 10 ++++++++++
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/client/src/base_rules.js b/client/src/base_rules.js
index 9ee506e5..acf6eff0 100644
--- a/client/src/base_rules.js
+++ b/client/src/base_rules.js
@@ -884,7 +884,7 @@ export const ChessRules = class ChessRules {
   }
 
   // "castleInCheck" arg to let some variants castle under check
-  getCastleMoves([x, y], castleInCheck) {
+  getCastleMoves([x, y], castleInCheck, castleWith) {
     const c = this.getColor(x, y);
     if (x != (c == "w" ? V.size.x - 1 : 0) || y != this.INIT_COL_KING[c])
       return []; //x isn't first rank, or king has moved (shortcut)
@@ -908,9 +908,14 @@ export const ChessRules = class ChessRules {
 
       // NOTE: in some variants this is not a rook
       const rookPos = this.castleFlags[c][castleSide];
-      if (this.board[x][rookPos] == V.EMPTY || this.getColor(x, rookPos) != c)
+      if (
+        this.board[x][rookPos] == V.EMPTY ||
+        this.getColor(x, rookPos) != c ||
+        (!!castleWith && !castleWith.includes(this.getPiece(x, rookPos)))
+      ) {
         // Rook is not here, or changed color (see Benedict)
         continue;
+      }
 
       // Nothing on the path of the king ? (and no checks)
       const castlingPiece = this.getPiece(x, rookPos);
diff --git a/client/src/variants/Koopa.js b/client/src/variants/Koopa.js
index dbce8421..27c147a9 100644
--- a/client/src/variants/Koopa.js
+++ b/client/src/variants/Koopa.js
@@ -205,6 +205,16 @@ export class KoopaRules extends ChessRules {
     return moves.concat(promoteAfterStun);
   }
 
+  getPotentialKingMoves(sq) {
+    return (
+      this.getSlideNJumpMoves(
+        sq,
+        V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
+        "oneStep"
+      ).concat(super.getCastleMoves(sq, true, ['r']))
+    );
+  }
+
   filterValid(moves) {
     // Forbid kicking own king out
     const color = this.turn;
-- 
2.44.0