From 6f252ccbf794acae91aa51e45244fd2696d9b4cf Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
Date: Fri, 3 Apr 2020 23:55:01 +0200
Subject: [PATCH] Better Ball rules (I think...)

---
 client/src/translations/rules/Ball/en.pug |  8 +++++-
 client/src/translations/rules/Ball/es.pug |  8 +++++-
 client/src/translations/rules/Ball/fr.pug |  8 +++++-
 client/src/variants/Ball.js               | 31 +++++++++++++++++++----
 4 files changed, 47 insertions(+), 8 deletions(-)

diff --git a/client/src/translations/rules/Ball/en.pug b/client/src/translations/rules/Ball/en.pug
index c70fb460..e87db51a 100644
--- a/client/src/translations/rules/Ball/en.pug
+++ b/client/src/translations/rules/Ball/en.pug
@@ -10,12 +10,18 @@ ul
   li.
     Capturing an enemy unit holding the ball both make the piece
     disappear and grab the ball.
-  li "Capturing" a friendly unit pass the ball to it.
+  li.
+    "Capturing" a friendly unit pass the ball to it, or take the ball
+    from it. In both cases the pieces don't move.
 
 p.
   All pieces represent players on a field of some ball game,
   so they can move up to three squares only for a better realism.
 
+p.
+  To balance the advantage of ball possession, the piece holding the ball
+  cannot capture enemy pieces.
+
 figure.diagram-container
   .diagram.diag12
     | fen:1bnrqrnhb/ppppppppp/2h6/9/4a4/5P3/9/PPPPP1PPP/HBNRQRNHB:
diff --git a/client/src/translations/rules/Ball/es.pug b/client/src/translations/rules/Ball/es.pug
index 916ef802..ce371e9c 100644
--- a/client/src/translations/rules/Ball/es.pug
+++ b/client/src/translations/rules/Ball/es.pug
@@ -10,12 +10,18 @@ ul
   li.
     Capturar una pieza enemiga con el globo lo roba
     mientras lo hace desaparecer.
-  li "Capturar" una pieza amiga le pasa la pelota.
+  li.
+    "Capturar" una pieza amistosa pasa o toma la pelota. En ambos casos,
+    las piezas no se mueven.
 
 p.
   Todas las piezas representan jugadores en un área de juego de pelota,
   entonces solo se mueven tres casillas como máximo para un mejor realismo.
 
+p.
+  Para compensar la ventaja de la posesión, una pieza que tiene la
+  la pelota no puede capturar piezas opuestas.
+
 figure.diagram-container
   .diagram.diag12
     | fen:1bnrqrnhb/ppppppppp/2h6/9/4a4/5P3/9/PPPPP1PPP/HBNRQRNHB:
diff --git a/client/src/translations/rules/Ball/fr.pug b/client/src/translations/rules/Ball/fr.pug
index f38bfbd2..19c9284c 100644
--- a/client/src/translations/rules/Ball/fr.pug
+++ b/client/src/translations/rules/Ball/fr.pug
@@ -10,13 +10,19 @@ ul
   li.
     Capturer une pièce ennemie possédant le ballon lui vole
     tout en la faisant disparaître.
-  li "Capturer" une pièce amie lui passe le ballon.
+  li.
+    "Capturer" une pièce amie lui passe le ballon, ou lui prend.
+    Dans les deux cas, les pièces ne bougent pas.
 
 p.
   Toutes les pièces représentent des joueurs sur un terrain d'un certain
   jeu de ballon, donc elles ne se déplacent que de trois cases au maximum
   pour un meilleur réalisme.
 
+p.
+  Pour compenser l'avantage de possession du ballon, une pièce ayant la
+  balle ne peut pas capturer les pièces adverses.
+
 figure.diagram-container
   .diagram.diag12
     | fen:1bnrqrnhb/ppppppppp/2h6/9/4a4/5P3/9/PPPPP1PPP/HBNRQRNHB:
diff --git a/client/src/variants/Ball.js b/client/src/variants/Ball.js
index 3903e2b4..e3c8e5ec 100644
--- a/client/src/variants/Ball.js
+++ b/client/src/variants/Ball.js
@@ -112,10 +112,17 @@ export class BallRules extends ChessRules {
   }
 
   canTake([x1, y1], [x2, y2]) {
-    // Capture enemy or pass ball to friendly pieces
+    if (this.getColor(x1, y1) !== this.getColor(x2, y2)) {
+      // The piece holding the ball cannot capture:
+      return (
+        !(Object.keys(V.HAS_BALL_DECODE)
+          .includes(this.board[x1][y1].charAt(1)))
+      );
+    }
+    // Pass: possible only if one of the friendly pieces has the ball
     return (
-      this.getColor(x1, y1) !== this.getColor(x2, y2) ||
-      Object.keys(V.HAS_BALL_DECODE).includes(this.board[x1][y1].charAt(1))
+      Object.keys(V.HAS_BALL_DECODE).includes(this.board[x1][y1].charAt(1)) ||
+      Object.keys(V.HAS_BALL_DECODE).includes(this.board[x2][y2].charAt(1))
     );
   }
 
@@ -238,15 +245,29 @@ export class BallRules extends ChessRules {
       );
     }
 
-    // Post-processing: maybe the ball was taken, or a piece + ball
+    // Post-processing: maybe the ball was taken, or a piece + ball,
+    // or maybe a pass (ball <--> piece)
     if (mv.vanish.length == 2) {
       if (
         // Take the ball?
         mv.vanish[1].c == 'a' ||
-        // Capture a ball-holding piece?
+        // Capture a ball-holding piece? If friendly one, then adjust
         Object.keys(V.HAS_BALL_DECODE).includes(mv.vanish[1].p)
       ) {
         mv.appear[0].p = V.HAS_BALL_CODE[mv.appear[0].p];
+        if (mv.vanish[1].c == mv.vanish[0].c) {
+          // "Capturing" self => pass
+          mv.appear[0].x = mv.start.x;
+          mv.appear[0].y = mv.start.y;
+          mv.appear.push(
+            new PiPo({
+              x: mv.end.x,
+              y: mv.end.y,
+              p: V.HAS_BALL_DECODE[mv.vanish[1].p],
+              c: mv.vanish[0].c
+            })
+          );
+        }
       } else if (mv.vanish[1].c == mv.vanish[0].c) {
         // Pass the ball: the passing unit does not disappear
         mv.appear.push(JSON.parse(JSON.stringify(mv.vanish[0])));
-- 
2.44.0