Better display on main Hall when no challenges or games found
[vchess.git] / client / src / components / BaseGame.vue
index 2a1a447..5c55656 100644 (file)
@@ -87,12 +87,13 @@ export default {
       orientation: "w",
       score: "*", //'*' means 'unfinished'
       moves: [],
-      // TODO: later, use subCursor to navigate intra-multimoves?
       cursor: -1, //index of the move just played
       lastMove: null,
       firstMoveNumber: 0, //for printing
       incheck: [], //for Board
-      inMultimove: false
+      inMultimove: false,
+      inPlay: false,
+      stackToPlay: []
     };
   },
   watch: {
@@ -227,11 +228,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);
@@ -272,6 +275,7 @@ export default {
     // Animate an elementary move
     animateMove: function(move, callback) {
       let startSquare = document.getElementById(getSquareId(move.start));
+      if (!startSquare) return; //shouldn't happen but...
       let endSquare = document.getElementById(getSquareId(move.end));
       let rectStart = startSquare.getBoundingClientRect();
       let rectEnd = endSquare.getBoundingClientRect();
@@ -282,6 +286,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");
@@ -310,8 +317,15 @@ export default {
       }
     },
     // "light": if gotoMove() or gotoEnd()
-    // data: some custom data (addTime) to be re-emitted
-    play: function(move, received, light, data) {
+    play: function(move, received, light, noemit) {
+      if (!!noemit) {
+        if (this.inPlay) {
+          // Received moves in observed games can arrive too fast:
+          this.stackToPlay.unshift(move);
+          return;
+        }
+        this.inPlay = true;
+      }
       const navigate = !move;
       const playSubmove = (smove) => {
         if (!navigate) smove.notation = this.vr.getNotation(smove);
@@ -337,7 +351,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;
@@ -378,8 +392,15 @@ export default {
           }
           if (!navigate && this.game.mode != "analyze") {
             const L = this.moves.length;
-            // Post-processing (e.g. computer play)
-            this.$emit("newmove", this.moves[L-1], data);
+            if (!noemit)
+              // Post-processing (e.g. computer play)
+              this.$emit("newmove", this.moves[L-1]);
+            else {
+              this.inPlay = false;
+              if (this.stackToPlay.length > 0)
+                // Move(s) arrived in-between
+                this.play(this.stackToPlay.pop(), received, light, noemit);
+            }
           }
         }
       };