Draft Dice chess
[xogo.git] / base_rules.js
index 8c7d549..0f89cc4 100644 (file)
@@ -235,7 +235,7 @@ export default class ChessRules {
         randomness: this.options["randomness"],
         between: [{p1: 'k', p2: 'r'}],
         diffCol: ['b'],
-        flags: ['r', 'k']
+        flags: ['r']
       }
     );
     return {
@@ -324,7 +324,7 @@ export default class ChessRules {
 
   // Flags part of the FEN string
   getFlagsFen() {
-    return ["w", "b"].map(c => {
+    return ['w', 'b'].map(c => {
       return this.castleFlags[c].map(x => x.toString(36)).join("");
     }).join("");
   }
@@ -340,7 +340,7 @@ export default class ChessRules {
     if (o.init)
       return "000000000000";
     return (
-      ["w","b"].map(c => Object.values(this.reserve[c]).join("")).join("")
+      ['w', 'b'].map(c => Object.values(this.reserve[c]).join("")).join("")
     );
   }
 
@@ -579,11 +579,18 @@ export default class ChessRules {
 
   // Get SVG board (background, no pieces)
   getSvgChessboard() {
-    const flipped = this.flippedBoard;
     let board = `
       <svg
         viewBox="0 0 ${10*this.size.y} ${10*this.size.x}"
         class="chessboard_SVG">`;
+    board += this.getBaseSvgChessboard();
+    board += "</svg>";
+    return board;
+  }
+
+  getBaseSvgChessboard() {
+    let board = "";
+    const flipped = this.flippedBoard;
     for (let i=0; i < this.size.x; i++) {
       for (let j=0; j < this.size.y; j++) {
         if (!this.onBoard(i, j))
@@ -605,7 +612,6 @@ export default class ChessRules {
           />`;
       }
     }
-    board += "</svg>";
     return board;
   }
 
@@ -642,7 +648,13 @@ export default class ChessRules {
       else
         this[arrName] = ArrayFun.init(this.size.x, this.size.y, null);
       if (arrName == "d_pieces")
-        this.marks.forEach(([i, j]) => addPiece(i, j, arrName, "mark"));
+        this.marks.forEach((m) => {
+          const formattedSquare =
+            (this.size.x - parseInt(m.substring(1), 10)).toString(36) +
+            (m.charCodeAt(0) - 97).toString(36);
+          const mCoords = V.SquareToCoords(formattedSquare);
+          addPiece(mCoords.x, mCoords.y, arrName, "mark");
+        });
     };
     if (this.marks)
       conditionalReset("d_pieces");
@@ -1792,7 +1804,10 @@ export default class ChessRules {
               continue outerLoop;
             const oldIJ = [i, j];
             [i, j] = this.increment([i, j], step);
-            if (Math.abs(j - oldIJ[1]) > 1 || Math.abs(i - oldIJ[0]) > 1) {
+            if (
+              Math.abs(i - oldIJ[0]) != Math.abs(step[0]) ||
+              Math.abs(j - oldIJ[1]) != Math.abs(step[1])
+            ) {
               // Boundary between segments (cylinder or circular mode)
               segments.push([[segStart[0], segStart[1]], oldIJ]);
               segStart = [i, j];
@@ -2236,7 +2251,7 @@ export default class ChessRules {
   }
 
   // NOTE: arg "castleFlags" for Coregal or Twokings
-  updateCastleFlags(move, castleFlags) {
+  updateCastleFlags(move, castleFlags, king) {
     castleFlags = castleFlags || this.castleFlags;
     // If flags already off, no need to re-check:
     if (
@@ -2247,7 +2262,7 @@ export default class ChessRules {
     }
     // Update castling flags if start or arrive from/at rook/king locations
     move.appear.concat(move.vanish).forEach(psq => {
-      if (this.isKing(0, 0, psq.p))
+      if ((king && psq.p == king) || (!king && this.isKing(0, 0, psq.p)))
         castleFlags[psq.c] = [this.size.y, this.size.y];
       // NOTE: not "else if" because king can capture enemy rook...
       let c = "";
@@ -2332,10 +2347,11 @@ export default class ChessRules {
     if (this.options["teleport"]) {
       if (
         this.subTurnTeleport == 1 &&
-        move.vanish.length > move.appear.length &&
+        move.vanish.length == 2 &&
+        move.appear.length == 1 &&
         move.vanish[1].c == this.turn
       ) {
-        const v = move.vanish[move.vanish.length - 1];
+        const v = move.vanish[1];
         this.captured = {x: v.x, y: v.y, c: v.c, p: v.p};
         this.subTurnTeleport = 2;
         return;