+ // NOTE: when launching game, the challenge is already deleted
+ launchGame: async function(c) {
+ const vModule = await import("@/variants/" + c.vname + ".js");
+ window.V = vModule.VariantRules;
+ // These game informations will be sent to other players
+ const gameInfo =
+ {
+ id: getRandString(),
+ fen: c.fen || V.GenRandInitFen(),
+ players: shuffle([c.from, c.seat]), //white then black
+ vid: c.vid,
+ vname: c.vname, //theoretically vid is enough, but much easier with vname
+ timeControl: c.timeControl,
+ };
+ let target = c.from.sid; //may not be defined if corr + offline opp
+ if (!target)
+ {
+ target = Object.keys(this.people).find(sid =>
+ this.people[sid].id == c.from.id);
+ }
+ const tryNotifyOpponent = () => {
+ if (!!target) //opponent is online
+ {
+ this.st.conn.send(JSON.stringify({code:"newgame",
+ gameInfo:gameInfo, target:target, cid:c.id}));
+ }
+ };
+ if (c.type == "live")
+ {
+ tryNotifyOpponent();
+ this.startNewGame(gameInfo);
+ }
+ else //corr: game only on server
+ {
+ ajax(
+ "/games",
+ "POST",
+ {gameInfo: gameInfo, cid: c.id}, //cid useful to delete challenge
+ response => {
+ gameInfo.id = response.gameId;
+ tryNotifyOpponent();
+ this.$router.push("/game/" + response.gameId);
+ }
+ );
+ }
+ // Send game info to everyone except opponent (and me)
+ this.st.conn.send(JSON.stringify({code:"game",
+ game: { //minimal game info:
+ id: gameInfo.id,
+ players: gameInfo.players.map(p => p.name),
+ vid: gameInfo.vid,
+ timeControl: gameInfo.timeControl,
+ },
+ oppsid: target}));
+ },
+ // NOTE: for live games only (corr games start on the server)
+ startNewGame: function(gameInfo) {
+ const game = Object.assign({}, gameInfo, {
+ // (other) Game infos: constant
+ fenStart: gameInfo.fen,
+ added: Date.now(),
+ // Game state (including FEN): will be updated
+ moves: [],
+ clocks: [-1, -1], //-1 = unstarted
+ initime: [0, 0], //initialized later
+ score: "*",
+ });
+ GameStorage.add(game);
+ if (this.st.settings.sound >= 1)
+ new Audio("/sounds/newgame.mp3").play().catch(err => {});
+ this.$router.push("/game/" + gameInfo.id);