X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=public%2Fjavascripts%2Fcomponents%2Fgame.js;h=deccd5da0c6bd5686b914ad8f614682c157bf9db;hb=523da5d5adeb4abd8b165158485314d0e7de9cf4;hp=80dd35de1a8df192a505f6c3b17fb088fad8462c;hpb=12b46d8f437967ecab12791298749d28ed99dce3;p=vchess.git diff --git a/public/javascripts/components/game.js b/public/javascripts/components/game.js index 80dd35de..deccd5da 100644 --- a/public/javascripts/components/game.js +++ b/public/javascripts/components/game.js @@ -20,12 +20,12 @@ Vue.component('my-game', { hints: (getCookie("hints") === "1" ? true : false), color: getCookie("color", "lichess"), //lichess, chesscom or chesstempo // sound level: 0 = no sound, 1 = sound only on newgame, 2 = always - sound: getCookie("sound", "2"), + sound: parseInt(getCookie("sound", "2")), }; }, render(h) { const [sizeX,sizeY] = VariantRules.size; - const smallScreen = (screen.width <= 420); + const smallScreen = (window.innerWidth <= 420); // Precompute hints squares to facilitate rendering let hintSquares = doubleArray(sizeX, sizeY, false); this.possibleMoves.forEach(m => { hintSquares[m.end.x][m.end.y] = true; }); @@ -92,7 +92,7 @@ Vue.component('my-game', { const settingsBtnElt = document.getElementById("settingsBtn"); const indicWidth = !!settingsBtnElt //-2 for border: ? parseFloat(window.getComputedStyle(settingsBtnElt).height.slice(0,-2)) - 2 - : 37; //TODO: always 37? + : (smallScreen ? 31 : 37); if (this.mode == "human") { let connectedIndic = h( @@ -140,7 +140,8 @@ Vue.component('my-game', { "tooltip": true, "topindicator": true, "indic-right": true, - "settings-btn": true, + "settings-btn": !smallScreen, + "settings-btn-small": smallScreen, }, }, [h('i', { 'class': { "material-icons": true } }, "settings")] @@ -181,6 +182,9 @@ Vue.component('my-game', { }) ); // Create board element (+ reserves if needed by variant or mode) + const lm = this.vr.lastMove; + const showLight = this.hints && + (this.mode!="idle" || this.cursor==this.vr.moves.length); let gameDiv = h('div', { 'class': { 'game': true }, @@ -233,9 +237,6 @@ Vue.component('my-game', { ) ); } - const lm = this.vr.lastMove; - const showLight = this.hints && - (this.mode!="idle" || this.cursor==this.vr.moves.length); return h( 'div', { @@ -573,12 +574,10 @@ Vue.component('my-game', { h('fieldset', { }, [ - //h('legend', { domProps: { innerHTML: "Show " } }), + //h('legend', { domProps: { innerHTML: "Legend title" } }), h('label', { - attrs: { - for: "setHints", - }, + attrs: { for: "setHints" }, domProps: { innerHTML: "Show hints?" }, }, ), @@ -599,9 +598,7 @@ Vue.component('my-game', { [ h('label', { - attrs: { - for: "selectColor", - }, + attrs: { for: "selectColor" }, domProps: { innerHTML: "Board colors" }, }, ), @@ -615,7 +612,7 @@ Vue.component('my-game', { { domProps: { "value": "lichess", - innerHTML: "lichess" + innerHTML: "brown" }, attrs: { "selected": this.color=="lichess" }, } @@ -624,7 +621,7 @@ Vue.component('my-game', { { domProps: { "value": "chesscom", - innerHTML: "chess.com" + innerHTML: "green" }, attrs: { "selected": this.color=="chesscom" }, } @@ -633,7 +630,7 @@ Vue.component('my-game', { { domProps: { "value": "chesstempo", - innerHTML: "chesstempo" + innerHTML: "blue" }, attrs: { "selected": this.color=="chesstempo" }, } @@ -647,10 +644,8 @@ Vue.component('my-game', { [ h('label', { - attrs: { - for: "selectSound", - }, - domProps: { innerHTML: "Sound level" }, + attrs: { for: "selectSound" }, + domProps: { innerHTML: "Play sounds?" }, }, ), h("select", @@ -663,24 +658,27 @@ Vue.component('my-game', { { domProps: { "value": "0", - innerHTML: "No sound" + innerHTML: "None" }, + attrs: { "selected": this.sound==0 }, } ), h("option", { domProps: { "value": "1", - innerHTML: "Newgame sound" + innerHTML: "Newgame" }, + attrs: { "selected": this.sound==1 }, } ), h("option", { domProps: { "value": "2", - innerHTML: "All sounds" + innerHTML: "All" }, + attrs: { "selected": this.sound==2 }, } ), ], @@ -705,7 +703,10 @@ Vue.component('my-game', { { elementArray.push( h('div', - { attrs: { id: "pgn-div" } }, + { + attrs: { id: "pgn-div" }, + "class": { "section-content": true }, + }, [ h('a', { @@ -718,10 +719,16 @@ Vue.component('my-game', { h('p', { attrs: { id: "pgn-game" }, - on: { click: this.download }, domProps: { innerHTML: this.pgnTxt } } - ) + ), + h('button', + { + attrs: { "id": "downloadBtn" }, + on: { click: this.download }, + domProps: { innerHTML: "Download game" }, + } + ), ] ) ); @@ -731,7 +738,10 @@ Vue.component('my-game', { // Show current FEN elementArray.push( h('div', - { attrs: { id: "fen-div" } }, + { + attrs: { id: "fen-div" }, + "class": { "section-content": true }, + }, [ h('p', { @@ -769,7 +779,7 @@ Vue.component('my-game', { created: function() { const url = socketUrl; const continuation = (localStorage.getItem("variant") === variant); - this.myid = continuation ? localStorage.getItem("myid") : getRandString(); + this.myid = (continuation ? localStorage.getItem("myid") : getRandString()); if (!continuation) { // HACK: play a small silent sound to allow "new game" sound later @@ -798,6 +808,12 @@ Vue.component('my-game', { const data = JSON.parse(msg.data); switch (data.code) { + case "duplicate": + // We opened another tab on the same game + this.mode = "idle"; + this.vr = null; + alert("Already playing a game in this variant on another tab!"); + break; case "newgame": //opponent found // oppid: opponent socket ID this.newGame("human", data.fen, data.color, data.oppid); @@ -954,12 +970,13 @@ Vue.component('my-game', { this.hints = !this.hints; setCookie("hints", this.hints ? "1" : "0"); }, - // TODO: - setColor: function() { - alert("Change"); + setColor: function(e) { + this.color = e.target.options[e.target.selectedIndex].value; + setCookie("color", this.color); }, - setSound: function() { - alert("Change"); + setSound: function(e) { + this.sound = parseInt(e.target.options[e.target.selectedIndex].value); + setCookie("sound", this.sound); }, clickGameSeek: function(e) { this.getRidOfTooltip(e.currentTarget); @@ -1033,14 +1050,14 @@ Vue.component('my-game', { if (mode=="human") { // Opponent found! - if (!continuation) + if (!continuation) //not playing sound on game continuation { - // Not playing sound on game continuation: - new Audio("/sounds/newgame.mp3").play().then(() => {}).catch(err => {}); + if (this.sound >= 1) + new Audio("/sounds/newgame.mp3").play().then(() => {}).catch(err => {}); document.getElementById("modal-newgame").checked = false; } this.oppid = oppId; - this.oppConnected = true; + this.oppConnected = !continuation; this.mycolor = color; this.seek = false; if (!!moves && moves.length > 0) //imply continuation @@ -1216,7 +1233,8 @@ Vue.component('my-game', { // Not programmatic, or animation is over if (this.mode == "human" && this.vr.turn == this.mycolor) this.conn.send(JSON.stringify({code:"newmove", move:move, oppid:this.oppid})); - new Audio("/sounds/chessmove1.mp3").play().then(() => {}).catch(err => {}); + if (this.sound == 2) + new Audio("/sounds/chessmove1.mp3").play().then(() => {}).catch(err => {}); if (this.mode != "idle") { this.incheck = this.vr.getCheckSquares(move); //is opponent in check?