From a8f0bbcb3808c8a8af548ab335c61674cffcb6c3 Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
Date: Sun, 22 Mar 2020 13:25:26 +0100
Subject: [PATCH] Fix duplicated moves in Cylinder and Circular chess

---
 client/src/variants/Circular.js | 12 ++++++++++--
 client/src/variants/Cylinder.js | 12 ++++++++++--
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/client/src/variants/Circular.js b/client/src/variants/Circular.js
index 4338c91f..73f87aaa 100644
--- a/client/src/variants/Circular.js
+++ b/client/src/variants/Circular.js
@@ -79,7 +79,10 @@ export class CircularRules extends ChessRules {
 
   getSlideNJumpMoves([x, y], steps, oneStep) {
     let moves = [];
+    // Don't add move twice when running on an infinite file:
+    let infiniteSteps = {};
     outerLoop: for (let step of steps) {
+      if (!!infiniteSteps[(-step[0]) + "." + (-step[1])]) continue;
       let i = V.ComputeX(x + step[0]);
       let j = y + step[1];
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
@@ -88,8 +91,13 @@ export class CircularRules extends ChessRules {
         i = V.ComputeX(i + step[0]);
         j += step[1];
       }
-      if (V.OnBoard(i, j) && this.canTake([x, y], [i, j]))
-        moves.push(this.getBasicMove([x, y], [i, j]));
+      if (V.OnBoard(i, j)) {
+        if (i == x && j == y)
+          // Looped back onto initial square
+          infiniteSteps[step[0] + "." + step[1]] = true;
+        else if (this.canTake([x, y], [i, j]))
+          moves.push(this.getBasicMove([x, y], [i, j]));
+      }
     }
     return moves;
   }
diff --git a/client/src/variants/Cylinder.js b/client/src/variants/Cylinder.js
index f26f3e62..2324bdcf 100644
--- a/client/src/variants/Cylinder.js
+++ b/client/src/variants/Cylinder.js
@@ -13,7 +13,10 @@ export class CylinderRules extends ChessRules {
 
   getSlideNJumpMoves([x, y], steps, oneStep) {
     let moves = [];
+    // Don't add move twice when running on an infinite rank:
+    let infiniteSteps = {};
     outerLoop: for (let step of steps) {
+      if (!!infiniteSteps[(-step[0]) + "." + (-step[1])]) continue;
       let i = x + step[0];
       let j = V.ComputeY(y + step[1]);
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
@@ -22,8 +25,13 @@ export class CylinderRules extends ChessRules {
         i += step[0];
         j = V.ComputeY(j + step[1]);
       }
-      if (V.OnBoard(i, j) && this.canTake([x, y], [i, j]))
-        moves.push(this.getBasicMove([x, y], [i, j]));
+      if (V.OnBoard(i, j)) {
+        if (i == x && j == y)
+          // Looped back onto initial square
+          infiniteSteps[step[0] + "." + step[1]] = true;
+        else if (this.canTake([x, y], [i, j]))
+          moves.push(this.getBasicMove([x, y], [i, j]));
+      }
     }
     return moves;
   }
-- 
2.44.0