Attempt to clarify installation instructions a little
[vchess.git] / client / src / variants / Knightrelay1.js
index 1d1ab52..0afa9aa 100644 (file)
@@ -1,10 +1,25 @@
 import { ChessRules } from "@/base_rules";
 
 export class Knightrelay1Rules extends ChessRules {
+
   static get HasEnpassant() {
     return false;
   }
 
+  static IsGoodPosition(position) {
+    if (!ChessRules.IsGoodPosition(position)) return false;
+    // Check that (at least) 2 knights per side are on the board
+    const rows = position.split("/");
+    let knights = { 'N': 0, 'n': 0 };
+    for (let row of rows) {
+      for (let i = 0; i < row.length; i++) {
+        if (['N','n'].includes(row[i])) knights[row[i]]++;
+      }
+    }
+    if (Object.values(knights).some(v => v < 2)) return false;
+    return true;
+  }
+
   getPotentialMovesFrom([x, y]) {
     let moves = super.getPotentialMovesFrom([x, y]);
 
@@ -58,7 +73,7 @@ export class Knightrelay1Rules extends ChessRules {
 
     // Check if a (non-knight) piece at knight distance
     // is guarded by a knight (and thus attacking)
-    // --> Except for pawns targetting last rank.
+    // --> Except for kings, and pawns targetting last rank.
     const x = sq[0],
           y = sq[1];
     // Last rank for me, that is to say oppCol of color:
@@ -69,7 +84,10 @@ export class Knightrelay1Rules extends ChessRules {
         this.getColor(x+step[0],y+step[1]) == color
       ) {
         const piece = this.getPiece(x+step[0],y+step[1]);
-        if (piece != V.KNIGHT && (piece != V.PAWN || x != lastRank)) {
+        if (
+          ![V.KNIGHT, V.KING].includes(piece) &&
+          (piece != V.PAWN || x != lastRank)
+        ) {
           for (const step2 of V.steps[V.KNIGHT]) {
             const xx = x+step[0]+step2[0],
                   yy = y+step[1]+step2[1];
@@ -97,7 +115,7 @@ export class Knightrelay1Rules extends ChessRules {
     return {
       p: 1,
       r: 5,
-      n: 7, //the knight is valuable
+      n: 0, //the knight isn't captured - value doesn't matter
       b: 3,
       q: 9,
       k: 1000
@@ -118,7 +136,8 @@ export class Knightrelay1Rules extends ChessRules {
     const finalSquare = V.CoordsToSquare(move.end);
     const piece = this.getPiece(move.start.x, move.start.y);
 
-    // Since pieces and pawns could move like knight, indicate start and end squares
+    // Since pieces and pawns could move like knight,
+    // indicate start and end squares
     let notation =
       piece.toUpperCase() +
       initSquare +
@@ -136,4 +155,5 @@ export class Knightrelay1Rules extends ChessRules {
 
     return notation;
   }
+
 };