Some fixes, wrote some rules, implemented Wormhole variant
[vchess.git] / client / src / variants / Checkered.js
index 0e4f0a0..ac99602 100644 (file)
@@ -1,10 +1,6 @@
 import { ChessRules } from "@/base_rules";
 
 export const VariantRules = class CheckeredRules extends ChessRules {
-  static getPpath(b) {
-    return b[0] == "c" ? "Checkered/" + b : b;
-  }
-
   static board2fen(b) {
     const checkered_codes = {
       p: "s",
@@ -40,6 +36,10 @@ export const VariantRules = class CheckeredRules extends ChessRules {
     return ChessRules.PIECES.concat(["s", "t", "u", "c", "o"]);
   }
 
+  getPpath(b) {
+    return (b[0] == "c" ? "Checkered/" : "") + b;
+  }
+
   setOtherVariables(fen) {
     super.setOtherVariables(fen);
     // Local stack of non-capturing checkered moves:
@@ -74,7 +74,6 @@ export const VariantRules = class CheckeredRules extends ChessRules {
       w: [...Array(8).fill(true)], //pawns can move 2 squares?
       b: [...Array(8).fill(true)]
     };
-    if (!fenflags) return;
     const flags = fenflags.substr(4); //skip first 4 digits, for castle
     for (let c of ["w", "b"]) {
       for (let i = 0; i < 8; i++)
@@ -112,7 +111,8 @@ export const VariantRules = class CheckeredRules extends ChessRules {
   getPotentialMovesFrom([x, y]) {
     let standardMoves = super.getPotentialMovesFrom([x, y]);
     const lastRank = this.turn == "w" ? 0 : 7;
-    if (this.getPiece(x, y) == V.KING) return standardMoves; //king has to be treated differently (for castles)
+    // King has to be treated differently (for castles)
+    if (this.getPiece(x, y) == V.KING) return standardMoves;
     let moves = [];
     standardMoves.forEach(m => {
       if (m.vanish[0].p == V.PAWN) {
@@ -130,7 +130,7 @@ export const VariantRules = class CheckeredRules extends ChessRules {
         }
       }
       if (m.vanish.length == 1) moves.push(m);
-      //no capture
+      // No capture
       else {
         // A capture occured (m.vanish.length == 2)
         m.appear[0].c = "c";
@@ -156,7 +156,7 @@ export const VariantRules = class CheckeredRules extends ChessRules {
   // Does m2 un-do m1 ? (to disallow undoing checkered moves)
   oppositeMoves(m1, m2) {
     return (
-      !!m1 &&
+      m1 &&
       m2.appear[0].c == "c" &&
       m2.appear.length == 1 &&
       m2.vanish.length == 1 &&
@@ -170,8 +170,8 @@ export const VariantRules = class CheckeredRules extends ChessRules {
   filterValid(moves) {
     if (moves.length == 0) return [];
     const color = this.turn;
+    const L = this.cmoves.length; //at least 1: init from FEN
     return moves.filter(m => {
-      const L = this.cmoves.length; //at least 1: init from FEN
       if (this.oppositeMoves(this.cmoves[L - 1], m)) return false;
       this.play(m);
       const res = !this.underCheck(color);
@@ -180,6 +180,41 @@ export const VariantRules = class CheckeredRules extends ChessRules {
     });
   }
 
+  getAllValidMoves() {
+    const oppCol = V.GetOppCol(this.turn);
+    let potentialMoves = [];
+    for (let i = 0; i < V.size.x; i++) {
+      for (let j = 0; j < V.size.y; j++) {
+        // NOTE: just testing == color isn't enough because of checkred pieces
+        if (this.board[i][j] != V.EMPTY && this.getColor(i, j) != oppCol) {
+          Array.prototype.push.apply(
+            potentialMoves,
+            this.getPotentialMovesFrom([i, j])
+          );
+        }
+      }
+    }
+    return this.filterValid(potentialMoves);
+  }
+
+  atLeastOneMove() {
+    const oppCol = V.GetOppCol(this.turn);
+    for (let i = 0; i < V.size.x; i++) {
+      for (let j = 0; j < V.size.y; j++) {
+        // NOTE: just testing == color isn't enough because of checkred pieces
+        if (this.board[i][j] != V.EMPTY && this.getColor(i, j) != oppCol) {
+          const moves = this.getPotentialMovesFrom([i, j]);
+          if (moves.length > 0) {
+            for (let k = 0; k < moves.length; k++) {
+              if (this.filterValid([moves[k]]).length > 0) return true;
+            }
+          }
+        }
+      }
+    }
+    return false;
+  }
+
   isAttackedByPawn([x, y], colors) {
     for (let c of colors) {
       const color = c == "c" ? this.turn : c;
@@ -245,13 +280,15 @@ export const VariantRules = class CheckeredRules extends ChessRules {
 
   evalPosition() {
     let evaluation = 0;
-    //Just count material for now, considering checkered neutral (...)
+    // Just count material for now, considering checkered neutral (...)
     for (let i = 0; i < V.size.x; i++) {
       for (let j = 0; j < V.size.y; j++) {
         if (this.board[i][j] != V.EMPTY) {
           const sqColor = this.getColor(i, j);
-          const sign = sqColor == "w" ? 1 : sqColor == "b" ? -1 : 0;
-          evaluation += sign * V.VALUES[this.getPiece(i, j)];
+          if (["w","b"].includes(sqColor)) {
+            const sign = sqColor == "w" ? 1 : -1;
+            evaluation += sign * V.VALUES[this.getPiece(i, j)];
+          }
         }
       }
     }