Fix parseInt() usage, rename Doubleorda --> Ordamirror, implement Clorange variant
[vchess.git] / client / src / variants / Alice.js
index 57de568..61fcd01 100644 (file)
@@ -60,6 +60,30 @@ export class AliceRules extends ChessRules {
     return undefined; //default
   }
 
+  // king can be l or L (on the other mirror side)
+  static IsGoodPosition(position) {
+    if (position.length == 0) return false;
+    const rows = position.split("/");
+    if (rows.length != V.size.x) return false;
+    let kings = { "k": 0, "K": 0, 'l': 0, 'L': 0 };
+    for (let row of rows) {
+      let sumElts = 0;
+      for (let i = 0; i < row.length; i++) {
+        if (['K','k','L','l'].includes(row[i])) kings[row[i]]++;
+        if (V.PIECES.includes(row[i].toLowerCase())) sumElts++;
+        else {
+          const num = parseInt(row[i], 10);
+          if (isNaN(num)) return false;
+          sumElts += num;
+        }
+      }
+      if (sumElts != V.size.y) return false;
+    }
+    if (kings['k'] + kings['l'] != 1 || kings['K'] + kings['L'] != 1)
+      return false;
+    return true;
+  }
+
   setOtherVariables(fen) {
     super.setOtherVariables(fen);
     const rows = V.ParseFen(fen).position.split("/");
@@ -77,7 +101,7 @@ export class AliceRules extends ChessRules {
               this.kingPos["w"] = [i, k];
               break;
             default: {
-              const num = parseInt(rows[i].charAt(j));
+              const num = parseInt(rows[i].charAt(j), 10);
               if (!isNaN(num)) k += num - 1;
             }
           }
@@ -173,49 +197,15 @@ export class AliceRules extends ChessRules {
         m.vanish.length == 2 &&
         this.board[m.end.x][m.end.y] == V.EMPTY
       ) {
-        m.vanish[1].c = V.GetOppCol(this.getColor(x, y));
-        // In the special case of en-passant, if
-        //  - board1 takes board2 : vanish[1] --> Alice
-        //  - board2 takes board1 : vanish[1] --> normal
-        let van = m.vanish[1];
-        if (mirrorSide == 1 && codes.includes(this.getPiece(van.x, van.y)))
-          van.p = V.ALICE_CODES[van.p];
-        else if (
-          mirrorSide == 2 &&
-          pieces.includes(this.getPiece(van.x, van.y))
-        )
-          van.p = V.ALICE_PIECES[van.p];
+        m.vanish[1].c = V.GetOppCol(this.turn);
+        const [epX, epY] = [m.vanish[1].x, m.vanish[1].y];
+        m.vanish[1].p = this.getPiece(epX, epY);
       }
       return true;
     });
     return res;
   }
 
-  getEnpassantCaptures([x, y], shiftX) {
-    const Lep = this.epSquares.length;
-    const epSquare = this.epSquares[Lep - 1]; //always at least one element
-    let enpassantMove = null;
-    if (
-      !!epSquare &&
-      epSquare.x == x + shiftX &&
-      Math.abs(epSquare.y - y) == 1
-    ) {
-      enpassantMove = this.getBasicMove([x, y], [epSquare.x, epSquare.y]);
-      // May capture in same world or different:
-      const capturedPiece =
-        this.board[x][epSquare.y] != V.EMPTY
-          ? this.getPiece(x, epSquare.y)
-          : ['p','s'][1 - "ps".indexOf(this.getPiece(x, y))];
-      enpassantMove.vanish.push({
-        x: x,
-        y: epSquare.y,
-        p: capturedPiece,
-        c: V.GetOppCol(this.turn)
-      });
-    }
-    return !!enpassantMove ? [enpassantMove] : [];
-  }
-
   filterValid(moves, sideBoard) {
     if (moves.length == 0) return [];
     if (!sideBoard) sideBoard = [this.getSideBoard(1), this.getSideBoard(2)];
@@ -371,10 +361,9 @@ export class AliceRules extends ChessRules {
 
     // Piece or pawn movement
     let notation = piece.toUpperCase() + pawnMark + captureMark + finalSquare;
-    if (["s", "p"].includes(piece) && !["s", "p"].includes(move.appear[0].p)) {
+    if (["s", "p"].includes(piece) && !["s", "p"].includes(move.appear[0].p))
       // Promotion
       notation += "=" + move.appear[0].p.toUpperCase();
-    }
     return notation;
   }
 };