Some fixes. TODO: check clocks update, and continue work on resign/abort/draw
[vchess.git] / client / src / views / Hall.vue
index 0fd8322..22aa53e 100644 (file)
@@ -79,9 +79,10 @@ import { checkChallenge } from "@/data/challengeCheck";
 import { ArrayFun } from "@/utils/array";
 import { ajax } from "@/utils/ajax";
 import { getRandString, shuffle } from "@/utils/alea";
-import { extractTime } from "@/utils/timeControl";
 import GameList from "@/components/GameList.vue";
 import ChallengeList from "@/components/ChallengeList.vue";
+import { GameStorage } from "@/utils/gameStorage";
+import { extractTime } from "@/utils/timeControl";
 export default {
   name: "my-hall",
   components: {
@@ -292,20 +293,21 @@ export default {
         }
         case "askgame":
         {
-          // Send my current live game (if any)
-          if (!!localStorage["gid"])
-          {
-            const myGame =
-            {
-              // Minimal game informations: (fen+clock not required)
-              id: localStorage["gid"],
-              players: JSON.parse(localStorage["players"]), //array sid+id+name
-              vname: localStorage["vname"],
-              timeControl: localStorage["timeControl"],
-            };
-            this.st.conn.send(JSON.stringify({code:"game",
-              game:myGame, target:data.from}));
-          }
+          // Send my current live games (if any)
+          // TODO: from indexedDB, through GameStorage.
+//          if (!!localStorage["gid"])
+//          {
+//            const myGame =
+//            {
+//              // Minimal game informations: (fen+clock not required)
+//              id: localStorage["gid"],
+//              players: JSON.parse(localStorage["players"]), //array sid+id+name
+//              vname: localStorage["vname"],
+//              timeControl: localStorage["timeControl"],
+//            };
+//            this.st.conn.send(JSON.stringify({code:"game",
+//              game:myGame, target:data.from}));
+//          }
           break;
         }
         case "identity":
@@ -331,6 +333,7 @@ export default {
         {
           // Receive game from some player (+sid)
           // NOTE: it may be correspondance (if newgame while we are connected)
+          // TODO: ambiguous naming "newGame" ==> rename function ?
           let newGame = data.game;
           newGame.type = this.classifyObject(data.game);
           newGame.vname = newGame.vname;
@@ -564,12 +567,14 @@ export default {
       window.V = vModule.VariantRules;
       let players = [c.from];
       Array.prototype.push.apply(players, c.seats);
-      let gameInfo =
+      // These game informations will be sent to other players
+      const gameInfo =
       {
+        gameId: getRandString(),
         fen: c.fen || V.GenRandInitFen(),
-        // Shuffle players order (white then black then other colors).
         // Players' names may be required if game start when a player is offline
-        players: shuffle(players).map(p => { return {name:p.name, sid:p.sid} }),
+        // Shuffle players order (white then black then other colors).
+        players: shuffle(players.map(p => { return {name:p.name, sid:p.sid} })),
         vid: c.vid,
         timeControl: c.timeControl,
       };
@@ -584,20 +589,30 @@ export default {
     },
     // NOTE: for live games only (corr games are launched on server)
     newGame: function(gameInfo) {
-      localStorage["gid"] = getRandString();
-      // Extract times (in [milli]seconds), set clocks, store in localStorage
+      // Extract times (in [milli]seconds), set clocks
       const tc = extractTime(gameInfo.timeControl);
-      localStorage["timeControl"] = gameInfo.timeControl;
-      localStorage["clocks"] = JSON.stringify(
-        [...Array(gameInfo.players.length)].fill(tc.mainTime));
-      localStorage["increment"] = tc.increment;
-      localStorage["started"] = JSON.stringify(
-        [...Array(gameInfo.players.length)].fill(false));
-      localStorage["vname"] = this.getVname(gameInfo.vid);
-      localStorage["fenInit"] = gameInfo.fen;
-      localStorage["players"] = JSON.stringify(gameInfo.players);
+      const IPlayFirst = (gameInfo.players[0].sid == this.st.user.sid);
+      const game =
+      {
+        // Game infos: constant
+        gameId: gameInfo.gameId,
+        vname: this.getVname(gameInfo.vid),
+        fenStart: gameInfo.fen,
+        players: gameInfo.players,
+        timeControl: gameInfo.timeControl,
+        increment: tc.increment,
+        mode: "live", //function for live games only
+        // Game state: will be updated
+        fen: gameInfo.fen,
+        moves: [],
+        clocks: [...Array(gameInfo.players.length)].fill(tc.mainTime),
+        initime: (IPlayFirst ? Date.now() : undefined),
+        score: "*",
+      };
+      GameStorage.add(game);
       if (this.st.settings.sound >= 1)
         new Audio("/sounds/newgame.mp3").play().catch(err => {});
+      // TODO: redirect to game
     },
   },
 };
@@ -606,3 +621,9 @@ export default {
 <style lang="sass">
 // TODO
 </style>
+
+<!--
+// TODO:
+// Remove duplicates if several players of one game send their game info (Hall)
+// When click on it, assign a random rid among online players (max. 4).
+-->