Several small improvements + integrate options + first working draft of Cwda
[vchess.git] / client / src / variants / Suction.js
index 2038e4f..77aef39 100644 (file)
@@ -1,6 +1,17 @@
 import { ChessRules, PiPo, Move } from "@/base_rules";
+import { SuicideRules } from "@/variants/Suicide";
 
 export class SuctionRules extends ChessRules {
+
+  static get PawnSpecs() {
+    return Object.assign(
+      {},
+      ChessRules.PawnSpecs,
+      // No promotions:
+      { promotions: [V.PAWN] }
+    );
+  }
+
   static get HasFlags() {
     return false;
   }
@@ -29,8 +40,8 @@ export class SuctionRules extends ChessRules {
   static IsGoodFen(fen) {
     if (!ChessRules.IsGoodFen(fen)) return false;
     const fenParts = fen.split(" ");
-    if (fenParts.length != 6) return false;
-    if (fenParts[5] != "-" && !fenParts[5].match(/^([a-h][1-8]){2}$/))
+    if (fenParts.length != 5) return false;
+    if (fenParts[4] != "-" && !fenParts[4].match(/^([a-h][1-8]){2}$/))
       return false;
     return true;
   }
@@ -96,7 +107,7 @@ export class SuctionRules extends ChessRules {
       Math.abs(epSquare.y - y) == 1
     ) {
       let enpassantMove = this.getBasicMove([x, y], [epSquare.x, epSquare.y]);
-      const oppCol = V.GetOppCol(color);
+      const oppCol = V.GetOppCol(this.turn);
       enpassantMove.vanish.push({
         x: x,
         y: epSquare.y,
@@ -121,7 +132,7 @@ export class SuctionRules extends ChessRules {
   // Does m2 un-do m1 ? (to disallow undoing captures)
   oppositeMoves(m1, m2) {
     return (
-      m1 &&
+      !!m1 &&
       m2.vanish.length == 2 &&
       m1.start.x == m2.start.x &&
       m1.end.x == m2.end.x &&
@@ -132,43 +143,47 @@ export class SuctionRules extends ChessRules {
 
   filterValid(moves) {
     if (moves.length == 0) return [];
-    const color = this.turn;
     return moves.filter(m => {
       const L = this.cmoves.length; //at least 1: init from FEN
       return !this.oppositeMoves(this.cmoves[L - 1], m);
     });
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     // Add empty cmove:
-    return ChessRules.GenRandInitFen(randomness).slice(0, -6) + "- -";
+    return SuicideRules.GenRandInitFen(options) + " -";
   }
 
-  getFen() {
+  getCmoveFen() {
     const L = this.cmoves.length;
-    const cmoveFen = !this.cmoves[L - 1]
-      ? "-"
-      : ChessRules.CoordsToSquare(this.cmoves[L - 1].start) +
-        ChessRules.CoordsToSquare(this.cmoves[L - 1].end);
-    return super.getFen() + " " + cmoveFen;
+    return (
+      !this.cmoves[L - 1]
+        ? "-"
+        : ChessRules.CoordsToSquare(this.cmoves[L - 1].start) +
+          ChessRules.CoordsToSquare(this.cmoves[L - 1].end)
+    );
+  }
+
+  getFen() {
+    return super.getFen() + " " + this.getCmoveFen();
+  }
+
+  getFenForRepeat() {
+    return super.getFenForRepeat() + "_" + this.getCmoveFen();
   }
 
   postPlay(move) {
     super.postPlay(move);
-    if (move.vanish.length == 2) {
-      // Was opponent king swapped?
-      if (move.vanish[1].p == V.KING)
-        this.kingPos[this.turn] = [move.appear[1].x, move.appear[1].y];
-    }
+    // Was opponent king swapped?
+    if (move.vanish.length == 2 && move.vanish[1].p == V.KING)
+      this.kingPos[this.turn] = [move.appear[1].x, move.appear[1].y];
     this.cmoves.push(this.getCmove(move));
   }
 
   postUndo(move) {
     super.postUndo(move);
-    if (move.appear.length == 2) {
-      if (move.appear[1].p == V.KING)
-        this.kingPos[move.vanish[1].c] = [move.vanish[1].x, move.vanish[1].y];
-    }
+    if (move.appear.length == 2 && move.appear[1].p == V.KING)
+      this.kingPos[move.vanish[1].c] = [move.vanish[1].x, move.vanish[1].y];
     this.cmoves.pop();
   }
 
@@ -217,4 +232,5 @@ export class SuctionRules extends ChessRules {
       finalSquare
     );
   }
+
 };