}
};
-let vr, playerColor;
+let vr = null, playerColor, lastVname = undefined;
function initializeGame(obj) {
const options = obj.options || {};
import(`/variants/${obj.vname}/class.js`).then(module => {
window.V = module.default;
for (const [k, v] of Object.entries(V.Aliases))
window[k] = v;
- // Load CSS. Avoid loading twice the same stylesheet:
- const allIds = [].slice.call($.styleSheets).map(s => s.id);
- const newId = obj.vname + "_css";
- if (!allIds.includes(newId)) {
+ if (lastVname != obj.vname) {
+ // Load CSS + unload potential previous one.
+ if (lastVname)
+ document.getElementById(lastVname + "_css").remove();
$.getElementsByTagName("head")[0].insertAdjacentHTML(
"beforeend",
- `<link id="${newId}" rel="stylesheet"
+ `<link id="${obj.vname + '_css'}" rel="stylesheet"
href="/variants/${obj.vname}/style.css"/>`);
+ lastVname = obj.vname;
}
playerColor = (sid == obj.players[0].sid ? "w" : "b");
// Init + remove potential extra DOM elements from a previous game:
</svg>
</div>
<div class="chessboard"></div>`;
+ if (vr)
+ // Avoid interferences:
+ vr.removeListeners();
vr = new V({
seed: obj.seed, //may be null if FEN already exists (running game)
fen: obj.fen,
curPiece.remove();
};
+ const resize = (e) => this.rescale(e.deltaY < 0 ? "up" : "down");
+
if ('onmousedown' in window) {
- document.addEventListener("mousedown", mousedown);
- document.addEventListener("mousemove", mousemove);
- document.addEventListener("mouseup", mouseup);
- document.addEventListener("wheel",
- (e) => this.rescale(e.deltaY < 0 ? "up" : "down"));
+ this.mouseListeners = [
+ {type: "mousedown", listener: mousedown},
+ {type: "mousemove", listener: mousemove},
+ {type: "mouseup", listener: mouseup},
+ {type: "wheel", listener: resize}
+ ];
+ this.mouseListeners.forEach(ml => {
+ document.addEventListener(ml.type, ml.listener);
+ });
}
if ('ontouchstart' in window) {
- // https://stackoverflow.com/a/42509310/12660887
- document.addEventListener("touchstart", mousedown, {passive: false});
- document.addEventListener("touchmove", mousemove, {passive: false});
- document.addEventListener("touchend", mouseup, {passive: false});
+ this.touchListeners = [
+ {type: "touchstart", listener: mousedown},
+ {type: "touchmove", listener: mousemove},
+ {type: "touchend", listener: mouseup}
+ ];
+ this.touchListeners.forEach(tl => {
+ // https://stackoverflow.com/a/42509310/12660887
+ document.addEventListener(tl.type, tl.listener, {passive: false});
+ });
}
// TODO: onpointerdown/move/up ? See reveal.js /controllers/touch.js
}
+ removeListeners() {
+ if ('onmousedown' in window) {
+ this.mouseListeners.forEach(ml => {
+ document.removeEventListener(ml.type, ml.listener);
+ });
+ }
+ if ('ontouchstart' in window) {
+ this.touchListeners.forEach(tl => {
+ // https://stackoverflow.com/a/42509310/12660887
+ document.removeEventListener(tl.type, tl.listener);
+ });
+ }
+ }
+
showChoices(moves, r) {
let container = document.getElementById(this.containerId);
let chessboard = container.querySelector(".chessboard");