X-Git-Url: https://git.auder.net/?p=vchess.git;a=blobdiff_plain;f=public%2Fjavascripts%2Fcomponents%2Fgame.js;h=6af331b3158cd6436e858a633eb933a979f97511;hp=6814208402f0a982f32ac7250a02c3d6fd0447f3;hb=9d218497ab97bc0e94ec4c1f0a40cf02df3ea0d4;hpb=88af03d2c863b1e29788c98851abec483256f9ce diff --git a/public/javascripts/components/game.js b/public/javascripts/components/game.js index 68142084..6af331b3 100644 --- a/public/javascripts/components/game.js +++ b/public/javascripts/components/game.js @@ -18,8 +18,9 @@ Vue.component('my-game', { incheck: [], pgnTxt: "", hints: (getCookie("hints") === "1" ? true : false), - //color: TODO (lichess, chess.com, chesstempo) - //sound: TODO (0,1, 2) + color: getCookie("color", "lichess"), //lichess, chesscom or chesstempo + // sound level: 0 = no sound, 1 = sound only on newgame, 2 = always + sound: parseInt(getCookie("sound", "2")), }; }, render(h) { @@ -91,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 - : 30; + : (smallScreen ? 31 : 37); if (this.mode == "human") { let connectedIndic = h( @@ -139,8 +140,8 @@ Vue.component('my-game', { "tooltip": true, "topindicator": true, "indic-right": true, - "settings-btn": true, - "small": smallScreen, + "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', { @@ -244,6 +245,7 @@ Vue.component('my-game', { ['board'+sizeY]: true, 'light-square': (i+j)%2==0, 'dark-square': (i+j)%2==1, + [this.color]: true, 'highlight': showLight && !!lm && _.isMatch(lm.end, {x:ci,y:cj}), 'incheck': showLight && incheckSq[ci][cj], }, @@ -434,6 +436,7 @@ Vue.component('my-game', { ]; elementArray = elementArray.concat(modalEog); } + // NOTE: this modal could be in Pug view (no usage of Vue functions or variables) const modalNewgame = [ h('input', { @@ -565,13 +568,123 @@ Vue.component('my-game', { h('h3', { "class": { "section": true }, - domProps: { innerHTML: "User settings" }, + domProps: { innerHTML: "Preferences" }, } ), - // https://minicss.org/docs#forms-and-input - h('p', { domProps: { innerHTML: "TODO: hints" } }), - h('p', { domProps: { innerHTML: "TODO: board(color)" } }), - h('p', { domProps: { innerHTML: "TODO: sound(level)" } }), + h('fieldset', + { }, + [ + //h('legend', { domProps: { innerHTML: "Legend title" } }), + h('label', + { + attrs: { for: "setHints" }, + domProps: { innerHTML: "Show hints?" }, + }, + ), + h('input', + { + attrs: { + "id": "setHints", + type: "checkbox", + checked: this.hints, + }, + on: { "change": this.toggleHints }, + } + ), + ] + ), + h('fieldset', + { }, + [ + h('label', + { + attrs: { for: "selectColor" }, + domProps: { innerHTML: "Board colors" }, + }, + ), + h("select", + { + attrs: { "id": "selectColor" }, + on: { "change": this.setColor }, + }, + [ + h("option", + { + domProps: { + "value": "lichess", + innerHTML: "brown" + }, + attrs: { "selected": this.color=="lichess" }, + } + ), + h("option", + { + domProps: { + "value": "chesscom", + innerHTML: "green" + }, + attrs: { "selected": this.color=="chesscom" }, + } + ), + h("option", + { + domProps: { + "value": "chesstempo", + innerHTML: "blue" + }, + attrs: { "selected": this.color=="chesstempo" }, + } + ), + ], + ), + ] + ), + h('fieldset', + { }, + [ + h('label', + { + attrs: { for: "selectSound" }, + domProps: { innerHTML: "Play sounds?" }, + }, + ), + h("select", + { + attrs: { "id": "selectSound" }, + on: { "change": this.setSound }, + }, + [ + h("option", + { + domProps: { + "value": "0", + innerHTML: "None" + }, + attrs: { "selected": this.sound==0 }, + } + ), + h("option", + { + domProps: { + "value": "1", + innerHTML: "Newgame" + }, + attrs: { "selected": this.sound==1 }, + } + ), + h("option", + { + domProps: { + "value": "2", + innerHTML: "All" + }, + attrs: { "selected": this.sound==2 }, + } + ), + ], + ), + ] + ), ] ) ] @@ -590,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', { @@ -603,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" }, + } + ), ] ) ); @@ -616,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', { @@ -839,6 +964,14 @@ Vue.component('my-game', { this.hints = !this.hints; setCookie("hints", this.hints ? "1" : "0"); }, + setColor: function(e) { + this.color = e.target.options[e.target.selectedIndex].value; + setCookie("color", this.color); + }, + setSound: function(e) { + this.sound = parseInt(e.target.options[e.target.selectedIndex].value); + setCookie("sound", this.sound); + }, clickGameSeek: function(e) { this.getRidOfTooltip(e.currentTarget); if (this.mode == "human") @@ -875,7 +1008,7 @@ Vue.component('my-game', { this.endGame(this.mycolor=="w"?"0-1":"1-0"); }, newGame: function(mode, fenInit, color, oppId, moves, continuation) { - const fen = fenInit || VariantRules.GenRandInitFen(); + const fen = "M7/8/8/3K1k2/8/8/8/8 0000";//fenInit || VariantRules.GenRandInitFen(); console.log(fen); //DEBUG if (mode=="human" && !oppId) { @@ -911,10 +1044,10 @@ 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; @@ -933,7 +1066,7 @@ Vue.component('my-game', { } else if (mode == "computer") { - this.mycolor = Math.random() < 0.5 ? 'w' : 'b'; + this.mycolor = "w";//Math.random() < 0.5 ? 'w' : 'b'; if (this.mycolor == 'b') setTimeout(this.playComputerMove, 500); } @@ -1094,7 +1227,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?