<template lang="pug">
main
- input#modalInfo.modal(type="checkbox")
- div#infoDiv(
+ input#modalRules.modal(type="checkbox")
+ div#rulesDiv(
role="dialog"
- data-checkbox="modalInfo"
+ 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"
+ data-checkbox="modalScore"
)
.card.text-center
- label.modal-close(for="modalInfo")
+ label.modal-close(for="modalScore")
+ p.score-section
+ span.score {{ game.score }}
+ | :
+ span.score-msg {{ st.tr[game.scoreMsg] }}
+ input#modalRematch.modal(type="checkbox")
+ div#rematchDiv(
+ role="dialog"
+ data-checkbox="modalRematch"
+ )
+ .card.text-center
+ label.modal-close(for="modalRematch")
a(
:href="'#/game/' + rematchId"
- onClick="document.getElementById('modalInfo').checked=false"
+ onClick="document.getElementById('modalRematch').checked=false"
)
| {{ st.tr["Rematch in progress"] }}
input#modalChat.modal(
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(
span.time-separator(v-if="!!virtualClocks[0][1]") :
span.time-right(v-if="!!virtualClocks[0][1]")
| {{ virtualClocks[0][1] }}
+ span.separator
span.time(
v-if="game.score=='*'"
:class="{yourturn: !!vr && vr.turn == 'b'}"
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")
});
});
- document.getElementById("infoDiv")
- .addEventListener("click", processModalClick);
+ ["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 => {
isLargeScreen: function() {
return window.innerWidth >= 500;
},
+ 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 = "";
if (sid != this.st.user.sid) {
this.send("askidentity", { target: sid });
this.people[sid] = { tmpIds: data.sockIds[sid] };
- } else {
+ }
+ else {
// Complete my tmpIds:
Object.assign(this.people[sid].tmpIds, data.sockIds[sid]);
}
// player.tmpIds is already set
player.name = user.name;
player.id = user.id;
+ if (this.game.type == "live") {
+ const myGidx =
+ this.game.players.findIndex(p => p.sid == this.st.user.sid);
+ // Sometimes a player name isn't stored yet (TODO: why?)
+ if (
+ myGidx >= 0 &&
+ !this.game.players[1 - myGidx].name &&
+ this.game.players[1 - myGidx].sid == user.sid &&
+ !!user.name
+ ) {
+ this.game.players[1-myGidx].name = user.name;
+ GameStorage.update(
+ this.gameRef,
+ { playerName: { idx: 1 - myGidx, name: user.name } }
+ );
+ }
+ }
this.$forceUpdate(); //TODO: shouldn't be required
// If I multi-connect, kill current connexion if no mark (I'm older)
if (this.newConnect[user.sid]) {
this.$router.push("/game/" + gameInfo.id);
} else {
this.rematchId = gameInfo.id;
- document.getElementById("modalInfo").checked = true;
+ document.getElementById("modalRematch").checked = true;
}
break;
}
const myIdx = game.players.findIndex(p => {
return p.sid == this.st.user.sid || p.id == this.st.user.id;
});
+ // Sometimes the name isn't stored yet (TODO: why?)
+ if (
+ myIdx >= 0 &&
+ gtype == "live" &&
+ !game.players[myIdx].name &&
+ !!this.st.user.name
+ ) {
+ game.players[myIdx].name = this.st.user.name;
+ GameStorage.update(
+ game.id,
+ { playerName: { idx: myIdx, name: this.st.user.name } }
+ );
+ }
// "mycolor" is undefined for observers
const mycolor = [undefined, "w", "b"][myIdx + 1];
if (gtype == "corr") {
game.clocks = [tc.mainTime, tc.mainTime];
if (myIdx >= 0) {
// I play in this live game
- GameStorage.update(game.id, {
- clocks: game.clocks
- });
+ GameStorage.update(
+ game.id,
+ { clocks: game.clocks }
+ );
}
} else {
if (!!game.initime)
await import("@/variants/" + game.vname + ".js")
.then((vModule) => {
window.V = vModule[game.vname + "Rules"];
+ // (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);
this.loadGame(game, callback);
});
},
this.game.score = score;
if (!scoreMsg) scoreMsg = getScoreMessage(score);
this.game.scoreMsg = scoreMsg;
+ // Display result in a un-missable way:
+ document.getElementById("modalScore").checked = true;
this.$set(this.game, "scoreMsg", scoreMsg);
const myIdx = this.game.players.findIndex(p => {
return p.sid == this.st.user.sid || p.id == this.st.user.id;
</script>
<style lang="sass" scoped>
-#infoDiv > .card
+#scoreDiv > .card, #rematchDiv > .card
padding: 15px 0
max-width: 430px
+#rulesDiv > .card
+ padding: 5px 0
+ max-width: 75%
+ max-height: 100%
+ @media screen and (max-width: 1024px)
+ max-width: 85%
+ @media screen and (max-width: 767px)
+ max-width: 100%
+
+p.score-section
+ 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
padding: 0 3px
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">
+// TODO: next is duplicated from Rules/. Merge ? How ? ...
+
+figure.diagram-container
+ margin: 15px 0 15px 0
+ text-align: center
+ width: 100%
+ display: block
+ .diagram
+ display: block
+ width: 50%
+ min-width: 240px
+ margin-left: auto
+ margin-right: auto
+ .diag12
+ float: left
+ width: 40%
+ margin-left: calc(10% - 20px)
+ margin-right: 40px
+ @media screen and (max-width: 630px)
+ float: none
+ margin: 0 auto 10px auto
+ .diag22
+ float: left
+ width: 40%
+ margin-right: calc(10% - 20px)
+ @media screen and (max-width: 630px)
+ float: none
+ margin: 0 auto
+ figcaption
+ display: block
+ clear: both
+ padding-top: 5px
+ font-size: 0.8em
+
+p.boxed
+ background-color: #FFCC66
+ padding: 5px
+
+.bigfont
+ font-size: 1.2em
+
+.bold
+ font-weight: bold
+
+.stageDelimiter
+ color: purple
+
+// To show (new) pieces, and/or there values...
+figure.showPieces > img
+ width: 50px
+
+figure.showPieces > figcaption
+ color: #6C6C6C
+
+.section-title
+ padding: 0
+
+.section-title > h4
+ padding: 5px
+
+ol, ul:not(.browser-default)
+ padding-left: 20px
+
+ul:not(.browser-default)
+ margin-top: 5px
+
+ul:not(.browser-default) > li
+ list-style-type: disc
+
+table
+ margin: 15px auto
+
+.italic
+ font-style: italic
+
+img.img-center
+ display: block
+ margin: 0 auto 15px auto
</style>