Several small improvements + integrate options + first working draft of Cwda
[vchess.git] / client / src / variants / Cylinder.js
index f26f3e6..bcb5393 100644 (file)
@@ -3,6 +3,7 @@ import { ArrayFun } from "@/utils/array";
 import { randInt, shuffle } from "@/utils/alea";
 
 export class CylinderRules extends ChessRules {
+
   // Output basically x % 8 (circular board)
   static ComputeY(y) {
     let res = y % V.size.y;
@@ -13,17 +14,25 @@ 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) {
         moves.push(this.getBasicMove([x, y], [i, j]));
-        if (oneStep !== undefined) continue outerLoop;
+        if (oneStep) continue outerLoop;
         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;
   }
@@ -146,4 +155,5 @@ export class CylinderRules extends ChessRules {
       k: 1000
     };
   }
+
 };