Add Orda variant. Some advances in Dynamo draft. Display error message when loading...
[vchess.git] / client / src / base_rules.js
index f51e8d0..177fc9b 100644 (file)
@@ -191,14 +191,14 @@ export const ChessRules = class ChessRules {
     return V.CoordToColumn(coords.y) + (V.size.x - coords.x);
   }
 
-  // Path to pieces
+  // Path to pieces (standard ones in pieces/ folder)
   getPpath(b) {
-    return b; //usual pieces in pieces/ folder
+    return b;
   }
 
   // Path to promotion pieces (usually the same)
-  getPPpath(b) {
-    return this.getPpath(b);
+  getPPpath(m) {
+    return this.getPpath(m.appear[0].c + m.appear[0].p);
   }
 
   // Aggregates flags into one object
@@ -224,9 +224,11 @@ export const ChessRules = class ChessRules {
     const s = move.start,
           e = move.end;
     if (
-      Math.abs(s.x - e.x) == 2 &&
       s.y == e.y &&
-      move.appear[0].p == V.PAWN
+      Math.abs(s.x - e.x) == 2 &&
+      // Next conditions for variants like Atomic or Rifle, Recycle...
+      (move.appear.length > 0 && move.appear[0].p == V.PAWN) &&
+      (move.vanish.length > 0 && move.vanish[0].p == V.PAWN)
     ) {
       return {
         x: (s.x + e.x) / 2,
@@ -941,6 +943,7 @@ export const ChessRules = class ChessRules {
   }
 
   // Stop at the first move found
+  // TODO: not really, it explores all moves from a square but one would suffice.
   atLeastOneMove() {
     const color = this.turn;
     for (let i = 0; i < V.size.x; i++) {
@@ -1091,7 +1094,7 @@ export const ChessRules = class ChessRules {
     const c = V.GetOppCol(this.turn);
     const firstRank = (c == "w" ? V.size.x - 1 : 0);
     // Update castling flags if rooks are moved
-    const oppCol = V.GetOppCol(c);
+    const oppCol = this.turn;
     const oppFirstRank = V.size.x - 1 - firstRank;
     if (piece == V.KING && move.appear.length > 0)
       this.castleFlags[c] = [V.size.y, V.size.y];
@@ -1101,7 +1104,9 @@ export const ChessRules = class ChessRules {
     ) {
       const flagIdx = (move.start.y == this.castleFlags[c][0] ? 0 : 1);
       this.castleFlags[c][flagIdx] = V.size.y;
-    } else if (
+    }
+    // NOTE: not "else if" because a rook could take an opposing rook
+    if (
       move.end.x == oppFirstRank && //we took opponent rook?
       this.castleFlags[oppCol].includes(move.end.y)
     ) {
@@ -1282,8 +1287,8 @@ export const ChessRules = class ChessRules {
     }
 
     let candidates = [0];
-    for (let j = 1; j < moves1.length && moves1[j].eval == moves1[0].eval; j++)
-      candidates.push(j);
+    for (let i = 1; i < moves1.length && moves1[i].eval == moves1[0].eval; i++)
+      candidates.push(i);
     return moves1[candidates[randInt(candidates.length)]];
   }