From: Benjamin Auder Date: Fri, 27 Mar 2020 18:53:14 +0000 (+0100) Subject: Add unambiguous section in the PGN + some fixes + code formatting and fix typos X-Git-Url: https://git.auder.net/doc/DESCRIPTION?a=commitdiff_plain;h=2c5d7b20742b802d9c47916915c1114bcfc9a9c3;p=vchess.git Add unambiguous section in the PGN + some fixes + code formatting and fix typos --- diff --git a/client/public/images/pieces/Ball/bh.svg b/client/public/images/pieces/Ball/bh.svg index 8c5339cc..6dbea895 100644 --- a/client/public/images/pieces/Ball/bh.svg +++ b/client/public/images/pieces/Ball/bh.svg @@ -11,11 +11,11 @@ width="100%" version="1.1" viewBox="0 0 2048 2048" - id="svg18" - sodipodi:docname="bd.svg" + id="svg112" + sodipodi:docname="bh.svg" inkscape:version="0.92.4 5da689c313, 2019-01-14"> + id="metadata118"> @@ -27,7 +27,7 @@ + id="defs116" /> + inkscape:current-layer="svg112" /> - diff --git a/client/public/images/pieces/Ball/bc.svg b/client/public/images/pieces/Ball/bi.svg similarity index 54% rename from client/public/images/pieces/Ball/bc.svg rename to client/public/images/pieces/Ball/bi.svg index 6dbea895..8c5339cc 100644 --- a/client/public/images/pieces/Ball/bc.svg +++ b/client/public/images/pieces/Ball/bi.svg @@ -11,11 +11,11 @@ width="100%" version="1.1" viewBox="0 0 2048 2048" - id="svg112" - sodipodi:docname="bh.svg" + id="svg18" + sodipodi:docname="bd.svg" inkscape:version="0.92.4 5da689c313, 2019-01-14"> + id="metadata24"> @@ -27,7 +27,7 @@ + id="defs22" /> + inkscape:current-layer="svg18" /> + diff --git a/client/public/images/pieces/Ball/wh.svg b/client/public/images/pieces/Ball/wh.svg index d10a14fe..eac3db53 100644 --- a/client/public/images/pieces/Ball/wh.svg +++ b/client/public/images/pieces/Ball/wh.svg @@ -12,7 +12,7 @@ version="1.1" viewBox="0 0 2048 2048" id="svg6" - sodipodi:docname="wd.svg" + sodipodi:docname="wh.svg" inkscape:version="0.92.4 5da689c313, 2019-01-14"> @@ -42,7 +42,7 @@ id="namedview8" showgrid="false" inkscape:zoom="0.11523438" - inkscape:cx="1058.7119" + inkscape:cx="1041.3559" inkscape:cy="1024" inkscape:window-x="0" inkscape:window-y="20" @@ -60,9 +60,4 @@ display="block" id="path4" inkscape:connector-curvature="0" /> - diff --git a/client/public/images/pieces/Ball/wc.svg b/client/public/images/pieces/Ball/wi.svg similarity index 59% rename from client/public/images/pieces/Ball/wc.svg rename to client/public/images/pieces/Ball/wi.svg index eac3db53..d10a14fe 100644 --- a/client/public/images/pieces/Ball/wc.svg +++ b/client/public/images/pieces/Ball/wi.svg @@ -12,7 +12,7 @@ version="1.1" viewBox="0 0 2048 2048" id="svg6" - sodipodi:docname="wh.svg" + sodipodi:docname="wd.svg" inkscape:version="0.92.4 5da689c313, 2019-01-14"> @@ -42,7 +42,7 @@ id="namedview8" showgrid="false" inkscape:zoom="0.11523438" - inkscape:cx="1041.3559" + inkscape:cx="1058.7119" inkscape:cy="1024" inkscape:window-x="0" inkscape:window-y="20" @@ -60,4 +60,9 @@ display="block" id="path4" inkscape:connector-curvature="0" /> + diff --git a/client/src/App.vue b/client/src/App.vue index caf91a96..ed8d1520 100644 --- a/client/src/App.vue +++ b/client/src/App.vue @@ -24,8 +24,7 @@ router-link(to="/problems") | {{ st.tr["Problems"] }} #rightMenu - .clickable(onClick="window.doClick('modalUser')") - | {{ st.user.id > 0 ? (st.user.name || "@nonymous") : "Login" }} + .clickable(onClick="window.doClick('modalUser')") {{ userName }} #divSettings.clickable(onClick="window.doClick('modalSettings')") span {{ st.tr["Settings"] }} img(src="/images/icons/settings.svg") @@ -72,6 +71,15 @@ export default { } ); }, + computed: { + userName: function() { + return ( + this.st.user.id > 0 + ? (this.st.user.name || "@nonymous") + : "Login" + ); + } + }, methods: { hideDrawer: function(e) { e.preventDefault(); //TODO: why is this needed? diff --git a/client/src/base_rules.js b/client/src/base_rules.js index 177fc9b6..d1348e71 100644 --- a/client/src/base_rules.js +++ b/client/src/base_rules.js @@ -27,7 +27,8 @@ export const Move = class Move { } }; -// NOTE: x coords = top to bottom; y = left to right (from white player perspective) +// NOTE: x coords = top to bottom; y = left to right +// (from white player perspective) export const ChessRules = class ChessRules { ////////////// // MISC UTILS @@ -257,7 +258,8 @@ export const ChessRules = class ChessRules { getCheckSquares(color) { return ( this.underCheck(color) - ? [JSON.parse(JSON.stringify(this.kingPos[color]))] //need to duplicate! + // kingPos must be duplicated, because it may change: + ? [JSON.parse(JSON.stringify(this.kingPos[color]))] : [] ); } @@ -466,7 +468,8 @@ export const ChessRules = class ChessRules { // Scan board for kings positions scanKings(fen) { this.INIT_COL_KING = { w: -1, b: -1 }; - this.kingPos = { w: [-1, -1], b: [-1, -1] }; //squares of white and black king + // Squares of white and black king: + this.kingPos = { w: [-1, -1], b: [-1, -1] }; const fenRows = V.ParseFen(fen).position.split("/"); const startRow = { 'w': V.size.x - 1, 'b': 0 }; for (let i = 0; i < fenRows.length; i++) { @@ -841,7 +844,7 @@ export const ChessRules = class ChessRules { if (this.castleFlags[c][castleSide] >= V.size.y) continue; // If this code is reached, rook and king are on initial position - // NOTE: in some variants this is not a rook, but let's keep variable name + // NOTE: in some variants this is not a rook const rookPos = this.castleFlags[c][castleSide]; const castlingPiece = this.getPiece(x, rookPos); if (this.getColor(x, rookPos) != c) @@ -886,8 +889,18 @@ export const ChessRules = class ChessRules { moves.push( new Move({ appear: [ - new PiPo({ x: x, y: finalSquares[castleSide][0], p: V.KING, c: c }), - new PiPo({ x: x, y: finalSquares[castleSide][1], p: castlingPiece, c: c }) + new PiPo({ + x: x, + y: finalSquares[castleSide][0], + p: V.KING, + c: c + }), + new PiPo({ + x: x, + y: finalSquares[castleSide][1], + p: castlingPiece, + c: c + }) ], vanish: [ new PiPo({ x: x, y: y, p: V.KING, c: c }), @@ -943,7 +956,7 @@ export const ChessRules = class ChessRules { } // Stop at the first move found - // TODO: not really, it explores all moves from a square but one would suffice. + // TODO: not really, it explores all moves from a square (one is enough). atLeastOneMove() { const color = this.turn; for (let i = 0; i < V.size.x; i++) { @@ -1082,7 +1095,8 @@ export const ChessRules = class ChessRules { // this.states.push(stateFen); this.prePlay(move); - if (V.HasFlags) move.flags = JSON.stringify(this.aggregateFlags()); //save flags (for undo) + // Save flags (for undo) + if (V.HasFlags) move.flags = JSON.stringify(this.aggregateFlags()); if (V.HasEnpassant) this.epSquares.push(this.getEpSquare(move)); V.PlayOnBoard(this.board, move); this.turn = V.GetOppCol(this.turn); @@ -1200,7 +1214,7 @@ export const ChessRules = class ChessRules { return V.INFINITY; } - // Search depth: 1,2 for high branching factor, 4 for small (Loser chess, eg.) + // Search depth: 1,2 for e.g. higher branching factor, 4 for smaller static get SEARCH_DEPTH() { return 3; } @@ -1373,4 +1387,28 @@ export const ChessRules = class ChessRules { finalSquare ); } + + static GetUnambiguousNotation(move) { + // Machine-readable format with all the informations about the move + return ( + (!!move.start && V.OnBoard(move.start.x, move.start.y) + ? V.CoordsToSquare(move.start) + : "-" + ) + "." + + (!!move.end && V.OnBoard(move.end.x, move.end.y) + ? V.CoordsToSquare(move.end) + : "-" + ) + " " + + (!!move.appear && move.appear.length > 0 + ? move.appear.map(a => + a.c + a.p + V.CoordsToSquare({ x: a.x, y: a.y })).join(".") + : "-" + ) + "/" + + (!!move.vanish && move.vanish.length > 0 + ? move.vanish.map(a => + a.c + a.p + V.CoordsToSquare({ x: a.x, y: a.y })).join(".") + : "-" + ) + ); + } }; diff --git a/client/src/components/BaseGame.vue b/client/src/components/BaseGame.vue index d9540eb3..0ed908a5 100644 --- a/client/src/components/BaseGame.vue +++ b/client/src/components/BaseGame.vue @@ -60,6 +60,7 @@ div#baseGame