From afa7abae33f5d0999890f8d9672525337d0bfaea Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
Date: Mon, 22 Mar 2021 23:43:14 +0100
Subject: [PATCH] Add New Zealand Chess

---
 client/src/translations/en.js                 |  1 +
 client/src/translations/es.js                 |  1 +
 client/src/translations/fr.js                 |  1 +
 .../src/translations/rules/Newzealand/en.pug  | 17 +++++
 .../src/translations/rules/Newzealand/es.pug  | 17 +++++
 .../src/translations/rules/Newzealand/fr.pug  | 17 +++++
 client/src/translations/variants/en.pug       |  1 +
 client/src/translations/variants/es.pug       |  1 +
 client/src/translations/variants/fr.pug       |  1 +
 client/src/variants/Newzealand.js             | 65 +++++++++++++++++++
 server/db/populate.sql                        |  1 +
 11 files changed, 123 insertions(+)
 create mode 100644 client/src/translations/rules/Newzealand/en.pug
 create mode 100644 client/src/translations/rules/Newzealand/es.pug
 create mode 100644 client/src/translations/rules/Newzealand/fr.pug
 create mode 100644 client/src/variants/Newzealand.js

diff --git a/client/src/translations/en.js b/client/src/translations/en.js
index e93b434b..604fbf8e 100644
--- a/client/src/translations/en.js
+++ b/client/src/translations/en.js
@@ -245,6 +245,7 @@ export const translations = {
   "Kings cross the 8x8 board": "Kings cross the 8x8 board",
   "Kings cross the 11x11 board": "Kings cross the 11x11 board",
   "Knibis and Bisknis": "Knibis and Bisknis",
+  "Kniros and Rosknis": "Kniros and Rosknis",
   "Knight in pocket": "Knight in pocket",
   "Knight versus pawns": "Knight versus pawns",
   "Korean Chess": "Korean Chess",
diff --git a/client/src/translations/es.js b/client/src/translations/es.js
index d776b26a..9a099a2c 100644
--- a/client/src/translations/es.js
+++ b/client/src/translations/es.js
@@ -245,6 +245,7 @@ export const translations = {
   "Kings cross the 8x8 board": "Los reyes cruzan el 8x8 tablero",
   "Kings cross the 11x11 board": "Los reyes cruzan el 11x11 tablero",
   "Knibis and Bisknis": "Knibis y Bisknis",
+  "Kniros and Rosknis": "Kniros y Rosknis",
   "Knight in pocket": "Caballo en bolsillo",
   "Knight versus pawns": "Caballo contra peones",
   "Korean Chess": "Ajedrez coreano",
diff --git a/client/src/translations/fr.js b/client/src/translations/fr.js
index 4752d917..5bd4aea6 100644
--- a/client/src/translations/fr.js
+++ b/client/src/translations/fr.js
@@ -245,6 +245,7 @@ export const translations = {
   "Kings cross the 8x8 board": "Les rois traversent l'échiquier 8x8",
   "Kings cross the 11x11 board": "Les rois traversent l'échiquier 11x11",
   "Knibis and Bisknis": "Knibis et Bisknis",
+  "Kniros and Rosknis": "Kniros et Rosknis",
   "Knight in pocket": "Cavalier en poche",
   "Knight versus pawns": "Cavalier contre pions",
   "Korean Chess": "Échecs coréens",
diff --git a/client/src/translations/rules/Newzealand/en.pug b/client/src/translations/rules/Newzealand/en.pug
new file mode 100644
index 00000000..0405e15a
--- /dev/null
+++ b/client/src/translations/rules/Newzealand/en.pug
@@ -0,0 +1,17 @@
+p.boxed
+  | Knights capture as rooks, and rooks capture as knights.
+
+figure.diagram-container
+  .diagram.diag12
+    | fen:r1bqr1k1/pp2ppbp/2n2np1/1BpN4/5P2/4PN2/PPP3PP/R1BQ1RK1:
+  .diagram.diag22
+    | fen:r1bNr1k1/pp2ppbp/2n2np1/1Bp5/5P2/4PN2/PPP3PP/R1BQ1RK1:
+  figcaption Before and after Nxd8.
+
+h3 Source
+
+p
+  | The variant is mentioned 
+  a(href="https://www.chessvariants.com/play/erf/NewZChss.html")
+    | on chessvariants
+  | . It was probably invented around 1903.
diff --git a/client/src/translations/rules/Newzealand/es.pug b/client/src/translations/rules/Newzealand/es.pug
new file mode 100644
index 00000000..3a416434
--- /dev/null
+++ b/client/src/translations/rules/Newzealand/es.pug
@@ -0,0 +1,17 @@
+p.boxed
+  | Los caballos capturan como torres y las torres como caballos.
+
+figure.diagram-container
+  .diagram.diag12
+    | fen:r1bqr1k1/pp2ppbp/2n2np1/1BpN4/5P2/4PN2/PPP3PP/R1BQ1RK1:
+  .diagram.diag22
+    | fen:r1bNr1k1/pp2ppbp/2n2np1/1Bp5/5P2/4PN2/PPP3PP/R1BQ1RK1:
+  figcaption Antes y después de Nxd8.
+
+h3 Fuente
+
+p
+  | Se menciona la variante 
+  a(href="https://www.chessvariants.com/play/erf/NewZChss.html")
+    | en chessvariants
+  | . Probablemente fue inventado alrededor de 1903.
diff --git a/client/src/translations/rules/Newzealand/fr.pug b/client/src/translations/rules/Newzealand/fr.pug
new file mode 100644
index 00000000..e58a693b
--- /dev/null
+++ b/client/src/translations/rules/Newzealand/fr.pug
@@ -0,0 +1,17 @@
+p.boxed
+  | Les cavaliers capturent comme des tours, et les tours comme des cavaliers.
+
+figure.diagram-container
+  .diagram.diag12
+    | fen:r1bqr1k1/pp2ppbp/2n2np1/1BpN4/5P2/4PN2/PPP3PP/R1BQ1RK1:
+  .diagram.diag22
+    | fen:r1bNr1k1/pp2ppbp/2n2np1/1Bp5/5P2/4PN2/PPP3PP/R1BQ1RK1:
+  figcaption Avant et après Nxd8.
+
+h3 Source
+
+p
+  | La variante est mentionnée 
+  a(href="https://www.chessvariants.com/play/erf/NewZChss.html")
+    | sur chessvariants
+  | . Elle a probablement été inventée vers 1903.
diff --git a/client/src/translations/variants/en.pug b/client/src/translations/variants/en.pug
index a6e5bd8d..5c131086 100644
--- a/client/src/translations/variants/en.pug
+++ b/client/src/translations/variants/en.pug
@@ -124,6 +124,7 @@ p.
     "Grand",
     "Grasshopper",
     "Hoppelpoppel",
+    "Newzealand",
     "Omega",
     "Ordamirror",
     "Perfect",
diff --git a/client/src/translations/variants/es.pug b/client/src/translations/variants/es.pug
index 2db4ef95..fa4bab94 100644
--- a/client/src/translations/variants/es.pug
+++ b/client/src/translations/variants/es.pug
@@ -131,6 +131,7 @@ p.
     "Grand",
     "Grasshopper",
     "Hoppelpoppel",
+    "Newzealand",
     "Omega",
     "Ordamirror",
     "Perfect",
diff --git a/client/src/translations/variants/fr.pug b/client/src/translations/variants/fr.pug
index ba52eca5..a2dccaef 100644
--- a/client/src/translations/variants/fr.pug
+++ b/client/src/translations/variants/fr.pug
@@ -130,6 +130,7 @@ p.
     "Grand",
     "Grasshopper",
     "Hoppelpoppel",
+    "Newzealand",
     "Omega",
     "Ordamirror",
     "Perfect",
diff --git a/client/src/variants/Newzealand.js b/client/src/variants/Newzealand.js
new file mode 100644
index 00000000..d51eda11
--- /dev/null
+++ b/client/src/variants/Newzealand.js
@@ -0,0 +1,65 @@
+import { ChessRules } from "@/base_rules";
+
+// NOTE: a lot copy-pasted from Hoppelpoppel
+export class NewzealandRules extends ChessRules {
+
+  getSlideNJumpMoves_([x, y], steps, oneStep, options) {
+    options = options || {};
+    let moves = [];
+    outerLoop: for (let step of steps) {
+      let i = x + step[0];
+      let j = y + step[1];
+      while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
+        if (!options.onlyTake) moves.push(this.getBasicMove([x, y], [i, j]));
+        if (!!oneStep) continue outerLoop;
+        i += step[0];
+        j += step[1];
+      }
+      if (V.OnBoard(i, j) && this.canTake([x, y], [i, j]) && !options.onlyMove)
+        moves.push(this.getBasicMove([x, y], [i, j]));
+    }
+    return moves;
+  }
+
+  getPotentialKnightMoves(sq) {
+    // The knight captures like a rook
+    return (
+      this.getSlideNJumpMoves_(
+        sq, ChessRules.steps[V.KNIGHT], "oneStep", { onlyMove: true })
+      .concat(
+        this.getSlideNJumpMoves_(
+          sq, ChessRules.steps[V.ROOK], null, { onlyTake: true }))
+    );
+  }
+
+  getPotentialRookMoves(sq) {
+    // The rook captures like a knight
+    return (
+      this.getSlideNJumpMoves_(
+        sq, ChessRules.steps[V.ROOK], null, { onlyMove: true })
+      .concat(
+        this.getSlideNJumpMoves_(
+          sq, ChessRules.steps[V.KNIGHT], "oneStep", { onlyTake: true }))
+    );
+  }
+
+  isAttackedByKnight([x, y], color) {
+    return super.isAttackedBySlideNJump(
+      [x, y],
+      color,
+      V.KNIGHT,
+      V.steps[V.ROOK]
+    );
+  }
+
+  isAttackedByROOK([x, y], color) {
+    return super.isAttackedBySlideNJump(
+      [x, y],
+      color,
+      V.ROOK,
+      V.steps[V.KNIGHT],
+      "oneStep"
+    );
+  }
+
+};
diff --git a/server/db/populate.sql b/server/db/populate.sql
index 97ccdd66..1a13014b 100644
--- a/server/db/populate.sql
+++ b/server/db/populate.sql
@@ -114,6 +114,7 @@ insert or ignore into Variants (name, description) values
   ('Monocolor', 'All of the same color'),
   ('Monster', 'White move twice'),
   ('Musketeer', 'New fairy pieces'),
+  ('Newzealand', 'Kniros and Rosknis'),
   ('Omega', 'A wizard in the corner'),
   ('Orda', 'Mongolian Horde (v1)'),
   ('Ordamirror', 'Mongolian Horde (v2)'),
-- 
2.44.0