Add Knightrelay1. Some fixes. Move odd 'isAttackedBy_multiple_colors' to Checkered...
[vchess.git] / client / src / variants / Circular.js
index 93df8ef..5468dc5 100644 (file)
@@ -3,6 +3,10 @@ import { ArrayFun } from "@/utils/array";
 import { randInt, shuffle } from "@/utils/alea";
 
 export const VariantRules = class CircularRules extends ChessRules {
+  static get HasCastle() {
+    return false;
+  }
+
   static get HasEnpassant() {
     return false;
   }
@@ -31,7 +35,6 @@ export const VariantRules = class CircularRules extends ChessRules {
   }
 
   static GenRandInitFen(randomness) {
-    if (!randomness) randomness = 2;
     if (randomness == 0)
       return "8/8/pppppppp/rnbqkbnr/8/8/PPPPPPPP/RNBQKBNR w 0 1111111111111111";
 
@@ -166,8 +169,7 @@ export const VariantRules = class CircularRules extends ChessRules {
   filterValid(moves) {
     const filteredMoves = super.filterValid(moves);
     // If at least one full move made, everything is allowed:
-    if (this.movesCount >= 2)
-      return filteredMoves;
+    if (this.movesCount >= 2) return filteredMoves;
     // Else, forbid check:
     const oppCol = V.GetOppCol(this.turn);
     return filteredMoves.filter(m => {
@@ -178,25 +180,23 @@ export const VariantRules = class CircularRules extends ChessRules {
     });
   }
 
-  isAttackedByPawn([x, y], colors) {
-    const pawnShift = 1;
-    const attackerRow = V.ComputeX(x + pawnShift);
-    for (let c of colors) {
-      for (let i of [-1, 1]) {
-        if (
-          y + i >= 0 &&
-          y + i < V.size.y &&
-          this.getPiece(attackerRow, y + i) == V.PAWN &&
-          this.getColor(attackerRow, y + i) == c
-        ) {
-          return true;
-        }
+  isAttackedByPawn([x, y], color) {
+    // pawn shift is always 1 (all pawns go the same way)
+    const attackerRow = V.ComputeX(x + 1);
+    for (let i of [-1, 1]) {
+      if (
+        y + i >= 0 &&
+        y + i < V.size.y &&
+        this.getPiece(attackerRow, y + i) == V.PAWN &&
+        this.getColor(attackerRow, y + i) == 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 = V.ComputeX(x + step[0]),
           ry = y + step[1];
@@ -206,8 +206,8 @@ export const VariantRules = class CircularRules 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;
       }
@@ -224,15 +224,11 @@ export const VariantRules = class CircularRules extends ChessRules {
     return flags;
   }
 
-  updateVariables(move) {
+  postPlay(move) {
+    super.postPlay(move);
     const c = move.vanish[0].c;
-    const secondRank = {"w":6, "b":2};
-    // Update king position + flags
-    if (move.vanish[0].p == V.KING && move.appear.length > 0) {
-      this.kingPos[c][0] = move.appear[0].x;
-      this.kingPos[c][1] = move.appear[0].y;
-    }
-    else if (move.vanish[0].p == V.PAWN && secondRank[c] == move.start.x)
+    const secondRank = { "w": 6, "b": 2 };
+    if (move.vanish[0].p == V.PAWN && secondRank[c] == move.start.x)
       // This move turns off a 2-squares pawn flag
       this.pawnFlags[c][move.start.y] = false;
   }
@@ -247,4 +243,8 @@ export const VariantRules = class CircularRules extends ChessRules {
       k: 1000
     };
   }
+
+  static get SEARCH_DEPTH() {
+    return 2;
+  }
 };