<template lang="pug">
main
+ input#modalRules.modal(type="checkbox")
+ div#rulesDiv(
+ role="dialog"
+ data-checkbox="modalRules"
+ )
+ .card
+ label.modal-close(for="modalRules")
+ h4#variantNameInGame(@click="gotoRules") {{ game.vname }}
+ div(v-html="rulesContent")
input#modalScore.modal(type="checkbox")
div#scoreDiv(
role="dialog"
)
.card.text-center
label.modal-close(for="modalScore")
- p
+ p.score-section
span.score {{ game.score }}
| :
span.score-msg {{ st.tr[game.scoreMsg] }}
button.refuseBtn(@click="cancelMove()")
span {{ st.tr["Cancel"] }}
.row
- #aboveBoard.col-sm-12.col-md-9.col-md-offset-3.col-lg-10.col-lg-offset-2
+ #aboveBoard.col-sm-12
span.variant-cadence(v-if="game.type!='import'") {{ game.cadence }}
span.variant-name {{ game.vname }}
span#nextGame(
@click="showNextGame()"
)
| {{ st.tr["Next_g"] }}
- button#chatBtn.tooltip(
+ button#chatBtn(
+ :class="btnTooltipClass()"
onClick="window.doClick('modalChat')"
aria-label="Chat"
)
img(src="/images/icons/chat.svg")
#actions(v-if="game.score=='*'")
- button.tooltip(
+ button(
@click="clickDraw()"
- :class="{['draw-' + drawOffer]: true}"
+ :class="btnTooltipClass('draw')"
:aria-label="st.tr['Draw']"
)
img(src="/images/icons/draw.svg")
- button.tooltip(
+ button(
v-if="!!game.mycolor"
+ :class="btnTooltipClass()"
@click="abortGame()"
:aria-label="st.tr['Abort']"
)
img(src="/images/icons/abort.svg")
- button.tooltip(
+ button(
v-if="!!game.mycolor"
+ :class="btnTooltipClass()"
@click="resign()"
:aria-label="st.tr['Resign']"
)
img(src="/images/icons/resign.svg")
- button.tooltip(
+ button(
v-else
+ :class="btnTooltipClass('rematch')"
@click="clickRematch()"
- :class="{['rematch-' + rematchOffer]: true}"
:aria-label="st.tr['Rematch']"
)
img(src="/images/icons/rematch.svg")
#playersInfo
- p(v-if="isLargeScreen()")
+ div(v-if="isLargeScreen()")
span.name(:class="{connected: isConnected(0)}")
| {{ game.players[0].name || "@nonymous" }}
span.time(
span.time-separator(v-if="!!virtualClocks[1][1]") :
span.time-right(v-if="!!virtualClocks[1][1]")
| {{ virtualClocks[1][1] }}
- p(v-else)
+ div(v-else)
span.name(:class="{connected: isConnected(0)}")
| {{ game.players[0].name || "@nonymous" }}
span.split-names -
span.name(:class="{connected: isConnected(1)}")
| {{ game.players[1].name || "@nonymous" }}
- br
- span.time(
- v-if="game.score=='*'"
- :class="{yourturn: !!vr && vr.turn == 'w'}"
- )
- span.time-left {{ virtualClocks[0][0] }}
- span.time-separator(v-if="!!virtualClocks[0][1]") :
- span.time-right(v-if="!!virtualClocks[0][1]")
- | {{ virtualClocks[0][1] }}
- span.time(
- v-if="game.score=='*'"
- :class="{yourturn: !!vr && vr.turn == 'b'}"
- )
- span.time-left {{ virtualClocks[1][0] }}
- span.time-separator(v-if="!!virtualClocks[1][1]") :
- span.time-right(v-if="!!virtualClocks[1][1]")
- | {{ virtualClocks[1][1] }}
+ div(v-if="game.score=='*'")
+ span.time(:class="{yourturn: !!vr && vr.turn == 'w'}")
+ span.time-left {{ virtualClocks[0][0] }}
+ span.time-separator(v-if="!!virtualClocks[0][1]") :
+ span.time-right(v-if="!!virtualClocks[0][1]")
+ | {{ virtualClocks[0][1] }}
+ span.separator
+ span.time(:class="{yourturn: !!vr && vr.turn == 'b'}")
+ span.time-left {{ virtualClocks[1][0] }}
+ span.time-separator(v-if="!!virtualClocks[1][1]") :
+ span.time-right(v-if="!!virtualClocks[1][1]")
+ | {{ virtualClocks[1][1] }}
BaseGame(
ref="basegame"
:game="game"
import { getRandString } from "@/utils/alea";
import { getScoreMessage } from "@/utils/scoring";
import { getFullNotation } from "@/utils/notation";
-import { getDiagram } from "@/utils/printDiagram";
+import { getDiagram, replaceByDiag } from "@/utils/printDiagram";
import { processModalClick } from "@/utils/modalClick";
import { playMove, getFilteredMove } from "@/utils/playUndo";
import { ArrayFun } from "@/utils/array";
// virtualClocks will be initialized from true game.clocks
virtualClocks: [],
vr: null, //"variant rules" object initialized from FEN
+ rulesContent: "",
drawOffer: "",
rematchId: "",
rematchOffer: "",
this.toggleChat("close")
});
});
- ["rematchDiv", "scoreDiv"].forEach(
+ ["rulesDiv", "rematchDiv", "scoreDiv"].forEach(
(eltName) => {
document.getElementById(eltName)
.addEventListener("click", processModalClick);
}
);
- if ("ontouchstart" in window) {
- // Disable tooltips on smartphones:
- document.querySelectorAll("#aboveBoard .tooltip").forEach(elt => {
- elt.classList.remove("tooltip");
- });
- }
},
beforeDestroy: function() {
this.cleanBeforeDestroy();
this.send("losefocus");
},
isLargeScreen: function() {
- return window.innerWidth >= 500;
+ return window.innerWidth >= 768;
+ },
+ btnTooltipClass: function(thing) {
+ let append = {};
+ if (!!thing) append = { [thing + "-" + this[thing + "Offer"]]: true };
+ return (
+ Object.assign(
+ { tooltip: !("ontouchstart" in window) },
+ append
+ )
+ );
+ },
+ gotoRules: function() {
+ this.$router.push("/variants/" + this.game.vname);
},
participateInChat: function(p) {
return Object.keys(p.tmpIds).some(x => p.tmpIds[x].focus) && !!p.name;
if (!!chatComp) chatComp.chats = [];
this.virtualClocks = [[0,0], [0,0]];
this.vr = null;
+ this.rulesContent = "";
this.drawOffer = "";
this.lastateAsked = false;
this.rematchOffer = "";
GameStorage.update(this.gameRef, { drawOffer: "" });
}
}
- this.$refs["basegame"].play(
- movePlus.move, "received", null, true);
+ this.$refs["basegame"].play(movePlus.move, "received");
this.game.clocks[moveColIdx] = movePlus.clock;
this.processMove(
movePlus.move,
this.$router.push("/game/" + gameInfo.id);
} else {
this.rematchId = gameInfo.id;
+ document.getElementById("modalRules").checked = false;
+ document.getElementById("modalScore").checked = false;
document.getElementById("modalRematch").checked = true;
}
break;
this.game.clocks[oppIdx] = data.clock;
if (data.movesCount > L) {
// Just got last move from him
- this.$refs["basegame"].play(data.lastMove, "received", null, true);
+ this.$refs["basegame"].play(data.lastMove, "received");
this.processMove(data.lastMove);
} else {
if (!!this.clockUpdate) clearInterval(this.clockUpdate);
window.V = vModule[game.vname + "Rules"];
this.loadGame(game, callback);
});
+ // (AJAX) Request to get rules content (plain text, HTML)
+ this.rulesContent =
+ require(
+ "raw-loader!@/translations/rules/" +
+ game.vname + "/" +
+ this.st.lang + ".pug"
+ )
+ // Next two lines fix a weird issue after last update (2019-11)
+ .replace(/\\n/g, " ")
+ .replace(/\\"/g, '"')
+ .replace('module.exports = "', "")
+ .replace(/"$/, "")
+ .replace(/(fen:)([^:]*):/g, replaceByDiag);
},
// 3 cases for loading a game:
// - from indexedDB (running or completed live game I play)
this.game.score = score;
if (!scoreMsg) scoreMsg = getScoreMessage(score);
this.game.scoreMsg = scoreMsg;
+ document.getElementById("modalRules").checked = false;
// Display result in a un-missable way:
document.getElementById("modalScore").checked = true;
this.$set(this.game, "scoreMsg", scoreMsg);
<style lang="sass" scoped>
#scoreDiv > .card, #rematchDiv > .card
- padding: 15px 0
+ padding: 10px 0
max-width: 430px
-span.score
- font-weight: bold
+#rulesDiv > .card
+ padding: 5px 0
+ max-width: 50%
+ max-height: 100%
+ @media screen and (max-width: 1500px)
+ max-width: 67%
+ @media screen and (max-width: 1024px)
+ max-width: 85%
+ @media screen and (max-width: 767px)
+ max-width: 100%
+
+p.score-section
+ margin: 0
+ font-size: 1.3em
+ span.score
+ font-weight: bold
.connected
background-color: lightgreen
#playersInfo > p
margin: 0
-@media screen and (min-width: 768px)
- #actions
- width: 300px
@media screen and (max-width: 767px)
.game
width: 100%
@media screen and (max-width: 767px)
height: 18px
-@media screen and (max-width: 767px)
- #aboveBoard
- text-align: center
-@media screen and (min-width: 768px)
- #aboveBoard
- margin-left: 30%
+#aboveBoard
+ text-align: center
.variant-cadence
padding-right: 10px
display: inline-block
margin-right: 10px
+span.separator
+ display: inline-block
+ margin: 0
+ padding: 0
+ width: 10px
+
span.name
font-size: 1.5rem
+ @media screen and (max-width: 767px)
+ font-size: 1.2rem
padding: 0 3px
span.time
font-size: 2rem
+ @media screen and (max-width: 767px)
+ font-size: 1.5rem
display: inline-block
.time-left
margin-left: 10px
background-color: lightgreen
button.refuseBtn
background-color: red
+
+h4#variantNameInGame
+ cursor: pointer
+ text-align: center
+ text-decoration: underline
+ font-weight: bold
+</style>
+
+<style lang="sass">
+@import "@/styles/_rules.sass"
+@import "@/styles/_board_squares_img.sass"
</style>