Completed Checkered variant. Untested
[xogo.git] / base_rules.js
index cdce2a1..a0defd1 100644 (file)
@@ -219,12 +219,15 @@ export default class ChessRules {
     const s = FenUtil.setupPieces(
       ['r', 'n', 'b', 'q', 'k', 'b', 'n', 'r'],
       {
+        randomness: this.options["randomness"],
         between: {p1: 'k', p2: 'r'},
-        diffCol: ['b']
+        diffCol: ['b'],
+        flags: ['r']
       }
     );
     return {
-      fen: s.b + "/pppppppp/8/8/8/8/PPPPPPPP/" + s.w,
+      fen: s.b.join("") + "/pppppppp/8/8/8/8/PPPPPPPP/" +
+           s.w.join("").toUpperCase(),
       o: {flags: s.flags}
     };
   }
@@ -283,9 +286,9 @@ export default class ChessRules {
   // Position part of the FEN string
   getPosition() {
     let position = "";
-    for (let i = 0; i < this.size.y; i++) {
+    for (let i = 0; i < this.size.x; i++) {
       let emptyCount = 0;
-      for (let j = 0; j < this.size.x; j++) {
+      for (let j = 0; j < this.size.y; j++) {
         if (this.board[i][j] == "")
           emptyCount++;
         else {
@@ -300,7 +303,7 @@ export default class ChessRules {
       if (emptyCount > 0)
         // "Flush remainder"
         position += C.FenEmptySquares(emptyCount);
-      if (i < this.size.y - 1)
+      if (i < this.size.x - 1)
         position += "/"; //separate rows
     }
     return position;
@@ -356,9 +359,6 @@ export default class ChessRules {
       if (this.options[opt.variable] === undefined)
         this.options[opt.variable] = opt.defaut;
     });
-    if (o.genFenOnly)
-      // This object will be used only for initial FEN generation
-      return;
 
     // Some variables
     this.playerColor = o.color;
@@ -557,7 +557,7 @@ export default class ChessRules {
     chessboard.style.top = spaceTop + "px";
     // Give sizes instead of recomputing them,
     // because chessboard might not be drawn yet.
-    this.setupPieces({
+    this.setupVisualPieces({
       width: cbWidth,
       height: cbHeight,
       x: spaceLeft,
@@ -597,7 +597,7 @@ export default class ChessRules {
     return board;
   }
 
-  setupPieces(r) {
+  setupVisualPieces(r) {
     let chessboard =
       document.getElementById(this.containerId).querySelector(".chessboard");
     if (!r)
@@ -965,7 +965,7 @@ export default class ChessRules {
     // TODO: onpointerdown/move/up ? See reveal.js /controllers/touch.js
   }
 
-  // NOTE: not called if isDiagram, or genFenOnly
+  // NOTE: not called if isDiagram
   removeListeners() {
     let container = document.getElementById(this.containerId);
     this.windowResizeObs.unobserve(container);
@@ -1171,8 +1171,12 @@ export default class ChessRules {
   ////////////////////////
   // PIECES SPECIFICATIONS
 
+  getPawnShift(color) {
+    return (color == "w" ? -1 : 1);
+  }
+
   pieces(color, x, y) {
-    const pawnShift = (color == "w" ? -1 : 1);
+    const pawnShift = this.getPawnShift(color);
     // NOTE: jump 2 squares from first rank (pawns can be here sometimes)
     const initRank = ((color == 'w' && x >= 6) || (color == 'b' && x <= 1));
     return {
@@ -2102,8 +2106,10 @@ export default class ChessRules {
   ////////////////////
   // MOVES VALIDATION
 
-  // Is piece (or square) at given position attacked by "oppCol" ?
+  // Is piece (or square) at given position attacked by "oppCol(s)" ?
   underAttack([x, y], oppCol) {
+    if (!Array.isArray(oppCol))
+      oppCol = [oppCol];
     // An empty square is considered as king,
     // since it's used only in getCastleMoves (TODO?)
     const king = this.board[x][y] == "" || this.isKing(x, y);
@@ -2113,7 +2119,7 @@ export default class ChessRules {
         this.findCapturesOn(
           [x, y],
           {
-            byCol: [oppCol],
+            byCol: oppCol,
             segments: this.options["cylinder"],
             one: true
           }
@@ -2129,7 +2135,7 @@ export default class ChessRules {
             segments: this.options["cylinder"],
             one: true
           },
-          ([i1, j1], [i2, j2]) => this.getColor(i2, j2) == oppCol
+          ([i1, j1], [i2, j2]) => oppCol.includes(this.getColor(i2, j2))
         )
       )
     );
@@ -2641,6 +2647,7 @@ export default class ChessRules {
     let container = document.getElementById(this.containerId);
     if (document.hidden) {
       document.onvisibilitychange = () => {
+        // TODO here: page reload ?! (some issues if tab changed...)
         document.onvisibilitychange = undefined;
         checkDisplayThenAnimate(700);
       };