Several small improvements + integrate options + first working draft of Cwda
[vchess.git] / client / src / variants / Grasshopper.js
index 043c0fc..fcc6bb1 100644 (file)
@@ -2,7 +2,20 @@ import { ChessRules } from "@/base_rules";
 import { ArrayFun } from "@/utils/array";
 import { randInt } from "@/utils/alea";
 
-export const VariantRules = class GrasshopperRules extends ChessRules {
+export class GrasshopperRules extends ChessRules {
+
+  static get HasEnpassant() {
+    return false;
+  }
+
+  static get PawnSpecs() {
+    return Object.assign(
+      {},
+      ChessRules.PawnSpecs,
+      { promotions: ChessRules.PawnSpecs.promotions.concat([V.GRASSHOPPER]) }
+    );
+  }
+
   static get GRASSHOPPER() {
     return "g";
   }
@@ -42,14 +55,14 @@ export const VariantRules = class GrasshopperRules extends ChessRules {
     return moves;
   }
 
-  isAttacked(sq, colors) {
+  isAttacked(sq, color) {
     return (
-      super.isAttacked(sq, colors) ||
-      this.isAttackedByGrasshopper(sq, colors)
+      super.isAttacked(sq, color) ||
+      this.isAttackedByGrasshopper(sq, color)
     );
   }
 
-  isAttackedByGrasshopper([x, y], colors) {
+  isAttackedByGrasshopper([x, y], color) {
     // Reversed process: is there an adjacent obstacle,
     // and a grasshopper next in the same line?
     for (const step of V.steps[V.ROOK].concat(V.steps[V.BISHOP])) {
@@ -67,7 +80,7 @@ export const VariantRules = class GrasshopperRules extends ChessRules {
         if (
           V.OnBoard(i, j) &&
           this.getPiece(i, j) == V.GRASSHOPPER &&
-          colors.includes(this.getColor(i, j))
+          this.getColor(i, j) == color
         ) {
           return true;
         }
@@ -78,56 +91,23 @@ 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(options) {
+    return ChessRules.GenRandInitFen(options)
+      .slice(0, -2)
+      .replace(
+        "/pppppppp/8/8/8/8/PPPPPPPP/",
+        "/gggggggg/pppppppp/8/8/PPPPPPPP/GGGGGGGG/"
+      );
   }
+
 };