Several small improvements + integrate options + first working draft of Cwda
[vchess.git] / client / src / variants / Schess.js
index ba5730e..5f58571 100644 (file)
@@ -1,6 +1,7 @@
 import { ChessRules, PiPo } from "@/base_rules";
 
 export class SchessRules extends ChessRules {
+
   static get PawnSpecs() {
     return Object.assign(
       {},
@@ -50,7 +51,7 @@ export class SchessRules extends ChessRules {
   setFlags(fenflags) {
     super.setFlags(fenflags); //castleFlags
     this.pieceFlags = {
-      w: [...Array(8)], //pawns can move 2 squares?
+      w: [...Array(8)], //pieces can generate Hawk or Elephant?
       b: [...Array(8)]
     };
     const flags = fenflags.substr(4); //skip first 4 letters, for castle
@@ -77,9 +78,9 @@ export class SchessRules extends ChessRules {
     );
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     return (
-      ChessRules.GenRandInitFen(randomness).slice(0, -2) +
+      ChessRules.GenRandInitFen(options).slice(0, -2) +
       // Add pieceFlags + pocket
       "1111111111111111 - 1111"
     );
@@ -119,12 +120,12 @@ export class SchessRules extends ChessRules {
     const fenParsed = V.ParseFen(fen);
     this.pocket = {
       "w": {
-        h: parseInt(fenParsed.pocket[0]),
-        e: parseInt(fenParsed.pocket[1])
+        h: parseInt(fenParsed.pocket[0], 10),
+        e: parseInt(fenParsed.pocket[1], 10)
       },
       "b": {
-        h: parseInt(fenParsed.pocket[2]),
-        e: parseInt(fenParsed.pocket[3])
+        h: parseInt(fenParsed.pocket[2], 10),
+        e: parseInt(fenParsed.pocket[3], 10)
       }
     };
   }
@@ -172,7 +173,8 @@ export class SchessRules extends ChessRules {
                 (
                   m.appear.length == shift+1 ||
                   // Special castle case: is initial king square free?
-                  ![m.appear[shift].y, m.appear[shift+1].y].includes(m.vanish[0].y)
+                  ![m.appear[shift].y, m.appear[shift+1].y]
+                    .includes(m.vanish[0].y)
                 )
               ) {
                 let pMove = JSON.parse(JSON.stringify(m));
@@ -191,7 +193,8 @@ export class SchessRules extends ChessRules {
               if (
                 m.appear.length >= 2 + shift &&
                 m.vanish.length == 2 &&
-                ![m.appear[shift].y, m.appear[shift+1].y].includes(m.vanish[1].y)
+                ![m.appear[shift].y, m.appear[shift+1].y]
+                  .includes(m.vanish[1].y)
               ) {
                 // Special castle case: rook flag was necessarily on
                 let pMove = JSON.parse(JSON.stringify(m));
@@ -218,13 +221,13 @@ export class SchessRules extends ChessRules {
 
   getPotentialHawkMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")
+      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)
     );
   }
 
   getPotentialElephantMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")
+      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)
     );
   }
 
@@ -239,26 +242,14 @@ export class SchessRules extends ChessRules {
   isAttackedByHawk(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.HAWK, V.steps[V.BISHOP]) ||
-      this.isAttackedBySlideNJump(
-        sq,
-        color,
-        V.HAWK,
-        V.steps[V.KNIGHT],
-        "oneStep"
-      )
+      this.isAttackedBySlideNJump(sq, color, V.HAWK, V.steps[V.KNIGHT], 1)
     );
   }
 
   isAttackedByElephant(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.ELEPHANT, V.steps[V.ROOK]) ||
-      this.isAttackedBySlideNJump(
-        sq,
-        color,
-        V.ELEPHANT,
-        V.steps[V.KNIGHT],
-        "oneStep"
-      )
+      this.isAttackedBySlideNJump(sq, color, V.ELEPHANT, V.steps[V.KNIGHT], 1)
     );
   }
 
@@ -289,11 +280,10 @@ export class SchessRules extends ChessRules {
         ([V.HAWK, V.ELEPHANT, V.NOTHING].includes(move.appear[0].p) ? 1 : 0);
       this.kingPos[color][0] = move.appear[shift].x;
       this.kingPos[color][1] = move.appear[shift].y;
-      return;
     }
     this.updateCastleFlags(move, piece);
 
-    const oppCol = V.GetOppCol(color);
+    const oppCol = this.turn;
     const firstRank = (color == 'w' ? 7 : 0);
     const oppFirstRank = 7 - firstRank;
     // Does this move turn off a piece init square flag?
@@ -328,9 +318,11 @@ export class SchessRules extends ChessRules {
 
   static get VALUES() {
     return Object.assign(
-      {},
-      ChessRules.VALUES,
-      { 'h': 5, 'e': 7 }
+      {
+        'h': 5,
+        'e': 7
+      },
+      ChessRules.VALUES
     );
   }
 
@@ -340,7 +332,14 @@ export class SchessRules extends ChessRules {
       const nothingAppear = (move.appear[0].p == V.NOTHING);
       if (pPieceAppear || nothingAppear) {
         let suffix = "";
-        if (pPieceAppear) suffix = "/" + move.appear[0].p.toUpperCase();
+        if (pPieceAppear) {
+          suffix = "/" + move.appear[0].p.toUpperCase();
+          if (move.appear.length == 3) {
+            // Castling; indicate square
+            suffix +=
+              V.CoordsToSquare({ x: move.appear[0].x, y: move.appear[0].y });
+          }
+        }
         let cmove = JSON.parse(JSON.stringify(move));
         cmove.appear.shift();
         return super.getNotation(cmove) + suffix;
@@ -348,4 +347,5 @@ export class SchessRules extends ChessRules {
     }
     return super.getNotation(move);
   }
+
 };