First draft of Emergo - still buggish. Fix Fanorona, avoid underscore in FEN and...
[vchess.git] / client / src / variants / Otage.js
index 3e35767..2a8891f 100644 (file)
@@ -36,7 +36,7 @@ export class OtageRules extends ChessRules {
       x: ['b', 'k'],
       y: ['q', 'q'],
       z: ['q', 'k'],
-      '_': ['k', 'k']
+      '@': ['k', 'k']
     };
   }
 
@@ -61,7 +61,7 @@ export class OtageRules extends ChessRules {
       for (let i = 0; i < row.length; i++) {
         const lowR = row[i].toLowerCase();
         const readNext = !(ChessRules.PIECES.includes(lowR));
-        if (!!(lowR.match(/[a-z_]/))) {
+        if (!!(lowR.match(/[a-z@]/))) {
           sumElts++;
           if (lowR == 'k') kings[row[i]]++;
           else if (readNext) {
@@ -146,7 +146,7 @@ export class OtageRules extends ChessRules {
         const c = fenRows[i].charAt(j);
         const lowR = c.toLowerCase();
         const readNext = !(ChessRules.PIECES.includes(lowR));
-        if (!!(lowR.match(/[a-z_]/))) {
+        if (!!(lowR.match(/[a-z@]/))) {
           if (lowR == 'k') this.kingPos[c == 'k' ? 'b' : 'w'] = [i, k];
           else if (readNext) {
             const up = this.getUnionPieces(fenRows[i][++j], lowR);
@@ -255,7 +255,14 @@ export class OtageRules extends ChessRules {
       // Transformation computed without taking union into account
       const up = this.getUnionPieces(initColor, initPiece);
       let args = [tr.p, up[oppCol]];
-      if (['a', 'v'].includes(initColor)) args = args.reverse();
+      if (
+        ['a', 'v'].includes(initColor) ||
+        // HACK: "ba" piece = two pawns, black controling.
+        // If promoting, must artificially imagine color was 'a':
+        (initPiece == 'a' && initColor == 'b')
+      ) {
+        args = args.reverse();
+      }
       const capturer = (['a', 'b'].includes(initColor) ? 'b' : 'w');
       const cp = this.getUnionCode(args[0], args[1], capturer);
       tr.c = cp.c;
@@ -646,11 +653,19 @@ export class OtageRules extends ChessRules {
       if (!m.end.released) return true;
       // Check for repetitions:
       V.PlayOnBoard(this.board, m);
-      const newState = { piece: m.end.released, position: this.getBaseFen() };
+      const newState = {
+        piece: m.end.released,
+        square: { x: m.end.x, y: m.end.y },
+        position: this.getBaseFen()
+      };
       const repet =
         this.repetitions.some(r => {
           return (
             r.piece == newState.piece &&
+            (
+              r.square.x == newState.square.x &&
+              r.square.y == newState.square.y
+            ) &&
             r.position == newState.position
           );
         });
@@ -724,6 +739,7 @@ export class OtageRules extends ChessRules {
       this.repetitions.push(
         {
           piece: move.end.released,
+          square: { x: move.end.x, y: move.end.y },
           position: this.getBaseFen()
         }
       );
@@ -739,7 +755,7 @@ export class OtageRules extends ChessRules {
       this.turn = V.GetOppCol(this.turn);
       this.movesCount--;
     }
-    if (!!move.end.releasd) this.repetitions.pop();
+    if (!!move.end.released) this.repetitions.pop();
     this.postUndo(move);
   }