Fix Parachute, allow 3 squares in Ball variant
[vchess.git] / client / src / variants / Ball.js
index 0f84bae..3903e2b 100644 (file)
@@ -125,7 +125,7 @@ export class BallRules extends ChessRules {
 
   static GenRandInitFen(randomness) {
     if (randomness == 0)
-      return "rnbcqcnbr/ppppppppp/9/9/4a4/9/9/PPPPPPPPP/RNBCQCNBR w 0 -";
+      return "hbnrqrnhb/ppppppppp/9/9/4a4/9/9/PPPPPPPPP/HBNRQRNHB w 0 -";
 
     let pieces = { w: new Array(9), b: new Array(9) };
     for (let c of ["w", "b"]) {
@@ -134,17 +134,26 @@ export class BallRules extends ChessRules {
         break;
       }
 
-      // Get random squares for every piece, totally freely
+      // Get random squares for every piece, with bishops and phoenixes
+      // on different colors:
       let positions = shuffle(ArrayFun.range(9));
-      const composition = ['b', 'b', 'r', 'r', 'n', 'n', 'c', 'c', 'q'];
-      const rem2 = positions[0] % 2;
+      const composition = ['b', 'b', 'h', 'h', 'n', 'n', 'r', 'r', 'q'];
+      let rem2 = positions[0] % 2;
       if (rem2 == positions[1] % 2) {
         // Fix bishops (on different colors)
-        for (let i=2; i<9; i++) {
+        for (let i=4; i<9; i++) {
           if (positions[i] % 2 != rem2)
             [positions[1], positions[i]] = [positions[i], positions[1]];
         }
       }
+      rem2 = positions[2] % 2;
+      if (rem2 == positions[3] % 2) {
+        // Fix phoenixes too:
+        for (let i=4; i<9; i++) {
+          if (positions[i] % 2 != rem2)
+            [positions[3], positions[i]] = [positions[i], positions[3]];
+        }
+      }
       for (let i = 0; i < 9; i++) pieces[c][positions[i]] = composition[i];
     }
     return (
@@ -259,7 +268,7 @@ export class BallRules extends ChessRules {
     return super.getPotentialMovesFrom([x, y]);
   }
 
-  // "Sliders": at most 2 steps
+  // "Sliders": at most 3 steps
   getSlideNJumpMoves([x, y], steps, oneStep) {
     let moves = [];
     outerLoop: for (let step of steps) {
@@ -268,7 +277,7 @@ export class BallRules extends ChessRules {
       let stepCount = 1;
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
         moves.push(this.getBasicMove([x, y], [i, j]));
-        if (oneStep || stepCount == 2) continue outerLoop;
+        if (oneStep || stepCount == 3) continue outerLoop;
         i += step[0];
         j += step[1];
         stepCount++;