)
.card
label.modal-close(for="modalRules")
- a#variantNameInGame(:href="'/#/variants/'+game.vname") {{ game.vname }}
+ a#variantNameInGame(:href="'/#/variants/'+game.vname") {{ game.vdisp }}
div(v-html="rulesContent")
input#modalScore.modal(type="checkbox")
div#scoreDiv(
.row
#aboveBoard.col-sm-12
span.variant-cadence(v-if="game.type!='import'") {{ game.cadence }}
- span.variant-name {{ game.vname }}
+ span.variant-name
+ | {{ game.vname }}
+ | {{ !!vr ? vr.constructor.AbbreviateOptions(game.options) : '' }}
span#nextGame(
v-if="nextIds.length > 0"
@click="showNextGame()"
this.conn.onopen = () => callback();
};
this.fetchGame((game) => {
- if (!!game)
+ if (!!game) {
+ if (!game.options) {
+ // Patch for retro-compatibility (TODO: remove it)
+ game.options = { randomness: game.randomness };
+ delete game["randomness"];
+ }
+ else game.options = JSON.parse(game.options);
this.loadVariantThenGame(game, () => socketInit(this.roomInit));
+ }
else
// Live game stored remotely: need socket to retrieve it
// NOTE: the callback "roomInit" will be lost, so it's not provided.
const gameToSend = Object.keys(this.game)
.filter(k =>
[
- "id","fen","players","vid","cadence","fenStart","vname",
+ "id","fen","players","vid","cadence","fenStart","options",
"moves","clocks","score","drawOffer","rematchOffer"
].includes(k))
.reduce(
{
// (other) Game infos: constant
fenStart: gameInfo.fen,
- vname: this.game.vname,
created: Date.now(),
// Game state (including FEN): will be updated
moves: [],
// Start a new game!
let gameInfo = {
id: getRandString(), //ignored if corr
- fen: V.GenRandInitFen(this.game.randomness),
- randomness: this.game.randomness,
+ fen: V.GenRandInitFen(this.game.options),
+ options: this.game.options,
players: [this.game.players[1], this.game.players[0]],
vid: this.game.vid,
cadence: this.game.cadence
};
const notifyNewGame = () => {
- const oppsid = this.getOppsid(); //may be null
- this.send("rnewgame", { data: gameInfo, oppsid: oppsid });
+ this.send("rnewgame", { data: gameInfo });
// To main Hall if corr game:
if (this.game.type == "corr")
this.send("newgame", { data: gameInfo, page: "/" });
// Also to MyGames page:
this.notifyMyGames("newgame", gameInfo);
};
- if (this.game.type == "live")
+ if (this.game.type == "live") {
+ GameStorage.update(
+ this.gameRef,
+ { rematchOffer: "" }
+ );
+ // Increment game stats counter in DB
+ ajax(
+ "/gamestat",
+ "POST",
+ { data: { vid: gameInfo.vid } }
+ );
this.addAndGotoLiveGame(gameInfo, notifyNewGame);
+ }
else {
// corr game
+ this.updateCorrGame({ rematchOffer: 'n' });
ajax(
"/games",
"POST",
{
- data: { gameInfo: gameInfo },
+ data: Object.assign(
+ {},
+ gameInfo,
+ { options: JSON.stringify(this.game.options) }
+ ),
success: (response) => {
- gameInfo.id = response.gameId;
+ gameInfo.id = response.id;
notifyNewGame();
- this.$router.push("/game/" + response.gameId);
+ this.$router.push("/game/" + response.id);
}
}
);
if (!!callback) callback();
},
loadVariantThenGame: async function(game, callback) {
- await import("@/variants/" + game.vname + ".js")
- .then((vModule) => {
- window.V = vModule[game.vname + "Rules"];
- this.loadGame(game, callback);
- });
- this.rulesContent =
- afterRawLoad(
- require(
- "raw-loader!@/translations/rules/" +
- game.vname + "/" + this.st.lang + ".pug"
- ).default
- ).replace(/(fen:)([^:]*):/g, replaceByDiag);
+ const afterSetVname = async () => {
+ await import("@/variants/" + game.vname + ".js")
+ .then((vModule) => {
+ window.V = vModule[game.vname + "Rules"];
+ this.loadGame(game, callback);
+ });
+ this.rulesContent =
+ afterRawLoad(
+ require(
+ "raw-loader!@/translations/rules/" +
+ game.vname + "/" + this.st.lang + ".pug"
+ ).default
+ ).replace(/(fen:)([^:]*):/g, replaceByDiag);
+ };
+ let variant = undefined;
+ const trySetVname = setInterval(
+ () => {
+ // this.st.variants might be uninitialized (variant == null)
+ variant = this.st.variants.find(v => v.id == game.vid);
+ if (!!variant) {
+ clearInterval(trySetVname);
+ game.vname = variant.name;
+ game.vdisp = variant.display;
+ afterSetVname();
+ }
+ }, 500
+ );
},
// 3 cases for loading a game:
// - from indexedDB (running or completed live game I play)
// In corr games, just reset clock to mainTime:
this.game.clocks[colorIdx] = extractTime(this.game.cadence).mainTime;
}
- // If repetition detected, consider that a draw offer was received:
- const fenObj = this.vr.getFenForRepeat();
- this.repeat[fenObj] =
- !!this.repeat[fenObj]
- ? this.repeat[fenObj] + 1
- : 1;
- if (this.repeat[fenObj] >= 3) {
- if (V.LoseOnRepetition)
- this.gameOver(moveCol == "w" ? "0-1" : "1-0", "Repetition");
- else this.drawOffer = "threerep";
+ if (!V.IgnoreRepetition) {
+ // If repetition detected, consider that a draw offer was received:
+ const fenObj = this.vr.getFenForRepeat();
+ this.repeat[fenObj] =
+ !!this.repeat[fenObj]
+ ? this.repeat[fenObj] + 1
+ : 1;
+ if (this.repeat[fenObj] >= 3) {
+ if (this.vr.loseOnRepetition())
+ this.gameOver(moveCol == "w" ? "0-1" : "1-0", "Repetition");
+ else this.drawOffer = "threerep";
+ }
+ else if (this.drawOffer == "threerep") this.drawOffer = "";
}
- else if (this.drawOffer == "threerep") this.drawOffer = "";
if (!!this.game.mycolor && !data.receiveMyMove) {
// NOTE: 'var' to see that variable outside this block
var filtered_move = getFilteredMove(move);