Several small improvements + integrate options + first working draft of Cwda
[vchess.git] / client / src / variants / Hidden.js
index 5ccc3d7..24b8dd0 100644 (file)
@@ -2,7 +2,13 @@ import { ChessRules, PiPo, Move } from "@/base_rules";
 import { ArrayFun } from "@/utils/array";
 import { randInt } from "@/utils/alea";
 
-export const VariantRules = class HiddenRules extends ChessRules {
+export class HiddenRules extends ChessRules {
+
+  static get Options() {
+    // TODO: later, option "free placement"
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
@@ -11,14 +17,18 @@ export const VariantRules = class HiddenRules extends ChessRules {
     return false;
   }
 
+  static get SomeHiddenMoves() {
+    return true;
+  }
+
   // Analyse in Hidden mode makes no sense
   static get CanAnalyze() {
     return false;
   }
 
-  // Moves are revealed only when game ends
+  // Moves are revealed only when game ends, but are highlighted on board
   static get ShowMoves() {
-    return "none";
+    return "highlight";
   }
 
   static get HIDDEN_DECODE() {
@@ -50,7 +60,7 @@ export const VariantRules = class HiddenRules extends ChessRules {
   }
 
   static get PIECES() {
-    return ChessRules.PIECES.concat(Object.values(V.HIDDEN_CODE));
+    return ChessRules.PIECES.concat(Object.keys(V.HIDDEN_DECODE));
   }
 
   // Pieces can be hidden :)
@@ -74,7 +84,7 @@ export const VariantRules = class HiddenRules extends ChessRules {
   }
 
   // Scan board for kings positions (no castling)
-  scanKingsRooks(fen) {
+  scanKings(fen) {
     this.kingPos = { w: [-1, -1], b: [-1, -1] };
     const fenRows = V.ParseFen(fen).position.split("/");
     for (let i = 0; i < fenRows.length; i++) {
@@ -90,7 +100,7 @@ export const VariantRules = class HiddenRules extends ChessRules {
             this.kingPos["w"] = [i, k];
             break;
           default: {
-            const num = parseInt(fenRows[i].charAt(j));
+            const num = parseInt(fenRows[i].charAt(j), 10);
             if (!isNaN(num)) k += num - 1;
           }
         }
@@ -143,16 +153,6 @@ export const VariantRules = class HiddenRules extends ChessRules {
     return mv;
   }
 
-  // What are the king moves from square x,y ?
-  getPotentialKingMoves(sq) {
-    // No castling:
-    return this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
-  }
-
   filterValid(moves) {
     return moves;
   }
@@ -215,9 +215,11 @@ export const VariantRules = class HiddenRules extends ChessRules {
       pieces[c][rook2Pos] = "u";
     }
     let upFen = pieces["b"].join("");
-    upFen = upFen.substr(0,8) + "/" + upFen.substr(8).split("").reverse().join("");
+    upFen = upFen.substr(0,8) + "/" +
+      upFen.substr(8).split("").reverse().join("");
     let downFen = pieces["b"].join("").toUpperCase();
-    downFen = downFen.substr(0,8) + "/" + downFen.substr(8).split("").reverse().join("");
+    downFen = downFen.substr(0,8) + "/" +
+      downFen.substr(8).split("").reverse().join("");
     return upFen + "/8/8/8/8/" + downFen + " w 0";
   }
 
@@ -225,8 +227,8 @@ export const VariantRules = class HiddenRules extends ChessRules {
     return [];
   }
 
-  updateVariables(move) {
-    super.updateVariables(move);
+  postPlay(move) {
+    super.postPlay(move);
     if (
       move.vanish.length >= 2 &&
       [V.KING,V.HIDDEN_CODE[V.KING]].includes(move.vanish[1].p)
@@ -236,8 +238,8 @@ export const VariantRules = class HiddenRules extends ChessRules {
     }
   }
 
-  unupdateVariables(move) {
-    super.unupdateVariables(move);
+  postUndo(move) {
+    super.postUndo(move);
     const c = move.vanish[0].c;
     const oppCol = V.GetOppCol(c);
     if (this.kingPos[oppCol][0] < 0)
@@ -265,9 +267,10 @@ export const VariantRules = class HiddenRules extends ChessRules {
       if (move.vanish.length == 2 && move.vanish[1].c != color) {
         // OK this isn't a castling move
         const myPieceVal = V.VALUES[move.appear[0].p];
-        const hisPieceVal = Object.keys(V.HIDDEN_DECODE).includes(move.vanish[1].p)
-          ? undefined
-          : V.VALUES[move.vanish[1].p];
+        const hisPieceVal =
+          Object.keys(V.HIDDEN_DECODE).includes(move.vanish[1].p)
+            ? undefined
+            : V.VALUES[move.vanish[1].p];
         if (!hisPieceVal) {
           // Opponent's piece is unknown: do not take too much risk
           move.eval = -myPieceVal + 1.5; //so that pawns always take
@@ -286,7 +289,8 @@ export const VariantRules = class HiddenRules extends ChessRules {
         // If no capture, favor small step moves,
         // but sometimes move the knight anyway
         const penalty = V.Decode(move.vanish[0].p) != V.KNIGHT
-          ? Math.abs(move.end.x - move.start.x) + Math.abs(move.end.y - move.start.y)
+          ? Math.abs(move.end.x - move.start.x) +
+            Math.abs(move.end.y - move.start.y)
           : (Math.random() < 0.5 ? 3 : 1);
         move.eval -= penalty / (V.size.x + V.size.y - 1);
       }
@@ -329,4 +333,5 @@ export const VariantRules = class HiddenRules extends ChessRules {
       finalSquare
     );
   }
+
 };