Add Queenpawns + small fix to vs pawns variants + remove HQ inventor (webmaster but...
authorBenjamin Auder <benjamin.auder@somewhere>
Thu, 4 Jun 2020 21:21:42 +0000 (23:21 +0200)
committerBenjamin Auder <benjamin.auder@somewhere>
Thu, 4 Jun 2020 21:21:42 +0000 (23:21 +0200)
14 files changed:
client/src/translations/en.js
client/src/translations/es.js
client/src/translations/fr.js
client/src/translations/rules/Hiddenqueen/en.pug
client/src/translations/rules/Hiddenqueen/es.pug
client/src/translations/rules/Hiddenqueen/fr.pug
client/src/translations/rules/Queenpawns/en.pug [new file with mode: 0644]
client/src/translations/rules/Queenpawns/es.pug [new file with mode: 0644]
client/src/translations/rules/Queenpawns/fr.pug [new file with mode: 0644]
client/src/variants/Bishopawns.js
client/src/variants/Knightpawns.js
client/src/variants/Queenpawns.js [new file with mode: 0644]
client/src/variants/Rookpawns.js
server/db/populate.sql

index 41c007a..42112a4 100644 (file)
@@ -244,6 +244,7 @@ export const translations = {
   "Protect your pawns": "Protect your pawns",
   "Push and pull": "Push and pull",
   "Queen disguised as a pawn": "Queen disguised as a pawn",
   "Protect your pawns": "Protect your pawns",
   "Push and pull": "Push and pull",
   "Queen disguised as a pawn": "Queen disguised as a pawn",
+  "Queen versus pawns": "Queen versus pawns",
   "Reach the last rank (v1)": "Reach the last rank (v1)",
   "Reach the last rank (v2)": "Reach the last rank (v2)",
   "Reposition pieces": "Reposition pieces",
   "Reach the last rank (v1)": "Reach the last rank (v1)",
   "Reach the last rank (v2)": "Reach the last rank (v2)",
   "Reposition pieces": "Reposition pieces",
index bc25339..379daae 100644 (file)
@@ -244,6 +244,7 @@ export const translations = {
   "Protect your pawns": "Protege tus peones",
   "Push and pull": "Empujar y tirar",
   "Queen disguised as a pawn": "Reina disfrazada de peón",
   "Protect your pawns": "Protege tus peones",
   "Push and pull": "Empujar y tirar",
   "Queen disguised as a pawn": "Reina disfrazada de peón",
+  "Queen versus pawns": "Dama contra peones",
   "Reach the last rank (v1)": "Llegar a la última fila (v1)",
   "Reach the last rank (v2)": "Llegar a la última fila (v2)",
   "Reposition pieces": "Reposicionar las piezas",
   "Reach the last rank (v1)": "Llegar a la última fila (v1)",
   "Reach the last rank (v2)": "Llegar a la última fila (v2)",
   "Reposition pieces": "Reposicionar las piezas",
index 869a68d..dce0131 100644 (file)
@@ -244,6 +244,7 @@ export const translations = {
   "Protect your pawns": "Protégez vos pions",
   "Push and pull": "Pousser et tirer",
   "Queen disguised as a pawn": "Reine déguisée en pion",
   "Protect your pawns": "Protégez vos pions",
   "Push and pull": "Pousser et tirer",
   "Queen disguised as a pawn": "Reine déguisée en pion",
+  "Queen versus pawns": "Dame contre pions",
   "Reach the last rank (v1)": "Atteignez la dernière rangée (v1)",
   "Reach the last rank (v2)": "Atteignez la dernière rangée (v2)",
   "Reposition pieces": "Replacer les pièces",
   "Reach the last rank (v1)": "Atteignez la dernière rangée (v1)",
   "Reach the last rank (v2)": "Atteignez la dernière rangée (v2)",
   "Reposition pieces": "Replacer les pièces",
index 40fb013..07cc31e 100644 (file)
@@ -20,10 +20,7 @@ h3 Source
 
 p
   a(href="https://dames-cachees.herokuapp.com/rules") This website
 
 p
   a(href="https://dames-cachees.herokuapp.com/rules") This website
-  | &nbsp;introduces the rules and allow to play in live,
+  | &nbsp;developed by Etienne Orieux (2019)
+  | introduces the rules and allow to play in live,
   | with a deterministic initial position but a user-defined
   | location of the hiden queen.
   | with a deterministic initial position but a user-defined
   | location of the hiden queen.
-
-p
-  a(href="https://github.com/orieuxe") Inventor
-  | &nbsp;- see the repo "dames-cachees" - (2019)
index ad7e50e..aeb58cd 100644 (file)
@@ -21,10 +21,7 @@ h3 Fuente
 
 p
   a(href = "https://dames-cachees.herokuapp.com/rules") Este sitio web
 
 p
   a(href = "https://dames-cachees.herokuapp.com/rules") Este sitio web
-  | &nbsp;presenta las reglas y te permite jugar en vivo,
+  | &nbsp;desarrollado por Etienne Orieux (2019)
+  | presenta las reglas y te permite jugar en vivo,
   | con una posición inicial determinista pero dejando elegir
   | la ubicación de la dama escondida
   | con una posición inicial determinista pero dejando elegir
   | la ubicación de la dama escondida
-
-p
-  a(href="https://github.com/orieuxe") Inventor
-  | &nbsp;- ver el repo "dames-cachees" - (2019)
index 8e0724b..8006b34 100644 (file)
@@ -21,10 +21,7 @@ h3 Source
 
 p
   a(href="https://dames-cachees.herokuapp.com/rules") Ce site web
 
 p
   a(href="https://dames-cachees.herokuapp.com/rules") Ce site web
-  | &nbsp;présente les règles et permet de jouer en direct,
+  | &nbsp;développé par Etienne Orieux (2019)
+  | présente les règles et permet de jouer en direct,
   | avec une position initiale déterministe mais en laissant choisir
   | l'emplacement de la dame cachée.
   | avec une position initiale déterministe mais en laissant choisir
   | l'emplacement de la dame cachée.
-
-p
-  a(href="https://github.com/orieuxe") Inventeur
-  | &nbsp;- voir le repo "dames-cachees" - (2019)
diff --git a/client/src/translations/rules/Queenpawns/en.pug b/client/src/translations/rules/Queenpawns/en.pug
new file mode 100644 (file)
index 0000000..1eecf9d
--- /dev/null
@@ -0,0 +1,20 @@
+p.boxed
+  | A queen versus eight pawns.
+
+figure.diagram-container
+  .diagram
+    | fen:3q4/8/8/8/8/8/PPPPPPPP/8:
+  figcaption Initial position
+
+p.
+  The pawns win if one reaches the other end
+  without being immediately captured.
+  The queen wins if it captures all the pawns.
+
+h3 Source
+
+p
+  | Inspired by 
+  a(href="https://chessplus.net/interactive-games/")
+    | Bishop vs 3 Pawns
+  | &nbsp;on chessplus.net.
diff --git a/client/src/translations/rules/Queenpawns/es.pug b/client/src/translations/rules/Queenpawns/es.pug
new file mode 100644 (file)
index 0000000..e7ed788
--- /dev/null
@@ -0,0 +1,20 @@
+p.boxed
+  | Una dama contra ocho peones.
+
+figure.diagram-container
+  .diagram
+    | fen:3q4/8/8/8/8/8/PPPPPPPP/8:
+  figcaption Posición inicial
+
+p.
+  Los peones ganan si uno de ellos llega al otro lado sin ser
+  inmediatamente capturado.
+  La dama gana si se come todos los peones.
+
+h3 Fuente
+
+p
+  | Inspirado por 
+  a(href="https://chessplus.net/interactive-games/")
+    | Bishop vs 3 Pawns
+  | &nbsp;en chessplus.net.
diff --git a/client/src/translations/rules/Queenpawns/fr.pug b/client/src/translations/rules/Queenpawns/fr.pug
new file mode 100644 (file)
index 0000000..106723a
--- /dev/null
@@ -0,0 +1,20 @@
+p.boxed
+  | Une dame contre huit pions.
+
+figure.diagram-container
+  .diagram
+    | fen:3q4/8/8/8/8/8/PPPPPPPP/8:
+  figcaption Position initiale
+
+p.
+  Les pions gagnent si l'un d'eux arrive de l'autre côté sans être
+  immédiatement capturé.
+  La dame gagne si elle mange tous les pions.
+
+h3 Source
+
+p
+  | Inspiré par 
+  a(href="https://chessplus.net/interactive-games/")
+    | Bishop vs 3 Pawns
+  | &nbsp;sur chessplus.net.
index 1ee9b97..67afe66 100644 (file)
@@ -36,8 +36,12 @@ export class BishopawnsRules extends ChessRules {
     }
     // Did a black pawn promote? Can the bishop take it?
     const qIdx = this.board[7].findIndex(cell => cell[1] == V.QUEEN);
     }
     // Did a black pawn promote? Can the bishop take it?
     const qIdx = this.board[7].findIndex(cell => cell[1] == V.QUEEN);
-    if (qIdx >= 0 && !super.isAttackedByBishop([7, qIdx], 'w'))
+    if (
+      qIdx >= 0 &&
+      (this.turn == 'b' || !super.isAttackedByBishop([7, qIdx], 'w'))
+    ) {
       return "0-1";
       return "0-1";
+    }
     if (!this.atLeastOneMove()) return "1/2";
     return "*";
   }
     if (!this.atLeastOneMove()) return "1/2";
     return "*";
   }
index 6b7415c..9647653 100644 (file)
@@ -34,10 +34,14 @@ export class KnightpawnsRules extends ChessRules {
       if (this.board.every(b => b.every(cell => !cell || cell[0] != c)))
         return (c == 'w' ? "0-1" : "1-0");
     }
       if (this.board.every(b => b.every(cell => !cell || cell[0] != c)))
         return (c == 'w' ? "0-1" : "1-0");
     }
