From 20620465247585ed4e845885c4d9fee8cd6920c1 Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
Date: Wed, 19 Feb 2020 15:15:20 +0100
Subject: [PATCH] Avoid direct references to (Dark) variant name in BaseGame,
 Analyse and Board

---
 client/src/base_rules.js               | 17 +++++++++++++--
 client/src/components/BaseGame.vue     | 29 ++++++++++++++------------
 client/src/components/Board.vue        | 11 +++++-----
 client/src/components/ComputerGame.vue |  4 ++--
 client/src/translations/en.js          |  2 --
 client/src/translations/es.js          |  2 --
 client/src/translations/fr.js          |  2 --
 client/src/variants/Dark.js            | 11 +++++++++-
 client/src/views/Analyse.vue           | 10 ++-------
 client/src/views/Rules.vue             |  5 ++++-
 10 files changed, 55 insertions(+), 38 deletions(-)

diff --git a/client/src/base_rules.js b/client/src/base_rules.js
index 42d9bdc8..5ebe4997 100644
--- a/client/src/base_rules.js
+++ b/client/src/base_rules.js
@@ -32,13 +32,26 @@ export const ChessRules = class ChessRules {
   //////////////
   // MISC UTILS
 
+  // Some variants don't have flags:
   static get HasFlags() {
     return true;
-  } //some variants don't have flags
+  }
 
