Several small improvements + integrate options + first working draft of Cwda
[vchess.git] / client / src / variants / Synchrone2.js
index 5539c9e..17b0be3 100644 (file)
@@ -47,8 +47,8 @@ export class Synchrone2Rules extends Synchrone1Rules {
     );
   }
 
-  static GenRandInitFen(randomness) {
-    const res = ChessRules.GenRandInitFen(randomness);
+  static GenRandInitFen(options) {
+    const res = ChessRules.GenRandInitFen(options);
     // Add initFen field:
     return res.slice(0, -1) + res.split(' ')[0] + " -";
   }
@@ -93,7 +93,7 @@ export class Synchrone2Rules extends Synchrone1Rules {
     this.board = initBoard;
     const movesInit = super.getPotentialMovesFrom([x, y]);
     this.board = saveBoard;
-    const target = appeared.find(a => a.c == oppCol);
+    const target = appeared.find(a => a.c == oppCol) || { x: -1, y: -1 };
     let movesNow = super.getPotentialMovesFrom([x, y]).filter(m => {
       return (
         m.end.x == target.x &&
@@ -141,9 +141,19 @@ export class Synchrone2Rules extends Synchrone1Rules {
     return this.filterValid(this.getPotentialMovesFrom([x, y]));
   }
 
-  play(move) {
+  getAllValidMoves() {
+    const moves = this.filterValid(super.getAllPotentialMoves());
+    if (this.movesCount % 4 <= 1) return moves;
+    const emptyIdx = moves.findIndex(m => m.vanish.length == 0);
+    if (emptyIdx >= 0)
+      // Keep only one pass move (for computer play)
+      return moves.filter((m, i) => m.vanish.length > 0 || i == emptyIdx);
+    return moves;
+  }
+
+  play(move, noFlag) {
     if (this.movesCount % 4 == 0) this.initfenStack.push(this.getBaseFen());
-    move.flags = JSON.stringify(this.aggregateFlags());
+    if (!noFlag) move.flags = JSON.stringify(this.aggregateFlags());
     // Do not play on board (would reveal the move...)
     this.turn = V.GetOppCol(this.turn);
     this.movesCount++;
@@ -191,8 +201,8 @@ export class Synchrone2Rules extends Synchrone1Rules {
     move.smove = smove;
   }
 
-  undo(move) {
-    this.disaggregateFlags(JSON.parse(move.flags));
+  undo(move, noFlag) {
+    if (!noFlag) this.disaggregateFlags(JSON.parse(move.flags));
     if (this.turn == 'w')
       // Back to the middle of the move
       V.UndoOnBoard(this.board, move.smove);
@@ -213,12 +223,15 @@ export class Synchrone2Rules extends Synchrone1Rules {
   }
 
   getCurrentScore() {
-    if (this.movesCount % 4 != 0)
-      // Turn (2 x [white + black]) not over yet
+    if (this.movesCount % 2 != 0)
+      // Turn [white + black] not over yet
       return "*";
     // Was a king captured?
     if (this.kingPos['w'][0] < 0) return "0-1";
     if (this.kingPos['b'][0] < 0) return "1-0";
+    if (this.movesCount % 4 == 2)
+      // Turn (2 x [white + black]) not over yet
+      return "*";
     const whiteCanMove = this.atLeastOneMove('w');
     const blackCanMove = this.atLeastOneMove('b');
     if (whiteCanMove && blackCanMove) return "*";
@@ -236,6 +249,12 @@ export class Synchrone2Rules extends Synchrone1Rules {
     return (whiteCanMove ? "1-0" : "0-1");
   }
 
+  getComputerMove() {
+    if (this.movesCount % 4 <= 1) return super.getComputerMove();
+    const moves = this.getAllValidMoves();
+    return moves[randInt(moves.length)];
+  }
+
   getNotation(move) {
     if (move.vanish.length == 0) return "pass";
     return super.getNotation(move);