-    // Did a black pawn promote? Can the rook take it?
+    // Did a black pawn promote? Can the knight take it?
     const qIdx = this.board[7].findIndex(cell => cell[1] == V.QUEEN);
     const qIdx = this.board[7].findIndex(cell => cell[1] == V.QUEEN);
-    if (qIdx >= 0 && !super.isAttackedByKnight([7, qIdx], 'w'))
+    if (
+      qIdx >= 0 &&
+      (this.turn == 'b' || !super.isAttackedByKnight([7, qIdx], 'w'))
+    ) {
       return "0-1";
       return "0-1";
+    }
     if (!this.atLeastOneMove()) return "1/2";
     return "*";
   }
     if (!this.atLeastOneMove()) return "1/2";
     return "*";
   }
diff --git a/client/src/variants/Queenpawns.js b/client/src/variants/Queenpawns.js
new file mode 100644 (file)
index 0000000..8ffe111
--- /dev/null
@@ -0,0 +1,55 @@
+import { ChessRules } from "@/base_rules";
+
+export class QueenpawnsRules extends ChessRules {
+  static get PawnSpecs() {
+    return Object.assign(
+      {},
+      ChessRules.PawnSpecs,
+      // The promotion piece doesn't matter, the game is won
+      { promotions: [V.QUEEN] }
+    );
+  }
+
+  static get HasFlags() {
+    return false;
+  }
+
+  scanKings() {}
+
+  static GenRandInitFen() {
+    return "3q4/8/8/8/8/8/PPPPPPPP/8 w 0 -";
+  }
+
+  filterValid(moves) {
+    return moves;
+  }
+
+  getCheckSquares() {
+    return [];
+  }
+
+  getCurrentScore() {
+    // If all pieces of some color vanished, the opponent wins:
+    for (let c of ['w', 'b']) {
+      if (this.board.every(b => b.every(cell => !cell || cell[0] != c)))
+        return (c == 'w' ? "0-1" : "1-0");
+    }
+    // Did a white pawn promote? Can the queen (in turn) take it?
+    const qIdx = this.board[0].findIndex(cell => cell == "wq");
+    if (
+      qIdx >= 0 &&
+      (this.turn == 'w' || !super.isAttackedByQueen([0, qIdx], 'b'))
+    ) {
+      return "1-0";
+    }
+    if (!this.atLeastOneMove()) return "1/2";
+    return "*";
+  }
+
+  postPlay() {}
+  postUndo() {}
+
+  static get SEARCH_DEPTH() {
+    return 4;
+  }
+};
index abbd785..2d0c3a8 100644 (file)
@@ -36,8 +36,12 @@ export class RookpawnsRules extends ChessRules {
     }
     // Did a black pawn promote? Can the rook take it?
     const qIdx = this.board[7].findIndex(cell => cell[1] == V.QUEEN);
     }
     // Did a black pawn promote? Can the rook take it?
     const qIdx = this.board[7].findIndex(cell => cell[1] == V.QUEEN);
