Fix Football
[vchess.git] / client / src / variants / Football.js
index df46d01..5b0b16d 100644 (file)
@@ -104,13 +104,13 @@ export class FootballRules extends ChessRules {
     }
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "rnbq1knbr/9/9/9/4a4/9/9/9/RNBQ1KNBR w 0";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
@@ -159,7 +159,7 @@ export class FootballRules extends ChessRules {
           V.OnBoard(i, j) &&
           this.board[i][j] == V.EMPTY &&
           (
-            // In a corner? The, allow all ball moves
+            // In a corner? Then, allow all ball moves
             ([0, 8].includes(bp[0]) && [0, 8].includes(bp[1])) ||
             // Do not end near the knight
             (Math.abs(i - x) >= 2 || Math.abs(j - y) >= 2)
@@ -246,34 +246,17 @@ export class FootballRules extends ChessRules {
       const moves = super.getPotentialMovesFrom([x, y])
                     .filter(m => m.end.y != 4 || ![0, 8].includes(m.end.x));
       // If bishop stuck in a corner: allow to jump over the next obstacle
-      if (moves.length == 0 && piece == V.BISHOP) {
-        if (
-          x == 0 && y == 0 &&
-          this.board[1][1] != V.EMPTY &&
-          this.board[2][2] == V.EMPTY
-        ) {
-          return [super.getBasicMove([x, y], [2, 2])];
-        }
-        if (
-          x == 0 && y == 8 &&
-          this.board[1][7] != V.EMPTY &&
-          this.board[2][6] == V.EMPTY
-        ) {
-          return [super.getBasicMove([x, y], [2, 6])];
-        }
-        if (
-          x == 8 && y == 0 &&
-          this.board[7][1] != V.EMPTY &&
-          this.board[6][2] == V.EMPTY
-        ) {
-          return [super.getBasicMove([x, y], [6, 2])];
-        }
+      if (
+        moves.length == 0 && piece == V.BISHOP &&
+        [0, 8].includes(x) && [0, 8].includes(y)
+      ) {
+        const indX = x == 0 ? [1, 2] : [7, 6];
+        const indY = y == 0 ? [1, 2] : [7, 6];
         if (
-          x == 8 && y == 8 &&
-          this.board[7][7] != V.EMPTY &&
-          this.board[6][6] == V.EMPTY
+          this.board[indX[0]][indY[0]] != V.EMPTY &&
+          this.board[indX[1]][indY[1]] == V.EMPTY
         ) {
-          return [super.getBasicMove([x, y], [6, 6])];
+          return [super.getBasicMove([x, y], [indX[1], indY[1]])];
         }
       }
       return moves;
@@ -282,7 +265,8 @@ export class FootballRules extends ChessRules {
     const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
     const c = this.turn;
     let moves = [];
-    let atLeastOnePotentialKick = false;
+    let kicks = {};
+    let adjacentPieces = false;
     for (let s of steps) {
       const [i, j] = [x + s[0], y + s[1]];
       if (
@@ -290,17 +274,24 @@ export class FootballRules extends ChessRules {
         this.board[i][j] != V.EMPTY &&
         this.getColor(i, j) == c
       ) {
-        if (!atLeastOnePotentialKick) atLeastOnePotentialKick = true;
-        Array.prototype.push.apply(moves, this.tryKickFrom([i, j]));
+        const kmoves = this.tryKickFrom([i, j]);
+        kmoves.forEach(km => {
+          const key = V.CoordsToSquare(km.start) + V.CoordsToSquare(km.end);
+          if (!kicks[key]) {
+            moves.push(km);
+            kicks[key] = true;
+          }
+        });
+        if (!adjacentPieces) adjacentPieces = true;
       }
     }
-    if (atLeastOnePotentialKick) {
-      // And, always add the "end" move. For computer, keep only one
+    if (adjacentPieces) {
+      // Add the "end" move (even if no valid kicks)
       outerLoop: 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 && this.getColor(i, j) == c) {
             moves.push(super.getBasicMove([x, y], [i, j]));
-            if (!!computer) break outerLoop;
+            if (computer) break outerLoop; //no choice for computer
           }
         }
       }
@@ -308,22 +299,8 @@ export class FootballRules extends ChessRules {
     return moves;
   }
 
-  // No captures:
-  getSlideNJumpMoves([x, y], steps, oneStep) {
-    let moves = [];
-    outerLoop: for (let step of steps) {
-      let i = x + step[0];
-      let j = y + step[1];
-      let stepCount = 1;
-      while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
-        moves.push(this.getBasicMove([x, y], [i, j]));
-        if (!!oneStep) continue outerLoop;
-        i += step[0];
-        j += step[1];
-        stepCount++;
-      }
-    }
-    return moves;
+  canTake() {
+    return false;
   }
 
   // Extra arg "computer" to avoid trimming all redundant pass moves: