Several small improvements + integrate options + first working draft of Cwda
[vchess.git] / client / src / variants / Arena.js
index b2b18ee..880f008 100644 (file)
@@ -1,6 +1,14 @@
 import { ChessRules } from "@/base_rules";
 
 export class ArenaRules extends ChessRules {
+
+  static get Lines() {
+    return [
+      [[2, 0], [2, 8]],
+      [[6, 0], [6, 8]]
+    ];
+  }
+
   static get HasFlags() {
     return false;
   }
@@ -13,8 +21,39 @@ export class ArenaRules extends ChessRules {
     );
   }
 
-  static GenRandInitFen(randomness) {
-    return ChessRules.GenRandInitFen(randomness).slice(0, -6) + "-";
+  static IsGoodPosition(position) {
+    if (position.length == 0) return false;
+    const rows = position.split("/");
+    if (rows.length != V.size.x) return false;
+    // At most and at least one king or queen per color
+    let royals = { "k": 0, "K": 0, "q": 0, "Q": 0 };
+    for (let row of rows) {
+      let sumElts = 0;
+      for (let i = 0; i < row.length; i++) {
+        if (['K','k','Q','q'].includes(row[i])) royals[row[i]]++;
+        if (V.PIECES.includes(row[i].toLowerCase())) sumElts++;
+        else {
+          const num = parseInt(row[i], 10);
+          if (isNaN(num)) return false;
+          sumElts += num;
+        }
+      }
+      if (sumElts != V.size.y) return false;
+    }
+    if (
+      Object.values(royals).some(v => v >= 2) ||
+      royals['K'] + royals['Q'] == 0 ||
+      royals['k'] + royals['q'] == 0
+    ) {
+      return false;
+    }
+    return true;
+  }
+
+  scanKings() {}
+
+  static GenRandInitFen(options) {
+    return ChessRules.GenRandInitFen(options).slice(0, -6) + "-";
   }
 
   static InArena(x) {
@@ -37,27 +76,13 @@ export class ArenaRules extends ChessRules {
   }
 
   getPotentialQueenMoves(sq) {
-    return this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP])
-    ).filter(m => {
-      // Filter out moves longer than 3 squares
-      return Math.max(
-        Math.abs(m.end.x - m.start.x),
-        Math.abs(m.end.y - m.start.y)) <= 3;
-    });
+    return super.getSlideNJumpMoves(
+      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 3);
   }
 
   getPotentialKingMoves(sq) {
-    return this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP])
-    ).filter(m => {
-      // Filter out moves longer than 3 squares
-      return Math.max(
-        Math.abs(m.end.x - m.start.x),
-        Math.abs(m.end.y - m.start.y)) <= 3;
-    });
+    return super.getSlideNJumpMoves(
+      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 3);
   }
 
   getCheckSquares() {
@@ -69,6 +94,9 @@ export class ArenaRules extends ChessRules {
     return moves;
   }
 
+  postPlay() {} //no kingPos no castleFlags
+  postUndo() {}
+
   getCurrentScore() {
     const color = this.turn;
     if (!this.atLeastOneMove())
@@ -109,4 +137,5 @@ export class ArenaRules extends ChessRules {
   static get SEARCH_DEPTH() {
     return 4;
   }
+
 };