From 204e289bbcddc69e2d81aef492dbea6db9e31188 Mon Sep 17 00:00:00 2001 From: Benjamin Auder Date: Tue, 20 Nov 2018 14:59:19 +0100 Subject: [PATCH] Fist draft of Antiking variant (still being debugged) --- public/javascripts/base_rules.js | 2 +- public/javascripts/components/game.js | 26 +++--- public/javascripts/variants/Antiking.js | 102 ++++++++++++++++++------ variants.js | 2 +- views/rules/Antiking.pug | 43 ++++++++++ 5 files changed, 136 insertions(+), 39 deletions(-) create mode 100644 views/rules/Antiking.pug diff --git a/public/javascripts/base_rules.js b/public/javascripts/base_rules.js index a4001225..8626b888 100644 --- a/public/javascripts/base_rules.js +++ b/public/javascripts/base_rules.js @@ -621,7 +621,7 @@ class ChessRules getCheckSquares(move) { this.play(move); - const color = this.turn; + const color = this.turn; //opponent let res = this.isAttacked(this.kingPos[color], this.getOppCol(color)) ? [ JSON.parse(JSON.stringify(this.kingPos[color])) ] //need to duplicate! : [ ]; diff --git a/public/javascripts/components/game.js b/public/javascripts/components/game.js index 9364c8d9..18632858 100644 --- a/public/javascripts/components/game.js +++ b/public/javascripts/components/game.js @@ -217,18 +217,21 @@ Vue.component('my-game', { ); }), choices] ); - actionArray.push( - h('button', - { - on: { click: this.resign }, - attrs: { "aria-label": 'Resign' }, - 'class': { - "tooltip":true, - "bottom": true, + if (this.mode != "idle") + { + actionArray.push( + h('button', + { + on: { click: this.resign }, + attrs: { "aria-label": 'Resign' }, + 'class': { + "tooltip":true, + "bottom": true, + }, }, - }, - [h('i', { 'class': { "material-icons": true } }, "flag")]) - ); + [h('i', { 'class': { "material-icons": true } }, "flag")]) + ); + } elementArray.push(gameDiv); // if (!!vr.reserve) // { @@ -494,6 +497,7 @@ Vue.component('my-game', { this.score = score; let modalBox = document.getElementById("modal-eog"); modalBox.checked = true; + // Variants may have special PGN structure (so next function isn't defined here) this.pgnTxt = this.vr.getPGN(this.mycolor, this.score, this.fenStart, this.mode); setTimeout(() => { modalBox.checked = false; }, 2000); if (this.mode == "human") diff --git a/public/javascripts/variants/Antiking.js b/public/javascripts/variants/Antiking.js index 360deafa..2770261a 100644 --- a/public/javascripts/variants/Antiking.js +++ b/public/javascripts/variants/Antiking.js @@ -1,4 +1,4 @@ -class AntikingRules +class AntikingRules extends ChessRules { // Path to pieces static getPpath(b) @@ -11,30 +11,55 @@ class AntikingRules initVariables(fen) { super.initVariables(fen); - // TODO: initialize this.antikingPos[...] + this.antikingPos = {'w':[-1,-1], 'b':[-1,-1]}; + const position = fen.split(" ")[0].split("/"); + for (let i=0; i0?antikingPos:"") + "A" + (antikingPos<7?7-antikingPos:""); + randFen = randFen.replace("pppppppp/8", ranks23); + // White side + antikingPos = _.random(7); + ranks23 = (antikingPos>0?antikingPos:"") + "a" + (antikingPos<7?7-antikingPos:"") + "/PPPPPPPP"; + randFen = randFen.replace("8/PPPPPPPP", ranks23); return randFen; } } diff --git a/variants.js b/variants.js index ed2b6bad..6c2f62cf 100644 --- a/variants.js +++ b/variants.js @@ -3,7 +3,7 @@ module.exports = [ { "name" : "Zen", "description" : "Reverse captures" }, { "name" : "Atomic", "description" : "Explosive captures" }, { "name" : "Chess960", "description" : "Standard rules" }, -// { "name" : "AntiKing", "description" : "Keep anti-king in check" }, + { "name" : "Antiking", "description" : "Keep antiking in check" }, // { "name" : "Magnetic", "description" : "Laws of attraction" }, // { "name" : "Alice", "description" : "Both sides of the mirror" }, // { "name" : "Grand", "description" : "Big board" }, diff --git a/views/rules/Antiking.pug b/views/rules/Antiking.pug new file mode 100644 index 00000000..eda7db44 --- /dev/null +++ b/views/rules/Antiking.pug @@ -0,0 +1,43 @@ +p.boxed + | You have a king and an antiking. King must stay away from checks, but antiking must always stay in check. + | Antiking captures his own kind. + +h3 Specifications + +ul + li Chessboard: standard. + li Material: additional antiking. + li Non-capturing moves: standard. + li Special moves: standard. + li Captures: special case of antiking (see below). + li End of game: Checkmate or anti-checkmate. + +h3 Basics + +p + | The additional piece is a royal figure, thus cannot be captured. + | It captures the pieces of his color (to help checkmate opponent antiking, but by doing so it also make standard checkmate more difficult...). + | It should always remains under check (if it cannot, game is over). + +figure.diagram-container + .diagram + | fen:rnbqkbnr/pppppppp/3A4/8/8/3a4/PPPPPPPP/RNBQKBNR: + figcaption Initial position (non-random). 1.Ae5 is forbidden. + +h3 End of the game + +p There are two ways to win: +ol + li Checkmate opponent king + li Anti-checkmate opponent antiking +p ...Or maybe do both at the same time? + +p Note 1: athough antiking captures his color, it doesn't check his king. + +p Note 2: since it would allow a basic tactic (keep antiking touching opponent's king), kings do not attack antikings. + +h3 Credits + +p + a(href="https://www.chessvariants.com/diffobjective.dir/anti-king-chess.html") Antiking chess + | on chessvariants.com. -- 2.44.0