Merge branch 'simu'
authorBenjamin Auder <benjamin.auder@somewhere>
Wed, 3 Jun 2020 21:08:16 +0000 (23:08 +0200)
committerBenjamin Auder <benjamin.auder@somewhere>
Wed, 3 Jun 2020 21:08:16 +0000 (23:08 +0200)
TODO
client/src/variants/Capture.js
client/src/variants/Hiddenqueen.js
client/src/variants/Losers.js
client/src/variants/Suicide.js
server/models/User.js

diff --git a/TODO b/TODO
index ca05de4..6fe14fc 100644 (file)
--- a/TODO
+++ b/TODO
@@ -16,6 +16,8 @@ https://www.chessvariants.com/mvopponent.dir/avalanche.html
 https://www.chessvariants.com/mvopponent.dir/hypnotic-chess.html
 https://www.chessvariants.com/mvopponent.dir/mesmer-chess.html
 
+https://brainking.com/en/GameRules?tp=47&fwa=ArchivedGame!g=8204276$i=1
+
 Squatter Chess: safe on last rank = win
 Companion Chess : pieces of same nature don't attack each others
 https://www.chessvariants.com/difftaking.dir/brotherhood.html
index 19ce734..c5f86dc 100644 (file)
@@ -9,15 +9,18 @@ export class CaptureRules extends ChessRules {
   // Stop at the first capture found (if any)
   atLeastOneCapture() {
     const color = this.turn;
-    const oppCol = V.GetOppCol(color);
     for (let i = 0; i < V.size.x; i++) {
       for (let j = 0; j < V.size.y; j++) {
         if (
           this.board[i][j] != V.EMPTY &&
-          this.getColor(i, j) != oppCol &&
-          this.filterValid(this.getPotentialMovesFrom([i, j])).some(m =>
-            // Warning: discard castle moves
-            m.vanish.length == 2 && m.appear.length == 1)
+          this.getColor(i, j) == color &&
+          this.filterValid(this.getPotentialMovesFrom([i, j])).some(m => {
+            return (
+              // Warning: discard castle moves
+              m.vanish.length == 2 && m.appear.length == 1 &&
+              this.filterValid([m]).length == 1
+            );
+          })
         ) {
           return true;
         }
index f824785..aa536a6 100644 (file)
@@ -42,6 +42,29 @@ export class HiddenqueenRules extends ChessRules {
     return b;
   }
 
+  getEpSquare(moveOrSquare) {
+    if (!moveOrSquare) return undefined;
+    if (typeof moveOrSquare === "string") {
+      const square = moveOrSquare;
+      if (square == "-") return undefined;
+      return V.SquareToCoords(square);
+    }
+    const move = moveOrSquare;
+    const s = move.start,
+          e = move.end;
+    if (
+      s.y == e.y &&
+      Math.abs(s.x - e.x) == 2 &&
+      [V.PAWN, V.HIDDEN_QUEEN].includes(move.vanish[0].p)
+    ) {
+      return {
+        x: (s.x + e.x) / 2,
+        y: s.y
+      };
+    }
+    return undefined; //default
+  }
+
   isValidPawnMove(move) {
     const color = move.vanish[0].c;
     const pawnShift = color == "w" ? -1 : 1;
@@ -91,6 +114,27 @@ export class HiddenqueenRules extends ChessRules {
     return super.getPotentialMovesFrom([x, y]);
   }
 
+  getEnpassantCaptures([x, y], shiftX) {
+    const Lep = this.epSquares.length;
+    const epSquare = this.epSquares[Lep - 1];
+    let enpassantMove = null;
+    if (
+      !!epSquare &&
+      epSquare.x == x + shiftX &&
+      Math.abs(epSquare.y - y) == 1
+    ) {
+      enpassantMove = this.getBasicMove([x, y], [epSquare.x, epSquare.y]);
+      enpassantMove.vanish.push({
+        x: x,
+        y: epSquare.y,
+        // Captured piece may be a hidden queen
+        p: this.board[x][epSquare.y][1],
+        c: this.getColor(x, epSquare.y)
+      });
+    }
+    return !!enpassantMove ? [enpassantMove] : [];
+  }
+
   getPotentialPawnMoves([x, y]) {
     const piece = this.getPiece(x, y);
     const promotions =
@@ -160,7 +204,8 @@ export class HiddenqueenRules extends ChessRules {
   }
 
   getNotation(move) {
-    if (this.getPiece(move.start.x, move.start.y) != V.HIDDEN_QUEEN)
+    // Not using getPiece() method because it would transform HQ into pawn:
+    if (this.board[move.start.x][move.start.y][1] != V.HIDDEN_QUEEN)
       return super.getNotation(move);
     const finalSquare = V.CoordsToSquare(move.end);
     if (move.appear[0].p == V.QUEEN) {
index d82e57d..3ac46c2 100644 (file)
@@ -11,15 +11,18 @@ export class LosersRules extends ChessRules {
   // Stop at the first capture found (if any)
   atLeastOneCapture() {
     const color = this.turn;
-    const oppCol = V.GetOppCol(color);
     for (let i = 0; i < V.size.x; i++) {
       for (let j = 0; j < V.size.y; j++) {
         if (
           this.board[i][j] != V.EMPTY &&
-          this.getColor(i, j) != oppCol &&
-          this.getPotentialMovesFrom([i, j]).some(m =>
-            // Warning: discard castle moves
-            m.vanish.length == 2 && m.appear.length == 1)
+          this.getColor(i, j) == color &&
+          this.getPotentialMovesFrom([i, j]).some(m => {
+            return (
+              // Warning: discard castle moves
+              m.vanish.length == 2 && m.appear.length == 1 &&
+              this.filterValid([m]).length == 1
+            );
+          })
         ) {
           return true;
         }
@@ -31,6 +34,9 @@ export class LosersRules extends ChessRules {
   getPossibleMovesFrom(sq) {
     let moves = this.filterValid(this.getPotentialMovesFrom(sq));
     const captureMoves = V.KeepCaptures(moves);
+
+console.log(this.atLeastOneCapture());
+
     if (captureMoves.length > 0) return captureMoves;
     if (this.atLeastOneCapture()) return [];
     return moves;
index ecb2aef..e3630bb 100644 (file)
@@ -50,12 +50,11 @@ export class SuicideRules extends ChessRules {
   // Stop at the first capture found (if any)
   atLeastOneCapture() {
     const color = this.turn;
-    const oppCol = V.GetOppCol(color);
     for (let i = 0; i < V.size.x; i++) {
       for (let j = 0; j < V.size.y; j++) {
         if (
           this.board[i][j] != V.EMPTY &&
-          this.getColor(i, j) != oppCol &&
+          this.getColor(i, j) == color &&
           this.getPotentialMovesFrom([i, j]).some(m => m.vanish.length == 2)
         ) {
           return true;
index c193d6d..d91045b 100644 (file)
@@ -139,7 +139,7 @@ const UserModel = {
   },
 
   tryNotify: function(id, message) {
-    UserModel.getOne("id", id, "name, email", (err, user) => {
+    UserModel.getOne("id", id, "name, email, notify", (err, user) => {
       if (!err && user.notify) UserModel.notify(user, message);
     });
   },