+  // Some variants don't have en-passant
   static get HasEnpassant() {
     return true;
-  } //some variants don't have ep.
+  }
+
+  // Some variants cannot have analyse mode
+  static get CanAnalyse() {
+    return true;
+  }
+
+  // Some variants show incomplete information,
+  // and thus show only a partial moves list or no list at all.
+  static get ShowMoves() {
+    return "all";
+  }
 
   // Path to pieces
   static getPpath(b) {
diff --git a/client/src/components/BaseGame.vue b/client/src/components/BaseGame.vue
index 2f49169a..07d62cf7 100644
--- a/client/src/components/BaseGame.vue
+++ b/client/src/components/BaseGame.vue
@@ -33,14 +33,15 @@ div#baseGame(
       Board(
         :vr="vr"
         :last-move="lastMove"
-        :analyze="analyze"
+        :analyze="game.mode=='analyze'"
+        :score="game.score"
         :user-color="game.mycolor"
         :orientation="orientation"
         :vname="game.vname"
         :incheck="incheck"
         @play-move="play"
       )
-      #turnIndicator(v-if="game.vname=='Dark' && game.score=='*'") {{ turn }}
+      #turnIndicator(v-if="showTurn") {{ turn }}
       #controls
         button(@click="gotoBegin()") <<
         button(@click="undo()") <
@@ -48,16 +49,16 @@ div#baseGame(
         button(@click="play()") >
         button(@click="gotoEnd()") >>
       #belowControls
-        #downloadDiv(v-if="game.vname!='Dark' || game.score!='*'")
+        #downloadDiv(v-if="allowDownloadPGN")
           a#download(href="#")
           button(@click="download()") {{ st.tr["Download"] }} PGN
         button(onClick="window.doClick('modalAdjust')") &#10530;
         button(
-          v-if="game.vname!='Dark' && game.mode!='analyze'"
+          v-if="canAnalyze"
           @click="analyzePosition()"
         )
           | {{ st.tr["Analyse"] }}
-        // NOTE: rather ugly hack to avoid showing twice "rules" link...
+        // NOTE: variants pages already have a "Rules" link on top
         button(
           v-if="!$route.path.match('/variants/')"
           @click="showRules()"
@@ -122,17 +123,19 @@ export default {
   },
   computed: {
     showMoves: function() {
-      return this.game.vname != "Dark" || this.game.score != "*";
+      return this.game.score != "*" || (window.V && V.ShowMoves == "all");
+    },
+    showTurn: function() {
+      return this.game.score == '*' && window.V && V.ShowMoves != "all";
     },
     turn: function() {
       return this.st.tr[(this.vr.turn == 'w' ? "White" : "Black") + " to move"];
     },
-    analyze: function() {
-      return (
-        this.game.mode == "analyze" ||
-        // From Board viewpoint, a finished Dark game == analyze (TODO: unclear)
-        (this.game.vname == "Dark" && this.game.score != "*")
-      );
+    canAnalyze: function() {
+      return this.game.mode != "analyze" && window.V && V.CanAnalyze;
+    },
+    allowDownloadPGN: function() {
+      return this.game.score != "*" || (window.V && V.ShowMoves == "all");
     }
   },
   created: function() {
@@ -381,7 +384,7 @@ export default {
         if (!navigate && this.game.mode != "analyze")
           this.$emit("newmove", move); //post-processing (e.g. computer play)
       };
-      if (!!receive && this.game.vname != "Dark")
+      if (!!receive && V.ShowMoves == "all")
         this.animateMove(move, doPlayMove);
       else doPlayMove();
     },
diff --git a/client/src/components/Board.vue b/client/src/components/Board.vue
index 45c7293b..bd2612d8 100644
--- a/client/src/components/Board.vue
+++ b/client/src/components/Board.vue
@@ -11,6 +11,7 @@ export default {
     "vr",
     "lastMove",
     "analyze",
+    "score",
     "incheck",
     "orientation",
     "userColor",
@@ -46,9 +47,9 @@ export default {
       incheckSq[sq[0]][sq[1]] = true;
     });
 
-    // Create board element (+ reserves if needed by variant or mode)
+    // Create board element (+ reserves if needed by variant)
     const lm = this.lastMove;
-    const showLight = this.settings.highlight && this.vname != "Dark";
+    const showLight = this.settings.highlight && V.ShowMoves == "all";
     const gameDiv = h(
       "div",
       {
@@ -72,8 +73,7 @@ export default {
             let elems = [];
             if (
               this.vr.board[ci][cj] != V.EMPTY &&
-              (this.vname != "Dark" ||
-                this.analyze ||
+              (!this.vr.enlightened || this.analyze || this.score != "*" ||
                 (!!this.userColor &&
                   this.vr.enlightened[this.userColor][ci][cj]))
             ) {
@@ -116,8 +116,9 @@ export default {
                   "dark-square": (i + j) % 2 == 1,
                   [this.settings.bcolor]: true,
                   "in-shadow":
-                    this.vname == "Dark" &&
                     !this.analyze &&
+                    this.score == "*" &&
+                    this.vr.enlightened &&
                     (!this.userColor ||
                       !this.vr.enlightened[this.userColor][ci][cj]),
                   highlight:
diff --git a/client/src/components/ComputerGame.vue b/client/src/components/ComputerGame.vue
index 4d354713..0d566a81 100644
--- a/client/src/components/ComputerGame.vue
+++ b/client/src/components/ComputerGame.vue
@@ -57,8 +57,8 @@ export default {
       const delay = Math.max(500 - (Date.now() - this.timeStart), 0);
       setTimeout(() => {
         if (this.currentUrl != document.location.href) return; //page change
-        // NOTE: Dark and 2-moves are incompatible
-        const animate = this.gameInfo.vname != "Dark";
+        // NOTE: do not animate move if special display (ShowMoves != "all")
+        const animate = V.ShowMoves == "all";
         const animDelay = animate ? 250 : 0;
         let moveIdx = 0;
         let self = this;
diff --git a/client/src/translations/en.js b/client/src/translations/en.js
index 94be8f8a..5afbc59a 100644
--- a/client/src/translations/en.js
+++ b/client/src/translations/en.js
@@ -4,8 +4,6 @@ export const translations = {
   "Accept draw?": "Accept draw?",
   All: "All",
   Analyse: "Analyse",
-  "Analyse in Dark mode makes no sense!":
-    "Analyse in Dark mode makes no sense!",
   "Any player": "Any player",
   "Are you sure?": "Are you sure?",
   "Authentication successful!": "Authentication successful!",
diff --git a/client/src/translations/es.js b/client/src/translations/es.js
index 56c6733b..fd9f28ea 100644
--- a/client/src/translations/es.js
+++ b/client/src/translations/es.js
@@ -4,8 +4,6 @@ export const translations = {
   "Accept draw?": "¿Acceptar tablas?",
   All: "Todos",
   Analyse: "Analizar",
-  "Analyse in Dark mode makes no sense!":
-    "¡Analizar en modo Dark no tiene sentido!",
   "Any player": "Cualquier jugador",
   Apply: "Aplicar",
   "Are you sure?": "¿Está usted seguro?",
diff --git a/client/src/translations/fr.js b/client/src/translations/fr.js
index 3e9aa6ab..0d776b4e 100644
--- a/client/src/translations/fr.js
+++ b/client/src/translations/fr.js
@@ -4,8 +4,6 @@ export const translations = {
   "Accept draw?": "Accepter la nulle ?",
   All: "Tous",
   Analyse: "Analyser",
-  "Analyse in Dark mode makes no sense!":
-    "Analyser en mode Dark n'a pas de sens !",
   "Any player": "N'importe qui",
   Apply: "Appliquer",
   "Authentication successful!": "Authentification réussie !",
diff --git a/client/src/variants/Dark.js b/client/src/variants/Dark.js
index 358362c7..cdacf9d2 100644
--- a/client/src/variants/Dark.js
+++ b/client/src/variants/Dark.js
@@ -3,7 +3,16 @@ import { ArrayFun } from "@/utils/array";
 import { randInt } from "@/utils/alea";
 
 export const VariantRules = class DarkRules extends ChessRules {
-  // Standard rules, in the shadow
+  // Analyse in Dark mode makes no sense
+  static get CanAnalyse() {
+    return false;
+  }
+
+  // Moves are revealed only when game ends
+  static get ShowMoves() {
+    return "none";
+  }
+
   setOtherVariables(fen) {
     super.setOtherVariables(fen);
     const [sizeX, sizeY] = [V.size.x, V.size.y];
diff --git a/client/src/views/Analyse.vue b/client/src/views/Analyse.vue
index 7259632c..d1c6d593 100644
--- a/client/src/views/Analyse.vue
+++ b/client/src/views/Analyse.vue
@@ -37,7 +37,6 @@ export default {
       },
       vr: null, //"variant rules" object initialized from FEN
       curFen: ""
-      //people: [], //players + observers //TODO later: interactive analyze...
     };
   },
   watch: {
@@ -50,13 +49,8 @@ export default {
   },
   created: function() {
     this.gameRef.vname = this.$route.params["vname"];
-    if (this.gameRef.vname == "Dark") {
-      alert(this.st.tr["Analyse in Dark mode makes no sense!"]);
-      history.back(); //or this.$router.go(-1)
-    } else {
-      this.gameRef.fen = this.$route.query["fen"].replace(/_/g, " ");
-      this.initialize();
-    }
+    this.gameRef.fen = this.$route.query["fen"].replace(/_/g, " ");
+    this.initialize();
   },
   methods: {
     initialize: async function() {
diff --git a/client/src/views/Rules.vue b/client/src/views/Rules.vue
index 55564ffd..8ac03a91 100644
--- a/client/src/views/Rules.vue
+++ b/client/src/views/Rules.vue
@@ -20,7 +20,7 @@ main
         )
           | {{ st.tr["Stop game"] }}
         button(
-          v-if="display=='rules' && gameInfo.vname!='Dark'"
+          v-if="showAnalyzeBtn"
           @click="gotoAnalyze()"
         )
           | {{ st.tr["Analyse"] }}
@@ -69,6 +69,9 @@ export default {
     this.re_setVariant(this.$route.params["vname"]);
   },
   computed: {
+    showAnalyzeBtn: function() {
+      return (this.display=='rules' && (!window.V || V.CanAnalyse));
+    },
     content: function() {
       if (!this.gameInfo.vname) return ""; //variant not set yet
       // (AJAX) Request to get rules content (plain text, HTML)
-- 
2.44.0