Change castle flags. Eightpieces still not OK, but almost
[vchess.git] / client / src / variants / Grasshopper.js
index 043c0fc..82caa9f 100644 (file)
@@ -3,6 +3,10 @@ import { ArrayFun } from "@/utils/array";
 import { randInt } from "@/utils/alea";
 
 export const VariantRules = class GrasshopperRules extends ChessRules {
+  static get HasEnpassant() {
+    return false;
+  }
+
   static get GRASSHOPPER() {
     return "g";
   }
@@ -24,6 +28,51 @@ export const VariantRules = class GrasshopperRules extends ChessRules {
     }
   }
 
+  getPotentialPawnMoves([x, y]) {
+    const color = this.turn;
+    let moves = [];
+    const [sizeX, sizeY] = [V.size.x, V.size.y];
+    const shiftX = color == "w" ? -1 : 1;
+    const lastRank = color == "w" ? 0 : sizeX - 1;
+
+    const finalPieces =
+      x + shiftX == lastRank
+        ? [V.ROOK, V.KNIGHT, V.BISHOP, V.QUEEN, V.GRASSHOPPER]
+        : [V.PAWN];
+    if (this.board[x + shiftX][y] == V.EMPTY) {
+      // One square forward
+      for (let piece of finalPieces) {
+        moves.push(
+          this.getBasicMove([x, y], [x + shiftX, y], {
+            c: color,
+            p: piece
+          })
+        );
+      }
+      // No 2-squares jump
+    }
+    // Captures
+    for (let shiftY of [-1, 1]) {
+      if (
+        y + shiftY >= 0 &&
+        y + shiftY < sizeY &&
+        this.board[x + shiftX][y + shiftY] != V.EMPTY &&
+        this.canTake([x, y], [x + shiftX, y + shiftY])
+      ) {
+        for (let piece of finalPieces) {
+          moves.push(
+            this.getBasicMove([x, y], [x + shiftX, y + shiftY], {
+              c: color,
+              p: piece
+            })
+          );
+        }
+      }
+    }
+
+    return moves;
+  }
+
   getPotentialGrasshopperMoves([x, y]) {
     let moves = [];
     // Look in every direction until an obstacle (to jump) is met
@@ -78,56 +127,22 @@ export const VariantRules = class GrasshopperRules extends ChessRules {
 
   static get VALUES() {
     return Object.assign(
-      // TODO: grasshoppers power decline when less pieces on board...
-      { g: 3 },
+      // TODO: grasshoppers power decline with less pieces on board...
+      { g: 2 },
       ChessRules.VALUES
     );
   }
 
-  static GenRandInitFen() {
-    let pieces = { w: new Array(10), b: new Array(10) };
-    for (let c of ["w", "b"]) {
-      let positions = ArrayFun.range(8);
-
-      // Get random squares for grasshoppers (unconstrained)
-      let randIndex = randInt(8);
-      const grasshopper1Pos = positions[randIndex];
-      positions.splice(randIndex, 1);
-      randIndex = randInt(7);
-      const grasshopper2Pos = positions[randIndex];
-      positions.splice(randIndex, 1);
-
-      // Knights
-      randIndex = randInt(6);
-      let knight1Pos = positions[randIndex];
-      positions.splice(randIndex, 1);
-      randIndex = randInt(5);
-      let knight2Pos = positions[randIndex];
-      positions.splice(randIndex, 1);
-
-      // Queen
-      randIndex = randInt(4);
-      let queenPos = positions[randIndex];
-      positions.splice(randIndex, 1);
-
-      let rook1Pos = positions[0];
-      let kingPos = positions[1];
-      let rook2Pos = positions[2];
+  static get SEARCH_DEPTH() {
+    return 2;
+  }
 
-      pieces[c][rook1Pos] = "r";
-      pieces[c][knight1Pos] = "n";
-      pieces[c][grasshopper1Pos] = "g";
-      pieces[c][queenPos] = "q";
-      pieces[c][kingPos] = "k";
-      pieces[c][grasshopper2Pos] = "g";
-      pieces[c][knight2Pos] = "n";
-      pieces[c][rook2Pos] = "r";
-    }
-    return (
-      pieces["b"].join("") +
-      "/pppppppp/8/8/8/8/PPPPPPPP/" +
-      pieces["w"].join("").toUpperCase() +
-      " w 0 1111 -"
-    );
+  static GenRandInitFen(randomness) {
+    return ChessRules.GenRandInitFen(randomness)
+      .slice(0, -2)
+      .replace(
+        "/pppppppp/8/8/8/8/PPPPPPPP/",
+        "/gggggggg/pppppppp/8/8/PPPPPPPP/GGGGGGGG/"
+      );
   }
 };