From eaab401ea14ebbde1e49ede7c639bc3b6556bf08 Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
Date: Wed, 15 Jul 2020 14:28:47 +0200
Subject: [PATCH] Add Progressive2 + fix knightrider translations

---
 client/src/translations/en.js                 |  3 +-
 client/src/translations/es.js                 |  3 +-
 client/src/translations/fr.js                 |  3 +-
 .../src/translations/rules/Checkered2/en.pug  |  2 +-
 .../src/translations/rules/Checkered2/es.pug  |  2 +-
 .../src/translations/rules/Checkered2/fr.pug  |  2 +-
 .../src/translations/rules/Enpassant/es.pug   | 10 ++--
 .../src/translations/rules/Enpassant/fr.pug   | 12 ++---
 .../{Progressive => Progressive1}/en.pug      |  0
 .../{Progressive => Progressive1}/es.pug      |  0
 .../{Progressive => Progressive1}/fr.pug      |  0
 .../translations/rules/Progressive2/en.pug    |  8 +++
 .../translations/rules/Progressive2/es.pug    |  8 +++
 .../translations/rules/Progressive2/fr.pug    |  8 +++
 .../src/translations/rules/Royalrace/es.pug   |  2 +-
 .../src/translations/rules/Royalrace/fr.pug   |  2 +-
 client/src/translations/variants/en.pug       |  3 +-
 client/src/translations/variants/es.pug       |  3 +-
 client/src/translations/variants/fr.pug       |  3 +-
 .../{Progressive.js => Progressive1.js}       |  2 +-
 client/src/variants/Progressive2.js           | 51 +++++++++++++++++++
 server/db/populate.sql                        |  3 +-
 22 files changed, 106 insertions(+), 24 deletions(-)
 rename client/src/translations/rules/{Progressive => Progressive1}/en.pug (100%)
 rename client/src/translations/rules/{Progressive => Progressive1}/es.pug (100%)
 rename client/src/translations/rules/{Progressive => Progressive1}/fr.pug (100%)
 create mode 100644 client/src/translations/rules/Progressive2/en.pug
 create mode 100644 client/src/translations/rules/Progressive2/es.pug
 create mode 100644 client/src/translations/rules/Progressive2/fr.pug
 rename client/src/variants/{Progressive.js => Progressive1.js} (98%)
 create mode 100644 client/src/variants/Progressive2.js

