Fix Cwda (track kings)
[vchess.git] / client / src / variants / Cwda.js
index c5ecf09..f8cc6d9 100644 (file)
@@ -109,6 +109,24 @@ export class CwdaRules extends ChessRules {
     this.army2 = armies.charAt(1);
   }
 
+  scanKings(fen) {
+    this.kingPos = { w: [-1, -1], b: [-1, -1] };
+    const fenRows = V.ParseFen(fen).position.split("/");
+    for (let i = 0; i < fenRows.length; i++) {
+      let k = 0;
+      for (let j = 0; j < fenRows[i].length; j++) {
+        const newChar = fenRows[i].charAt(j);
+        if (['a', 'e', 'k'].includes(newChar)) this.kingPos["b"] = [i, k];
+        else if (['A', 'E', 'K'].includes(newChar)) this.kingPos["w"] = [i, k];
+        else {
+          const num = parseInt(fenRows[i].charAt(j), 10);
+          if (!isNaN(num)) k += num - 1;
+        }
+        k++;
+      }
+    }
+  }
+
   static ParseFen(fen) {
     return Object.assign(
       { armies: fen.split(" ")[5] },
@@ -192,6 +210,30 @@ export class CwdaRules extends ChessRules {
     );
   }
 
+  getEpSquare(moveOrSquare) {
+    if (!moveOrSquare) return undefined; //TODO: necessary line?!
+    if (typeof moveOrSquare === "string") {
+      const square = moveOrSquare;
+      if (square == "-") return undefined;
+      return V.SquareToCoords(square);
+    }
+    // Argument is a move:
+    const move = moveOrSquare;
+    const s = move.start,
+          e = move.end;
+    if (
+      s.y == e.y &&
+      Math.abs(s.x - e.x) == 2 &&
+      ['p', 'u', 'v'].includes(move.appear[0].p)
+    ) {
+      return {
+        x: (s.x + e.x) / 2,
+        y: s.y
+      };
+    }
+    return undefined; //default
+  }
+
   getPotentialMovesFrom(sq) {
     switch (this.getPiece(sq[0], sq[1])) {
       case V.C_ROOK: return this.getPotentialC_rookMoves(sq);
@@ -548,6 +590,28 @@ export class CwdaRules extends ChessRules {
     return super.isAttackedByQueen(sq, color);
   }
 
+  postPlay(move) {
+    const c = V.GetOppCol(this.turn);
+    const piece = move.appear[0].p;
+    // Update king position + flags
+    if (['k', 'a', 'e'].includes(piece)) {
+      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];
+    }
+    // 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);
+  }
+
+  postUndo(move) {
+    // (Potentially) Reset king position
+    const c = this.getColor(move.start.x, move.start.y);
+    const piece = move.appear[0].p;
+    if (['k', 'a', 'e'].includes(piece))
+      this.kingPos[c] = [move.start.x, move.start.y];
+  }
+
   static get VALUES() {
     return Object.assign(
       {
@@ -572,4 +636,11 @@ export class CwdaRules extends ChessRules {
     return 2;
   }
 
+  getNotation(move) {
+    let notation = super.getNotation(move);
+    if (['u', 'v'].includes(move.appear[0].p))
+      notation = notation.slice(0, -2);
+    return notation;
+  }
+
 };