From 8b405c81769b822dd2d0db28c613da259f68c071 Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
Date: Sat, 22 Feb 2020 13:51:46 +0100
Subject: [PATCH] Fix incheck in BaseGame, draft Antimatter variant

---
 client/src/components/BaseGame.vue            |  2 ++
 client/src/translations/en.js                 |  1 +
 client/src/translations/es.js                 |  1 +
 client/src/translations/fr.js                 |  1 +
 .../src/translations/rules/Antimatter/en.pug  | 24 ++++++++++++++++++
 .../src/translations/rules/Antimatter/es.pug  | 25 +++++++++++++++++++
 .../src/translations/rules/Antimatter/fr.pug  | 25 +++++++++++++++++++
 client/src/translations/rules/Benedict/en.pug |  2 ++
 client/src/translations/rules/Benedict/es.pug |  7 ++++++
 client/src/translations/rules/Benedict/fr.pug |  7 ++++++
 client/src/variants/Antimatter.js             | 20 +++++++++++++++
 client/src/variants/Atomic.js                 |  4 +--
 server/db/populate.sql                        |  1 +
 13 files changed, 118 insertions(+), 2 deletions(-)
 create mode 100644 client/src/translations/rules/Antimatter/en.pug
 create mode 100644 client/src/translations/rules/Antimatter/es.pug
 create mode 100644 client/src/translations/rules/Antimatter/fr.pug
 create mode 100644 client/src/variants/Antimatter.js