diff --git a/client/src/translations/en.js b/client/src/translations/en.js
index 42112a4f..e088adfb 100644
--- a/client/src/translations/en.js
+++ b/client/src/translations/en.js
@@ -237,7 +237,8 @@ export const translations = {
   "Pawns move diagonally": "Pawns move diagonally",
   "Pieces upside down": "Pieces upside down",
   "Play at the same time": "Play at the same time",
-  "Play more and more moves": "Play more and more moves",
+  "Play more and more moves (v1)": "Play more and more moves (v1)",
+  "Play more and more moves (v2)": "Play more and more moves (v2)",
   "Play opponent's pieces": "Play opponent's pieces",
   "Powerful pieces": "Powerful pieces",
   "Prolongated captures": "Prolongated captures",
diff --git a/client/src/translations/es.js b/client/src/translations/es.js
index 379daaee..605f5015 100644
--- a/client/src/translations/es.js
+++ b/client/src/translations/es.js
@@ -237,7 +237,8 @@ export const translations = {
   "Pawns move diagonally": "Peones se mueven en diagonal",
   "Pieces upside down": "Piezas al revés",
   "Play at the same time": "Jugar al mismo tiempo",
-  "Play more and more moves": "Jugar más y más movimientos",
+  "Play more and more moves (v1)": "Jugar más y más movimientos (v1)",
+  "Play more and more moves (v2)": "Jugar más y más movimientos (v2)",
   "Play opponent's pieces": "Jugar piezas opuestas",
   "Powerful pieces": "Piezas poderosas",
   "Prolongated captures": "Capturas extendidas",
diff --git a/client/src/translations/fr.js b/client/src/translations/fr.js
index dce01310..a35c4ca4 100644
--- a/client/src/translations/fr.js
+++ b/client/src/translations/fr.js
@@ -237,7 +237,8 @@ export const translations = {
   "Pawns move diagonally": "Les pions vont en diagonale",
   "Pieces upside down": "Pièces à l'envers",
   "Play at the same time": "Jouer en même temps",
-  "Play more and more moves": "Jouez de plus en plus de coups",
+  "Play more and more moves (v1)": "Jouez de plus en plus de coups (v1)",
+  "Play more and more moves (v2)": "Jouez de plus en plus de coups (v2)",
   "Play opponent's pieces": "Jouez les pièces adverses",
   "Powerful pieces": "Pièces puissantes",
   "Prolongated captures": "Captures prolongées",
diff --git a/client/src/translations/rules/Checkered2/en.pug b/client/src/translations/rules/Checkered2/en.pug
index 4c004a35..0d0af195 100644
--- a/client/src/translations/rules/Checkered2/en.pug
+++ b/client/src/translations/rules/Checkered2/en.pug
@@ -4,7 +4,7 @@ p.boxed
 
 p
   | This is the 
-  a(href="/variants/Checkered1") Checkered1 variant
+  a(href="/#/variants/Checkered1") Checkered1 variant
   | , without the stage 2.
   | Probably more drawish, but also quite different.
   | I think both are interesting.
diff --git a/client/src/translations/rules/Checkered2/es.pug b/client/src/translations/rules/Checkered2/es.pug
index a93f5790..a38eaf2c 100644
--- a/client/src/translations/rules/Checkered2/es.pug
+++ b/client/src/translations/rules/Checkered2/es.pug
@@ -4,7 +4,7 @@ p.boxed
 
 p
   | Esta la 
-  a(href="/variants/Checkered1") variante Checkered1
+  a(href="/#/variants/Checkered1") variante Checkered1
   | , sin fase 2.
   | Probablemente más canceladoras, pero también bastante diferente.
   | Creo que ambos tienen interés.
diff --git a/client/src/translations/rules/Checkered2/fr.pug b/client/src/translations/rules/Checkered2/fr.pug
index 5b5de767..4b0b92a2 100644
--- a/client/src/translations/rules/Checkered2/fr.pug
+++ b/client/src/translations/rules/Checkered2/fr.pug
@@ -4,7 +4,7 @@ p.boxed
 
 p
   | C'est la 
-  a(href="/variants/Checkered1") variante Checkered1
+  a(href="/#/variants/Checkered1") variante Checkered1
   | , sans la phase 2.
   | Sans doute plus annulant, mais aussi assez différente.
   | Je pense que les deux ont un intérêt.
diff --git a/client/src/translations/rules/Enpassant/es.pug b/client/src/translations/rules/Enpassant/es.pug
index 50770d18..efc974f8 100644
--- a/client/src/translations/rules/Enpassant/es.pug
+++ b/client/src/translations/rules/Enpassant/es.pug
@@ -27,9 +27,9 @@ h3 Movimientos especiales
 
 ul
   li.
-    Los caballos se convierten en caballeros, capaces de realizar varias
-    saltos en la misma dirección.
-    Por ejemplo en la posición inicial, el caballero en g1 puede ir a e5
+    Los caballos se convierten en caballos de la noche (o noctámbulos),
+    capaces de realizar varias saltos en la misma dirección.
+    Por ejemplo en la posición inicial, el noctámbulo en g1 puede ir a e5
     o podría tomar en d7 además de los movimientos de caballo.
   li.
     El rey puede capturar una pieza en passant haciendo
@@ -39,7 +39,7 @@ figure.diagram-container
   .diagram
     | fen:rnbqk1nr/ppppppbp/6p1/8/8/2NP5/PPP1PPPP/R1BQKBNR h3,f3,e5,d7:
   figcaption.
-    Posibles jugadas de caballero después de 1.d3 g6 2.Nc3 Bg7.
+    Posibles jugadas de noctámbulo después de 1.d3 g6 2.Nc3 Bg7.
     Si 3.Nxd7, 3...Bxe5 e.p. es posible.
 
 p.
@@ -53,7 +53,7 @@ p.
 figure.diagram-container
   .diagram
     | fen:nbqnbrkr/pppppppp/8/8/8/8/PPPPPPPP/RNKBQNBR:
-  figcaption 1.Nxe7# y 1...Nxg2: "anomalías de caballeros".
+  figcaption 1.Nxe7# y 1...Nxg2: "anomalías de noctámbulos".
 
 h3 Fuente
 
diff --git a/client/src/translations/rules/Enpassant/fr.pug b/client/src/translations/rules/Enpassant/fr.pug
index 1a818f70..d598e840 100644
--- a/client/src/translations/rules/Enpassant/fr.pug
+++ b/client/src/translations/rules/Enpassant/fr.pug
@@ -28,10 +28,10 @@ h3 Coups spéciaux
 
 ul
   li.
-    Les cavaliers deviennent des chevaliers, pouvant effectuer plusieurs
-    déplacements de cavalier dans la même direction.
-    Par exemple dans la position initiale, le chevalier en g1 peut aller
-    en e5 ou pourrait prendre en d7 en plus des coups de cavalier.
+    Les cavaliers deviennent des cavaliers de la nuit (ou noctambules),
+    pouvant effectuer plusieurs déplacements de cavalier dans la même
+    direction. Par exemple dans la position initiale, le noctambule en g1 peut
+    aller en e5 ou pourrait prendre en d7 en plus des coups de cavalier.
   li.
     Le roi peut capturer une pièce en passant en effectuant
     un coup de cavalier.
@@ -40,7 +40,7 @@ figure.diagram-container
   .diagram
     | fen:rnbqk1nr/ppppppbp/6p1/8/8/2NP5/PPP1PPPP/R1BQKBNR h3,f3,e5,d7:
   figcaption.
-    Possibles coups de chevalier après 1.d3 g6 2.Nc3 Bg7.
+    Possibles coups de noctambule après 1.d3 g6 2.Nc3 Bg7.
     Si 3.Nxd7, 3...Bxe5 e.p. est possible.
 
 p.
@@ -53,7 +53,7 @@ p.
 figure.diagram-container
   .diagram
     | fen:nbqnbrkr/pppppppp/8/8/8/8/PPPPPPPP/RNKBQNBR:
-  figcaption 1.Nxe7# et 1...Nxg2 : "anomalies de chevaliers".
+  figcaption 1.Nxe7# et 1...Nxg2 : "anomalies de noctambules".
 
 h3 Source
 
diff --git a/client/src/translations/rules/Progressive/en.pug b/client/src/translations/rules/Progressive1/en.pug
similarity index 100%
rename from client/src/translations/rules/Progressive/en.pug
rename to client/src/translations/rules/Progressive1/en.pug
diff --git a/client/src/translations/rules/Progressive/es.pug b/client/src/translations/rules/Progressive1/es.pug
similarity index 100%
rename from client/src/translations/rules/Progressive/es.pug
rename to client/src/translations/rules/Progressive1/es.pug
diff --git a/client/src/translations/rules/Progressive/fr.pug b/client/src/translations/rules/Progressive1/fr.pug
similarity index 100%
rename from client/src/translations/rules/Progressive/fr.pug
rename to client/src/translations/rules/Progressive1/fr.pug
diff --git a/client/src/translations/rules/Progressive2/en.pug b/client/src/translations/rules/Progressive2/en.pug
new file mode 100644
index 00000000..1590c187
--- /dev/null
+++ b/client/src/translations/rules/Progressive2/en.pug
@@ -0,0 +1,8 @@
+p.boxed
+  | White plays one move, then black play twice,
+  | then white plays three moves...
+
+p
+  Same as 
+  a(href="/#/variants/Progressive1") Progressive1
+  | , but without initial double-step pawn move, and without castling.
diff --git a/client/src/translations/rules/Progressive2/es.pug b/client/src/translations/rules/Progressive2/es.pug
new file mode 100644
index 00000000..a3f70e97
--- /dev/null
+++ b/client/src/translations/rules/Progressive2/es.pug
@@ -0,0 +1,8 @@
+p.boxed
+  | Las blancas juegan un movimiento, luego las negras juegan dos veces,
+  | entonces las blancas juegan tres movimientos...
+
+p
+  | Como
+  a(href="/#/variants/Progressive1") Progressive1
+  | , pero sin el doble movimiento inicial de peón, y sin enroque.
diff --git a/client/src/translations/rules/Progressive2/fr.pug b/client/src/translations/rules/Progressive2/fr.pug
new file mode 100644
index 00000000..6b8248fe
--- /dev/null
+++ b/client/src/translations/rules/Progressive2/fr.pug
@@ -0,0 +1,8 @@
+p.boxed
+  | Les blancs jouent un coup, puis les noirs jouent deux fois,
+  | ensuite les blancs jouent trois coups...
+
+p
+  Comme 
+  a(href="/#/variants/Progressive1") Progressive1
+  | , mais sans le double coup initial de pion, et sans roque.
diff --git a/client/src/translations/rules/Royalrace/es.pug b/client/src/translations/rules/Royalrace/es.pug
index 634f4b7c..584771eb 100644
--- a/client/src/translations/rules/Royalrace/es.pug
+++ b/client/src/translations/rules/Royalrace/es.pug
@@ -21,7 +21,7 @@ h3 Movimientos de piezas adaptadas
 
 ul
   li.
-    Los caballos se convierten en caballeros:
+    Los caballos se convierten en noctámbulos:
     pueden hacer varios saltos de caballo en la misma dirección.
   li.
     Los peones se mueven como torres.
diff --git a/client/src/translations/rules/Royalrace/fr.pug b/client/src/translations/rules/Royalrace/fr.pug
index 21f6dae4..c0bb36b2 100644
--- a/client/src/translations/rules/Royalrace/fr.pug
+++ b/client/src/translations/rules/Royalrace/fr.pug
@@ -22,7 +22,7 @@ h3 Déplacements de pièces adaptés
 
 ul
   li.
-    Les cavaliers deviennent des chevaliers :
+    Les cavaliers deviennent des noctambules :
     ils peuvent effectuer plusieurs sauts de cavalier dans une même direction.
   li.
     Les pions se déplacent comme des tours.
diff --git a/client/src/translations/variants/en.pug b/client/src/translations/variants/en.pug
index 67227c79..854e5a61 100644
--- a/client/src/translations/variants/en.pug
+++ b/client/src/translations/variants/en.pug
@@ -339,7 +339,8 @@ p In these variants, you can play two or more moves per turn.
     "Doublemove1",
     "Doublemove2",
     "Monster",
-    "Progressive"
+    "Progressive1",
+    "Progressive2"
   ]
 ul
   for v in varlist
diff --git a/client/src/translations/variants/es.pug b/client/src/translations/variants/es.pug
index a373000d..283169c4 100644
--- a/client/src/translations/variants/es.pug
+++ b/client/src/translations/variants/es.pug
@@ -350,7 +350,8 @@ p En estas variantes, puedes jugar dos o más movimientos por turno.
     "Doublemove1",
     "Doublemove2",
     "Monster",
-    "Progressive"
+    "Progressive1",
+    "Progressive2"
   ]
 ul
   for v in varlist
diff --git a/client/src/translations/variants/fr.pug b/client/src/translations/variants/fr.pug
index 72e481ae..26835cbd 100644
--- a/client/src/translations/variants/fr.pug
+++ b/client/src/translations/variants/fr.pug
@@ -349,7 +349,8 @@ p Dans ces variantes, vous pouvez jouer deux coups ou plus par tour.
     "Doublemove1",
     "Doublemove2",
     "Monster",
-    "Progressive"
+    "Progressive1",
+    "Progressive2"
   ]
 ul
   for v in varlist
