From baba60703f661aab20f2327098c3a0af572f0704 Mon Sep 17 00:00:00 2001 From: Benjamin Auder <benjamin.auder@somewhere> Date: Sun, 13 Jan 2019 03:20:48 +0100 Subject: [PATCH] my-board seems OK. Now TODO: test my-game (with sockets) --- public/javascripts/base_rules.js | 22 ++++++++-------- public/javascripts/components/board.js | 7 ++++- public/javascripts/variant.js | 36 +++++++++++++++++++++++--- views/variant.pug | 14 ++++++---- 4 files changed, 59 insertions(+), 20 deletions(-) diff --git a/public/javascripts/base_rules.js b/public/javascripts/base_rules.js index 718261d2..4b0b4705 100644 --- a/public/javascripts/base_rules.js +++ b/public/javascripts/base_rules.js @@ -221,7 +221,7 @@ class ChessRules // On which squares is color under check ? (for interface) getCheckSquares(color) { - return this.isAttacked(this.kingPos[color], [this.getOppCol(color)]) + return this.isAttacked(this.kingPos[color], [V.GetOppCol(color)]) ? [JSON.parse(JSON.stringify(this.kingPos[color]))] //need to duplicate! : []; } @@ -280,7 +280,7 @@ class ChessRules return pieces["b"].join("") + "/pppppppp/8/8/8/8/PPPPPPPP/" + pieces["w"].join("").toUpperCase() + - " w 1111 -"; //add turn + flags + enpassant + " w 0 1111 -"; //add turn + flags + enpassant } // "Parse" FEN: just return untransformed string data @@ -734,7 +734,7 @@ class ChessRules return []; //x isn't first rank, or king has moved (shortcut) // Castling ? - const oppCol = this.getOppCol(c); + const oppCol = V.GetOppCol(c); let moves = []; let i = 0; const finalSquares = [ [2,3], [V.size.y-2,V.size.y-3] ]; //king, then rook @@ -824,7 +824,7 @@ class ChessRules getAllValidMoves() { const color = this.turn; - const oppCol = this.getOppCol(color); + const oppCol = V.GetOppCol(color); let potentialMoves = []; for (let i=0; i<V.size.x; i++) { @@ -845,7 +845,7 @@ class ChessRules atLeastOneMove() { const color = this.turn; - const oppCol = this.getOppCol(color); + const oppCol = V.GetOppCol(color); for (let i=0; i<V.size.x; i++) { for (let j=0; j<V.size.y; j++) @@ -956,7 +956,7 @@ class ChessRules // Is color under check after his move ? underCheck(color) { - return this.isAttacked(this.kingPos[color], [this.getOppCol(color)]); + return this.isAttacked(this.kingPos[color], [V.GetOppCol(color)]); } ///////////////// @@ -999,7 +999,7 @@ class ChessRules if (c == "c") //if (!["w","b"].includes(c)) { // 'c = move.vanish[0].c' doesn't work for Checkered - c = this.getOppCol(this.turn); + c = V.GetOppCol(this.turn); } const firstRank = (c == "w" ? V.size.x-1 : 0); @@ -1015,7 +1015,7 @@ class ChessRules if (V.HasFlags) { // Update castling flags if rooks are moved - const oppCol = this.getOppCol(c); + const oppCol = V.GetOppCol(c); const oppFirstRank = (V.size.x-1) - firstRank; if (move.start.x == firstRank //our rook moves? && this.INIT_COL_ROOK[c].includes(move.start.y)) @@ -1054,7 +1054,7 @@ class ChessRules if (V.HasEnpassant) this.epSquares.push( this.getEpSquare(move) ); V.PlayOnBoard(this.board, move); - this.turn = this.getOppCol(this.turn); + this.turn = V.GetOppCol(this.turn); this.movesCount++; this.updateVariables(move); } @@ -1066,7 +1066,7 @@ class ChessRules if (V.HasFlags) this.disaggregateFlags(JSON.parse(move.flags)); V.UndoOnBoard(this.board, move); - this.turn = this.getOppCol(this.turn); + this.turn = V.GetOppCol(this.turn); this.movesCount--; this.unupdateVariables(move); @@ -1088,7 +1088,7 @@ class ChessRules // Game over const color = this.turn; // No valid move: stalemate or checkmate? - if (!this.isAttacked(this.kingPos[color], [this.getOppCol(color)])) + if (!this.isAttacked(this.kingPos[color], [V.GetOppCol(color)])) return "1/2"; // OK, checkmate return (color == "w" ? "0-1" : "1-0"); diff --git a/public/javascripts/components/board.js b/public/javascripts/components/board.js index cec6049e..44c499c2 100644 --- a/public/javascripts/components/board.js +++ b/public/javascripts/components/board.js @@ -14,6 +14,8 @@ Vue.component('my-board', { }; }, render(h) { + if (!this.vr) + return; const [sizeX,sizeY] = [V.size.x,V.size.y]; // Precompute hints squares to facilitate rendering let hintSquares = doubleArray(sizeX, sizeY, false); @@ -21,6 +23,7 @@ Vue.component('my-board', { // Also precompute in-check squares let incheckSq = doubleArray(sizeX, sizeY, false); this.incheck.forEach(sq => { incheckSq[sq[0]][sq[1]] = true; }); + const squareWidth = 40; //TODO: compute this const choices = h( 'div', { @@ -85,7 +88,8 @@ Vue.component('my-board', { let cj = (this.orientation=='w' ? j : sizeY-j-1); let elems = []; if (this.vr.board[ci][cj] != V.EMPTY && (variant.name!="Dark" - || this.gameOver || this.vr.enlightened[this.userColor][ci][cj])) + || this.gameOver || this.mode == "analyze" + || this.vr.enlightened[this.userColor][ci][cj])) { elems.push( h( @@ -130,6 +134,7 @@ Vue.component('my-board', { 'dark-square': (i+j)%2==1, [this.bcolor]: true, 'in-shadow': variant.name=="Dark" && !this.gameOver + && this.mode != "analyze" && !this.vr.enlightened[this.userColor][ci][cj], 'highlight': showLight && !!lm && _.isMatch(lm.end, {x:ci,y:cj}), 'incheck': showLight && incheckSq[ci][cj], diff --git a/public/javascripts/variant.js b/public/javascripts/variant.js index 1ec4d89b..453656ca 100644 --- a/public/javascripts/variant.js +++ b/public/javascripts/variant.js @@ -1,15 +1,24 @@ new Vue({ el: "#VueElement", data: { - display: "room", //default: main hall + display: "undefined", //default to main hall; see "created()" function gameid: "undefined", //...yet + + // TEMPORARY: DEBUG + vr: null, + mode: "analyze", + orientation: "w", + userColor: "w", + gameOver: false, }, created: function() { // TODO: navigation becomes a little more complex const url = window.location.href; const hashPos = url.indexOf("#"); - if (hashPos >= 0) - this.setDisplay(url.substr(hashPos+1)); + const page = (hashPos >= 0 ? url.substr(hashPos+1) : "room"); + this.setDisplay(page); + + this.vr = new VariantRules( V.GenRandInitFen() ); }, methods: { setDisplay: function(elt) { @@ -19,6 +28,27 @@ new Vue({ if (!!menuToggle) menuToggle.checked = false; }, + + // TEMPORARY: DEBUG (duplicate code) + play: function(move) { + // Not programmatic, or animation is over + if (!move.notation) + move.notation = this.vr.getNotation(move); + this.vr.play(move); + if (!move.fen) + move.fen = this.vr.getFen(); + if (this.sound == 2) + new Audio("/sounds/move.mp3").play().catch(err => {}); + // Is opponent in check? + this.incheck = this.vr.getCheckSquares(this.vr.turn); + const score = this.vr.getCurrentScore(); + }, + undo: function(move) { + this.vr.undo(move); + if (this.sound == 2) + new Audio("/sounds/undo.mp3").play().catch(err => {}); + this.incheck = this.vr.getCheckSquares(this.vr.turn); + }, }, }); diff --git a/views/variant.pug b/views/variant.pug index 15c546d0..16dd447a 100644 --- a/views/variant.pug +++ b/views/variant.pug @@ -28,9 +28,12 @@ block content .row //my-room(v-show="display=='room'") //my-game-list(v-show="display=='gameList'") - my-rules(v-show="display=='rules'") - my-problems(v-show="display=='problems'") + //my-rules(v-show="display=='rules'") + //my-problems(v-show="display=='problems'") //my-game(v-show="display=='game'" :gameId="gameid") + my-board(:vr="vr" :mode="mode" :orientation="orientation" + :user-color="userColor" :game-over="gameOver" + v-on:play-move="play") block javascripts script(src="/javascripts/utils/array.js") @@ -44,8 +47,9 @@ block javascripts const variant = !{JSON.stringify(variant)}; //script(src="/javascripts/components/room.js") //script(src="/javascripts/components/gameList.js") - script(src="/javascripts/components/rules.js") - script(src="/javascripts/components/problemPreview.js") - script(src="/javascripts/components/problems.js") + //script(src="/javascripts/components/rules.js") + script(src="/javascripts/components/board.js") + //script(src="/javascripts/components/problemPreview.js") + //script(src="/javascripts/components/problems.js") //script(src="/javascripts/components/game.js") script(src="/javascripts/variant.js") -- 2.44.0