Pandemonium: promotion on last 2 ranks
authorBenjamin Auder <benjamin.auder@somewhere>
Wed, 24 Mar 2021 10:36:28 +0000 (11:36 +0100)
committerBenjamin Auder <benjamin.auder@somewhere>
Wed, 24 Mar 2021 10:36:28 +0000 (11:36 +0100)
client/src/base_rules.js
client/src/translations/rules/Pandemonium/en.pug
client/src/translations/rules/Pandemonium/es.pug
client/src/translations/rules/Pandemonium/fr.pug
client/src/variants/Pandemonium.js

index 5cf1d97..f7a2fee 100644 (file)
@@ -769,9 +769,8 @@ export const ChessRules = class ChessRules {
       if (!!promotions) finalPieces = promotions;
       else if (!!V.PawnSpecs.promotions) finalPieces = V.PawnSpecs.promotions;
     }
       if (!!promotions) finalPieces = promotions;
       else if (!!V.PawnSpecs.promotions) finalPieces = V.PawnSpecs.promotions;
     }
-    let tr = null;
     for (let piece of finalPieces) {
     for (let piece of finalPieces) {
-      tr = (piece != V.PAWN ? { c: color, p: piece } : null);
+      const tr = (piece != V.PAWN ? { c: color, p: piece } : null);
       moves.push(this.getBasicMove([x1, y1], [x2, y2], tr));
     }
   }
       moves.push(this.getBasicMove([x1, y1], [x2, y2], tr));
     }
   }
index 1c315cb..1a0ebdf 100644 (file)
@@ -29,7 +29,7 @@ ul
   li Marshal promotes into Queen (called "Apricot" here).
 p.
   All these promotions are optional. They are available after a move ending
   li Marshal promotes into Queen (called "Apricot" here).
 p.
   All these promotions are optional. They are available after a move ending
-  at or starting from the last rank.
+  at or starting from the last two ranks.
 
 p.
   Each captured piece is first returned to its unpromoted version (if
 
 p.
   Each captured piece is first returned to its unpromoted version (if
index 56ab473..c66055f 100644 (file)
@@ -30,7 +30,7 @@ ul
   li Mariscal ascendió a Dama (aquí se llama "Apricot").
 p.
   Todas estas promociones son opcionales. Están disponibles después de un
   li Mariscal ascendió a Dama (aquí se llama "Apricot").
 p.
   Todas estas promociones son opcionales. Están disponibles después de un
-  movimiento que termina o comienza en la última fila.
+  movimiento que termina o comienza en las dos últimas filas.
 
 p.
   Cada pieza capturada se devuelve primero a su forma no promocionada (el caso
 
 p.
   Cada pieza capturada se devuelve primero a su forma no promocionada (el caso
index 63de846..6772a22 100644 (file)
@@ -30,7 +30,7 @@ ul
   li Maréchal promu en Dame (appelée "Apricot" ici).
 p.
   Toutes ces promotions sont optionnelles. Elles sont disponibles après un
   li Maréchal promu en Dame (appelée "Apricot" ici).
 p.
   Toutes ces promotions sont optionnelles. Elles sont disponibles après un
-  coup terminant ou commençant sur la dernière rangée.
+  coup terminant ou commençant sur les deux dernières rangées.
 
 p.
   Chaque pièce capturée est d'abord ramenée à sa forme non promue (le cas
 
 p.
   Chaque pièce capturée est d'abord ramenée à sa forme non promue (le cas
index e3b8c19..4894ec1 100644 (file)
@@ -4,14 +4,6 @@ import { ArrayFun } from "@/utils/array";
 
 export class PandemoniumRules extends ChessRules {
 
 
 export class PandemoniumRules extends ChessRules {
 
-  static get PawnSpecs() {
-    return Object.assign(
-      {},
-      ChessRules.PawnSpecs,
-      { promotions: [V.GILDING] }
-    );
-  }
-
   loseOnRepetition() {
     // If current side is under check: lost
     return this.underCheck(this.turn);
   loseOnRepetition() {
     // If current side is under check: lost
     return this.underCheck(this.turn);
@@ -414,10 +406,10 @@ export class PandemoniumRules extends ChessRules {
     // Maybe apply promotions:
     if (Object.keys(V.PromoteMap).includes(p)) {
       const promoted = V.PromoteMap[p];
     // Maybe apply promotions:
     if (Object.keys(V.PromoteMap).includes(p)) {
       const promoted = V.PromoteMap[p];
-      const lastRank = (c == 'w' ? 0 : 9);
+      const lastRanks = (c == 'w' ? [0, 1] : [9, 8]);
       let promotions = [];
       moves.forEach(m => {
       let promotions = [];
       moves.forEach(m => {
-        if (m.start.x == lastRank || m.end.x == lastRank) {
+        if (lastRanks.includes(m.start.x) || lastRanks.includes(m.end.x)) {
           let pMove = JSON.parse(JSON.stringify(m));
           pMove.appear[0].p = promoted;
           promotions.push(pMove);
           let pMove = JSON.parse(JSON.stringify(m));
           pMove.appear[0].p = promoted;
           promotions.push(pMove);
@@ -428,6 +420,21 @@ export class PandemoniumRules extends ChessRules {
     return moves;
   }
 
     return moves;
   }
 
+  addPawnMoves([x1, y1], [x2, y2], moves) {
+    const color = this.turn;
+    const lastRanks = (color == "w" ? [0, 1] : [9, 8]);
+    if (!lastRanks.includes(x2)) {
+      moves.push(this.getBasicMove([x1, y1], [x2, y2]));
+      return;
+    }
+    let finalPieces = [V.GILDING];
+    if (x2 == lastRanks[1]) finalPieces.push(V.PAWN);
+    for (let piece of finalPieces) {
+      const tr = (piece != V.PAWN ? { c: color, p: piece } : null);
+      moves.push(this.getBasicMove([x1, y1], [x2, y2], tr));
+    }
+  }
+
   getPotentialPawnMoves([x, y]) {
     const color = this.turn;
     const shiftX = (color == 'w' ? -1 : 1);
   getPotentialPawnMoves([x, y]) {
     const color = this.turn;
     const shiftX = (color == 'w' ? -1 : 1);