-    if (qIdx >= 0 && !super.isAttackedByRook([7, qIdx], 'w'))
+    if (
+      qIdx >= 0 &&
+      (this.turn == 'b' || !super.isAttackedByRook([7, qIdx], 'w'))
+    ) {
       return "0-1";
       return "0-1";
+    }
     if (!this.atLeastOneMove()) return "1/2";
     return "*";
   }
     if (!this.atLeastOneMove()) return "1/2";
     return "*";
   }
index 6b664a5..f55889a 100644 (file)
@@ -86,6 +86,7 @@ insert or ignore into Variants (name, description) values
   ('Perfect', 'Powerful pieces'),
   ('Pocketknight', 'Knight in pocket'),
   ('Progressive', 'Play more and more moves'),
   ('Perfect', 'Powerful pieces'),
   ('Pocketknight', 'Knight in pocket'),
   ('Progressive', 'Play more and more moves'),
+  ('Queenpawns', 'Queen versus pawns'),
   ('Racingkings', 'Kings cross the 8x8 board'),
   ('Rampage', 'Move under cover'),
   ('Rifle', 'Shoot pieces'),
   ('Racingkings', 'Kings cross the 8x8 board'),
   ('Rampage', 'Move under cover'),
   ('Rifle', 'Shoot pieces'),