Work on Eightpieces draft. Fix Grand deterministic initial position
[vchess.git] / client / src / variants / Grand.js
index d28f639..b8a0838 100644 (file)
@@ -5,10 +5,6 @@ import { randInt } from "@/utils/alea";
 // NOTE: initial setup differs from the original; see
 // https://www.chessvariants.com/large.dir/freeling.html
 export const VariantRules = class GrandRules extends ChessRules {
-  static getPpath(b) {
-    return ([V.MARSHALL, V.CARDINAL].includes(b[1]) ? "Grand/" : "") + b;
-  }
-
   static IsGoodFen(fen) {
     if (!ChessRules.IsGoodFen(fen)) return false;
     const fenParsed = V.ParseFen(fen);
@@ -35,10 +31,18 @@ export const VariantRules = class GrandRules extends ChessRules {
     return Object.assign(ChessRules.ParseFen(fen), { captured: fenParts[5] });
   }
 
+  getPpath(b) {
+    return ([V.MARSHALL, V.CARDINAL].includes(b[1]) ? "Grand/" : "") + b;
+  }
+
   getFen() {
     return super.getFen() + " " + this.getCapturedFen();
   }
 
+  getFenForRepeat() {
+    return super.getFenForRepeat() + "_" + this.getCapturedFen();
+  }
+
   getCapturedFen() {
     let counts = [...Array(14).fill(0)];
     let i = 0;
@@ -307,8 +311,8 @@ export const VariantRules = class GrandRules extends ChessRules {
 
   static get VALUES() {
     return Object.assign(
-      ChessRules.VALUES,
-      { c: 5, m: 7 } //experimental
+      { c: 5, m: 7 }, //experimental
+      ChessRules.VALUES
     );
   }
 
@@ -316,11 +320,21 @@ export const VariantRules = class GrandRules extends ChessRules {
     return 2;
   }
 
-  // TODO: this function could be generalized and shared better (how ?!...)
-  static GenRandInitFen() {
+  static GenRandInitFen(randomness) {
+    if (randomness == 0) {
+      // No castling in the official initial setup
+      return "r8r/1nbqkmcbn1/pppppppppp/10/10/10/10/PPPPPPPPPP/1NBQKMCBN1/R8R " +
+        "w 0 0000 - 00000000000000";
+    }
+
     let pieces = { w: new Array(10), b: new Array(10) };
     // Shuffle pieces on first and last rank
     for (let c of ["w", "b"]) {
+      if (c == 'b' && randomness == 1) {
+        pieces['b'] = pieces['w'];
+        break;
+      }
+
       let positions = ArrayFun.range(10);
 
       // Get random squares for bishops