Attempt to clarify installation instructions a little
[vchess.git] / client / src / variants / Knightrelay1.js
index 1e7bfab..0afa9aa 100644 (file)
@@ -6,7 +6,19 @@ export class Knightrelay1Rules extends ChessRules {
     return false;
   }
 
-  // TODO: IsGoodPosition to check that 2 knights are on the board...
+  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]);
@@ -61,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:
@@ -72,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];