Some fixes. Screen variant computer play is still broken, seemingly
[vchess.git] / client / src / variants / Cannibal.js
index 3a87a72..a0da0fd 100644 (file)
@@ -1,6 +1,7 @@
 import { ChessRules, Move, PiPo } from "@/base_rules";
 
 export class CannibalRules extends ChessRules {
+
   static get KING_CODE() {
     return {
       'p': 's',
@@ -49,7 +50,7 @@ export class CannibalRules extends ChessRules {
         else if (kingWhiteCodes.includes(row[i])) kings['w']++;
         if (allPiecesCodes.includes(row[i].toLowerCase())) sumElts++;
         else {
-          const num = parseInt(row[i]);
+          const num = parseInt(row[i], 10);
           if (isNaN(num)) return false;
           sumElts += num;
         }
@@ -74,7 +75,7 @@ export class CannibalRules extends ChessRules {
             const color = (piece.charCodeAt(0) <= 90 ? 'w' : 'b');
             this.kingPos[color] = [i, k];
           } else {
-            const num = parseInt(rows[i].charAt(j));
+            const num = parseInt(rows[i].charAt(j), 10);
             if (!isNaN(num)) k += num - 1;
           }
           k++;
@@ -88,7 +89,7 @@ export class CannibalRules extends ChessRules {
     return moves.filter(m => m.vanish.length == 2 && m.appear.length == 1);
   }
 
-       // Stop at the first capture found (if any)
+  // Stop at the first capture found (if any)
   atLeastOneCapture() {
     const color = this.turn;
     const oppCol = V.GetOppCol(color);
@@ -111,38 +112,9 @@ export class CannibalRules extends ChessRules {
   // Because of the disguised kings, getPiece() could be wrong:
   // use board[x][y][1] instead (always valid).
   getBasicMove([sx, sy], [ex, ey], tr) {
-    const initColor = this.getColor(sx, sy);
-    const initPiece = this.board[sx][sy].charAt(1);
-    let mv = new Move({
-      appear: [
-        new PiPo({
-          x: ex,
-          y: ey,
-          c: tr ? tr.c : initColor,
-          p: tr ? tr.p : initPiece
-        })
-      ],
-      vanish: [
-        new PiPo({
-          x: sx,
-          y: sy,
-          c: initColor,
-          p: initPiece
-        })
-      ]
-    });
-
-    // The opponent piece disappears if we take it
-    if (this.board[ex][ey] != V.EMPTY) {
-      mv.vanish.push(
-        new PiPo({
-          x: ex,
-          y: ey,
-          c: this.getColor(ex, ey),
-          p: this.board[ex][ey].charAt(1)
-        })
-      );
+    let mv = super.getBasicMove([sx, sy], [ex, ey], tr);
 
+    if (this.board[ex][ey] != V.EMPTY) {
       // If the captured piece has a different nature: take it as well
       if (mv.vanish[0].p != mv.vanish[1].p) {
         if (
@@ -150,7 +122,8 @@ export class CannibalRules extends ChessRules {
           Object.keys(V.KING_DECODE).includes(mv.vanish[0].p)
         ) {
           mv.appear[0].p = V.KING_CODE[mv.vanish[1].p];
-        } else mv.appear[0].p = mv.vanish[1].p;
+        }
+        else mv.appear[0].p = mv.vanish[1].p;
       }
     }
     else if (!!tr && mv.vanish[0].p != V.PAWN)
@@ -207,8 +180,9 @@ export class CannibalRules extends ChessRules {
       this.kingPos[c][0] = move.appear[0].x;
       this.kingPos[c][1] = move.appear[0].y;
       this.castleFlags[c] = [V.size.y, V.size.y];
-      return;
     }
+    // Next call is still required because the king may eat an opponent's rook
+    // TODO: castleFlags will be turned off twice then.
     super.updateCastleFlags(move, piece);
   }
 
@@ -245,4 +219,5 @@ export class CannibalRules extends ChessRules {
     }
     return notation;
   }
+
 };