From 2c5d7b20742b802d9c47916915c1114bcfc9a9c3 Mon Sep 17 00:00:00 2001 From: Benjamin Auder Date: Fri, 27 Mar 2020 19:53:14 +0100 Subject: [PATCH] Add unambiguous section in the PGN + some fixes + code formatting and fix typos --- client/public/images/pieces/Ball/bh.svg | 35 +++---- .../images/pieces/Ball/{bc.svg => bi.svg} | 35 ++++--- client/public/images/pieces/Ball/wh.svg | 9 +- .../images/pieces/Ball/{wc.svg => wi.svg} | 9 +- client/src/App.vue | 12 ++- client/src/base_rules.js | 56 +++++++++-- client/src/components/BaseGame.vue | 33 +++++-- client/src/components/Board.vue | 8 +- client/src/components/ChallengeList.vue | 3 +- client/src/components/MoveList.vue | 6 +- client/src/data/userCheck.js | 3 +- client/src/store.js | 5 +- client/src/translations/rules/Alice/es.pug | 3 +- client/src/translations/rules/Allmate1/en.pug | 3 +- client/src/translations/rules/Allmate1/es.pug | 13 +-- client/src/translations/rules/Allmate1/fr.pug | 21 ++-- client/src/translations/rules/Allmate2/es.pug | 4 +- client/src/translations/rules/Allmate2/fr.pug | 4 +- .../src/translations/rules/Antimatter/en.pug | 3 +- .../src/translations/rules/Antimatter/es.pug | 3 +- .../src/translations/rules/Antimatter/fr.pug | 3 +- client/src/translations/rules/Arena/en.pug | 7 +- client/src/translations/rules/Arena/es.pug | 17 ++-- client/src/translations/rules/Arena/fr.pug | 15 +-- client/src/translations/rules/Ball/en.pug | 21 ++-- client/src/translations/rules/Ball/es.pug | 25 ++--- client/src/translations/rules/Ball/fr.pug | 22 ++--- client/src/translations/rules/Baroque/en.pug | 59 +++++------ client/src/translations/rules/Baroque/es.pug | 54 +++++----- client/src/translations/rules/Baroque/fr.pug | 59 ++++++----- client/src/translations/rules/Benedict/en.pug | 8 +- client/src/translations/rules/Benedict/es.pug | 10 +- client/src/translations/rules/Benedict/fr.pug | 14 ++- client/src/translations/rules/Berolina/es.pug | 6 +- client/src/translations/rules/Cannibal/en.pug | 3 +- client/src/translations/rules/Cannibal/es.pug | 3 +- client/src/translations/rules/Cannibal/fr.pug | 3 +- .../src/translations/rules/Checkered/en.pug | 35 ++++--- .../src/translations/rules/Checkered/es.pug | 15 +-- .../src/translations/rules/Checkered/fr.pug | 8 +- client/src/translations/rules/Chess960/en.pug | 98 ++++++++++--------- client/src/translations/rules/Chess960/es.pug | 54 +++++----- client/src/translations/rules/Chess960/fr.pug | 61 +++++++----- client/src/translations/rules/Circular/en.pug | 3 +- client/src/translations/rules/Circular/es.pug | 3 +- client/src/translations/rules/Circular/fr.pug | 3 +- .../src/translations/rules/Crazyhouse/en.pug | 10 +- client/src/translations/rules/Cylinder/en.pug | 3 +- client/src/translations/rules/Cylinder/es.pug | 8 +- client/src/translations/rules/Cylinder/fr.pug | 5 +- .../src/translations/rules/Eightpieces/en.pug | 3 +- .../src/translations/rules/Eightpieces/es.pug | 3 +- .../src/translations/rules/Eightpieces/fr.pug | 3 +- .../src/translations/rules/Extinction/en.pug | 13 +-- .../src/translations/rules/Extinction/es.pug | 8 +- .../src/translations/rules/Extinction/fr.pug | 3 +- client/src/translations/rules/Grand/en.pug | 23 ++--- client/src/translations/rules/Grand/es.pug | 7 +- client/src/translations/rules/Grand/fr.pug | 3 +- .../src/translations/rules/Grasshopper/en.pug | 18 ++-- .../src/translations/rules/Grasshopper/es.pug | 14 ++- .../src/translations/rules/Grasshopper/fr.pug | 18 ++-- client/src/translations/rules/Hidden/es.pug | 8 +- client/src/translations/rules/Hidden/fr.pug | 12 ++- .../src/translations/rules/Hiddenqueen/en.pug | 6 +- .../src/translations/rules/Hiddenqueen/fr.pug | 4 +- .../src/translations/rules/Knightmate/en.pug | 2 +- .../src/translations/rules/Knightmate/es.pug | 6 +- .../src/translations/rules/Knightmate/fr.pug | 6 +- .../translations/rules/Knightrelay1/en.pug | 12 ++- .../translations/rules/Knightrelay1/es.pug | 12 ++- .../translations/rules/Knightrelay1/fr.pug | 9 +- .../translations/rules/Knightrelay2/en.pug | 18 ++-- .../translations/rules/Knightrelay2/es.pug | 15 +-- .../translations/rules/Knightrelay2/fr.pug | 24 +++-- client/src/translations/rules/Losers/es.pug | 3 +- client/src/translations/rules/Losers/fr.pug | 7 +- client/src/translations/rules/Magnetic/en.pug | 22 +++-- client/src/translations/rules/Magnetic/es.pug | 7 +- client/src/translations/rules/Magnetic/fr.pug | 12 +-- .../src/translations/rules/Marseille/es.pug | 3 +- .../src/translations/rules/Marseille/fr.pug | 14 +-- client/src/translations/rules/Orda/es.pug | 3 +- client/src/translations/rules/Perfect/en.pug | 5 +- client/src/translations/rules/Perfect/es.pug | 5 +- client/src/translations/rules/Perfect/fr.pug | 5 +- .../src/translations/rules/Racingkings/fr.pug | 8 +- client/src/translations/rules/Recycle/en.pug | 7 +- client/src/translations/rules/Recycle/es.pug | 3 +- client/src/translations/rules/Recycle/fr.pug | 3 +- client/src/translations/rules/Rifle/en.pug | 5 +- client/src/translations/rules/Rifle/es.pug | 16 +-- client/src/translations/rules/Rifle/fr.pug | 9 +- .../src/translations/rules/Royalrace/en.pug | 8 +- .../src/translations/rules/Royalrace/fr.pug | 15 +-- client/src/translations/rules/Schess/es.pug | 1 - client/src/translations/rules/Shatranj/en.pug | 10 +- client/src/translations/rules/Shatranj/es.pug | 15 +-- client/src/translations/rules/Shatranj/fr.pug | 9 +- client/src/translations/rules/Suicide/en.pug | 14 ++- client/src/translations/rules/Suicide/fr.pug | 11 ++- .../src/translations/rules/Synchrone/en.pug | 3 +- .../src/translations/rules/Synchrone/fr.pug | 6 +- .../src/translations/rules/Upsidedown/en.pug | 6 +- .../src/translations/rules/Upsidedown/es.pug | 17 ++-- .../src/translations/rules/Upsidedown/fr.pug | 10 +- .../src/translations/rules/Wildebeest/en.pug | 11 ++- .../src/translations/rules/Wildebeest/es.pug | 16 +-- .../src/translations/rules/Wildebeest/fr.pug | 20 ++-- client/src/translations/rules/Wormhole/en.pug | 7 +- client/src/translations/rules/Wormhole/es.pug | 16 +-- client/src/translations/rules/Wormhole/fr.pug | 3 +- client/src/translations/rules/Zen/en.pug | 3 +- client/src/translations/rules/Zen/es.pug | 6 +- client/src/translations/rules/Zen/fr.pug | 9 +- client/src/utils/alea.js | 2 +- client/src/utils/compgameStorage.js | 3 +- client/src/utils/gameStorage.js | 3 +- client/src/utils/notation.js | 7 +- client/src/variants/Alice.js | 14 ++- client/src/variants/Apocalypse.js | 8 -- client/src/variants/Ball.js | 34 +++---- client/src/variants/Baroque.js | 27 +++-- client/src/variants/Berolina.js | 4 +- client/src/variants/Checkered.js | 5 +- client/src/variants/Circular.js | 6 +- client/src/variants/Coregal.js | 21 +++- client/src/variants/Crazyhouse.js | 3 +- client/src/variants/Dark.js | 13 +-- client/src/variants/Dynamo.js | 6 +- client/src/variants/Eightpieces.js | 10 +- client/src/variants/Enpassant.js | 5 +- client/src/variants/Extinction.js | 5 +- client/src/variants/Grand.js | 11 ++- client/src/variants/Hidden.js | 16 +-- client/src/variants/Knightrelay1.js | 3 +- client/src/variants/Knightrelay2.js | 3 +- client/src/variants/Magnetic.js | 6 +- client/src/variants/Recycle.js | 3 +- client/src/variants/Schess.js | 6 +- client/src/variants/Synchrone.js | 5 +- client/src/variants/Threechecks.js | 2 +- client/src/variants/Wildebeest.js | 8 +- client/src/variants/Zen.js | 2 +- client/src/views/Analyse.vue | 3 +- client/src/views/Game.vue | 31 +++--- client/src/views/Hall.vue | 32 +++--- client/src/views/MyGames.vue | 2 +- client/src/views/News.vue | 2 +- client/src/views/Problems.vue | 17 +++- server/db/create.sql | 3 +- server/db/populate.sql | 10 +- server/models/User.js | 8 +- server/sockets.js | 7 +- server/utils/access.js | 14 +-- 155 files changed, 1108 insertions(+), 768 deletions(-) rename client/public/images/pieces/Ball/{bc.svg => bi.svg} (54%) rename client/public/images/pieces/Ball/{wc.svg => wi.svg} (59%) 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