Fix parseInt() usage, rename Doubleorda --> Ordamirror, implement Clorange variant
[vchess.git] / client / src / variants / Extinction.js
index 45ace33..db8abc0 100644 (file)
@@ -1,27 +1,33 @@
 import { ChessRules } from "@/base_rules";
 
-export const VariantRules = class ExtinctionRules extends ChessRules {
+export class ExtinctionRules extends ChessRules {
+  static get PawnSpecs() {
+    return Object.assign(
+      {},
+      ChessRules.PawnSpecs,
+      { promotions: ChessRules.PawnSpecs.promotions.concat([V.KING]) }
+    );
+  }
+
   static IsGoodPosition(position) {
-    if (!ChessRules.IsGoodPosition(position))
-      return false;
+    if (!ChessRules.IsGoodPosition(position)) return false;
     // Also check that each piece type is present
     const rows = position.split("/");
     let pieces = {};
     for (let row of rows) {
       for (let i = 0; i < row.length; i++) {
-        if (isNaN(parseInt(row[i])) && !pieces[row[i]])
+        if (isNaN(parseInt(row[i], 10)) && !pieces[row[i]])
           pieces[row[i]] = true;
       }
     }
-    if (Object.keys(pieces).length != 12)
-      return false;
+    if (Object.keys(pieces).length != 12) return false;
     return true;
   }
 
   setOtherVariables(fen) {
     super.setOtherVariables(fen);
     const pos = V.ParseFen(fen).position;
-    // NOTE: no need for safety "|| []", because each piece type must be present
+    // NOTE: no need for safety "|| []", because each piece type is present
     // (otherwise game is already over!)
     this.material = {
       w: {
@@ -43,43 +49,6 @@ export const VariantRules = class ExtinctionRules extends ChessRules {
     };
   }
 
-  getPotentialPawnMoves([x, y]) {
-    let moves = super.getPotentialPawnMoves([x, y]);
-    // Add potential promotions into king
-    const color = this.turn;
-    const shift = color == "w" ? -1 : 1;
-    const lastRank = color == "w" ? 0 : V.size.x - 1;
-
-    if (x + shift == lastRank) {
-      // Normal move
-      if (this.board[x + shift][y] == V.EMPTY)
-        moves.push(
-          this.getBasicMove([x, y], [x + shift, y], { c: color, p: V.KING })
-        );
-      // Captures
-      if (
-        y > 0 &&
-        this.board[x + shift][y - 1] != V.EMPTY &&
-        this.canTake([x, y], [x + shift, y - 1])
-      ) {
-        moves.push(
-          this.getBasicMove([x, y], [x + shift, y - 1], { c: color, p: V.KING })
-        );
-      }
-      if (
-        y < V.size.y - 1 &&
-        this.board[x + shift][y + 1] != V.EMPTY &&
-        this.canTake([x, y], [x + shift, y + 1])
-      ) {
-        moves.push(
-          this.getBasicMove([x, y], [x + shift, y + 1], { c: color, p: V.KING })
-        );
-      }
-    }
-
-    return moves;
-  }
-
   // TODO: verify this assertion
   atLeastOneMove() {
     return true; //always at least one possible move
@@ -93,8 +62,8 @@ export const VariantRules = class ExtinctionRules extends ChessRules {
     return [];
   }
 
-  updateVariables(move) {
-    super.updateVariables(move);
+  postPlay(move) {
+    super.postPlay(move);
     // Treat the promotion case: (not the capture part)
     if (move.appear[0].p != move.vanish[0].p) {
       this.material[move.appear[0].c][move.appear[0].p]++;
@@ -105,8 +74,8 @@ export const VariantRules = class ExtinctionRules extends ChessRules {
       this.material[move.vanish[1].c][move.vanish[1].p]--;
   }
 
-  unupdateVariables(move) {
-    super.unupdateVariables(move);
+  postUndo(move) {
+    super.postUndo(move);
     if (move.appear[0].p != move.vanish[0].p) {
       this.material[move.appear[0].c][move.appear[0].p]--;
       this.material[move.appear[0].c][V.PAWN]++;
@@ -128,7 +97,6 @@ export const VariantRules = class ExtinctionRules extends ChessRules {
       }
       return "*";
     }
-
     return this.turn == "w" ? "0-1" : "1-0"; //NOTE: currently unreachable...
   }
 
@@ -139,7 +107,8 @@ export const VariantRules = class ExtinctionRules extends ChessRules {
         return this.material[color][p] == 0;
       })
     ) {
-      // Very negative (resp. positive) if white (reps. black) pieces set is incomplete
+      // Very negative (resp. positive)
+      // if white (reps. black) pieces set is incomplete
       return (color == "w" ? -1 : 1) * V.INFINITY;
     }
     return super.evalPosition();