First draft of Hex game
[xogo.git] / base_rules.js
index 7191c56..20ff25e 100644 (file)
@@ -98,7 +98,7 @@ export default class ChessRules {
       this.options["teleport"] && this.subTurnTeleport == 2 &&
       this.board[coords.x][coords.y] == ""
     ) {
-      return new Move({
+      let res = new Move({
         start: {x: this.captured.x, y: this.captured.y},
         appear: [
           new PiPo({
@@ -108,9 +108,10 @@ export default class ChessRules {
             p: this.captured.p
           })
         ],
-        vanish: [],
-        drag: {c: this.captured.c, p: this.captured.p}
+        vanish: []
       });
+      res.drag = {c: this.captured.c, p: this.captured.p};
+      return res;
     }
     return null;
   }
@@ -289,19 +290,20 @@ export default class ChessRules {
     return fen;
   }
 
+  static FenEmptySquares(count) {
+    // if more than 9 consecutive free spaces, break the integer,
+    // otherwise FEN parsing will fail.
+    if (count <= 9)
+      return count;
+    // Most boards of size < 18:
+    if (count <= 18)
+      return "9" + (count - 9);
+    // Except Gomoku:
+    return "99" + (count - 18);
+  }
+
   // Position part of the FEN string
   getPosition() {
-    const format = (count) => {
-      // if more than 9 consecutive free spaces, break the integer,
-      // otherwise FEN parsing will fail.
-      if (count <= 9)
-        return count;
-      // Most boards of size < 18:
-      if (count <= 18)
-        return "9" + (count - 9);
-      // Except Gomoku:
-      return "99" + (count - 18);
-    };
     let position = "";
     for (let i = 0; i < this.size.y; i++) {
       let emptyCount = 0;
@@ -311,7 +313,7 @@ export default class ChessRules {
         else {
           if (emptyCount > 0) {
             // Add empty squares in-between
-            position += format(emptyCount);
+            position += C.FenEmptySquares(emptyCount);
             emptyCount = 0;
           }
           position += this.board2fen(this.board[i][j]);
@@ -319,7 +321,7 @@ export default class ChessRules {
       }
       if (emptyCount > 0)
         // "Flush remainder"
-        position += format(emptyCount);
+        position += C.FenEmptySquares(emptyCount);
       if (i < this.size.y - 1)
         position += "/"; //separate rows
     }
@@ -549,7 +551,7 @@ export default class ChessRules {
       cbHeight = Math.min(window.innerHeight, 767);
       cbWidth = cbHeight * this.size.ratio;
     }
-    if (this.reserve) {
+    if (this.hasReserve) {
       const sqSize = cbWidth / this.size.y;
       // NOTE: allocate space for reserves (up/down) even if they are empty
       // Cannot use getReserveSquareSize() here, but sqSize is an upper bound.
@@ -648,7 +650,7 @@ export default class ChessRules {
         }
       }
     }
-    if (this.reserve)
+    if (this.hasReserve)
       this.re_drawReserve(['w', 'b'], r);
   }
 
@@ -788,20 +790,24 @@ export default class ChessRules {
     chessboard.style.top = newY + "px";
     const newR = {x: newX, y: newY, width: newWidth, height: newHeight};
     const pieceWidth = this.getPieceWidth(newWidth);
-    for (let i=0; i < this.size.x; i++) {
-      for (let j=0; j < this.size.y; j++) {
-        if (this.g_pieces[i][j]) {
-          // NOTE: could also use CSS transform "scale"
-          this.g_pieces[i][j].style.width = pieceWidth + "px";
-          this.g_pieces[i][j].style.height = pieceWidth + "px";
-          const [ip, jp] = this.getPixelPosition(i, j, newR);
-          // Translate coordinates to use chessboard as reference:
-          this.g_pieces[i][j].style.transform =
-            `translate(${ip - newX}px,${jp - newY}px)`;
+    // NOTE: next "if" for variants which use squares filling
+    // instead of "physical", moving pieces
+    if (this.g_pieces) {
+      for (let i=0; i < this.size.x; i++) {
+        for (let j=0; j < this.size.y; j++) {
+          if (this.g_pieces[i][j]) {
+            // NOTE: could also use CSS transform "scale"
+            this.g_pieces[i][j].style.width = pieceWidth + "px";
+            this.g_pieces[i][j].style.height = pieceWidth + "px";
+            const [ip, jp] = this.getPixelPosition(i, j, newR);
+            // Translate coordinates to use chessboard as reference:
+            this.g_pieces[i][j].style.transform =
+              `translate(${ip - newX}px,${jp - newY}px)`;
+          }
         }
       }
     }
-    if (this.reserve)
+    if (this.hasReserve)
       this.rescaleReserve(newR);
   }
 
@@ -1207,7 +1213,7 @@ export default class ChessRules {
 
   getDropMovesFrom([c, p]) {
     // NOTE: by design, this.reserve[c][p] >= 1 on user click
-    // (but not necessarily otherwise)
+    // (but not necessarily otherwise: atLeastOneMove() etc)
     if (this.reserve[c][p] == 0)
       return [];
     let moves = [];