From c4d2eb5bdf1b23d8c4a9d09322f84a9e0da9d60c Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
Date: Wed, 3 Jan 2024 17:10:33 +0100
Subject: [PATCH] Fix Dobutsu

---
 base_rules.js             | 17 +++++++++--------
 variants/Dobutsu/class.js | 21 ++++++++++-----------
 2 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/base_rules.js b/base_rules.js
index 217d055..9a364e8 100644
--- a/base_rules.js
+++ b/base_rules.js
@@ -465,7 +465,7 @@ export default class ChessRules {
   // VISUAL UTILS
 
   getPieceWidth(rwidth) {
-    return (rwidth / this.size.y);
+    return (rwidth / Math.max(this.size.x, this.size.y));
   }
 
   getReserveSquareSize(rwidth, nbR) {
@@ -856,9 +856,10 @@ export default class ChessRules {
       y = (this.playerColor == i ? y = r.height + 5 : - 5 - rsqSize);
     }
     else {
-      const sqSize = r.width / this.size.y;
+      const sqSize = r.width / Math.max(this.size.x, this.size.y);
       const flipped = this.flippedBoard;
-      x = (flipped ? this.size.y - 1 - j : j) * sqSize;
+      x = (flipped ? this.size.y - 1 - j : j) * sqSize +
+          Math.abs(this.size.x - this.size.y) * sqSize / 2;
       y = (flipped ? this.size.x - 1 - i : i) * sqSize;
     }
     return [r.x + x, r.y + y];
@@ -2284,11 +2285,6 @@ export default class ChessRules {
     if (this.hasCastle)
       this.updateCastleFlags(move);
     if (this.options["crazyhouse"]) {
-      move.vanish.forEach(v => {
-        const square = C.CoordsToSquare({x: v.x, y: v.y});
-        if (this.ispawn[square])
-          delete this.ispawn[square];
-      });
       if (move.appear.length > 0 && move.vanish.length > 0) {
         // Assumption: something is moving
         const initSquare = C.CoordsToSquare(move.start);
@@ -2307,6 +2303,11 @@ export default class ChessRules {
           delete this.ispawn[destSquare];
         }
       }
+      move.vanish.forEach(v => {
+        const square = C.CoordsToSquare({x: v.x, y: v.y});
+        if (this.ispawn[square])
+          delete this.ispawn[square];
+      });
     }
     const minSize = Math.min(move.appear.length, move.vanish.length);
     if (
diff --git a/variants/Dobutsu/class.js b/variants/Dobutsu/class.js
index 7632a17..29b0708 100644
--- a/variants/Dobutsu/class.js
+++ b/variants/Dobutsu/class.js
@@ -19,7 +19,7 @@ export default class DobutsuRules extends ChessRules {
     // NOTE: classs change according to playerColor (orientation)
     const mySide = (this.playerColor == color);
     return {
-      'c': {
+      'p': {
         "class": (mySide ? "" : "rev-") + "chick",
         both: [{steps: [[pawnShift, 0]], range: 1}]
       },
@@ -43,7 +43,7 @@ export default class DobutsuRules extends ChessRules {
         "class": (mySide ? "" : "rev-") + "giraffe",
         both: [{steps: [[0, 1], [0, -1], [1, 0], [-1, 0]], range: 1}]
       },
-      'l': {
+      'k': {
         "class": (mySide ? "" : "rev-") + "lion",
         both: [{
           steps: [[-1, 1], [-1, -1], [1, 1], [1, -1],
@@ -54,16 +54,15 @@ export default class DobutsuRules extends ChessRules {
     };
   }
 
-  isKing(x, y, p) {
-    if (!p)
-      p = this.getPiece(x, y);
-    return (p == 'l');
-  }
-
   static get ReserveArray() {
     return ['p', 'h', 'e', 'g'];
   }
 
+  updateReserve(color, piece, count) {
+    if (piece != 'k')
+      super.updateReserve(color, piece, count);
+  }
+
   constructor(o) {
     o.options = {crazyhouse: true, taking: true};
     super(o);
@@ -75,13 +74,13 @@ export default class DobutsuRules extends ChessRules {
 
   genRandInitBaseFen() {
     return {
-      fen: "gle/1c1/1C1/ELG",
+      fen: "gke/1p1/1P1/EKG",
       o: {}
     };
   }
 
   get size() {
-    return {x: 4, y: 4};
+    return {x: 4, y: 3};
   }
 
   getCurrentScore(move_s) {
@@ -91,7 +90,7 @@ export default class DobutsuRules extends ChessRules {
     const oppCol = C.GetOppTurn(this.turn);
     const oppLastRank = (oppCol == 'b' ? 3 : 0);
     for (let j=0; j < this.size.y; j++) {
-      if (this.board[oppLastRank][j] == oppCol + 'l')
+      if (this.board[oppLastRank][j] == oppCol + 'k')
         return (oppCol == 'w' ? "1-0" : "0-1");
     }
     return "*";
-- 
2.44.0