Fix Dice chess
authorBenjamin Auder <benjamin.auder@somewhere>
Sun, 3 May 2020 22:32:53 +0000 (00:32 +0200)
committerBenjamin Auder <benjamin.auder@somewhere>
Sun, 3 May 2020 22:32:53 +0000 (00:32 +0200)
client/src/translations/rules/Dice/en.pug
client/src/translations/rules/Dice/es.pug
client/src/translations/rules/Dice/fr.pug
client/src/variants/Dice.js

index 3fc2354..91be2d1 100644 (file)
@@ -13,6 +13,10 @@ figure.diagram-container
     | fen:r1b2b1r/pp2p3/2p2q2/3p1kpp/1P2Qp2/2K2P1P/P1PP2P1/RNB2BNR:
   figcaption Both kings could be captured if the dice indicated a queen.
 
+p.
+  Note: a pawn promotion into a piece type 'T' is a valid move
+  if the dice shows 'T'.
+
 p.
   Games are likely to be very random with this constraint.
   Play at your own risk :)
index 4a08a92..1799c53 100644 (file)
@@ -14,6 +14,10 @@ figure.diagram-container
   figcaption.
     Los dos reyes podrían ser capturados si el dado indica una dama.
 
+p.
+  Nota: una promoción de peón en una pieza de tipo 'T' es un movimiento
+  válido si el dado indica 'T'.
+
 p.
   Es probable que los juegos sean muy aleatorios con esta restricción.
   Juega bajo tu propio riesgo :)
index 42ee7ca..a5d852f 100644 (file)
@@ -14,6 +14,10 @@ figure.diagram-container
   figcaption.
     Les deux rois pourraient être capturés si le dé indiquait une dame.
 
+p.
+  Note : une promotion de pion en une pièce de type 'T' est un coup valide
+  si le dé indique 'T'.
+
 p.
   Les parties sont susceptibles d'être très aléatoires avec cette contrainte.
   Jouez à vos risques et périls :)
index a8ecf1b..68d80bb 100644 (file)
@@ -3,7 +3,7 @@ import { randInt } from "@/utils/alea";
 
 export class DiceRules extends ChessRules {
   static get CanAnalyze() {
-    return true;//false;
+    return false;
   }
 
   doClick(square) {
@@ -19,14 +19,39 @@ export class DiceRules extends ChessRules {
   }
 
   getPotentialMovesFrom([x, y]) {
+    if (this.subTurn == 1) return [];
     const L = this.p2play.length;
-    if (
-      this.subTurn == 1 ||
+    const piece = this.getPiece(x, y);
+    if (piece == V.PAWN && this.p2play[L-1] != V.PAWN) {
+      // The piece must be a pawn about to promote.
+      const color = this.turn;
+      const beforeLastRank = (color == 'w' ? 1 : 0);
+      const forward = (color == 'w' ? -1 : 1);
+      let moves = [];
+      if (this.board[x + forward][y] == V.EMPTY) {
+        moves.push(
+          this.getBasicMove(
+            [x, y], [x + forward], { c: color, p: this.p2play[L-1] })
+        );
+      }
+      for (let shift of [-1, 1]) {
+        const [i, j] = [x + forward, y + shift];
+        if (
+          V.OnBoard(i, j) &&
+          this.board[i][j] != V.EMPTY &&
+          this.getColor(i, j) != color
+        ) {
+          moves.push(
+            this.getBasicMove(
+              [x, y], [i, j], { c: color, p: this.p2play[L-1] })
+          );
+        }
+      }
+      return moves;
+    }
+    if (piece != this.p2play[L-1])
       // The piece type must match last p2play
-      this.getPiece(x, y) != this.p2play[L-1]
-    ) {
       return [];
-    }
     return super.getPotentialMovesFrom([x, y]);
   }