Attempt to robustify identity detection at loading (no more temporary anonymous)
[vchess.git] / client / src / components / BaseGame.vue
index 3820dc1..0c20b0b 100644 (file)
@@ -23,11 +23,16 @@ div#baseGame
       )
       #turnIndicator(v-if="showTurn") {{ turn }}
       #controls
-        button(@click="gotoBegin()") <<
-        button(@click="undo()") <
-        button(v-if="canFlip" @click="flip()") &#8645;
-        button(@click="play()") >
-        button(@click="gotoEnd()") >>
+        button(@click="gotoBegin()")
+          img.inline(src="/images/icons/fast-forward_rev.svg")
+        button(@click="undo()")
+          img.inline(src="/images/icons/play_rev.svg")
+        button(v-if="canFlip" @click="flip()")
+          img.inline(src="/images/icons/flip.svg")
+        button(@click="play()")
+          img.inline(src="/images/icons/play.svg")
+        button(@click="gotoEnd()")
+          img.inline(src="/images/icons/fast-forward.svg")
       #belowControls
         #downloadDiv(v-if="allowDownloadPGN")
           a#download(href="#")
@@ -45,7 +50,6 @@ div#baseGame
           | {{ st.tr["Rules"] }}
     #movesList
       MoveList(
-        v-if="showMoves != 'none'"
         :show="showMoves"
         :score="game.score"
         :message="game.scoreMsg"
@@ -223,11 +227,13 @@ export default {
         this.lastMove = null;
     },
     analyzePosition: function() {
-      const newUrl =
+      let newUrl =
         "/analyse/" +
         this.game.vname +
         "/?fen=" +
         this.vr.getFen().replace(/ /g, "_");
+      if (this.game.mycolor)
+        newUrl += "&side=" + this.game.mycolor;
       // Open in same tab in live games (against cheating)
       if (this.game.type == "live") this.$router.push(newUrl);
       else window.open("#" + newUrl);
@@ -278,6 +284,9 @@ export default {
       let movingPiece = document.querySelector(
         "#" + getSquareId(move.start) + " > img.piece"
       );
+      // For some unknown reasons Opera get "movingPiece == null" error
+      // TOOO: is it calling 'animate()' twice ? One extra time ?
+      if (!movingPiece) return;
       // HACK for animation (with positive translate, image slides "under background")
       // Possible improvement: just alter squares on the piece's way...
       const squares = document.getElementsByClassName("board");
@@ -296,6 +305,15 @@ export default {
         callback();
       }, 250);
     },
+    // For Analyse mode:
+    emitFenIfAnalyze: function() {
+      if (this.game.mode == "analyze") {
+        this.$emit(
+          "fenchange",
+          this.lastMove ? this.lastMove.fen : this.game.fenStart
+        );
+      }
+    },
     // "light": if gotoMove() or gotoEnd()
     // data: some custom data (addTime) to be re-emitted
     play: function(move, received, light, data) {
@@ -309,7 +327,7 @@ export default {
         if (!navigate) {
           if (!this.inMultimove) {
             if (this.cursor < this.moves.length - 1)
-              this.moves = this.moves.slice(0, Math.max(this.cursor, 0));
+              this.moves = this.moves.slice(0, this.cursor + 1);
             this.moves.push(smove);
             this.inMultimove = true; //potentially
             this.cursor++;
@@ -324,7 +342,7 @@ export default {
         }
       };
       const playMove = () => {
-        const animate = V.ShowMoves == "all" && received;
+        const animate = V.ShowMoves == "all" && (received || navigate);
         if (!Array.isArray(move)) move = [move];
         let moveIdx = 0;
         let self = this;
@@ -346,18 +364,22 @@ export default {
         })();
       };
       const afterMove = (smove, initurn) => {
-        if (this.st.settings.sound == 2)
-          new Audio("/sounds/move.mp3").play().catch(() => {});
         if (this.vr.turn != initurn) {
           // Turn has changed: move is complete
+          if (!smove.fen) {
+            // NOTE: only FEN of last sub-move is required (thus setting it here)
+            smove.fen = this.vr.getFen();
+            this.emitFenIfAnalyze();
+          }
           this.inMultimove = false;
           const score = this.vr.getCurrentScore();
           if (score != "*") {
             const message = getScoreMessage(score);
             if (!navigate && this.game.mode != "analyze")
               this.$emit("gameover", score, message);
-            // Just show score on screen (allow undo)
-            else this.showEndgameMsg(score + " . " + this.st.tr[message]);
+            else if (this.game.mode == "analyze")
+              // Just show score on screen (allow undo)
+              this.showEndgameMsg(score + " . " + this.st.tr[message]);
           }
           if (!navigate && this.game.mode != "analyze") {
             const L = this.moves.length;
@@ -376,7 +398,10 @@ export default {
           if (!Array.isArray(move)) move = [move];
           for (let i=0; i < move.length; i++) this.vr.play(move[i]);
         }
-        else playMove();
+        else {
+          playMove();
+          this.emitFenIfAnalyze();
+        }
         this.cursor++;
         return;
       }
@@ -395,7 +420,6 @@ export default {
       playMove();
     },
     cancelCurrentMultimove: function() {
-      // Cancel current multi-move
       const L = this.moves.length;
       let move = this.moves[L-1];
       if (!Array.isArray(move)) move = [move];
@@ -424,9 +448,8 @@ export default {
         if (light) this.cursor--;
         else {
           this.positionCursorTo(this.cursor - 1);
-          if (this.st.settings.sound == 2)
-            new Audio("/sounds/undo.mp3").play().catch(() => {});
           this.incheck = this.vr.getCheckSquares(this.vr.turn);
+          this.emitFenIfAnalyze();
         }
       }
     },
@@ -445,6 +468,7 @@ export default {
       // NOTE: next line also re-assign cursor, but it's very light
       this.positionCursorTo(index);
       this.incheck = this.vr.getCheckSquares(this.vr.turn);
+      this.emitFenIfAnalyze();
     },
     gotoBegin: function() {
       if (this.inMultimove) this.cancelCurrentMultimove();
@@ -457,10 +481,12 @@ export default {
         this.lastMove = null;
       }
       this.incheck = [];
+      this.emitFenIfAnalyze();
     },
     gotoEnd: function() {
       if (this.cursor == this.moves.length - 1) return;
       this.gotoMove(this.moves.length - 1);
+      this.emitFenIfAnalyze();
     },
     flip: function() {
       this.orientation = V.GetOppCol(this.orientation);
@@ -488,10 +514,17 @@ export default {
 #controls
   margin: 0 auto
   text-align: center
+  display: flex
   button
     display: inline-block
     width: 20%
     margin: 0
+    img.inline
+      height: 24px
+      padding-top: 5px
+    @media screen and (max-width: 767px)
+      img.inline
+        height: 18px
 
 #turnIndicator
   text-align: center