Several small improvements + integrate options + first working draft of Cwda
[vchess.git] / client / src / variants / Cylinder.js
index 39a5185..bcb5393 100644 (file)
@@ -2,7 +2,8 @@ import { ChessRules, PiPo, Move } from "@/base_rules";
 import { ArrayFun } from "@/utils/array";
 import { randInt, shuffle } from "@/utils/alea";
 
-export const VariantRules = class CylinderRules extends ChessRules {
+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 const VariantRules = 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;
   }
@@ -97,25 +106,23 @@ export const VariantRules = class CylinderRules extends ChessRules {
     return moves;
   }
 
-  isAttackedByPawn([x, y], colors) {
-    for (let c of colors) {
-      let pawnShift = c == "w" ? 1 : -1;
-      if (x + pawnShift >= 0 && x + pawnShift < V.size.x) {
-        for (let i of [-1, 1]) {
-          const nextFile = V.ComputeY(y + i);
-          if (
-            this.getPiece(x + pawnShift, nextFile) == V.PAWN &&
-            this.getColor(x + pawnShift, nextFile) == c
-          ) {
-            return true;
-          }
+  isAttackedByPawn([x, y], color) {
+    let pawnShift = (color == "w" ? 1 : -1);
+    if (x + pawnShift >= 0 && x + pawnShift < V.size.x) {
+      for (let i of [-1, 1]) {
+        const nextFile = V.ComputeY(y + i);
+        if (
+          this.getPiece(x + pawnShift, nextFile) == V.PAWN &&
+          this.getColor(x + pawnShift, nextFile) == color
+        ) {
+          return true;
         }
       }
     }
     return false;
   }
 
-  isAttackedBySlideNJump([x, y], colors, piece, steps, oneStep) {
+  isAttackedBySlideNJump([x, y], color, piece, steps, oneStep) {
     for (let step of steps) {
       let rx = x + step[0],
           ry = V.ComputeY(y + step[1]);
@@ -125,8 +132,8 @@ export const VariantRules = class CylinderRules extends ChessRules {
       }
       if (
         V.OnBoard(rx, ry) &&
-        this.getPiece(rx, ry) === piece &&
-        colors.includes(this.getColor(rx, ry))
+        this.getPiece(rx, ry) == piece &&
+        this.getColor(rx, ry) == color
       ) {
         return true;
       }
@@ -134,6 +141,10 @@ export const VariantRules = class CylinderRules extends ChessRules {
     return false;
   }
 
+  static get SEARCH_DEPTH() {
+    return 2;
+  }
+
   static get VALUES() {
     return {
       p: 1,
@@ -144,4 +155,5 @@ export const VariantRules = class CylinderRules extends ChessRules {
       k: 1000
     };
   }
+
 };