Almost added TitanChess + EvolutionChess
[vchess.git] / client / src / variants / Circular.js
index 4338c91..aa700bb 100644 (file)
@@ -3,6 +3,7 @@ import { ArrayFun } from "@/utils/array";
 import { shuffle } from "@/utils/alea";
 
 export class CircularRules extends ChessRules {
+
   static get HasCastle() {
     return false;
   }
@@ -35,8 +36,10 @@ export class CircularRules extends ChessRules {
   }
 
   static GenRandInitFen(randomness) {
-    if (randomness == 0)
-      return "8/8/pppppppp/rnbqkbnr/8/8/PPPPPPPP/RNBQKBNR w 0 1111111111111111";
+    if (randomness == 0) {
+      return "8/8/pppppppp/rnbqkbnr/8/8/PPPPPPPP/RNBQKBNR " +
+        "w 0 1111111111111111";
+    }
 
     let pieces = { w: new Array(8), b: new Array(8) };
     // Shuffle pieces on first and last rank
@@ -79,7 +82,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 +94,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;
   }
@@ -211,4 +222,5 @@ export class CircularRules extends ChessRules {
   static get SEARCH_DEPTH() {
     return 2;
   }
+
 };