Add Checkered1 + fix last move highlights
[vchess.git] / client / src / variants / Coregal.js
index 1a4a403..d6c736f 100644 (file)
@@ -4,7 +4,7 @@ import { randInt, sample } from "@/utils/alea";
 
 export class CoregalRules extends ChessRules {
   static IsGoodPosition(position) {
-    if (!super.IsGoodPosition(position)) return false;
+    if (!ChessRules.IsGoodPosition(position)) return false;
     const rows = position.split("/");
     // Check that at least one queen of each color is there:
     let queens = {};
@@ -46,7 +46,8 @@ export class CoregalRules extends ChessRules {
     }
   }
 
-  getCheckSquares(color) {
+  getCheckSquares() {
+    const color = this.turn;
     let squares = [];
     const oppCol = V.GetOppCol(color);
     if (this.isAttacked(this.kingPos[color], oppCol))
@@ -80,11 +81,11 @@ export class CoregalRules extends ChessRules {
       }
 
       // Get random squares for king and queen between b and g files
-      let randIndex = randInt(6);
-      let kingPos = randIndex + 1;
-      randIndex = randInt(5);
+      let randIndex = randInt(6) + 1;
+      let kingPos = randIndex;
+      randIndex = randInt(5) + 1;
       if (randIndex >= kingPos) randIndex++;
-      let queenPos = randIndex + 1;
+      let queenPos = randIndex;
 
       // Get random squares for rooks to the left and right of the queen
       // and king: not all squares of the same colors (for bishops).
@@ -140,8 +141,8 @@ export class CoregalRules extends ChessRules {
       pieces[c][bishop2Pos] = "b";
       pieces[c][knight2Pos] = "n";
       pieces[c][rook2Pos] = "r";
-      flags +=
-        [rook1Pos, queenPos, kingPos, rook2Pos].sort().map(V.CoordToColumn).join("");
+      flags += [rook1Pos, queenPos, kingPos, rook2Pos]
+        .sort().map(V.CoordToColumn).join("");
     }
     // Add turn + flags + enpassant
     return (
@@ -235,8 +236,18 @@ export class CoregalRules extends ChessRules {
       moves.push(
         new Move({
           appear: [
-            new PiPo({ x: x, y: finalSquares[castleSide][0], p: castlingPiece, c: c }),
-            new PiPo({ x: x, y: finalSquares[castleSide][1], p: V.ROOK, c: c })
+            new PiPo({
+              x: x,
+              y: finalSquares[castleSide][0],
+              p: castlingPiece,
+              c: c
+            }),
+            new PiPo({
+              x: x,
+              y: finalSquares[castleSide][1],
+              p: V.ROOK,
+              c: c
+            })
           ],
           vanish: [
             new PiPo({ x: x, y: y, p: castlingPiece, c: c }),
@@ -268,18 +279,21 @@ export class CoregalRules extends ChessRules {
     return false;
   }
 
-  updateCastleFlags(move, piece) {
+  // "twoKings" arg for the similar Twokings variant.
+  updateCastleFlags(move, piece, twoKings) {
     const c = V.GetOppCol(this.turn);
     const firstRank = (c == "w" ? V.size.x - 1 : 0);
     // Update castling flags if castling pieces moved or were captured
     const oppCol = V.GetOppCol(c);
     const oppFirstRank = V.size.x - 1 - firstRank;
-    if (move.start.x == firstRank && [V.KING, V.QUEEN].includes(piece)) {
-      if (this.castleFlags[c][1] == move.start.y)
-        this.castleFlags[c][1] = 8;
-      else if (this.castleFlags[c][2] == move.start.y)
-        this.castleFlags[c][2] = 8;
-      // Else: the flag is already turned off
+    if (move.start.x == firstRank) {
+      if (piece == V.KING || (!twoKings && piece == V.QUEEN)) {
+        if (this.castleFlags[c][1] == move.start.y)
+          this.castleFlags[c][1] = 8;
+        else if (this.castleFlags[c][2] == move.start.y)
+          this.castleFlags[c][2] = 8;
+        // Else: the flag is already turned off
+      }
     }
     else if (
       move.start.x == firstRank && //our rook moves?
@@ -289,7 +303,8 @@ export class CoregalRules extends ChessRules {
       this.castleFlags[c][flagIdx] = 8;
     } else if (
       move.end.x == oppFirstRank && //we took opponent rook?
-      [this.castleFlags[oppCol][0], this.castleFlags[oppCol][3]].includes(move.end.y)
+      [this.castleFlags[oppCol][0], this.castleFlags[oppCol][3]]
+        .includes(move.end.y)
     ) {
       const flagIdx = (move.end.y == this.castleFlags[oppCol][0] ? 0 : 3);
       this.castleFlags[oppCol][flagIdx] = 8;
@@ -298,6 +313,10 @@ export class CoregalRules extends ChessRules {
 
   // NOTE: do not set queen value to 1000 or so, because there may be several.
 
+  static get SEARCH_DEPTH() {
+    return 2;
+  }
+
   getNotation(move) {
     if (move.appear.length == 2) {
       // Castle: determine the right notation