diff --git a/client/src/components/BaseGame.vue b/client/src/components/BaseGame.vue
index c52f94c8..42fe1897 100644
--- a/client/src/components/BaseGame.vue
+++ b/client/src/components/BaseGame.vue
@@ -393,6 +393,7 @@ export default {
       this.vr.re_init(this.moves[index].fen);
       this.cursor = index;
       this.lastMove = this.moves[index];
+      this.incheck = this.vr.getCheckSquares(this.vr.turn);
     },
     gotoBegin: function() {
       if (this.cursor == -1) return;
@@ -404,6 +405,7 @@ export default {
         this.cursor = -1;
         this.lastMove = null;
       }
+      this.incheck = this.vr.getCheckSquares(this.vr.turn);
     },
     gotoEnd: function() {
       if (this.cursor == this.moves.length - 1) return;
diff --git a/client/src/translations/en.js b/client/src/translations/en.js
index 64ff2b02..df3b1d22 100644
--- a/client/src/translations/en.js
+++ b/client/src/translations/en.js
@@ -132,6 +132,7 @@ export const translations = {
   "Capture all of a kind": "Capture all of a kind",
   "Captures reborn": "Captures reborn",
   "Change colors": "Change colors",
+  "Dangerous collisions": "Dangerous collisions",
   "Exchange pieces positions": "Exchange pieces positions",
   "Exotic captures": "Exotic captures",
   "Explosive captures": "Explosive captures",
diff --git a/client/src/translations/es.js b/client/src/translations/es.js
index 760e644c..5588cbb9 100644
--- a/client/src/translations/es.js
+++ b/client/src/translations/es.js
@@ -132,6 +132,7 @@ export const translations = {
   "Capture all of a kind": "Capturar todo del mismo tipo",
   "Captures reborn": "Las capturas renacen",
   "Change colors": "Cambiar colores",
+  "Dangerous collisions": "Colisiones peligrosas",
   "Exchange pieces positions": "Intercambiar las posiciones de las piezas",
   "Exotic captures": "Capturas exóticas",
   "Explosive captures": "Capturas explosivas",
diff --git a/client/src/translations/fr.js b/client/src/translations/fr.js
index b6906745..ed302bae 100644
--- a/client/src/translations/fr.js
+++ b/client/src/translations/fr.js
@@ -132,6 +132,7 @@ export const translations = {
   "Capture all of a kind": "Capturez tout d'un même type",
   "Captures reborn": "Les captures renaissent",
   "Change colors": "Changer les couleurs",
+  "Dangerous collisions": "Collisions dangeureuses",
   "Exchange pieces positions": "Échangez les positions des pièces",
   "Exotic captures": "Captures exotiques",
   "Explosive captures": "Captures explosives",
diff --git a/client/src/translations/rules/Antimatter/en.pug b/client/src/translations/rules/Antimatter/en.pug
new file mode 100644
index 00000000..3c8e3337
--- /dev/null
+++ b/client/src/translations/rules/Antimatter/en.pug
@@ -0,0 +1,24 @@
+p.boxed
+  | If a piece captures one of the same kind, both disappear.
+
+p.
+  The defensive power of pawns is thus increased, because they don't fear
+  captures (by other pawns).
+
+p.
+  Endings are also affected quite a lot, and sometimes new threats occur:
+  on the diagram, 3.Bxg7 wins a pawn because 3...Bxg7 would make both
+  bishops disappear.
+
+figure.diagram-container
+  .diagram
+    | fen:r1bqkbnr/pp1ppppp/2n5/2p5/8/1P6/PBPPPPPP/RN1QKBNR:
+  figcaption After 1.b3 c5 2.Bb2 Nc6
+
+p This detail excepted, the orthodox chess rules apply.
+
+h3 Source
+
+p
+  a(href="https://www.chessvariants.com/rules/antimatter-chess") Antimatter chess
+  | &nbsp;on chessvariants.com.
diff --git a/client/src/translations/rules/Antimatter/es.pug b/client/src/translations/rules/Antimatter/es.pug
new file mode 100644
index 00000000..60cf1ecb
--- /dev/null
+++ b/client/src/translations/rules/Antimatter/es.pug
@@ -0,0 +1,25 @@
+p.boxed
+  | Si una pieza captura otra del mismo tipo, las dos desaparecen.
+
+p.
+  El poder defensivo de los peones aumenta así, ya que no temen
+  más capturas (por otros peones).
+
+p.
+  Las finales también se ven muy afectadas y, a veces, nuevas amenazas
+  ocurren: en el diagrama, 3.Bxg7 gana un peón porque 3...Bxg7 causaría
+  la desaparición de los dos alfiles.
+
+figure.diagram-container
+  .diagram
+    | fen:r1bqkbnr/pp1ppppp/2n5/2p5/8/1P6/PBPPPPPP/RN1QKBNR:
+  figcaption Después de 1.b3 c5 2.Bb2 Nc6
+
+p Excepto por este detalle, se aplican las reglas del ajedrez ortodoxo.
+
+h3 Fuente
+
+p
+  | La 
+  a(href="https://www.chessvariants.com/rules/antimatter-chess") variante Antimateria
+  | &nbsp;en chessvariants.com.
diff --git a/client/src/translations/rules/Antimatter/fr.pug b/client/src/translations/rules/Antimatter/fr.pug
new file mode 100644
index 00000000..1e2dbee1
--- /dev/null
+++ b/client/src/translations/rules/Antimatter/fr.pug
@@ -0,0 +1,25 @@
+p.boxed
+  | Si une pièce en capture une autre du même type, les deux disparaissent.
+
+p.
+  Le pouvoir défensif des pions est ainsi augmenté, puisqu'ils ne craignent
+  plus les captures (par d'autres pions).
+
+p.
+  Les finales sont aussi beaucoup affectées, et parfois de nouvelles menaces
+  surviennent : sur le diagramme, 3.Bxg7 gagne un pion car 3...Bxg7 provoquerait
+  la disparition des deux fous.
+
+figure.diagram-container
+  .diagram
+    | fen:r1bqkbnr/pp1ppppp/2n5/2p5/8/1P6/PBPPPPPP/RN1QKBNR:
+  figcaption After 1.b3 c5 2.Bb2 Nc6
+
+p Ce détail excepté, les règles des échecs orthodoxes s'appliquent.
+
+h3 Source
+
+p
+  | La 
+  a(href="https://www.chessvariants.com/rules/antimatter-chess") variante Antimatière
+  | &nbsp;sur chessvariants.com.
diff --git a/client/src/translations/rules/Benedict/en.pug b/client/src/translations/rules/Benedict/en.pug
index 9f6da6fc..856f3417 100644
--- a/client/src/translations/rules/Benedict/en.pug
+++ b/client/src/translations/rules/Benedict/en.pug
@@ -6,6 +6,8 @@ p.
   They change side, until the opponent in turn can attack them.
   There are no captures: only color changes.
 
+p Castling is possible, and flips pieces attacked by the king or rook.
+
 figure.diagram-container
   .diagram
     | fen:r1bqkbnr/ppPpPppp/2n5/3N4/8/8/PPPPPPPP/R1BQKBNR:
diff --git a/client/src/translations/rules/Benedict/es.pug b/client/src/translations/rules/Benedict/es.pug
index 439d5da1..01c50ed9 100644
--- a/client/src/translations/rules/Benedict/es.pug
+++ b/client/src/translations/rules/Benedict/es.pug
@@ -2,6 +2,13 @@ p.boxed
   | Las piezas atacadas cambian de color después de cada turno.
   | El objetivo es cambiar el color del rey.
 
+p.
+  Más precisamente, solo las piezas atacadas por la unidad móvil se voltean.
+  Cambian de lado, hasta que el oponente a su vez puede atacarlos.
+  No hay capturas: solo cambios de color.
+
+p El enroque es posible y cambia tanto las piezas atacadas por el rey como la torre.
+
 figure.diagram-container
   .diagram
     | fen:r1bqkbnr/ppPpPppp/2n5/3N4/8/8/PPPPPPPP/R1BQKBNR:
diff --git a/client/src/translations/rules/Benedict/fr.pug b/client/src/translations/rules/Benedict/fr.pug
index 542a1898..cffef96f 100644
--- a/client/src/translations/rules/Benedict/fr.pug
+++ b/client/src/translations/rules/Benedict/fr.pug
@@ -2,6 +2,13 @@ p.boxed
   | Les pièces attaquées changent de couleur après chaque tour.
   | Le but est de changer la couleur du roi.
 
+p.
+  Plus précisément, seules les pièces attaquées par le coup courant sont modifiées.
+  Elles changent de couleur, jusqu'à ce que l'adversaire au trait puisse les attaquer.
+  Il n'y a pas de captures : seulement des changements de couleur.
+
+p Le roque est possible, et change à la fois les pièces attaquées par le roi et la tour.
+
 figure.diagram-container
   .diagram
     | fen:r1bqkbnr/ppPpPppp/2n5/3N4/8/8/PPPPPPPP/R1BQKBNR:
diff --git a/client/src/variants/Antimatter.js b/client/src/variants/Antimatter.js
new file mode 100644
index 00000000..63d5ae56
--- /dev/null
+++ b/client/src/variants/Antimatter.js
@@ -0,0 +1,20 @@
+import { ChessRules } from "@/base_rules";
+
+export const VariantRules = class AntimatterRules extends ChessRules {
+  getPotentialMovesFrom([x, y]) {
+    let moves = super.getPotentialMovesFrom([x, y]);
+
+    // Handle "matter collisions"
+    moves.forEach(m => {
+      if (
+        m.vanish.length > 1 &&
+        m.appear.length <= 1 &&
+        m.vanish[0].p == m.vanish[1].p
+      ) {
+        m.appear.pop();
+      }
+    });
+
+    return moves;
+  }
+};
diff --git a/client/src/variants/Atomic.js b/client/src/variants/Atomic.js
index 996f2d1a..2fcb5a6b 100644
--- a/client/src/variants/Atomic.js
+++ b/client/src/variants/Atomic.js
@@ -6,9 +6,9 @@ export const VariantRules = class AtomicRules extends ChessRules {
 
     // Handle explosions
     moves.forEach(m => {
+      // NOTE: if vanish.length==2 and appear.length==2, this is castle
       if (m.vanish.length > 1 && m.appear.length <= 1) {
-        //avoid castles
-        // Explosion! OPTION (TODO?): drop moves which explode our king here
+        // Explosion! (TODO?: drop moves which explode our king here)
         let steps = [
           [-1, -1],
           [-1, 0],
diff --git a/server/db/populate.sql b/server/db/populate.sql
index 34d0f44e..3fea093a 100644
--- a/server/db/populate.sql
+++ b/server/db/populate.sql
@@ -3,6 +3,7 @@
 insert or ignore into Variants (name,description) values
   ('Alice', 'Both sides of the mirror'),
   ('Antiking', 'Keep antiking in check'),
+  ('Antimatter', 'Dangerous collisions'),
   ('Atomic', 'Explosive captures'),
   ('Baroque', 'Exotic captures'),
   ('Benedict', 'Change colors'),
-- 
2.44.0