diff --git a/client/src/variants/Progressive.js b/client/src/variants/Progressive1.js
similarity index 98%
rename from client/src/variants/Progressive.js
rename to client/src/variants/Progressive1.js
index 67654286..4f69ee90 100644
--- a/client/src/variants/Progressive.js
+++ b/client/src/variants/Progressive1.js
@@ -1,7 +1,7 @@
 import { ChessRules } from "@/base_rules";
 import { randInt } from "@/utils/alea";
 
-export class ProgressiveRules extends ChessRules {
+export class Progressive1Rules extends ChessRules {
   static get HasEnpassant() {
     return false;
   }
diff --git a/client/src/variants/Progressive2.js b/client/src/variants/Progressive2.js
new file mode 100644
index 00000000..ffc22bc9
--- /dev/null
+++ b/client/src/variants/Progressive2.js
@@ -0,0 +1,51 @@
+import { Progressive1Rules } from "@/variants/Progressive1";
+import { SuicideRules } from "@/variants/Suicide";
+import { ChessRules } from "@/base_rules";
+import { randInt } from "@/utils/alea";
+
+export class Progressive2Rules extends Progressive1Rules {
+  static get PawnSpecs() {
+    return Object.assign(
+      {},
+      ChessRules.PawnSpecs,
+      { twoSquares: false }
+    );
+  }
+
+  static get HasFlags() {
+    return false;
+  }
+
+  postPlay(move) {
+    const c = move.turn[0];
+    const piece = move.vanish[0].p;
+    if (piece == V.KING && move.appear.length > 0) {
+      this.kingPos[c][0] = move.appear[0].x;
+      this.kingPos[c][1] = move.appear[0].y;
+    }
+  }
+
+  undo(move) {
+    this.disaggregateFlags(JSON.parse(move.flags));
+    V.UndoOnBoard(this.board, move);
+    if (this.turn != move.turn[0]) this.movesCount--;
+    this.turn = move.turn[0];
+    this.subTurn = move.turn[1];
+    super.postUndo(move);
+  }
+
+  static GenRandInitFen(randomness) {
+    return SuicideRules.GenRandInitFen(randomness);
+  }
+
+  static get VALUES() {
+    return {
+      p: 1,
+      r: 5,
+      n: 3,
+      b: 3,
+      q: 7, //slightly less than in orthodox game
+      k: 1000
+    };
+  }
+};
diff --git a/server/db/populate.sql b/server/db/populate.sql
index f55889ae..1543847e 100644
--- a/server/db/populate.sql
+++ b/server/db/populate.sql
@@ -85,7 +85,8 @@ insert or ignore into Variants (name, description) values
   ('Pawnsking', 'Reach the last rank (v2)'),
   ('Perfect', 'Powerful pieces'),
   ('Pocketknight', 'Knight in pocket'),
-  ('Progressive', 'Play more and more moves'),
+  ('Progressive1', 'Play more and more moves (v1)'),
+  ('Progressive2', 'Play more and more moves (v2)'),
   ('Queenpawns', 'Queen versus pawns'),
   ('Racingkings', 'Kings cross the 8x8 board'),
   ('Rampage', 'Move under cover'),
-- 
2.44.0