- loadGame: function(game) {
- const afterRetrieval = async (game) => {
- // NOTE: variants array might not be available yet, thus the two next lines
- const variantCell = this.st.variants.filter(v => v.id == game.vid);
- const vname = (variantCell.length > 0 ? variantCell[0].name : "");
- if (!game.fen)
- game.fen = game.fenStart; //game wasn't started
- const gtype = (game.timeControl.indexOf('d') >= 0 ? "corr" : "live");
- if (gtype == "corr")
- {
- // corr game: needs to compute the clocks + initime
- //if (game.players[i].rtime < 0) initime = Date.now(), else compute,
- //also using move.played fields
- game.clocks = [-1, -1];
- game.initime = [0, 0];
- // TODO: compute clocks + initime
+ loadGame: function(game, callback) {
+ const afterRetrieval = async game => {
+ const vModule = await import("@/variants/" + game.vname + ".js");
+ window.V = vModule.VariantRules;
+ this.vr = new V(game.fen);
+ const gtype = game.cadence.indexOf("d") >= 0 ? "corr" : "live";
+ const tc = extractTime(game.cadence);
+ const myIdx = game.players.findIndex(p => {
+ return p.sid == this.st.user.sid || p.uid == this.st.user.id;
+ });
+ const mycolor = [undefined, "w", "b"][myIdx + 1]; //undefined for observers
+ if (!game.chats) game.chats = []; //live games don't have chat history
+ if (gtype == "corr") {
+ if (game.players[0].color == "b") {
+ // Adopt the same convention for live and corr games: [0] = white
+ [game.players[0], game.players[1]] = [
+ game.players[1],
+ game.players[0]
+ ];
+ }
+ // corr game: need to compute the clocks + initime
+ // NOTE: clocks in seconds, initime in milliseconds
+ game.clocks = [tc.mainTime, tc.mainTime];
+ game.moves.sort((m1, m2) => m1.idx - m2.idx); //in case of
+ if (game.score == "*") {
+ //otherwise no need to bother with time
+ game.initime = [0, 0];
+ const L = game.moves.length;
+ if (L >= 3) {
+ let addTime = [0, 0];
+ for (let i = 2; i < L; i++) {
+ addTime[i % 2] +=
+ tc.increment -
+ (game.moves[i].played - game.moves[i - 1].played) / 1000;
+ }
+ for (let i = 0; i <= 1; i++) game.clocks[i] += addTime[i];
+ }
+ if (L >= 1) game.initime[L % 2] = game.moves[L - 1].played;
+ }
+ // Sort chat messages from newest to oldest
+ game.chats.sort((c1, c2) => {
+ return c2.added - c1.added;
+ });
+ if (myIdx >= 0 && game.chats.length > 0) {
+ // Did a chat message arrive after my last move?
+ let vr_tmp = new V(game.fen); //start from last position
+ const flags = V.ParseFen(game.fen).flags; //may be undefined
+ let dtLastMove = 0;
+ for (let midx = game.moves.length - 1; midx >= 0; midx--) {
+ vr_tmp.undo(Object.assign({flags:flags}, game.moves[midx].squares));
+ if (vr_tmp.turn == mycolor) {
+ dtLastMove = game.moves[midx].played;
+ break;
+ }
+ }
+ if (dtLastMove < game.chats[0].added)
+ document.getElementById("chatBtn").classList.add("somethingnew");
+ }
+ // Now that we used idx and played, re-format moves as for live games
+ game.moves = game.moves.map(m => m.squares);