From c20e2566091a867712d90701b6d069f8de9c3ac1 Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
Date: Sun, 23 Jul 2023 21:47:56 +0200
Subject: [PATCH] Fix Clorange

---
 variants/Clorange/class.js | 36 +++++++++++++++++++-----------------
 1 file changed, 19 insertions(+), 17 deletions(-)

diff --git a/variants/Clorange/class.js b/variants/Clorange/class.js
index 01d7189..485bbd6 100644
--- a/variants/Clorange/class.js
+++ b/variants/Clorange/class.js
@@ -51,26 +51,28 @@ export default class ClorangeRules extends ChessRules {
     );
   }
 
+  pawnPostProcess(moves, color, oppCols) {
+    let res = super.pawnPostProcess(moves, color, oppCols);
+    if (res.length > 0 && res[0].vanish[0].p == 's') {
+      // Fix promotions of non-violent pawns (if any)
+      res.forEach(m => {
+        if (m.appear[0].p != 's')
+          m.appear[0].p = V.NV_PIECES[V.V_PIECES.indexOf(m.appear[0].p)];
+      });
+    }
+    return res;
+  }
+
   prePlay(move) {
     super.prePlay(move);
-    // No crazyhouse or recycle, so the last call didn't update reserve:
-    if (
-      (move.vanish.length == 2 && move.appear.length == 1) ||
-      move.vanish.length == 0 //drop
-    ) {
-      const trPiece =
-        (move.vanish.length > 0 ? move.vanish[1].p : move.appear[0].p);
-      const normal = V.V_PIECES.includes(trPiece);
-      const pIdx = (normal ? V.V_PIECES : V.NV_PIECES).indexOf(trPiece);
+    // NOTE: drop moves already taken into account in base prePlay()
+    if (move.vanish.length == 2 && move.appear.length == 1) {
+      const normal = V.V_PIECES.includes(move.vanish[1].p);
+      const pIdx =
+        (normal ? V.V_PIECES : V.NV_PIECES).indexOf(move.vanish[1].p);
       const resPiece = (normal ? V.NV_PIECES : V.V_PIECES)[pIdx];
-      if (move.vanish.length > 0) {
-        super.updateReserve(C.GetOppTurn(this.turn), resPiece,
-          this.reserve[C.GetOppTurn(this.turn)][resPiece] + 1);
-      }
-      else {
-        super.updateReserve(this.turn, resPiece,
-          this.reserve[this.turn][resPiece] - 1);
-      }
+      super.updateReserve(C.GetOppTurn(this.turn), resPiece,
+        this.reserve[C.GetOppTurn(this.turn)][resPiece] + 1);
     }
   }
 
-- 
2.44.0