Several small improvements + integrate options + first working draft of Cwda
authorBenjamin Auder <benjamin.auder@somewhere>
Mon, 12 Apr 2021 15:54:42 +0000 (17:54 +0200)
committerBenjamin Auder <benjamin.auder@somewhere>
Mon, 12 Apr 2021 15:54:42 +0000 (17:54 +0200)
174 files changed:
TODO
client/public/images/pieces/Cwda/bc.svg [new file with mode: 0644]
client/public/images/pieces/Cwda/bf.svg [new file with mode: 0644]
client/public/images/pieces/Cwda/bg.svg [new file with mode: 0644]
client/public/images/pieces/Cwda/bh.svg
client/public/images/pieces/Cwda/bi.svg [new file with mode: 0644]
client/public/images/pieces/Cwda/bl.svg [new file with mode: 0644]
client/public/images/pieces/Cwda/bo.svg [new file with mode: 0644]
client/public/images/pieces/Cwda/bs.svg
client/public/images/pieces/Cwda/bt.svg [new file with mode: 0644]
client/public/images/pieces/Cwda/bw.svg [moved from client/public/images/pieces/Cwda/ba.svg with 100% similarity]
client/public/images/pieces/Cwda/by.svg [new file with mode: 0644]
client/public/images/pieces/Cwda/wc.svg [new file with mode: 0644]
client/public/images/pieces/Cwda/wf.svg [new file with mode: 0644]
client/public/images/pieces/Cwda/wg.svg [new file with mode: 0644]
client/public/images/pieces/Cwda/wh.svg
client/public/images/pieces/Cwda/wi.svg [new file with mode: 0644]
client/public/images/pieces/Cwda/wl.svg [new file with mode: 0644]
client/public/images/pieces/Cwda/wo.svg [new file with mode: 0644]
client/public/images/pieces/Cwda/ws.svg
client/public/images/pieces/Cwda/wt.svg [new file with mode: 0644]
client/public/images/pieces/Cwda/ww.svg [moved from client/public/images/pieces/Cwda/wa.svg with 100% similarity]
client/public/images/pieces/Cwda/wy.svg [new file with mode: 0644]
client/src/base_rules.js
client/src/components/BaseGame.vue
client/src/components/ChallengeList.vue
client/src/components/Settings.vue
client/src/components/UploadGame.vue
client/src/data/challengeCheck.js
client/src/store.js
client/src/translations/about/en.pug
client/src/translations/about/es.pug
client/src/translations/about/fr.pug
client/src/translations/en.js
client/src/translations/es.js
client/src/translations/faq/en.pug
client/src/translations/faq/es.pug
client/src/translations/faq/fr.pug
client/src/translations/fr.js
client/src/translations/rules/Capture/en.pug
client/src/translations/rules/Capture/es.pug
client/src/translations/rules/Capture/fr.pug
client/src/translations/rules/Cwda/en.pug
client/src/translations/rules/Cwda/es.pug
client/src/translations/rules/Cwda/fr.pug
client/src/variants/Absorption.js
client/src/variants/Alapo.js
client/src/variants/Align4.js
client/src/variants/Allmate.js
client/src/variants/Ambiguous.js
client/src/variants/Antiking1.js
client/src/variants/Antiking2.js
client/src/variants/Apocalypse.js
client/src/variants/Arena.js
client/src/variants/Atarigo.js
client/src/variants/Avalam2.js
client/src/variants/Avalanche.js
client/src/variants/Balaklava.js
client/src/variants/Ball.js
client/src/variants/Bario.js
client/src/variants/Baroque.js
client/src/variants/Benedict.js
client/src/variants/Bicolour.js
client/src/variants/Bishopawns.js
client/src/variants/Capablanca.js
client/src/variants/Chakart.js
client/src/variants/Checkered.js
client/src/variants/Chess960.js
client/src/variants/Circular.js
client/src/variants/Clorange.js
client/src/variants/Convert.js
client/src/variants/Copycat.js
client/src/variants/Coregal.js
client/src/variants/Crazyhouse.js
client/src/variants/Cwda.js
client/src/variants/Cylinder.js
client/src/variants/Diamond.js
client/src/variants/Dice.js
client/src/variants/Discoduel.js
client/src/variants/Dobutsu.js
client/src/variants/Doublearmy.js
client/src/variants/Eightpieces.js
client/src/variants/Emergo.js
client/src/variants/Empire.js
client/src/variants/Fanorona.js
client/src/variants/Football.js
client/src/variants/Fugue.js
client/src/variants/Fullcavalry.js
client/src/variants/Fusion.js
client/src/variants/Gomoku.js
client/src/variants/Grand.js
client/src/variants/Grasshopper.js
client/src/variants/Hamilton.js
client/src/variants/Hidden.js
client/src/variants/Hiddenqueen.js
client/src/variants/Hoppelpoppel.js
client/src/variants/Horde.js
client/src/variants/Hypnotic.js
client/src/variants/Iceage.js
client/src/variants/Interweave.js
client/src/variants/Janggi.js
client/src/variants/Joker.js
client/src/variants/Knightmate1.js
client/src/variants/Knightmate2.js
client/src/variants/Knightpawns.js
client/src/variants/Konane.js
client/src/variants/Koopa.js
client/src/variants/Madrasi.js
client/src/variants/Maharajah.js
client/src/variants/Makruk.js
client/src/variants/Maxima.js
client/src/variants/Mesmer.js
client/src/variants/Minixiangqi.js
client/src/variants/Monocolor.js
client/src/variants/Monster.js
client/src/variants/Musketeer.js
client/src/variants/Newzealand.js
client/src/variants/Omega.js
client/src/variants/Orda.js
client/src/variants/Ordamirror.js
client/src/variants/Otage.js
client/src/variants/Pacifist1.js
client/src/variants/Pacosako.js
client/src/variants/Pandemonium1.js
client/src/variants/Pandemonium2.js
client/src/variants/Parachute.js
client/src/variants/Pawnmassacre.js
client/src/variants/Pawns.js
client/src/variants/Pawnsking.js
client/src/variants/Perfect.js
client/src/variants/Pocketknight.js
client/src/variants/Queenpawns.js
client/src/variants/Racingkings.js
client/src/variants/Recycle.js
client/src/variants/Refusal1.js
client/src/variants/Relayup.js
client/src/variants/Rococo.js
client/src/variants/Rollerball.js
client/src/variants/Rookpawns.js
client/src/variants/Royalrace.js
client/src/variants/Rugby.js
client/src/variants/Schess.js
client/src/variants/Screen.js
client/src/variants/Shako.js
client/src/variants/Shatranj.js
client/src/variants/Shinobi.js
client/src/variants/Shogi.js
client/src/variants/Shogun.js
client/src/variants/Sittuyin.js
client/src/variants/Spartan.js
client/src/variants/Squatter2.js
client/src/variants/Stealthbomb1.js
client/src/variants/Stealthbomb2.js
client/src/variants/Suction.js
client/src/variants/Suicide.js
client/src/variants/Swap.js
client/src/variants/Synchrone1.js
client/src/variants/Synchrone2.js
client/src/variants/Synochess.js
client/src/variants/Tencubed.js
client/src/variants/Threechecks.js
client/src/variants/Titan.js
client/src/variants/Twokings.js
client/src/variants/Upsidedown.js
client/src/variants/Vchess.js
client/src/variants/Wildebeest.js
client/src/variants/Wormhole1.js
client/src/variants/Xiangqi.js
client/src/variants/Yote.js
client/src/variants/Zen.js
client/src/views/Game.vue
client/src/views/Hall.vue
client/src/views/Rules.vue
client/src/views/Variants.vue

diff --git a/TODO b/TODO
index 924b6d0..473ea2d 100644 (file)
--- a/TODO
+++ b/TODO
@@ -6,9 +6,18 @@ If new live game starts in background, "new game" notify OK but not first move.
 Will be used for variants with custom non-rectangular board (Hex, at least)
 Or, with other board shapes (see greenchess.net for example)
 
 Will be used for variants with custom non-rectangular board (Hex, at least)
 Or, with other board shapes (see greenchess.net for example)
 
-Merge variants 1, 2 (3) into one with sub-variant selection when starting a game (New Game + vs engine + analyse)
-E.g. Checkered 1 & 2 into one, and so on.
-Need additional field in variant code... in a generic way (radiobutton or select or checkbox?)
+debug import game + load
+
+TODEBUG: Avalanche computer play from here
+game.fen = "r2q1bnr/3pp3/n3k1p1/6Pp/3p1B1P/p5R1/1p6/4K1NR w 26 ihii 0";
+game.fenStart = "r2q1bnr/3pp3/n3k1p1/6Pp/3p1B1P/p5R1/1p6/4K1NR w 26 ihii 0";
+game.mycolor = 'w';
+Bd6,b1 then black promotes and win, but UI freezes.
+
+Merge Orda + Empire + Hoppelpoppel + Newzealand getSlideNJumpMoves() into base_rules.js
+=> allow to simplify getPawnMoves in RoyalRace (and some getXMoves in Shatranj)
+
+Option "free placement" in Hidden
 
 #New variants:
 Chessplode
 
 #New variants:
 Chessplode
@@ -16,7 +25,6 @@ Tablut
 
 https://brainking.com/fr/GameRules?tp=128 Massacre Chess
 
 
 https://brainking.com/fr/GameRules?tp=128 Massacre Chess
 
-CWDA : need game options (also useful at least for Monster)
 PizzaKings https://www.chessvariants.com/unequal.dir/pizza-kings.html
 https://en.m.wikipedia.org/wiki/Chess_with_different_armies#Pizza_Kings%5B11%5D_(John_Lawson)
 
 PizzaKings https://www.chessvariants.com/unequal.dir/pizza-kings.html
 https://en.m.wikipedia.org/wiki/Chess_with_different_armies#Pizza_Kings%5B11%5D_(John_Lawson)
 
diff --git a/client/public/images/pieces/Cwda/bc.svg b/client/public/images/pieces/Cwda/bc.svg
new file mode 100644 (file)
index 0000000..c34593d
--- /dev/null
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="45"
+   height="45"
+   id="svg3128"
+   sodipodi:version="0.32"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
+   version="1.0"
+   sodipodi:docname="bc.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3130">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 22.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="45 : 22.5 : 1"
+       inkscape:persp3d-origin="22.5 : 15 : 1"
+       id="perspective15" />
+    <inkscape:perspective
+       id="perspective12"
+       inkscape:persp3d-origin="22.5 : 15 : 1"
+       inkscape:vp_z="45 : 22.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 22.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.313709"
+     inkscape:cx="21.843794"
+     inkscape:cy="17.466685"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     height="45px"
+     width="45px"
+     inkscape:grid-points="true"
+     showgrid="true"
+     inkscape:window-width="960"
+     inkscape:window-height="1060"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0">
+    <inkscape:grid
+       id="GridFromPre046Settings"
+       type="xygrid"
+       originx="0"
+       originy="0"
+       spacingx="0.5"
+       spacingy="0.5"
+       color="#0000ff"
+       empcolor="#0000ff"
+       opacity="0.2"
+       empopacity="0.4"
+       empspacing="5" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3133">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="display:inline">
+    <path
+       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 37.5,37.5 c -3.723781,-1.069562 -11.126219,0.473903 -14.85,-2.2 -3.723782,2.673903 -11.12622,1.130438 -14.8500002,2.2 0,0 -1.8104878,0.595658 -3.3,2.2 0.7447561,1.069561 1.8104878,1.08478 3.3,0.55 C 11.52378,39.180439 18.926218,40.754342 22.65,39.15 c 3.723781,1.604342 11.126219,0.03044 14.85,1.1 1.489512,0.53478 2.555244,0.519561 3.3,-0.55 -1.489512,-2.139123 -3.3,-2.2 -3.3,-2.2 z"
+       id="path4582"
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 30.9,33.1 c -2.75,2.75 -13.75,2.75 -16.5,0 -0.55,-1.65 0,-2.2 0,-2.2 h 16.5 c 0,0 0.55,0.55 0,2.2 z"
+       id="path4584"
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 30.9,30.9 H 14.4"
+       id="path4590"
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g3323"
+       inkscape:label="Layer 1"
+       transform="matrix(-0.84196464,0,0,-0.84196464,38.826174,36.60001)"
+       style="fill:#000000;fill-opacity:1">
+      <path
+         sodipodi:nodetypes="cccc"
+         id="path3491"
+         d="M 22.028958,36 C 11.528958,35 5.5289585,28 6.0289585,7 H 29.028958 c 0,9 -10,6.5 -8,21"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="csccccccccccc"
+         id="path3495"
+         d="m 20.028958,28 c -0.384461,-2.911278 5.552936,-7.368624 8,-9 3,-2 2.819198,-4.342892 5,-4 1.04172,0.944016 -1.413429,3.037549 0,3 1,0 -0.187332,-1.231727 1,-2 1,0 4.003161,-0.999999 4,4 0,2 -6,12 -6,12 0,0 -1.885866,1.902129 -2,3.5 0.726047,0.994369 0.5,2 0.5,3 -1,1 -3,-2.5 -3,-2.5 h -2 c 0,0 -0.781781,1.991926 -2.5,3 -1,0 -1,-3 -1,-3"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <circle
+         transform="rotate(180,21.764479,22)"
+         id="path3499"
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         cx="8.5"
+         cy="23.5"
+         r="0.5" />
+      <ellipse
+         transform="rotate(-149.99999,24.024104,20.986505)"
+         id="path3501"
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1.50000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         cx="14.5"
+         cy="15.5"
+         rx="0.5"
+         ry="1.5" />
+      <path
+         sodipodi:nodetypes="cc"
+         id="path8049"
+         d="m 7.0289585,7 c -1,20 5.4999995,27.5 11.9999995,28.5"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+    </g>
+    <path
+       style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.64999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 14.4,30.9 H 30.9"
+       id="path3369"
+       inkscape:connector-curvature="0" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Layer 1#1"
+     style="display:inline" />
+</svg>
diff --git a/client/public/images/pieces/Cwda/bf.svg b/client/public/images/pieces/Cwda/bf.svg
new file mode 100644 (file)
index 0000000..9d51bfc
--- /dev/null
@@ -0,0 +1,247 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="177.17"
+   height="177.17"
+   shape-rendering="geometricPrecision"
+   image-rendering="optimizeQuality"
+   fill-rule="evenodd"
+   clip-rule="evenodd"
+   viewBox="0 0 50 50"
+   version="1.1"
+   id="svg974"
+   sodipodi:docname="ba.svg"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+  <metadata
+     id="metadata978">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1060"
+     id="namedview976"
+     showgrid="false"
+     inkscape:zoom="2.3931818"
+     inkscape:cx="11.490991"
+     inkscape:cy="50.539966"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg974"
+     showguides="false"
+     inkscape:snap-nodes="false" />
+  <defs
+     id="defs968">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient1002">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop998" />
+      <stop
+         style="stop-color:#dcdbdb;stop-opacity:1"
+         offset="1"
+         id="stop1000" />
+    </linearGradient>
+    <linearGradient
+       id="0"
+       x1="21.376"
+       x2="77.64"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         stop-color="#fff"
+         id="stop963" />
+      <stop
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop965" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1002"
+       id="linearGradient1004"
+       x1="-41.790333"
+       y1="22.581646"
+       x2="-15.82877"
+       y2="22.581646"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient5398"
+       x1="0"
+       y1="0"
+       x2="0"
+       y2="1">
+      <stop
+         offset="20%"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop5394" />
+      <stop
+         offset="100%"
+         style="stop-color:#4d4d4d;stop-opacity:1"
+         id="stop5396" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(0.47111842,-0.19973575)"
+       id="0-1"
+       x1="21.253"
+       y1="37.591999"
+       x2="77.639999"
+       y2="37.469002"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         stop-color="#fff"
+         id="stop3285" />
+      <stop
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop3287" />
+    </linearGradient>
+  </defs>
+  <g
+     id="g5357"
+     style="opacity:1;fill:#1f1a17;fill-opacity:1"
+     transform="matrix(0.84130849,0,0,0.84130849,-76.526422,18.776438)">
+    <path
+       sodipodi:nodetypes="cccccccccccccccsccsc"
+       inkscape:connector-curvature="0"
+       id="path5349"
+       d="m 119.66608,20.578823 c 0.12511,0.773672 0.40427,1.44388 1.3,1.7 11.23011,-0.424319 16.82956,-5.233235 20.30001,-11.7 l 0.2,-2.099999 c -2.10707,-8.89280401 -8.15113,-13.4502442 -16.2,-15.8 -4.40015,-0.5317426 -7.59668,1.3815851 -10.20001,4.5 -2.59354,2.64077835 -4.39616,5.9439949 -5.3,10 -0.9084,3.60641 -5.79067,1.6990508 -4.9,-0.6 2.76583,-4.0566968 11.00069,-10.7605086 4.9,-12.3 -8.75831,-2.0518262 -7.05798,4.7061225 -5.2,6.20000004 1.23982,-0.5457366 2.00197,-1.22280981 2.4,-2.00000004 -0.25951,-0.4357328 -0.98217,-0.8162564 0,-1.4 0.5387,0.045976 0.81918,0.2856122 1,0.6 0,1 0.50403,1.1455069 -3.6,4 -7.640521,5.2325602 -3.73403,16.328533 2.94302,17.405035 2.93812,0.458135 3.4042,1.08673 5.28907,0.933469 0.49515,-0.04026 1.25166,0.522864 1.96791,0.561495 0.84449,-0.337075 4.5865,-0.641651 3.83596,-0.600198 0.37015,0.007 0.83701,-0.226033 1.09094,-0.03707 0.11828,0.08802 0.12726,0.435864 0.1731,0.637268 z"
+       style="fill:#1f1a17;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path5353"
+       d="m 109.56608,17.578823 c -1.32838,4.066443 -4.04985,6.321863 -6.6,8.8 -0.20576,0.304421 0.14574,0.397532 1,0.3 3.90473,-1.863513 6.85963,-4.360243 8.1,-8 -0.78642,-0.41302 -1.31194,-1.08384 -2.5,-1.1 z"
+       style="fill:#1f1a17;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  </g>
+  <g
+     id="g14577"
+     transform="matrix(0.95,0,0,0.95,1.3708726,1.7010613)">
+    <rect
+       y="4.245285"
+       x="23.113207"
+       height="40.212261"
+       width="3.7735846"
+       id="rect14571"
+       style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
+    <rect
+       transform="rotate(90)"
+       style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.84308159;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+       id="rect14573"
+       width="3.7735846"
+       height="47.641506"
+       x="23.231133"
+       y="-48.820751" />
+  </g>
+  <path
+     sodipodi:type="star"
+     style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+     id="path14587"
+     sodipodi:sides="64"
+     sodipodi:cx="25"
+     sodipodi:cy="44.457546"
+     sodipodi:r1="3.9412203"
+     sodipodi:r2="3.9364729"
+     sodipodi:arg1="0.78539816"
+     sodipodi:arg2="0.83448555"
+     inkscape:flatsided="true"
+     inkscape:rounded="0"
+     inkscape:randomized="0"
+     d="m 27.786864,47.24441 -0.28658,0.259741 -0.310659,0.2304 -0.331747,0.198841 -0.349638,0.165367 -0.364164,0.1303 -0.375182,0.09398 -0.382587,0.05675 L 25,48.398767 l -0.386307,-0.01898 -0.382587,-0.05675 -0.375182,-0.09398 -0.364164,-0.1303 -0.349638,-0.165367 -0.331747,-0.198841 -0.310659,-0.2304 -0.28658,-0.259741 -0.25974,-0.28658 -0.230401,-0.310659 -0.198841,-0.331746 -0.165367,-0.349639 -0.1303,-0.364164 -0.09398,-0.375182 -0.05675,-0.382587 -0.01898,-0.386307 0.01898,-0.386307 0.05675,-0.382587 0.09398,-0.375182 0.1303,-0.364163 0.165367,-0.349639 0.198841,-0.331746 0.230401,-0.310659 0.25974,-0.28658 0.28658,-0.259741 0.310659,-0.230401 0.331747,-0.198841 0.349638,-0.165367 0.364164,-0.130299 0.375182,-0.09398 0.382587,-0.05675 L 25,40.516326 l 0.386307,0.01898 0.382587,0.05675 0.375182,0.09398 0.364164,0.130299 0.349638,0.165367 0.331747,0.198841 0.310659,0.230401 0.28658,0.259741 0.25974,0.28658 0.230401,0.310659 0.198841,0.331746 0.165367,0.349639 0.1303,0.364163 0.09398,0.375182 0.05675,0.382587 0.01898,0.386307 -0.01898,0.386307 -0.05675,0.382587 -0.09398,0.375182 -0.1303,0.364164 -0.165367,0.349639 -0.198841,0.331746 -0.230401,0.310659 z"
+     transform="matrix(0,0.95,-0.95,0,47.806603,1.7010613)" />
+  <path
+     style="fill:#ffffff;stroke:none;stroke-width:0.84130847px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="m 9.0513062,23.758841 c -1.5224694,5.64797 0.8106772,8.495757 4.4978728,9.890942 l 0.420654,-0.673047 C 8.3833763,30.233472 9.3915535,25.423457 9.2978739,24.11563 9.2827431,23.904424 9.150848,23.762548 9.0513062,23.758841 Z"
+     id="path5359"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccsc" />
+  <path
+     style="fill:#ffffff;stroke-width:0.76650214"
+     d="m 19.617688,23.128129 c -0.279006,-0.14257 -0.415444,-0.213854 -0.415444,-0.213854 -0.382484,-0.149468 -0.499759,-0.428474 -0.363322,-0.83702 0.149468,-0.376353 0.441505,-0.505892 0.876112,-0.376353 1.492379,0.544983 2.524858,1.548334 3.096668,3.004688 0.09045,0.415444 -0.05825,0.700584 -0.454535,0.85695 -0.395515,0.123407 -0.662258,-0.01303 -0.797928,-0.421577 -0.104246,-0.213853 -0.17553,-0.357189 -0.226886,-0.415443 -0.142569,0.110376 -0.324229,0.187793 -0.551881,0.226883 -0.774167,0.123407 -1.226403,-0.213853 -1.34981,-1.025579 -0.03909,-0.279006 0.02606,-0.544983 0.188559,-0.797929"
+     id="path3879"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:none;stroke:#ffffff;stroke-width:1.29790962;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     d="m 24.329544,34.771886 c 1.291628,-3.108895 2.461658,-6.045308 2.10449,-9.095101 -0.177235,-1.513395 -0.549622,-2.056607 -0.199499,-3.345737 0.44569,-1.640989 1.539073,-3.115915 2.735886,-4.344174"
+     id="path7508"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cssc" />
+  <path
+     style="fill:none;stroke:#ffffff;stroke-width:1.29790962;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     d="m 18.525608,34.64224 c 0.830395,-0.939643 0.643587,-0.695011 1.204359,-1.891915"
+     id="path7512"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cc" />
+  <path
+     sodipodi:type="star"
+     style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60862446;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+     id="path14581"
+     sodipodi:sides="64"
+     sodipodi:cx="25.120873"
+     sodipodi:cy="6.1821945"
+     sodipodi:r1="3.7441592"
+     sodipodi:r2="3.7396493"
+     sodipodi:arg1="0.78539816"
+     sodipodi:arg2="0.83448555"
+     inkscape:flatsided="true"
+     inkscape:rounded="0"
+     inkscape:randomized="0"
+     d="M 27.768393,8.8297151 27.496142,9.0764689 27.201016,9.2953493 26.885857,9.4842483 26.5537,9.6413468 26.207745,9.7651317 25.851322,9.854411 25.487864,9.9083248 25.120873,9.9263539 24.753881,9.9083248 24.390423,9.854411 24.034,9.7651317 23.688045,9.6413468 23.355888,9.4842484 23.040729,9.2953493 22.745603,9.0764689 22.473352,8.8297151 22.226598,8.5574642 22.007718,8.2623381 21.818819,7.9471792 21.66172,7.6150224 21.537936,7.2690668 21.448656,6.912644 l -0.05391,-0.3634575 -0.01803,-0.3669918 0.01803,-0.3669918 0.05391,-0.3634574 0.08928,-0.3564228 0.123784,-0.3459557 0.157099,-0.3321567 0.188899,-0.315159 0.21888,-0.295126 0.246754,-0.272251 0.272251,-0.2467538 0.295126,-0.2188804 0.315159,-0.188899 0.332157,-0.1570985 0.345955,-0.1237849 0.356423,-0.089279 0.363458,-0.053914 0.366991,-0.018029 0.366992,0.018029 0.363458,0.053914 0.356423,0.089279 0.345955,0.1237849 0.332157,0.1570985 0.315159,0.188899 0.295126,0.2188804 0.272251,0.2467538 0.246754,0.2722509 0.21888,0.2951261 0.188899,0.315159 0.157099,0.3321567 0.123784,0.3459556 0.08928,0.3564229 0.05391,0.3634574 0.01803,0.3669918 -0.01803,0.3669918 -0.05391,0.3634574 -0.08928,0.3564228 -0.123784,0.3459557 -0.157099,0.3321567 -0.188899,0.315159 -0.21888,0.2951261 z" />
+  <path
+     d="m 27.768393,46.58325 -0.272251,0.246754 -0.295126,0.218881 -0.315159,0.188899 -0.332157,0.157098 -0.345955,0.123785 -0.356423,0.08928 -0.363458,0.05391 -0.366991,0.01803 -0.366992,-0.01803 -0.363458,-0.05391 -0.356423,-0.08928 -0.345955,-0.123785 -0.332157,-0.157098 -0.315159,-0.188899 -0.295126,-0.218881 -0.272251,-0.246754 -0.246754,-0.272251 -0.21888,-0.295126 -0.188899,-0.315159 -0.157099,-0.332156 -0.123784,-0.345956 -0.08928,-0.356423 -0.05391,-0.363457 -0.01803,-0.366992 0.01803,-0.366992 0.05391,-0.363457 0.08928,-0.356423 0.123784,-0.345956 0.157099,-0.332156 0.188899,-0.315159 0.21888,-0.295126 0.246754,-0.272251 0.272251,-0.246754 0.295126,-0.218881 0.315159,-0.188899 0.332157,-0.157098 0.345955,-0.123785 0.356423,-0.08928 0.363458,-0.05391 0.366991,-0.01803 0.366992,0.01803 0.363458,0.05391 0.356423,0.08928 0.345955,0.123785 0.332157,0.157098 0.315159,0.188899 0.295126,0.218881 0.272251,0.246754 0.246754,0.272251 0.21888,0.295126 0.188899,0.315159 0.157099,0.332156 0.123784,0.345956 0.08928,0.356423 0.05391,0.363457 0.01803,0.366992 -0.01803,0.366992 -0.05391,0.363457 -0.08928,0.356423 -0.123784,0.345956 -0.157099,0.332156 -0.188899,0.315159 -0.21888,0.295126 z"
+     inkscape:randomized="0"
+     inkscape:rounded="0"
+     inkscape:flatsided="true"
+     sodipodi:arg2="0.83448555"
+     sodipodi:arg1="0.78539816"
+     sodipodi:r2="3.7396493"
+     sodipodi:r1="3.7441592"
+     sodipodi:cy="43.935729"
+     sodipodi:cx="25.120873"
+     sodipodi:sides="64"
+     id="path14583"
+     style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60862446;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+     sodipodi:type="star" />
+  <path
+     d="M 27.786864,7.5038459 27.500284,7.7635868 27.189625,7.9939873 26.857878,8.1928283 26.50824,8.3581951 26.144076,8.488495 25.768894,8.5824732 25.386307,8.6392246 25,8.6582026 24.613693,8.6392246 24.231106,8.5824732 23.855924,8.488495 23.49176,8.3581951 23.142122,8.1928283 22.810375,7.9939873 22.499716,7.7635869 22.213136,7.503846 21.953396,7.2172661 21.722995,6.906607 21.524154,6.5748608 21.358787,6.2252221 l -0.1303,-0.3641639 -0.09398,-0.3751819 -0.05675,-0.3825868 -0.01898,-0.3863071 0.01898,-0.3863072 0.05675,-0.3825868 0.09398,-0.3751819 0.1303,-0.3641638 0.165367,-0.3496387 0.198841,-0.3317463 0.230401,-0.310659 0.25974,-0.2865799 0.28658,-0.2597409 0.310659,-0.2304004 0.331747,-0.1988411 0.349638,-0.1653668 0.364164,-0.13029989 0.375182,-0.0939782 0.382587,-0.0567514 L 25,0.77576208 l 0.386307,0.018978 0.382587,0.0567514 0.375182,0.0939782 0.364164,0.1302999 0.349638,0.1653668 0.331747,0.1988411 0.310659,0.2304004 0.28658,0.2597409 0.25974,0.2865799 0.230401,0.310659 0.198841,0.3317463 0.165367,0.3496386 0.1303,0.3641639 0.09398,0.3751819 0.05675,0.3825868 0.01898,0.3863072 -0.01898,0.3863071 -0.05675,0.3825868 -0.09398,0.3751819 -0.1303,0.3641639 -0.165367,0.3496386 -0.198841,0.3317463 -0.230401,0.310659 z"
+     inkscape:randomized="0"
+     inkscape:rounded="0"
+     inkscape:flatsided="true"
+     sodipodi:arg2="0.83448555"
+     sodipodi:arg1="0.78539816"
+     sodipodi:r2="3.9364729"
+     sodipodi:r1="3.9412203"
+     sodipodi:cy="4.7169824"
+     sodipodi:cx="25"
+     sodipodi:sides="64"
+     id="path14585"
+     style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+     sodipodi:type="star"
+     transform="matrix(0,0.95,-0.95,0,49.262972,1.7010613)" />
+</svg>
diff --git a/client/public/images/pieces/Cwda/bg.svg b/client/public/images/pieces/Cwda/bg.svg
new file mode 100644 (file)
index 0000000..899f480
--- /dev/null
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="100%"
+   width="100%"
+   version="1.1"
+   viewBox="0 0 2048 2048"
+   id="svg16"
+   sodipodi:docname="br.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+  <metadata
+     id="metadata22">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs20" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="960"
+     inkscape:window-height="1060"
+     id="namedview18"
+     showgrid="false"
+     inkscape:zoom="0.43115234"
+     inkscape:cx="1024"
+     inkscape:cy="1024"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg16" />
+  <path
+     style="color:#000000"
+     d="m 1161,1706 h 170 v 137 h 274 V 1468 L 1383,1297 V 819 L 1553,649 V 444 h 153 V 205 H 341 v 239 h 153 v 205 l 171,170 v 478 l -222,171 v 375 h 273 v -137 h 171 v 137 h 274 z M 564,460 V 358 h 920 v 102 z m 460,1092 H 512 v -46 l 73,-55 h 879 l 71,55 v 46 z m 0,-169 H 674 l 60,-47 v -57 h 580 v 57 l 60,47 z m 0,-546 H 734 v -46 l -60,-58 h 700 l -60,58 v 46 z m 0,-172 H 610 l -46,-43 v -58 h 920 v 58 l -46,43 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#000000"
+     id="path2" />
+  <g
+     fill-rule="nonzero"
+     fill="#ffffff"
+     id="g14"
+     transform="matrix(1,0,0,-1,0,2048)">
+    <path
+       style="color:#000000"
+       d="m 564,1588 v 102 h 920 v -102 z"
+       display="block"
+       id="path4" />
+    <path
+       style="color:#000000"
+       d="M 1024,496 H 512 v 46 l 73,55 h 879 l 71,-55 v -46 z"
+       display="block"
+       id="path6" />
+    <path
+       style="color:#000000"
+       d="M 1024,665 H 674 l 60,47 v 57 h 580 v -57 l 60,-47 z"
+       display="block"
+       id="path8" />
+    <path
+       style="color:#000000"
+       d="M 1024,1211 H 734 v 46 l -60,58 h 700 l -60,-58 v -46 z"
+       display="block"
+       id="path10" />
+    <path
+       style="color:#000000"
+       d="M 1024,1383 H 610 l -46,43 v 58 h 920 v -58 l -46,-43 z"
+       display="block"
+       id="path12" />
+  </g>
+</svg>
index 9d51bfc..1b09643 100644 (file)
@@ -5,32 +5,28 @@
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="177.17"
-   height="177.17"
-   shape-rendering="geometricPrecision"
-   image-rendering="optimizeQuality"
-   fill-rule="evenodd"
-   clip-rule="evenodd"
-   viewBox="0 0 50 50"
+   height="100%"
+   width="100%"
    version="1.1"
    version="1.1"
-   id="svg974"
-   sodipodi:docname="ba.svg"
-   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+   viewBox="0 0 2048 2048"
+   id="svg16"
+   sodipodi:docname="bh.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
   <metadata
   <metadata
-     id="metadata978">
+     id="metadata22">
     <rdf:RDF>
       <cc:Work
          rdf:about="">
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
     <rdf:RDF>
       <cc:Work
          rdf:about="">
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
       </cc:Work>
     </rdf:RDF>
   </metadata>
       </cc:Work>
     </rdf:RDF>
   </metadata>
+  <defs
+     id="defs20" />
   <sodipodi:namedview
      pagecolor="#ffffff"
      bordercolor="#666666"
   <sodipodi:namedview
      pagecolor="#ffffff"
      bordercolor="#666666"
      guidetolerance="10"
      inkscape:pageopacity="0"
      inkscape:pageshadow="2"
      guidetolerance="10"
      inkscape:pageopacity="0"
      inkscape:pageshadow="2"
-     inkscape:window-width="1920"
+     inkscape:window-width="960"
      inkscape:window-height="1060"
      inkscape:window-height="1060"
-     id="namedview976"
+     id="namedview18"
      showgrid="false"
      showgrid="false"
-     inkscape:zoom="2.3931818"
-     inkscape:cx="11.490991"
-     inkscape:cy="50.539966"
+     inkscape:zoom="0.43115234"
+     inkscape:cx="1024"
+     inkscape:cy="1024"
      inkscape:window-x="0"
      inkscape:window-y="20"
      inkscape:window-maximized="0"
      inkscape:window-x="0"
      inkscape:window-y="20"
      inkscape:window-maximized="0"
-     inkscape:current-layer="svg974"
-     showguides="false"
-     inkscape:snap-nodes="false" />
-  <defs
-     id="defs968">
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient1002">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1"
-         offset="0"
-         id="stop998" />
-      <stop
-         style="stop-color:#dcdbdb;stop-opacity:1"
-         offset="1"
-         id="stop1000" />
-    </linearGradient>
-    <linearGradient
-       id="0"
-       x1="21.376"
-       x2="77.64"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         stop-color="#fff"
-         id="stop963" />
-      <stop
-         offset="1"
-         stop-color="#fff"
-         stop-opacity="0"
-         id="stop965" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient1002"
-       id="linearGradient1004"
-       x1="-41.790333"
-       y1="22.581646"
-       x2="-15.82877"
-       y2="22.581646"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       id="linearGradient5398"
-       x1="0"
-       y1="0"
-       x2="0"
-       y2="1">
-      <stop
-         offset="20%"
-         style="stop-color:#000000;stop-opacity:1"
-         id="stop5394" />
-      <stop
-         offset="100%"
-         style="stop-color:#4d4d4d;stop-opacity:1"
-         id="stop5396" />
-    </linearGradient>
-    <linearGradient
-       gradientTransform="translate(0.47111842,-0.19973575)"
-       id="0-1"
-       x1="21.253"
-       y1="37.591999"
-       x2="77.639999"
-       y2="37.469002"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         stop-color="#fff"
-         id="stop3285" />
-      <stop
-         offset="1"
-         stop-color="#fff"
-         stop-opacity="0"
-         id="stop3287" />
-    </linearGradient>
-  </defs>
+     inkscape:current-layer="svg16"
+     inkscape:document-rotation="0" />
+  <path
+     style="color:#000000"
+     d="m 1290,564.11538 -42,102 q -102,22 -224,22 -121,0 -222,-22 l -42,-101 q 124,31 264,31 138,0 266,-32 z m -84,206 -29,70 v 27 q -76,11 -153,11 -75,0 -152,-11 l -1,-27 -27,-70 q 85,15 180,15 96,0 182,-15 z m -35,-378 q -40,30 -80,95 h -32 q 0,-49 23,-95 z m -206,0 q 23,49 23,95 h -32 q -39,-64 -81,-95 z m 59,-18 q -14,-57 -34,-79 -20,-22 -53,-46 -36,-25 -85,-42 -49,-17 -109,-9 l -281,39 q -17,2 -30,0 -13,-2 -26,-2 -21,0 -53,-9 -32,-9 -51,-28 l -97,159 q 18,20 32,28 14,8 33,17 58,27 124,33 28,2 55,1 27,-1 56,2 54,-9 108,-16 54,-7 110,-16 60,0 81,12 11,6 35,22 24,16 48,47 -53,6 -108,20 -55,14 -97,31 l 104,258 q -78,45 -109,72 -31,27 -49,64 -26,46 -33,89.00002 -7,43 -7,77 1,60 28,132 27,72 104,130 63,48 123,99 60,51 119,119 -74,38 -74,121 0,56 39,96 39,40 97,40 56,0 96,-40 40,-40 40,-96 0,-82 -74,-121 58,-68 117,-119 59,-51 125,-99 75,-57 102,-129 27,-72 29,-133 0,-34 -7,-77 -7,-43.00002 -32,-89.00002 -20,-36 -50,-63 -30,-27 -108,-73 l 104,-258 q -44,-16 -99,-30 -55,-14 -106,-21 23,-31 47,-47 24,-16 36,-22 21,-12 81,-12 54,8 108,15 54,7 110,17 27,-3 54,-2 27,1 57,-1 64,-6 124,-33 18,-9 32,-17 14,-8 33,-28 l -98,-159 q -18,18 -50,27 -32,9 -53,10 -13,0 -26,2 -13,2 -31,0 l -280,-39 q -60,-9 -111,8 -51,17 -85,45 -33,27 -52,46 -19,19 -33,77 z m -37,744.00002 v -85 q 0,-37.00002 37,-37.00002 37,0 37,37.00002 v 86 h 90 q 35,0 35,36 0,36 -35,36 h -90 v 90 q 0,37 -37,37 -37,0 -37,-37 v -90 h -88 q -35,0 -35,-36 0,-36 35,-36 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#000000"
+     id="path2" />
   <g
   <g
-     id="g5357"
-     style="opacity:1;fill:#1f1a17;fill-opacity:1"
-     transform="matrix(0.84130849,0,0,0.84130849,-76.526422,18.776438)">
+     fill-rule="nonzero"
+     fill="#ffffff"
+     id="g14"
+     transform="matrix(1,0,0,-1,0,2030.1154)">
     <path
     <path
-       sodipodi:nodetypes="cccccccccccccccsccsc"
-       inkscape:connector-curvature="0"
-       id="path5349"
-       d="m 119.66608,20.578823 c 0.12511,0.773672 0.40427,1.44388 1.3,1.7 11.23011,-0.424319 16.82956,-5.233235 20.30001,-11.7 l 0.2,-2.099999 c -2.10707,-8.89280401 -8.15113,-13.4502442 -16.2,-15.8 -4.40015,-0.5317426 -7.59668,1.3815851 -10.20001,4.5 -2.59354,2.64077835 -4.39616,5.9439949 -5.3,10 -0.9084,3.60641 -5.79067,1.6990508 -4.9,-0.6 2.76583,-4.0566968 11.00069,-10.7605086 4.9,-12.3 -8.75831,-2.0518262 -7.05798,4.7061225 -5.2,6.20000004 1.23982,-0.5457366 2.00197,-1.22280981 2.4,-2.00000004 -0.25951,-0.4357328 -0.98217,-0.8162564 0,-1.4 0.5387,0.045976 0.81918,0.2856122 1,0.6 0,1 0.50403,1.1455069 -3.6,4 -7.640521,5.2325602 -3.73403,16.328533 2.94302,17.405035 2.93812,0.458135 3.4042,1.08673 5.28907,0.933469 0.49515,-0.04026 1.25166,0.522864 1.96791,0.561495 0.84449,-0.337075 4.5865,-0.641651 3.83596,-0.600198 0.37015,0.007 0.83701,-0.226033 1.09094,-0.03707 0.11828,0.08802 0.12726,0.435864 0.1731,0.637268 z"
-       style="fill:#1f1a17;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+       style="color:#000000"
+       d="m 1290,1466 -42,-102 q -102,-22 -224,-22 -121,0 -222,22 l -42,101 q 124,-31 264,-31 138,0 266,32 z"
+       display="block"
+       id="path4" />
     <path
     <path
-       sodipodi:nodetypes="ccccc"
-       inkscape:connector-curvature="0"
-       id="path5353"
-       d="m 109.56608,17.578823 c -1.32838,4.066443 -4.04985,6.321863 -6.6,8.8 -0.20576,0.304421 0.14574,0.397532 1,0.3 3.90473,-1.863513 6.85963,-4.360243 8.1,-8 -0.78642,-0.41302 -1.31194,-1.08384 -2.5,-1.1 z"
-       style="fill:#1f1a17;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-  </g>
-  <g
-     id="g14577"
-     transform="matrix(0.95,0,0,0.95,1.3708726,1.7010613)">
-    <rect
-       y="4.245285"
-       x="23.113207"
-       height="40.212261"
-       width="3.7735846"
-       id="rect14571"
-       style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
-    <rect
-       transform="rotate(90)"
-       style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.84308159;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
-       id="rect14573"
-       width="3.7735846"
-       height="47.641506"
-       x="23.231133"
-       y="-48.820751" />
+       style="color:#000000"
+       d="m 1206,1260 -29,-70 v -27 q -76,-11 -153,-11 -75,0 -152,11 l -1,27 -27,70 q 85,-15 180,-15 96,0 182,15 z"
+       display="block"
+       id="path6" />
+    <path
+       style="color:#000000"
+       d="m 1171,1638 q -40,-30 -80,-95 h -32 q 0,49 23,95 z"
+       display="block"
+       id="path8" />
+    <path
+       style="color:#000000"
+       d="m 965,1638 q 23,-49 23,-95 h -32 q -39,64 -81,95 z"
+       display="block"
+       id="path10" />
+    <path
+       style="color:#000000"
+       d="m 987,912 v 85 q 0,37 37,37 37,0 37,-37 v -86 h 90 q 35,0 35,-36 0,-36 -35,-36 h -90 v -90 q 0,-37 -37,-37 -37,0 -37,37 v 90 h -88 q -35,0 -35,36 0,36 35,36 z"
+       display="block"
+       id="path12" />
   </g>
   <path
   </g>
   <path
-     sodipodi:type="star"
-     style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
-     id="path14587"
-     sodipodi:sides="64"
-     sodipodi:cx="25"
-     sodipodi:cy="44.457546"
-     sodipodi:r1="3.9412203"
-     sodipodi:r2="3.9364729"
-     sodipodi:arg1="0.78539816"
-     sodipodi:arg2="0.83448555"
-     inkscape:flatsided="true"
-     inkscape:rounded="0"
-     inkscape:randomized="0"
-     d="m 27.786864,47.24441 -0.28658,0.259741 -0.310659,0.2304 -0.331747,0.198841 -0.349638,0.165367 -0.364164,0.1303 -0.375182,0.09398 -0.382587,0.05675 L 25,48.398767 l -0.386307,-0.01898 -0.382587,-0.05675 -0.375182,-0.09398 -0.364164,-0.1303 -0.349638,-0.165367 -0.331747,-0.198841 -0.310659,-0.2304 -0.28658,-0.259741 -0.25974,-0.28658 -0.230401,-0.310659 -0.198841,-0.331746 -0.165367,-0.349639 -0.1303,-0.364164 -0.09398,-0.375182 -0.05675,-0.382587 -0.01898,-0.386307 0.01898,-0.386307 0.05675,-0.382587 0.09398,-0.375182 0.1303,-0.364163 0.165367,-0.349639 0.198841,-0.331746 0.230401,-0.310659 0.25974,-0.28658 0.28658,-0.259741 0.310659,-0.230401 0.331747,-0.198841 0.349638,-0.165367 0.364164,-0.130299 0.375182,-0.09398 0.382587,-0.05675 L 25,40.516326 l 0.386307,0.01898 0.382587,0.05675 0.375182,0.09398 0.364164,0.130299 0.349638,0.165367 0.331747,0.198841 0.310659,0.230401 0.28658,0.259741 0.25974,0.28658 0.230401,0.310659 0.198841,0.331746 0.165367,0.349639 0.1303,0.364163 0.09398,0.375182 0.05675,0.382587 0.01898,0.386307 -0.01898,0.386307 -0.05675,0.382587 -0.09398,0.375182 -0.1303,0.364164 -0.165367,0.349639 -0.198841,0.331746 -0.230401,0.310659 z"
-     transform="matrix(0,0.95,-0.95,0,47.806603,1.7010613)" />
-  <path
-     style="fill:#ffffff;stroke:none;stroke-width:0.84130847px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     d="m 9.0513062,23.758841 c -1.5224694,5.64797 0.8106772,8.495757 4.4978728,9.890942 l 0.420654,-0.673047 C 8.3833763,30.233472 9.3915535,25.423457 9.2978739,24.11563 9.2827431,23.904424 9.150848,23.762548 9.0513062,23.758841 Z"
-     id="path5359"
-     inkscape:connector-curvature="0"
-     sodipodi:nodetypes="cccsc" />
-  <path
-     style="fill:#ffffff;stroke-width:0.76650214"
-     d="m 19.617688,23.128129 c -0.279006,-0.14257 -0.415444,-0.213854 -0.415444,-0.213854 -0.382484,-0.149468 -0.499759,-0.428474 -0.363322,-0.83702 0.149468,-0.376353 0.441505,-0.505892 0.876112,-0.376353 1.492379,0.544983 2.524858,1.548334 3.096668,3.004688 0.09045,0.415444 -0.05825,0.700584 -0.454535,0.85695 -0.395515,0.123407 -0.662258,-0.01303 -0.797928,-0.421577 -0.104246,-0.213853 -0.17553,-0.357189 -0.226886,-0.415443 -0.142569,0.110376 -0.324229,0.187793 -0.551881,0.226883 -0.774167,0.123407 -1.226403,-0.213853 -1.34981,-1.025579 -0.03909,-0.279006 0.02606,-0.544983 0.188559,-0.797929"
-     id="path3879"
-     inkscape:connector-curvature="0" />
-  <path
-     style="fill:none;stroke:#ffffff;stroke-width:1.29790962;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-     d="m 24.329544,34.771886 c 1.291628,-3.108895 2.461658,-6.045308 2.10449,-9.095101 -0.177235,-1.513395 -0.549622,-2.056607 -0.199499,-3.345737 0.44569,-1.640989 1.539073,-3.115915 2.735886,-4.344174"
-     id="path7508"
-     inkscape:connector-curvature="0"
-     sodipodi:nodetypes="cssc" />
-  <path
-     style="fill:none;stroke:#ffffff;stroke-width:1.29790962;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-     d="m 18.525608,34.64224 c 0.830395,-0.939643 0.643587,-0.695011 1.204359,-1.891915"
-     id="path7512"
-     inkscape:connector-curvature="0"
-     sodipodi:nodetypes="cc" />
-  <path
-     sodipodi:type="star"
-     style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60862446;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
-     id="path14581"
-     sodipodi:sides="64"
-     sodipodi:cx="25.120873"
-     sodipodi:cy="6.1821945"
-     sodipodi:r1="3.7441592"
-     sodipodi:r2="3.7396493"
-     sodipodi:arg1="0.78539816"
-     sodipodi:arg2="0.83448555"
-     inkscape:flatsided="true"
-     inkscape:rounded="0"
-     inkscape:randomized="0"
-     d="M 27.768393,8.8297151 27.496142,9.0764689 27.201016,9.2953493 26.885857,9.4842483 26.5537,9.6413468 26.207745,9.7651317 25.851322,9.854411 25.487864,9.9083248 25.120873,9.9263539 24.753881,9.9083248 24.390423,9.854411 24.034,9.7651317 23.688045,9.6413468 23.355888,9.4842484 23.040729,9.2953493 22.745603,9.0764689 22.473352,8.8297151 22.226598,8.5574642 22.007718,8.2623381 21.818819,7.9471792 21.66172,7.6150224 21.537936,7.2690668 21.448656,6.912644 l -0.05391,-0.3634575 -0.01803,-0.3669918 0.01803,-0.3669918 0.05391,-0.3634574 0.08928,-0.3564228 0.123784,-0.3459557 0.157099,-0.3321567 0.188899,-0.315159 0.21888,-0.295126 0.246754,-0.272251 0.272251,-0.2467538 0.295126,-0.2188804 0.315159,-0.188899 0.332157,-0.1570985 0.345955,-0.1237849 0.356423,-0.089279 0.363458,-0.053914 0.366991,-0.018029 0.366992,0.018029 0.363458,0.053914 0.356423,0.089279 0.345955,0.1237849 0.332157,0.1570985 0.315159,0.188899 0.295126,0.2188804 0.272251,0.2467538 0.246754,0.2722509 0.21888,0.2951261 0.188899,0.315159 0.157099,0.3321567 0.123784,0.3459556 0.08928,0.3564229 0.05391,0.3634574 0.01803,0.3669918 -0.01803,0.3669918 -0.05391,0.3634574 -0.08928,0.3564228 -0.123784,0.3459557 -0.157099,0.3321567 -0.188899,0.315159 -0.21888,0.2951261 z" />
-  <path
-     d="m 27.768393,46.58325 -0.272251,0.246754 -0.295126,0.218881 -0.315159,0.188899 -0.332157,0.157098 -0.345955,0.123785 -0.356423,0.08928 -0.363458,0.05391 -0.366991,0.01803 -0.366992,-0.01803 -0.363458,-0.05391 -0.356423,-0.08928 -0.345955,-0.123785 -0.332157,-0.157098 -0.315159,-0.188899 -0.295126,-0.218881 -0.272251,-0.246754 -0.246754,-0.272251 -0.21888,-0.295126 -0.188899,-0.315159 -0.157099,-0.332156 -0.123784,-0.345956 -0.08928,-0.356423 -0.05391,-0.363457 -0.01803,-0.366992 0.01803,-0.366992 0.05391,-0.363457 0.08928,-0.356423 0.123784,-0.345956 0.157099,-0.332156 0.188899,-0.315159 0.21888,-0.295126 0.246754,-0.272251 0.272251,-0.246754 0.295126,-0.218881 0.315159,-0.188899 0.332157,-0.157098 0.345955,-0.123785 0.356423,-0.08928 0.363458,-0.05391 0.366991,-0.01803 0.366992,0.01803 0.363458,0.05391 0.356423,0.08928 0.345955,0.123785 0.332157,0.157098 0.315159,0.188899 0.295126,0.218881 0.272251,0.246754 0.246754,0.272251 0.21888,0.295126 0.188899,0.315159 0.157099,0.332156 0.123784,0.345956 0.08928,0.356423 0.05391,0.363457 0.01803,0.366992 -0.01803,0.366992 -0.05391,0.363457 -0.08928,0.356423 -0.123784,0.345956 -0.157099,0.332156 -0.188899,0.315159 -0.21888,0.295126 z"
-     inkscape:randomized="0"
-     inkscape:rounded="0"
-     inkscape:flatsided="true"
-     sodipodi:arg2="0.83448555"
-     sodipodi:arg1="0.78539816"
-     sodipodi:r2="3.7396493"
-     sodipodi:r1="3.7441592"
-     sodipodi:cy="43.935729"
-     sodipodi:cx="25.120873"
-     sodipodi:sides="64"
-     id="path14583"
-     style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60862446;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
-     sodipodi:type="star" />
-  <path
-     d="M 27.786864,7.5038459 27.500284,7.7635868 27.189625,7.9939873 26.857878,8.1928283 26.50824,8.3581951 26.144076,8.488495 25.768894,8.5824732 25.386307,8.6392246 25,8.6582026 24.613693,8.6392246 24.231106,8.5824732 23.855924,8.488495 23.49176,8.3581951 23.142122,8.1928283 22.810375,7.9939873 22.499716,7.7635869 22.213136,7.503846 21.953396,7.2172661 21.722995,6.906607 21.524154,6.5748608 21.358787,6.2252221 l -0.1303,-0.3641639 -0.09398,-0.3751819 -0.05675,-0.3825868 -0.01898,-0.3863071 0.01898,-0.3863072 0.05675,-0.3825868 0.09398,-0.3751819 0.1303,-0.3641638 0.165367,-0.3496387 0.198841,-0.3317463 0.230401,-0.310659 0.25974,-0.2865799 0.28658,-0.2597409 0.310659,-0.2304004 0.331747,-0.1988411 0.349638,-0.1653668 0.364164,-0.13029989 0.375182,-0.0939782 0.382587,-0.0567514 L 25,0.77576208 l 0.386307,0.018978 0.382587,0.0567514 0.375182,0.0939782 0.364164,0.1302999 0.349638,0.1653668 0.331747,0.1988411 0.310659,0.2304004 0.28658,0.2597409 0.25974,0.2865799 0.230401,0.310659 0.198841,0.3317463 0.165367,0.3496386 0.1303,0.3641639 0.09398,0.3751819 0.05675,0.3825868 0.01898,0.3863072 -0.01898,0.3863071 -0.05675,0.3825868 -0.09398,0.3751819 -0.1303,0.3641639 -0.165367,0.3496386 -0.198841,0.3317463 -0.230401,0.310659 z"
-     inkscape:randomized="0"
-     inkscape:rounded="0"
-     inkscape:flatsided="true"
-     sodipodi:arg2="0.83448555"
-     sodipodi:arg1="0.78539816"
-     sodipodi:r2="3.9364729"
-     sodipodi:r1="3.9412203"
-     sodipodi:cy="4.7169824"
-     sodipodi:cx="25"
-     sodipodi:sides="64"
-     id="path14585"
-     style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
-     sodipodi:type="star"
-     transform="matrix(0,0.95,-0.95,0,49.262972,1.7010613)" />
+     style="fill:#b22222;stroke:#000000;stroke-width:2.31937"
+     d="m 1001.38,1832.1886 c -39.68505,-7.0772 -75.02345,-32.2286 -95.45407,-67.9376 -21.25638,-37.1523 -21.37604,-95.589 -0.27125,-132.4764 10.89005,-19.0338 28.95274,-35.9683 54.63044,-51.2181 3.55589,-2.1118 1.04506,-5.7062 -20.2524,-28.9921 -50.29807,-54.9942 -97.8562,-97.4176 -195.5163,-174.4069 -87.07894,-68.6477 -111.49189,-99.4061 -134.423,-169.3621 -16.51279,-50.3757 -18.66368,-63.721 -18.59505,-115.3741 0.0893,-67.2689 7.39393,-100.6648 32.85312,-150.20221 16.66889,-32.43355 29.18938,-49.76489 49.60848,-68.66983 16.97168,-15.7132 59.87612,-45.4002 94.37803,-65.30335 14.17854,-8.1792 18.85707,-12.03593 17.9341,-14.78394 -0.68681,-2.04487 -24.01181,-60.07851 -51.83335,-128.96367 l -50.5846,-125.24576 16.41494,-6.45924 c 39.09328,-15.38313 130.21966,-37.87882 171.23265,-42.27093 9.6404,-1.0324 15.65568,-2.7395 15.65568,-4.443 0,-1.52153 -7.56693,-10.6712 -16.81541,-20.33259 -19.1029,-19.9558 -61.04944,-48.64292 -79.43827,-54.32763 -6.66732,-2.06114 -24.41356,-4.0735 -41.74859,-4.73415 -28.19458,-1.07451 -36.55024,-0.20503 -128.7248,13.39503 -93.59186,13.80918 -101.09295,14.57798 -148.43941,15.21422 -98.33847,1.32144 -147.21685,-7.96129 -212.72091,-40.39887 -23.00263,-11.39089 -51.6868,-32.1845 -51.6868,-37.46858 0,-1.49762 91.60139,-152.92249 93.89453,-155.21563 0.49214,-0.49214 4.39946,1.77833 8.68293,5.04549 22.28363,16.99655 56.26452,26.27892 108.48483,29.63419 l 38.26954,2.45891 142.641,-20.12454 c 78.45254,-11.06849 154.24877,-20.70398 168.43603,-21.4122 46.32015,-2.31227 77.51576,5.06583 129.60247,30.65239 32.09237,15.76473 69.95855,43.51679 89.19581,65.37148 11.95072,13.57673 23.72853,37.63867 30.73723,62.79563 2.922,10.48828 5.8346,19.0696 6.4724,19.0696 0.6378,0 3.5449,-8.60275 6.4601,-19.1172 7.0485,-25.42218 16.5664,-45.32961 27.4913,-57.49997 14.8169,-16.5062 58.7505,-52.93964 78.4984,-65.09752 22.2312,-13.68671 58.3527,-28.14897 82.859,-33.17492 35.1123,-7.20112 57.7897,-5.40822 220.995,17.47216 l 150.7811,21.13857 35.9502,-2.44678 c 50.8848,-3.46323 89.8636,-14.2889 111.0223,-30.83448 3.0202,-2.36168 6.2932,-3.79831 7.2734,-3.19251 2.0752,1.28251 91.876,146.89376 93.9911,152.40582 3.4151,8.89962 -46.0577,40.38553 -88.6416,56.41408 -44.685,16.81937 -78.6753,22.07964 -150.827,23.34172 -53.2544,0.93153 -64.2086,0.48997 -88.1359,-3.55273 -15.0278,-2.53906 -62.2877,-9.44518 -105.022,-15.34693 -69.0316,-9.53349 -81.0622,-10.6087 -107.8506,-9.63896 -36.1015,1.30687 -47.646,4.70954 -76.7848,22.63183 -20.8229,12.80749 -61.2174,50.03607 -61.2174,56.41945 0,2.19345 4.274,3.75304 13.3363,4.86642 36.1666,4.44335 98.9431,19.40032 152.7622,36.3967 l 37.3736,11.80281 -51.878,128.80464 c -28.5329,70.84254 -51.6134,129.03578 -51.2899,129.3183 0.3235,0.2825 16.2751,10.318 35.4481,22.30112 74.2055,46.37853 101.6667,73.47477 128.4234,126.71691 21.9093,43.59628 31.3835,87.89135 31.3542,146.59065 -0.021,40.3905 -3.1992,60.6357 -16.3442,104.085 -23.24,76.8169 -55.4753,119.547 -135.385,179.4618 -77.8737,58.3883 -137.634,110.836 -184.6502,162.0553 -40.2461,43.844 -38.1758,39.2708 -22.2329,49.1113 76.8351,47.4253 81.6693,160.2541 9.3166,217.4456 -29.577,23.3793 -70.0827,33.9595 -105.6968,27.6083 z m 45.7354,-518.2274 c 12.6126,-6.5222 13.9945,-13.504 13.9945,-70.7066 v -51.1006 h 49.9408 c 55.9386,0 62.6909,-1.3729 70.6067,-14.3564 3.4274,-5.6216 4.6809,-11.7147 4.6809,-22.7534 0,-11.0387 -1.2535,-17.1319 -4.6809,-22.7534 -7.9158,-12.9835 -14.6681,-14.3565 -70.6067,-14.3565 h -49.9408 v -50.683 c 0,-48.9419 -0.1821,-50.9538 -5.2989,-58.564 -12.3193,-18.32216 -51.3027,-18.32216 -63.62196,0 -5.11685,7.6102 -5.29889,9.6221 -5.29889,58.564 v 50.683 h -48.78118 c -51.87795,0 -59.17071,1.2293 -68.3468,11.5202 -3.89236,4.3653 -4.63873,8.4827 -4.63873,25.5897 0,17.1069 0.74637,21.2243 4.63873,25.5896 9.17609,10.291 16.46885,11.5202 68.3468,11.5202 h 48.78118 v 52.3009 c 0,63.2867 0.83963,65.9522 23.05825,73.2001 8.5007,2.7729 28.5065,0.7847 37.167,-3.6938 z m 49.0048,-437.40333 c 19.6517,-1.36497 45.6456,-3.71333 57.7643,-5.21857 l 22.034,-2.73681 1.4307,-15.07588 c 1.0504,-11.06845 5.1957,-23.98043 15.5944,-48.57466 7.7901,-18.42432 13.6923,-33.97027 13.116,-34.54654 -0.5763,-0.57627 -13.3342,0.67406 -28.351,2.77849 -57.619,8.07466 -77.8861,9.33354 -151.3892,9.40352 -74.58956,0.071 -100.46218,-1.51696 -154.81578,-9.50196 -14.35003,-2.10812 -26.63998,-3.28394 -27.31102,-2.6129 -0.67104,0.67104 4.68538,16.24064 11.90313,34.59911 8.97766,22.83483 13.57532,38.14144 14.55451,48.45494 l 1.4313,15.07588 24.35334,2.85716 c 63.6325,7.46543 138.19612,9.36915 199.68532,5.09822 z m 50.6165,-193.30316 c 37.4044,-4.04651 100.2599,-14.54013 102.3934,-17.0944 2.8078,-3.36162 41.8406,-100.76455 40.7978,-101.80738 -0.5934,-0.59332 -12.9199,1.55622 -27.3924,4.77678 -151.8852,33.79898 -335.38904,33.56934 -482.04212,-0.60324 -10.82831,-2.52317 -20.12444,-4.151 -20.65808,-3.61736 -0.53362,0.53364 8.46032,23.68138 19.98657,51.43941 l 20.9568,50.46914 19.41587,4.02016 c 25.04472,5.18562 81.6526,12.77725 115.66956,15.51234 39.25656,3.15638 170.953,1.22316 210.8726,-3.09545 z M 988.30167,469.98768 c -1.72408,-19.02583 -9.69945,-50.1926 -17.14436,-66.99788 l -4.88062,-11.01699 h -46.70553 -46.70551 l 13.52413,11.50307 c 16.9296,14.3996 36.36791,37.02786 54.37347,63.29648 l 13.9106,20.29445 h 17.58773 17.58775 z m 110.14763,8.38151 c 12.0271,-19.93759 37.6167,-51.694 55.1667,-68.46114 l 18.7726,-17.93524 h -45.9896 -45.9896 l -2.9633,6.37826 c -10.2625,22.08988 -18.6556,56.33199 -18.6556,76.11087 v 12.60487 h 17.2061 17.206 z"
+     id="path194" />
 </svg>
 </svg>
diff --git a/client/public/images/pieces/Cwda/bi.svg b/client/public/images/pieces/Cwda/bi.svg
new file mode 100644 (file)
index 0000000..b31c14e
--- /dev/null
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="100%"
+   width="100%"
+   version="1.1"
+   viewBox="0 0 2048 2048"
+   id="svg18"
+   sodipodi:docname="bi.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+  <metadata
+     id="metadata24">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs22" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="960"
+     inkscape:window-height="1060"
+     id="namedview20"
+     showgrid="false"
+     inkscape:zoom="0.43115234"
+     inkscape:cx="1024"
+     inkscape:cy="1024"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg18" />
+  <path
+     style="color:#000000"
+     d="m 490,643 q 4,9 13,27 17,42 17,50 -2,28 -29,28 -20,0 -47,-57 -4,-8 -12,-14 -27,-28 8,-47 32,-19 50,13 z m 590,371 q 70,92 69,205 -4,33 -38,33 -46,0 -36,-34 3,-55 -11,-91 -23,-57 -51,-85 -15,-30 18,-44 32,-15 49,16 z m -261,488 q -5,36 2,78 -60,-12 -113,-56 -32,-17 -15,-47 17,-31 47,-10 21,11 38,20 17,9 41,15 z M 1756,234 q -1,0 2,54 3,54 3,118 1,125 0,258 -1,133 -36,267 -34,128 -75,218 -41,90 -89,157 -72,108 -196,183 -124,75 -259,98 4,-23 3,-47 -1,-24 0,-46 97,-33 183,-82 86,-49 126,-106 48,-66 89,-156 41,-90 75,-219 34,-133 35,-266 1,-133 1,-259 0,-63 -3,-117 -3,-54 0,-55 z m -677,1423 q 157,-10 291,-81 134,-71 228,-182 66,-78 124,-188 58,-110 94,-233 40,-143 50,-300 10,-157 11,-292 V 163 q 0,0 -155,0 -155,0 -404,0 H 647 q -9,0 -9,49 0,49 7,79 4,24 19,68 15,44 50,107 16,32 76,93 60,61 138,143 45,46 70,116 25,70 22,127 -37,-30 -81,-49 -212,-76 -307,-220 -7,-9 -45,-81 -20,-38 -34,-52 -19,-19 -55,-21 -56,-3 -87,54 -42,-12 -75,-10 -56,21 -81,45 -51,51 -66,102 -15,51 -16,110 0,84 104,222 122,159 130,242 0,36 7,81 6,31 25,60 13,20 17,27 4,7 17,23 9,12 15,18 6,6 15,18 11,13 28,30 -53,146 -43,301 199,-71 334,-223 33,113 130,183 80,-56 127,-148 z M 404,821 q 29,20 6,48 -24,23 -53,4 -61,-40 -65,-105 1,-33 39,-31 36,3 35,37 8,32 38,47 z m 252,498 q 22,11 22,11 30,12 19,44 -12,30 -46,20 -118,-43 -163,-158 -7,-33 24,-45 31,-10 42,22 8,17 12,22 11,-9 29,-12 61,-10 71,54 3,22 -10,42 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#000000"
+     id="path2" />
+  <g
+     fill-rule="nonzero"
+     fill="#ffffff"
+     id="g16"
+     transform="matrix(1,0,0,-1,0,2008)">
+    <path
+       style="color:#000000"
+       d="m 490,1365 q 4,-9 13,-27 17,-42 17,-50 -2,-28 -29,-28 -20,0 -47,57 -4,8 -12,14 -27,28 8,47 32,19 50,-13 z"
+       display="block"
+       id="path4" />
+    <path
+       style="color:#000000"
+       d="m 1080,994 q 70,-92 69,-205 -4,-33 -38,-33 -46,0 -36,34 3,55 -11,91 -23,57 -51,85 -15,30 18,44 32,15 49,-16 z"
+       display="block"
+       id="path6" />
+    <path
+       style="color:#000000"
+       d="m 819,506 q -5,-36 2,-78 -60,12 -113,56 -32,17 -15,47 17,31 47,10 21,-11 38,-20 17,-9 41,-15 z"
+       display="block"
+       id="path8" />
+    <path
+       style="color:#000000"
+       d="m 1756,1774 q -1,0 2,-54 3,-54 3,-118 1,-125 0,-258 -1,-133 -36,-267 -34,-128 -75,-218 -41,-90 -89,-157 -72,-108 -196,-183 -124,-75 -259,-98 4,23 3,47 -1,24 0,46 97,33 183,82 86,49 126,106 48,66 89,156 41,90 75,219 34,133 35,266 1,133 1,259 0,63 -3,117 -3,54 0,55 z"
+       display="block"
+       id="path10" />
+    <path
+       style="color:#000000"
+       d="m 404,1187 q 29,-20 6,-48 -24,-23 -53,-4 -61,40 -65,105 1,33 39,31 36,-3 35,-37 8,-32 38,-47 z"
+       display="block"
+       id="path12" />
+    <path
+       style="color:#000000"
+       d="m 656,689 q 22,-11 22,-11 30,-12 19,-44 -12,-30 -46,-20 -118,43 -163,158 -7,33 24,45 31,10 42,-22 8,-17 12,-22 11,9 29,12 61,10 71,-54 3,-22 -10,-42 z"
+       display="block"
+       id="path14" />
+  </g>
+</svg>
diff --git a/client/public/images/pieces/Cwda/bl.svg b/client/public/images/pieces/Cwda/bl.svg
new file mode 100644 (file)
index 0000000..1e669b4
--- /dev/null
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="100%"
+   width="100%"
+   version="1.1"
+   viewBox="0 0 2048 2048"
+   id="svg12"
+   sodipodi:docname="bl.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+  <metadata
+     id="metadata18">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs16" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="960"
+     inkscape:window-height="1060"
+     id="namedview14"
+     showgrid="false"
+     inkscape:zoom="0.43115234"
+     inkscape:cx="1024"
+     inkscape:cy="1024"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg12" />
+  <path
+     style="color:#000000"
+     d="m 1588,765 q -83,30 -233,49 -150,19 -333,20 -178,0 -326,-18 -148,-18 -233,-49 l 50,-91 q 84,25 218,36 134,11 293,11 159,0 294,-11 135,-11 219,-37 z m 226,668 q -57,0 -97,39 -40,39 -40,97 0,56 40,96 40,40 97,41 56,0 96,-40 40,-40 40,-97 0,-57 -40,-96 -40,-39 -96,-40 z m -1578,0 q -57,0 -96,39 -39,39 -40,97 0,56 39,96 39,40 97,41 57,0 97,-40 40,-40 40,-97 0,-57 -40,-96 -40,-39 -97,-40 z m 1208,110 q -57,0 -96,39 -39,39 -40,97 0,56 39,96 39,40 97,40 57,0 97,-40 40,-40 40,-96 0,-57 -40,-96 -40,-39 -97,-40 z m -840,0 q -57,0 -97,39 -40,39 -40,97 0,56 40,96 40,40 97,40 56,0 96,-40 40,-40 40,-96 0,-57 -40,-96 -40,-39 -96,-40 z M 1640,255 q -49,-43 -220,-72 -171,-29 -394,-29 -227,0 -399,30 -172,30 -217,75 l 63,240 -28,157 -88,153 -85,622 49,19 274,-462 6,550 68,12 209,-553 112,595 h 69 l 112,-593 207,551 69,-12 6,-550 275,463 47,-22 -83,-619 -89,-153 -28,-159 z m -96,32 -30,118 q -195,45 -490,45 -292,0 -488,-45 L 504,286 q 190,58 521,58 159,0 295,-16 136,-16 224,-41 z m -26,299 q -184,51 -490,51 -308,0 -496,-52 l 15,-101 q 189,49 481,49 291,0 474,-48 z m -494,1007 q -57,0 -96,40 -39,40 -40,97 0,56 39,96 39,40 97,40 56,0 96,-40 40,-40 41,-96 0,-57 -40,-97 -40,-40 -97,-40 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#000000"
+     id="path2" />
+  <g
+     fill-rule="nonzero"
+     fill="#ffffff"
+     id="g10"
+     transform="matrix(1,0,0,-1,0,2020)">
+    <path
+       style="color:#000000"
+       d="m 1588,1255 q -83,-30 -233,-49 -150,-19 -333,-20 -178,0 -326,18 -148,18 -233,49 l 50,91 q 84,-25 218,-36 134,-11 293,-11 159,0 294,11 135,11 219,37 z"
+       display="block"
+       id="path4" />
+    <path
+       style="color:#000000"
+       d="m 1544,1733 -30,-118 q -195,-45 -490,-45 -292,0 -488,45 l -32,119 q 190,-58 521,-58 159,0 295,16 136,16 224,41 z"
+       display="block"
+       id="path6" />
+    <path
+       style="color:#000000"
+       d="m 1518,1434 q -184,-51 -490,-51 -308,0 -496,52 l 15,101 q 189,-49 481,-49 291,0 474,48 z"
+       display="block"
+       id="path8" />
+  </g>
+</svg>
diff --git a/client/public/images/pieces/Cwda/bo.svg b/client/public/images/pieces/Cwda/bo.svg
new file mode 100644 (file)
index 0000000..282d921
--- /dev/null
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="100%"
+   width="100%"
+   version="1.1"
+   viewBox="0 0 2048 2048"
+   id="svg12"
+   sodipodi:docname="bo.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+  <metadata
+     id="metadata18">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs16" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="960"
+     inkscape:window-height="1060"
+     id="namedview14"
+     showgrid="false"
+     inkscape:zoom="0.43115234"
+     inkscape:cx="1024"
+     inkscape:cy="1024"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg12"
+     inkscape:document-rotation="0" />
+  <path
+     style="color:#000000"
+     d="m 1588,765 q -83,30 -233,49 -150,19 -333,20 -178,0 -326,-18 -148,-18 -233,-49 l 50,-91 q 84,25 218,36 134,11 293,11 159,0 294,-11 135,-11 219,-37 z m 226,668 q -57,0 -97,39 -40,39 -40,97 0,56 40,96 40,40 97,41 56,0 96,-40 40,-40 40,-97 0,-57 -40,-96 -40,-39 -96,-40 z m -1578,0 q -57,0 -96,39 -39,39 -40,97 0,56 39,96 39,40 97,41 57,0 97,-40 40,-40 40,-97 0,-57 -40,-96 -40,-39 -97,-40 z m 1208,110 q -57,0 -96,39 -39,39 -40,97 0,56 39,96 39,40 97,40 57,0 97,-40 40,-40 40,-96 0,-57 -40,-96 -40,-39 -97,-40 z m -840,0 q -57,0 -97,39 -40,39 -40,97 0,56 40,96 40,40 97,40 56,0 96,-40 40,-40 40,-96 0,-57 -40,-96 -40,-39 -96,-40 z M 1640,255 q -49,-43 -220,-72 -171,-29 -394,-29 -227,0 -399,30 -172,30 -217,75 l 63,240 -28,157 -88,153 -85,622 49,19 274,-462 6,550 68,12 209,-553 112,595 h 69 l 112,-593 207,551 69,-12 6,-550 275,463 47,-22 -83,-619 -89,-153 -28,-159 z m -96,32 -30,118 q -195,45 -490,45 -292,0 -488,-45 L 504,286 q 190,58 521,58 159,0 295,-16 136,-16 224,-41 z m -26,299 q -184,51 -490,51 -308,0 -496,-52 l 15,-101 q 189,49 481,49 291,0 474,-48 z m -494,1007 q -57,0 -96,40 -39,40 -40,97 0,56 39,96 39,40 97,40 56,0 96,-40 40,-40 41,-96 0,-57 -40,-97 -40,-40 -97,-40 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#000000"
+     id="path2" />
+  <g
+     fill-rule="nonzero"
+     fill="#ffffff"
+     id="g10"
+     transform="matrix(1,0,0,-1,0,2020)">
+    <path
+       style="color:#000000"
+       d="m 1588,1255 q -83,-30 -233,-49 -150,-19 -333,-20 -178,0 -326,18 -148,18 -233,49 l 50,91 q 84,-25 218,-36 134,-11 293,-11 159,0 294,11 135,11 219,37 z"
+       display="block"
+       id="path4" />
+    <path
+       style="color:#000000"
+       d="m 1544,1733 -30,-118 q -195,-45 -490,-45 -292,0 -488,45 l -32,119 q 190,-58 521,-58 159,0 295,16 136,16 224,41 z"
+       display="block"
+       id="path6" />
+    <path
+       style="color:#000000"
+       d="m 1518,1434 q -184,-51 -490,-51 -308,0 -496,52 l 15,101 q 189,-49 481,-49 291,0 474,48 z"
+       display="block"
+       id="path8" />
+  </g>
+  <path
+     style="fill:#b22222;stroke:#000000;stroke-width:2.31937"
+     d="m 990.63576,1587.0261 c -1.5896,-5.3512 -110.43644,-584.203 -110.43644,-587.30536 0,-1.3164 -0.8462,-2.39345 -1.88045,-2.39345 -1.03425,0 -48.74402,124.01991 -106.02169,275.59971 l -104.14124,275.5997 -32.56042,-5.6873 c -17.90822,-3.128 -32.71901,-5.8161 -32.91287,-5.9734 -0.67271,-0.5461 -5.47764,-432.0051 -5.46185,-490.4455 0.009,-37.9684 -0.80094,-58.48369 -2.29276,-57.9841 -1.26978,0.42521 -62.94003,103.0571 -137.04501,228.071 -74.10499,125.0138 -135.61488,228.2153 -136.68866,229.3366 -1.10856,1.1576 -11.87421,-1.8495 -24.91029,-6.9581 l -22.95798,-8.9969 42.39325,-310.0446 42.39325,-310.04454 43.89892,-76.18875 43.89892,-76.18876 14.20485,-79.28631 14.20485,-79.28632 -31.42828,-119.65781 -31.42829,-119.65781 5.3305,-4.52944 c 51.45416,-43.72167 205.12172,-78.05612 421.65666,-94.21214 77.94429,-5.81555 297.79297,-5.81555 375.73727,0 154.5719,11.53286 277.9724,32.20091 356.0227,59.62934 22.9502,8.06519 52.1299,22.48687 61.9913,30.63844 l 6.3266,5.22961 -32.3908,120.60703 -32.3909,120.60702 14.0146,80.01812 14.0145,80.01812 44.1964,76.1054 c 24.308,41.85794 44.6061,77.86609 45.1069,80.01812 1.0163,4.36695 82.0759,609.23218 82.0759,612.44878 0,2.2786 -38.2075,21.1718 -42.8155,21.1718 -1.6175,0 -64.2874,-103.3278 -139.2664,-229.6173 -74.9791,-126.2894 -137.0559,-229.61717 -137.9484,-229.61717 -0.8925,0 -2.3172,76.45207 -3.1661,169.89357 -0.8488,93.4414 -2.2224,216.9801 -3.0522,274.5304 l -1.5088,104.637 -32.6876,5.7309 -32.6875,5.731 -3.7723,-8.3158 c -2.0748,-4.5737 -48.9352,-128.6237 -104.1343,-275.6666 -55.1991,-147.043 -100.8315,-266.88131 -101.4054,-266.30743 -1.0856,1.08563 -111.7829,584.80223 -111.8704,589.90283 -0.038,2.1832 -8.3175,2.8992 -33.5243,2.8992 -29.87493,0 -33.60419,-0.4364 -34.68024,-4.0588 z M 1131.8505,832.67036 c 134.0802,-5.47702 245.2875,-17.4699 344.4258,-37.14371 40.2293,-7.98342 88.9165,-20.50535 107.4526,-27.63587 l 6.5602,-2.52356 -4.5377,-7.52621 c -2.4957,-4.13939 -14.1187,-24.48654 -25.8288,-45.21587 -11.7102,-20.72933 -22.7212,-37.6897 -24.469,-37.6897 -1.7477,0 -12.9074,2.61333 -24.7993,5.80739 -100.6107,27.02335 -263.0027,40.55474 -486.6543,40.55066 -162.82711,-0.002 -295.31158,-7.43739 -395.45187,-22.19097 -28.27908,-4.16633 -86.29041,-15.95538 -101.84087,-20.69608 -6.26208,-1.90904 -12.17542,-3.471 -13.14076,-3.471 -3.14998,0 -51.53898,90.70268 -49.42306,92.64095 3.24039,2.9683 36.609,13.31427 66.99132,20.77069 96.01038,23.56285 232.15372,39.64556 381.53568,45.07112 46.73281,1.69733 169.58256,1.27818 219.18006,-0.74784 z m 25.513,-197.18399 c 125.5572,-5.64749 232.6364,-18.01713 309.6354,-35.76861 46.2573,-10.66426 49.2066,-11.52238 50.4138,-14.66822 0.6666,-1.73712 -2.248,-25.01571 -6.4769,-51.73024 -5.7588,-36.37962 -8.5025,-48.57185 -10.9304,-48.57185 -1.7829,0 -11.2433,2.02068 -21.0233,4.49041 -73.4766,18.55504 -193.9285,33.8093 -312.2342,39.54194 -62.5147,3.02923 -216.6094,3.03085 -277.51092,0.002 -120.12046,-5.9722 -220.04315,-18.37399 -310.24867,-38.50618 -14.50139,-3.23644 -27.70967,-6.39998 -29.35169,-7.03009 -3.63667,-1.39554 -4.05418,0.50247 -11.55427,52.52703 -3.2183,22.32389 -6.33994,42.78202 -6.93696,45.46249 -0.99086,4.44864 1.08483,5.40716 23.80527,10.99296 98.63593,24.2495 218.79436,38.94969 360.03915,44.04715 47.73823,1.72287 197.35109,1.23538 242.37369,-0.78972 z m 82.3375,-191.0884 c 83.6212,-6.47782 140.8414,-13.16794 200.4465,-23.43587 34.3455,-5.91658 72.8761,-13.91723 74.3565,-15.43969 1.0899,-1.12093 31.3132,-118.73431 30.6752,-119.37226 -0.2886,-0.28858 -10.4303,2.00509 -22.5371,5.09705 -148.5852,37.94708 -370.9623,56.93092 -587.36888,50.1424 -174.3584,-5.46951 -295.66816,-20.10664 -400.21474,-48.28956 -16.97671,-4.57646 -31.20396,-7.94678 -31.61609,-7.48961 -0.90367,1.00247 30.42113,117.98206 32.02191,119.58282 1.88718,1.88719 38.68044,9.5931 74.93574,15.6944 83.87231,14.11462 144.87678,20.28692 273.27833,27.64967 7.65391,0.4389 80.19207,0.51583 161.19593,0.17094 107.9142,-0.45942 159.9883,-1.6115 194.8267,-4.31031 z"
+     id="path254" />
+  <path
+     style="fill:#b22222;stroke:#000000;stroke-width:2.31937"
+     d="m 211.06228,1702.3635 c -40.19618,-8.0682 -77.21899,-36.4428 -95.26113,-73.009 -19.222869,-38.9592 -19.222869,-81.6479 0,-120.607 35.35448,-71.6533 125.71589,-96.2252 193.01271,-52.4858 73.64181,47.8633 84.60195,146.5692 23.07511,207.8121 -32.72531,32.5743 -77.93061,46.8997 -120.82669,38.2897 z"
+     id="path256" />
+  <path
+     style="fill:#b22222;stroke:#000000;stroke-width:2.31937"
+     d="m 575.3614,1811.0409 c -31.01786,-5.9234 -64.95729,-29.5146 -84.50304,-58.738 -16.19805,-24.2181 -21.59757,-42.3652 -21.74497,-73.0821 -0.0983,-20.4875 0.86416,-27.2353 6.06328,-42.5089 7.76499,-22.8115 17.88033,-38.5781 35.32897,-55.0668 25.28745,-23.8962 49.38911,-34.2328 84.41168,-36.202 39.16039,-2.2018 71.1528,9.2226 99.61183,35.5713 28.12836,26.0426 41.35164,53.4444 43.47407,90.0887 2.35815,40.7137 -9.92257,72.1979 -39.82546,102.1007 -33.8572,33.8572 -75.87378,46.8017 -122.81636,37.8371 z"
+     id="path258" />
+  <path
+     style="fill:#b22222;stroke:#000000;stroke-width:2.31937"
+     d="m 995.00793,1862.0717 c -20.59625,-3.871 -48.05656,-18.9318 -64.24114,-35.2336 -26.19284,-26.3825 -38.55801,-53.2916 -40.65729,-88.4785 -2.37601,-39.8254 12.07207,-77.0793 40.92585,-105.5261 26.45983,-26.0866 55.43969,-37.9016 92.96465,-37.9016 36.8754,0 65.5048,11.3374 92.1774,36.5027 28.1356,26.5457 42.4131,58.0565 42.7759,94.4066 0.3935,39.4434 -11.6724,69.0896 -39.5196,97.1007 -9.7542,9.8117 -23.6292,21.1647 -30.8332,25.2291 -25.3581,14.3063 -62.2673,19.7882 -93.59257,13.9007 z"
+     id="path260" />
+  <path
+     style="fill:#b22222;stroke:#000000;stroke-width:2.31937"
+     d="m 1414.8131,1811.0457 c -30.9757,-5.8218 -65.4095,-30.4265 -85.0001,-60.737 -37.3987,-57.863 -20.9334,-141.0418 35.79,-180.8029 27.2093,-19.0727 53.44,-26.3528 87.0587,-24.1622 35.0115,2.2814 63.4058,15.399 88.5569,40.9116 26.5722,26.9541 38.0652,55.6325 37.7212,94.1253 -0.2637,29.5108 -5.9249,48.1899 -21.7982,71.9224 -31.479,47.065 -85.6041,69.4039 -142.3285,58.7428 z"
+     id="path262" />
+  <path
+     style="fill:#b22222;stroke:#000000;stroke-width:2.31937"
+     d="m 1784.752,1701.1003 c -37.4639,-8.1129 -74.7598,-37.5935 -93.1408,-73.6232 -6.8569,-13.4406 -13.5551,-42.3052 -13.5098,-58.2173 0.1051,-36.8676 13.0288,-67.8094 39.4013,-94.3351 54.6279,-54.945 139.4617,-54.0241 193.5594,2.1012 26.1486,27.1288 37.0562,54.2562 37.0018,92.0251 -0.056,39.05 -12.5551,68.9908 -40.1827,96.2562 -33.314,32.8772 -77.4062,45.6946 -123.1292,35.7931 z"
+     id="path264" />
+</svg>
index c34593d..a4aadfe 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
@@ -9,70 +7,15 @@
    xmlns="http://www.w3.org/2000/svg"
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="45"
-   height="45"
-   id="svg3128"
-   sodipodi:version="0.32"
-   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
-   version="1.0"
-   sodipodi:docname="bc.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs3130">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 22.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="45 : 22.5 : 1"
-       inkscape:persp3d-origin="22.5 : 15 : 1"
-       id="perspective15" />
-    <inkscape:perspective
-       id="perspective12"
-       inkscape:persp3d-origin="22.5 : 15 : 1"
-       inkscape:vp_z="45 : 22.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 22.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     gridtolerance="10000"
-     guidetolerance="10"
-     objecttolerance="10"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="11.313709"
-     inkscape:cx="21.843794"
-     inkscape:cy="17.466685"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     height="45px"
-     width="45px"
-     inkscape:grid-points="true"
-     showgrid="true"
-     inkscape:window-width="960"
-     inkscape:window-height="1060"
-     inkscape:window-x="0"
-     inkscape:window-y="20"
-     inkscape:window-maximized="0">
-    <inkscape:grid
-       id="GridFromPre046Settings"
-       type="xygrid"
-       originx="0"
-       originy="0"
-       spacingx="0.5"
-       spacingy="0.5"
-       color="#0000ff"
-       empcolor="#0000ff"
-       opacity="0.2"
-       empopacity="0.4"
-       empspacing="5" />
-  </sodipodi:namedview>
+   height="100%"
+   width="100%"
+   version="1.1"
+   viewBox="0 0 2048 2048"
+   id="svg16"
+   sodipodi:docname="bs.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
   <metadata
   <metadata
-     id="metadata3133">
+     id="metadata22">
     <rdf:RDF>
       <cc:Work
          rdf:about="">
     <rdf:RDF>
       <cc:Work
          rdf:about="">
       </cc:Work>
     </rdf:RDF>
   </metadata>
       </cc:Work>
     </rdf:RDF>
   </metadata>
+  <defs
+     id="defs20" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="960"
+     inkscape:window-height="1060"
+     id="namedview18"
+     showgrid="false"
+     inkscape:zoom="0.43115234"
+     inkscape:cx="1024"
+     inkscape:cy="1024"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg16"
+     inkscape:document-rotation="0" />
+  <path
+     style="color:#000000"
+     d="m 1161,1706 h 170 v 137 h 274 V 1468 L 1383,1297 V 819 L 1553,649 V 444 h 153 V 205 H 341 v 239 h 153 v 205 l 171,170 v 478 l -222,171 v 375 h 273 v -137 h 171 v 137 h 274 z M 564,460 V 358 h 920 v 102 z m 460,1092 H 512 v -46 l 73,-55 h 879 l 71,55 v 46 z m 0,-169 H 674 l 60,-47 v -57 h 580 v 57 l 60,47 z m 0,-546 H 734 v -46 l -60,-58 h 700 l -60,58 v 46 z m 0,-172 H 610 l -46,-43 v -58 h 920 v 58 l -46,43 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#000000"
+     id="path2" />
   <g
   <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     style="display:inline">
+     fill-rule="nonzero"
+     fill="#ffffff"
+     id="g14"
+     transform="matrix(1,0,0,-1,0,2048)">
+    <path
+       style="color:#000000"
+       d="m 564,1588 v 102 h 920 v -102 z"
+       display="block"
+       id="path4" />
     <path
     <path
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 37.5,37.5 c -3.723781,-1.069562 -11.126219,0.473903 -14.85,-2.2 -3.723782,2.673903 -11.12622,1.130438 -14.8500002,2.2 0,0 -1.8104878,0.595658 -3.3,2.2 0.7447561,1.069561 1.8104878,1.08478 3.3,0.55 C 11.52378,39.180439 18.926218,40.754342 22.65,39.15 c 3.723781,1.604342 11.126219,0.03044 14.85,1.1 1.489512,0.53478 2.555244,0.519561 3.3,-0.55 -1.489512,-2.139123 -3.3,-2.2 -3.3,-2.2 z"
-       id="path4582"
-       sodipodi:nodetypes="ccccccccc"
-       inkscape:connector-curvature="0" />
+       style="color:#000000"
+       d="M 1024,496 H 512 v 46 l 73,55 h 879 l 71,-55 v -46 z"
+       display="block"
+       id="path6" />
     <path
     <path
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 30.9,33.1 c -2.75,2.75 -13.75,2.75 -16.5,0 -0.55,-1.65 0,-2.2 0,-2.2 h 16.5 c 0,0 0.55,0.55 0,2.2 z"
-       id="path4584"
-       sodipodi:nodetypes="ccccc"
-       inkscape:connector-curvature="0" />
+       style="color:#000000"
+       d="M 1024,665 H 674 l 60,47 v 57 h 580 v -57 l 60,-47 z"
+       display="block"
+       id="path8" />
     <path
     <path
-       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 30.9,30.9 H 14.4"
-       id="path4590"
-       sodipodi:nodetypes="cc"
-       inkscape:connector-curvature="0" />
-    <g
-       id="g3323"
-       inkscape:label="Layer 1"
-       transform="matrix(-0.84196464,0,0,-0.84196464,38.826174,36.60001)"
-       style="fill:#000000;fill-opacity:1">
-      <path
-         sodipodi:nodetypes="cccc"
-         id="path3491"
-         d="M 22.028958,36 C 11.528958,35 5.5289585,28 6.0289585,7 H 29.028958 c 0,9 -10,6.5 -8,21"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:connector-curvature="0" />
-      <path
-         sodipodi:nodetypes="csccccccccccc"
-         id="path3495"
-         d="m 20.028958,28 c -0.384461,-2.911278 5.552936,-7.368624 8,-9 3,-2 2.819198,-4.342892 5,-4 1.04172,0.944016 -1.413429,3.037549 0,3 1,0 -0.187332,-1.231727 1,-2 1,0 4.003161,-0.999999 4,4 0,2 -6,12 -6,12 0,0 -1.885866,1.902129 -2,3.5 0.726047,0.994369 0.5,2 0.5,3 -1,1 -3,-2.5 -3,-2.5 h -2 c 0,0 -0.781781,1.991926 -2.5,3 -1,0 -1,-3 -1,-3"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:connector-curvature="0" />
-      <circle
-         transform="rotate(180,21.764479,22)"
-         id="path3499"
-         style="opacity:1;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         cx="8.5"
-         cy="23.5"
-         r="0.5" />
-      <ellipse
-         transform="rotate(-149.99999,24.024104,20.986505)"
-         id="path3501"
-         style="opacity:1;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1.50000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         cx="14.5"
-         cy="15.5"
-         rx="0.5"
-         ry="1.5" />
-      <path
-         sodipodi:nodetypes="cc"
-         id="path8049"
-         d="m 7.0289585,7 c -1,20 5.4999995,27.5 11.9999995,28.5"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:connector-curvature="0" />
-    </g>
+       style="color:#000000"
+       d="M 1024,1211 H 734 v 46 l -60,58 h 700 l -60,-58 v -46 z"
+       display="block"
+       id="path10" />
     <path
     <path
-       style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.64999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 14.4,30.9 H 30.9"
-       id="path3369"
-       inkscape:connector-curvature="0" />
+       style="color:#000000"
+       d="M 1024,1383 H 610 l -46,43 v 58 h 920 v -58 l -46,-43 z"
+       display="block"
+       id="path12" />
   </g>
   </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer2"
-     inkscape:label="Layer 1#1"
-     style="display:inline" />
+  <path
+     style="fill:#b22222;stroke:#000000;stroke-width:2.31937"
+     d="m 444.15855,1655.2535 v -186.3229 l 111.31279,-85.6227 111.31279,-85.6227 0.0168,-239.0875 0.0168,-239.08758 -85.81653,-85.52471 -85.81654,-85.52474 V 545.72977 442.99886 H 418.64552 342.10645 V 324.71121 206.42355 H 1024 1705.8936 v 118.28766 118.28765 h -76.5391 -76.5391 v 102.6437 102.6437 l -85.8165,85.79301 -85.8166,85.79302 0.048,238.90641 0.048,238.9065 111.2815,85.5664 111.2816,85.5664 v 186.3792 186.3793 h -135.6829 -135.6829 v -68.4213 -68.4213 h -85.8165 -85.8166 v 68.4213 68.4213 H 1024 887.15746 v -68.4213 -68.4213 h -85.81653 -85.81654 v 68.4213 68.4213 h -135.6829 -135.6829 v -186.323 z m 1092.42125,-125.504 v -24.2255 l -35.7866,-27.9602 -35.7866,-27.9602 H 1024.538 584.0693 l -36.19752,27.2526 -36.19753,27.2525 -0.12705,24.9332 -0.12705,24.9332 H 1024 1536.5798 Z m -162.7421,-147.2188 c -0.4252,-1.1719 -13.5586,-12.1936 -29.1854,-24.4926 l -28.4122,-22.3619 v -28.8528 -28.8528 H 1024 731.75991 v 28.8528 28.8528 l -28.41223,22.3619 c -15.62673,12.299 -28.76014,23.3207 -29.18535,24.4926 -0.46761,1.2887 137.77662,2.1307 349.83767,2.1307 212.0611,0 350.3053,-0.842 349.8377,-2.1307 z m -57.5976,-567.82123 v -22.58155 l 29.5384,-29.60418 29.5385,-29.60415 H 1024 672.68302 l 29.53844,29.60415 29.53845,29.60418 v 22.58155 22.58158 H 1024 1316.2401 Z m 146.2939,-170.43138 23.0198,-21.37991 V 593.25204 563.60589 H 1024 562.4462 l -9.7e-4,29.57191 -9.8e-4,29.57191 22.61479,21.33972 22.6148,21.33972 415.92016,0.11435 415.9202,0.11434 23.0198,-21.37989 z m 23.0198,-234.91003 V 357.18233 H 1024 562.4462 v 52.18573 52.18573 H 1024 1485.5538 Z"
+     id="path13" />
 </svg>
 </svg>
diff --git a/client/public/images/pieces/Cwda/bt.svg b/client/public/images/pieces/Cwda/bt.svg
new file mode 100644 (file)
index 0000000..17ba73f
--- /dev/null
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="100%"
+   width="100%"
+   version="1.1"
+   viewBox="0 0 2048 2048"
+   id="svg16"
+   sodipodi:docname="bb.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+  <metadata
+     id="metadata22">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs20" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="960"
+     inkscape:window-height="1060"
+     id="namedview18"
+     showgrid="false"
+     inkscape:zoom="0.43115234"
+     inkscape:cx="1024"
+     inkscape:cy="1024"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg16" />
+  <path
+     style="color:#000000"
+     d="m 1290,564.11538 -42,102 q -102,22 -224,22 -121,0 -222,-22 l -42,-101 q 124,31 264,31 138,0 266,-32 z m -84,206 -29,70 v 27 q -76,11 -153,11 -75,0 -152,-11 l -1,-27 -27,-70 q 85,15 180,15 96,0 182,-15 z m -35,-378 q -40,30 -80,95 h -32 q 0,-49 23,-95 z m -206,0 q 23,49 23,95 h -32 q -39,-64 -81,-95 z m 59,-18 q -14,-57 -34,-79 -20,-22 -53,-46 -36,-25 -85,-42 -49,-17 -109,-9 l -281,39 q -17,2 -30,0 -13,-2 -26,-2 -21,0 -53,-9 -32,-9 -51,-28 l -97,159 q 18,20 32,28 14,8 33,17 58,27 124,33 28,2 55,1 27,-1 56,2 54,-9 108,-16 54,-7 110,-16 60,0 81,12 11,6 35,22 24,16 48,47 -53,6 -108,20 -55,14 -97,31 l 104,258 q -78,45 -109,72 -31,27 -49,64 -26,46 -33,89.00002 -7,43 -7,77 1,60 28,132 27,72 104,130 63,48 123,99 60,51 119,119 -74,38 -74,121 0,56 39,96 39,40 97,40 56,0 96,-40 40,-40 40,-96 0,-82 -74,-121 58,-68 117,-119 59,-51 125,-99 75,-57 102,-129 27,-72 29,-133 0,-34 -7,-77 -7,-43.00002 -32,-89.00002 -20,-36 -50,-63 -30,-27 -108,-73 l 104,-258 q -44,-16 -99,-30 -55,-14 -106,-21 23,-31 47,-47 24,-16 36,-22 21,-12 81,-12 54,8 108,15 54,7 110,17 27,-3 54,-2 27,1 57,-1 64,-6 124,-33 18,-9 32,-17 14,-8 33,-28 l -98,-159 q -18,18 -50,27 -32,9 -53,10 -13,0 -26,2 -13,2 -31,0 l -280,-39 q -60,-9 -111,8 -51,17 -85,45 -33,27 -52,46 -19,19 -33,77 z m -37,744.00002 v -85 q 0,-37.00002 37,-37.00002 37,0 37,37.00002 v 86 h 90 q 35,0 35,36 0,36 -35,36 h -90 v 90 q 0,37 -37,37 -37,0 -37,-37 v -90 h -88 q -35,0 -35,-36 0,-36 35,-36 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#000000"
+     id="path2" />
+  <g
+     fill-rule="nonzero"
+     fill="#ffffff"
+     id="g14"
+     transform="matrix(1,0,0,-1,0,2030.1154)">
+    <path
+       style="color:#000000"
+       d="m 1290,1466 -42,-102 q -102,-22 -224,-22 -121,0 -222,22 l -42,101 q 124,-31 264,-31 138,0 266,32 z"
+       display="block"
+       id="path4" />
+    <path
+       style="color:#000000"
+       d="m 1206,1260 -29,-70 v -27 q -76,-11 -153,-11 -75,0 -152,11 l -1,27 -27,70 q 85,-15 180,-15 96,0 182,15 z"
+       display="block"
+       id="path6" />
+    <path
+       style="color:#000000"
+       d="m 1171,1638 q -40,-30 -80,-95 h -32 q 0,49 23,95 z"
+       display="block"
+       id="path8" />
+    <path
+       style="color:#000000"
+       d="m 965,1638 q 23,-49 23,-95 h -32 q -39,64 -81,95 z"
+       display="block"
+       id="path10" />
+    <path
+       style="color:#000000"
+       d="m 987,912 v 85 q 0,37 37,37 37,0 37,-37 v -86 h 90 q 35,0 35,-36 0,-36 -35,-36 h -90 v -90 q 0,-37 -37,-37 -37,0 -37,37 v 90 h -88 q -35,0 -35,36 0,36 35,36 z"
+       display="block"
+       id="path12" />
+  </g>
+</svg>
diff --git a/client/public/images/pieces/Cwda/by.svg b/client/public/images/pieces/Cwda/by.svg
new file mode 100644 (file)
index 0000000..b569a98
--- /dev/null
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="100%"
+   width="100%"
+   version="1.1"
+   viewBox="0 0 2048 2048"
+   id="svg18"
+   sodipodi:docname="by.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+  <metadata
+     id="metadata24">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs22" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="960"
+     inkscape:window-height="1060"
+     id="namedview20"
+     showgrid="false"
+     inkscape:zoom="0.43115234"
+     inkscape:cx="1024"
+     inkscape:cy="467.3522"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg18"
+     inkscape:document-rotation="0" />
+  <path
+     style="color:#000000"
+     d="m 490,643 q 4,9 13,27 17,42 17,50 -2,28 -29,28 -20,0 -47,-57 -4,-8 -12,-14 -27,-28 8,-47 32,-19 50,13 z m 590,371 q 70,92 69,205 -4,33 -38,33 -46,0 -36,-34 3,-55 -11,-91 -23,-57 -51,-85 -15,-30 18,-44 32,-15 49,16 z m -261,488 q -5,36 2,78 -60,-12 -113,-56 -32,-17 -15,-47 17,-31 47,-10 21,11 38,20 17,9 41,15 z M 1756,234 q -1,0 2,54 3,54 3,118 1,125 0,258 -1,133 -36,267 -34,128 -75,218 -41,90 -89,157 -72,108 -196,183 -124,75 -259,98 4,-23 3,-47 -1,-24 0,-46 97,-33 183,-82 86,-49 126,-106 48,-66 89,-156 41,-90 75,-219 34,-133 35,-266 1,-133 1,-259 0,-63 -3,-117 -3,-54 0,-55 z m -677,1423 q 157,-10 291,-81 134,-71 228,-182 66,-78 124,-188 58,-110 94,-233 40,-143 50,-300 10,-157 11,-292 V 163 q 0,0 -155,0 -155,0 -404,0 H 647 q -9,0 -9,49 0,49 7,79 4,24 19,68 15,44 50,107 16,32 76,93 60,61 138,143 45,46 70,116 25,70 22,127 -37,-30 -81,-49 -212,-76 -307,-220 -7,-9 -45,-81 -20,-38 -34,-52 -19,-19 -55,-21 -56,-3 -87,54 -42,-12 -75,-10 -56,21 -81,45 -51,51 -66,102 -15,51 -16,110 0,84 104,222 122,159 130,242 0,36 7,81 6,31 25,60 13,20 17,27 4,7 17,23 9,12 15,18 6,6 15,18 11,13 28,30 -53,146 -43,301 199,-71 334,-223 33,113 130,183 80,-56 127,-148 z M 404,821 q 29,20 6,48 -24,23 -53,4 -61,-40 -65,-105 1,-33 39,-31 36,3 35,37 8,32 38,47 z m 252,498 q 22,11 22,11 30,12 19,44 -12,30 -46,20 -118,-43 -163,-158 -7,-33 24,-45 31,-10 42,22 8,17 12,22 11,-9 29,-12 61,-10 71,54 3,22 -10,42 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#000000"
+     id="path2" />
+  <g
+     fill-rule="nonzero"
+     fill="#ffffff"
+     id="g16"
+     transform="matrix(1,0,0,-1,0,2008)">
+    <path
+       style="color:#000000"
+       d="m 490,1365 q 4,-9 13,-27 17,-42 17,-50 -2,-28 -29,-28 -20,0 -47,57 -4,8 -12,14 -27,28 8,47 32,19 50,-13 z"
+       display="block"
+       id="path4" />
+    <path
+       style="color:#000000"
+       d="m 1080,994 q 70,-92 69,-205 -4,-33 -38,-33 -46,0 -36,34 3,55 -11,91 -23,57 -51,85 -15,30 18,44 32,15 49,-16 z"
+       display="block"
+       id="path6" />
+    <path
+       style="color:#000000"
+       d="m 819,506 q -5,-36 2,-78 -60,12 -113,56 -32,17 -15,47 17,31 47,10 21,-11 38,-20 17,-9 41,-15 z"
+       display="block"
+       id="path8" />
+    <path
+       style="color:#000000"
+       d="m 1756,1774 q -1,0 2,-54 3,-54 3,-118 1,-125 0,-258 -1,-133 -36,-267 -34,-128 -75,-218 -41,-90 -89,-157 -72,-108 -196,-183 -124,-75 -259,-98 4,23 3,47 -1,24 0,46 97,33 183,82 86,49 126,106 48,66 89,156 41,90 75,219 34,133 35,266 1,133 1,259 0,63 -3,117 -3,54 0,55 z"
+       display="block"
+       id="path10" />
+    <path
+       style="color:#000000"
+       d="m 404,1187 q 29,-20 6,-48 -24,-23 -53,-4 -61,40 -65,105 1,33 39,31 36,-3 35,-37 8,-32 38,-47 z"
+       display="block"
+       id="path12" />
+    <path
+       style="color:#000000"
+       d="m 656,689 q 22,-11 22,-11 30,-12 19,-44 -12,-30 -46,-20 -118,43 -163,158 -7,33 24,45 31,10 42,-22 8,-17 12,-22 11,9 29,12 61,10 71,-54 3,-22 -10,-42 z"
+       display="block"
+       id="path14" />
+  </g>
+  <path
+     style="fill:#b22222;stroke:#000000;stroke-width:2.31937"
+     d="m 488.87142,1784.2552 c 0.91197,-44.0642 2.53785,-68.3539 6.17677,-92.2778 5.5848,-36.7173 19.78055,-96.6332 30.12165,-127.1342 l 6.93115,-20.4434 -25.36948,-28.8543 c -31.8104,-36.1799 -46.57815,-55.8293 -65.66083,-87.3658 -23.12294,-38.2135 -27.40416,-54.2783 -31.68599,-118.8977 -1.34561,-20.3074 -4.18061,-41.5493 -6.8101,-51.0261 -13.81504,-49.7898 -51.8304,-116.8503 -111.75841,-197.146 -70.1169,-93.94758 -100.08176,-148.34791 -112.29242,-203.86358 -8.02004,-36.4631 -0.77459,-108.92027 15.29449,-152.95063 8.98275,-24.61329 21.905,-45.95684 43.1669,-71.29828 23.67791,-28.221 49.83164,-46.12553 91.18962,-62.42733 11.83618,-4.66538 14.2155,-4.83179 34.82529,-2.43577 12.16663,1.41444 27.83761,4.10307 34.82441,5.97473 12.36675,3.31287 12.79544,3.26727 16.18232,-1.72139 23.59996,-34.76126 45.64157,-48.431 78.13206,-48.45591 36.76503,-0.0283 57.49392,11.78041 77.78712,44.31288 4.37653,7.01608 18.68776,32.65913 31.80277,56.98457 31.45779,58.34719 47.95753,81.21716 87.1229,120.75926 60.07668,60.65455 128.38859,103.75776 223.86871,141.25585 41.15738,16.16385 65.07742,28.65931 90.82625,47.44629 8.7523,6.38587 16.572,11.61066 17.3771,11.61066 2.763,0 -1.6128,-52.19003 -6.189,-73.81577 C 1003.9542,821.54061 980.08332,766.12857 953.612,730.60022 945.53312,719.75719 910.3155,681.32936 875.35057,645.20505 737.28907,502.56553 730.40445,494.46376 703.11996,442.52509 c -29.513,-56.18087 -49.3902,-110.71452 -58.58231,-160.72215 -5.28883,-28.77268 -6.23125,-103.47202 -1.41189,-111.9094 l 2.98083,-5.21858 h 614.55031 614.5504 l -0.012,142.06116 c -0.025,321.51381 -13.6167,484.29854 -53.2956,638.29636 -48.531,188.35642 -152.3293,379.21502 -269.5877,495.70422 -108.1591,107.4496 -249.9584,181.2957 -395.1856,205.8043 -22.5484,3.8053 -69.061,9.4862 -77.6687,9.4862 -1.119,0 -4.6173,5.0967 -7.7739,11.3261 -11.8389,23.3628 -39.0232,60.7684 -60.9525,83.8704 -21.245,22.381 -54.10744,50.9235 -58.63095,50.9235 -1.10789,0 -10.95158,-7.3655 -21.87482,-16.3679 -45.28972,-37.3254 -83.59368,-93.1185 -101.38451,-147.6755 -3.0066,-9.22 -6.1704,-16.7869 -7.03065,-16.8154 -0.86025,-0.028 -8.01448,7.2061 -15.89826,16.0768 -7.8838,8.8707 -27.33994,27.9185 -43.23585,42.3284 -76.48028,69.3309 -156.55186,117.9659 -262.56995,159.4836 l -12.47311,4.8846 z M 1127.2118,1584.09 c 131.2364,-25.2329 270.496,-98.3698 363.4054,-190.8548 79.914,-79.549 152.0267,-203.9073 200.2111,-345.2641 35.732,-104.82526 55.6682,-191.50035 66.597,-289.53849 3.4897,-31.30459 4.2932,-429.13083 0.9896,-489.96603 l -1.9837,-36.53001 h -71.9119 -71.9119 l 1.9953,70.16082 c 2.5506,89.68944 1.4075,381.75875 -1.6725,427.34315 -7.6018,112.50508 -35.7937,236.19195 -81.2582,356.50546 -34.913,92.391 -87.9388,188.7798 -132.4478,240.7604 -23.1879,27.0804 -65.8116,59.9005 -111.9762,86.2215 -42.2507,24.0895 -107.7844,54.2113 -155.3975,71.4267 -11.4809,4.1511 -21.555,8.2066 -22.387,9.0121 -0.832,0.8055 -1.9037,22.5962 -2.3815,48.4237 -0.7634,41.2634 -0.4393,46.8388 2.6724,45.9672 1.9476,-0.5456 9.8035,-2.196 17.4574,-3.6676 z m -306.62097,-16.7786 c -1.02008,-7.9728 -1.70541,-26.1428 -1.52292,-40.3778 l 0.33179,-25.8818 -15.56385,-5.0044 c -8.56011,-2.7524 -28.01815,-11.7541 -43.24006,-20.0037 -36.62939,-19.8516 -42.15408,-21.4507 -53.59495,-15.5134 -17.24701,8.9504 -26.89987,38.5711 -16.61819,50.9945 7.73047,9.3407 51.66947,39.2722 72.6887,49.516 18.8954,9.2088 48.4573,19.797 57.51948,20.6019 1.02008,0.091 1.02008,-6.3584 0,-14.3313 z M 684.90348,1392.3705 c 13.60192,-8.4799 20.0642,-31.7604 12.89184,-46.4433 -3.42909,-7.0198 -7.88716,-10.7004 -21.9119,-18.0903 l -17.60698,-9.2774 4.35129,-9.2775 c 5.80164,-12.3698 4.76725,-41.761 -1.99985,-56.8245 -13.30776,-29.6228 -49.49033,-40.5435 -83.98048,-25.3473 -5.58366,2.4602 -10.56793,4.473 -11.07613,4.473 -0.50817,0 -4.76078,-7.9711 -9.45021,-17.7137 -9.45051,-19.6338 -17.33067,-26.3646 -30.78471,-26.2946 -10.31867,0.054 -24.99713,6.7879 -32.47112,14.8972 -4.9772,5.4002 -5.79842,8.4833 -5.79842,21.7687 0,13.88 1.15635,17.7765 11.20314,37.7516 27.82038,55.3127 68.61489,94.7912 126.08008,122.0127 30.40955,14.4051 47.15493,16.7185 60.55345,8.3654 z m 447.96372,-144.1511 c 14.4938,-7.7731 16.8959,-15.6846 15.6143,-51.4266 -1.6669,-46.4892 -11.9358,-86.4692 -32.9035,-128.1039 -14.2014,-28.1988 -41.8592,-68.3998 -49.9297,-72.57315 -10.173,-5.26065 -25.1583,-4.2559 -38.9378,2.61072 -13.649,6.80163 -18.9461,14.66393 -18.9461,28.12133 0,9.3315 2.0045,13.0136 17.4802,32.1103 11.2219,13.8477 33.4279,56.3747 40.1061,76.8078 6.6141,20.2369 10.4544,55.9952 8.5928,80.0108 -1.7889,23.0773 0.012,28.4664 11.1225,33.2998 11.0176,4.7925 38.1747,4.3056 47.8012,-0.8571 z M 398.93091,878.42895 c 25.99794,-12.82517 29.41972,-43.50381 6.43448,-57.68945 -22.60666,-13.95201 -35.71601,-32.19711 -38.53157,-53.62682 -2.88685,-21.97231 -13.94417,-30.40731 -40.00358,-30.51639 -18.76357,-0.0786 -26.40212,3.52948 -32.5203,15.36072 -8.55931,16.55188 1.33173,56.55934 20.69009,83.68766 9.9967,14.00911 32.15581,33.98885 45.66135,41.17049 12.15398,6.46296 27.1573,7.09563 38.26953,1.61379 z M 506.85734,745.63683 c 8.00679,-4.14046 13.84028,-14.3058 13.84028,-24.11783 0,-15.43612 -24.87066,-75.14627 -36.92247,-88.64451 -10.51923,-11.78173 -22.26464,-14.05728 -37.5356,-7.27214 -30.79584,13.68307 -34.9755,31.19844 -12.95415,54.28608 4.42343,4.63762 12.58298,17.16219 18.13234,27.83239 5.54936,10.67019 14.86593,24.358 20.7035,30.41734 8.94092,9.28062 11.97855,11.01699 19.27309,11.01699 4.76266,0 11.72101,-1.58324 15.46301,-3.51832 z"
+     id="path119" />
+</svg>
diff --git a/client/public/images/pieces/Cwda/wc.svg b/client/public/images/pieces/Cwda/wc.svg
new file mode 100644 (file)
index 0000000..ee56aff
--- /dev/null
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="45"
+   height="45"
+   id="svg3128"
+   sodipodi:version="0.32"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
+   version="1.0"
+   sodipodi:docname="wc.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3130">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 22.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="45 : 22.5 : 1"
+       inkscape:persp3d-origin="22.5 : 15 : 1"
+       id="perspective15" />
+    <inkscape:perspective
+       id="perspective12"
+       inkscape:persp3d-origin="22.5 : 15 : 1"
+       inkscape:vp_z="45 : 22.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 22.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="8.0000004"
+     inkscape:cx="60.308779"
+     inkscape:cy="24.511479"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     height="45px"
+     width="45px"
+     inkscape:grid-points="true"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1060"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0">
+    <inkscape:grid
+       id="GridFromPre046Settings"
+       type="xygrid"
+       originx="0"
+       originy="0"
+       spacingx="0.5"
+       spacingy="0.5"
+       color="#0000ff"
+       empcolor="#0000ff"
+       opacity="0.2"
+       empopacity="0.4"
+       empspacing="5" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3133">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="display:inline">
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 37.725,38.008918 c -3.723781,-1.069562 -11.126219,0.473903 -14.85,-2.2 -3.723782,2.673903 -11.12622,1.130438 -14.8500002,2.2 0,0 -1.8104878,0.595658 -3.3,2.2 0.7447561,1.069561 1.8104878,1.08478 3.3,0.55 3.7237802,-1.069561 11.1262182,0.504342 14.8500002,-1.1 3.723781,1.604342 11.126219,0.03044 14.85,1.1 1.489512,0.53478 2.555244,0.519561 3.3,-0.55 -1.489512,-2.139123 -3.3,-2.2 -3.3,-2.2 z"
+       id="path4582"
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 31.125,33.608918 c -2.75,2.75 -13.75,2.75 -16.5,0 -0.55,-1.65 0,-2.2 0,-2.2 h 16.5 c 0,0 0.55,0.55 0,2.2 z"
+       id="path4584"
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 31.125,31.408918 h -16.5"
+       id="path4590"
+       sodipodi:nodetypes="cc"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g3323"
+       inkscape:label="Layer 1"
+       transform="matrix(-0.84196464,0,0,-0.84196464,39.051174,37.108928)">
+      <path
+         sodipodi:nodetypes="cccc"
+         id="path3491"
+         d="M 22.028958,36 C 11.528958,35 5.5289585,28 6.0289585,7 H 29.028958 c 0,9 -10,6.5 -8,21"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="csccccccccccc"
+         id="path3495"
+         d="m 20.028958,28 c -0.384461,-2.911278 5.552936,-7.368624 8,-9 3,-2 2.819198,-4.342892 5,-4 1.04172,0.944016 -1.413429,3.037549 0,3 1,0 -0.187332,-1.231727 1,-2 1,0 4.003161,-0.999999 4,4 0,2 -6,12 -6,12 0,0 -1.885866,1.902129 -2,3.5 0.726047,0.994369 0.5,2 0.5,3 -1,1 -3,-2.5 -3,-2.5 h -2 c 0,0 -0.781781,1.991926 -2.5,3 -1,0 -1,-3 -1,-3"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+      <circle
+         transform="rotate(180,21.764479,22)"
+         id="path3499"
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         cx="8.5"
+         cy="23.5"
+         r="0.5" />
+      <ellipse
+         transform="rotate(-149.99999,24.024104,20.986505)"
+         id="path3501"
+         style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.50000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         cx="14.5"
+         cy="15.5"
+         rx="0.5"
+         ry="1.5" />
+      <path
+         sodipodi:nodetypes="cc"
+         id="path8049"
+         d="m 7.0289585,7 c -1,20 5.4999995,27.5 11.9999995,28.5"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Layer 1#1"
+     style="display:inline" />
+</svg>
diff --git a/client/public/images/pieces/Cwda/wf.svg b/client/public/images/pieces/Cwda/wf.svg
new file mode 100644 (file)
index 0000000..0e24975
--- /dev/null
@@ -0,0 +1,285 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="177.17"
+   height="177.17"
+   shape-rendering="geometricPrecision"
+   image-rendering="optimizeQuality"
+   fill-rule="evenodd"
+   clip-rule="evenodd"
+   viewBox="0 0 50 50"
+   version="1.1"
+   id="svg974"
+   sodipodi:docname="wWaffle.svg"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+  <metadata
+     id="metadata978">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1060"
+     id="namedview976"
+     showgrid="false"
+     inkscape:zoom="2.3931818"
+     inkscape:cx="8.4123423"
+     inkscape:cy="122.97195"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg974"
+     showguides="false" />
+  <defs
+     id="defs968">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4543">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4539" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop4541" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient1002">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0"
+         id="stop998" />
+      <stop
+         style="stop-color:#dcdbdb;stop-opacity:1"
+         offset="1"
+         id="stop1000" />
+    </linearGradient>
+    <linearGradient
+       id="0"
+       x1="21.376"
+       x2="77.64"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         stop-color="#fff"
+         id="stop963" />
+      <stop
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop965" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1002"
+       id="linearGradient1004"
+       x1="-41.790333"
+       y1="22.581646"
+       x2="-15.82877"
+       y2="22.581646"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient5398"
+       x1="0"
+       y1="0"
+       x2="0"
+       y2="1">
+      <stop
+         offset="20%"
+         style="stop-color:#000000;stop-opacity:1"
+         id="stop5394" />
+      <stop
+         offset="100%"
+         style="stop-color:#4d4d4d;stop-opacity:1"
+         id="stop5396" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(0.47111842,-0.19973575)"
+       id="0-1"
+       x1="21.253"
+       y1="37.591999"
+       x2="77.639999"
+       y2="37.469002"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         stop-color="#fff"
+         id="stop3285" />
+      <stop
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop3287" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(50.633198,2.6998865)"
+       id="0-5"
+       x1="21.405001"
+       x2="77.639999"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         stop-color="#fff"
+         id="stop3911" />
+      <stop
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop3913" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4543"
+       id="linearGradient4545"
+       x1="119.21609"
+       y1="11.441374"
+       x2="209.83548"
+       y2="11.441374"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <g
+     transform="matrix(0.95,0,0,0.95,1.1939867,1.6421008)"
+     id="g14577">
+    <rect
+       y="4.245285"
+       x="23.113207"
+       height="40.212261"
+       width="3.7735846"
+       id="rect14571"
+       style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
+    <rect
+       transform="rotate(90)"
+       style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.84308159;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+       id="rect14573"
+       width="3.7735846"
+       height="47.641506"
+       x="23.231133"
+       y="-48.820751" />
+  </g>
+  <path
+     sodipodi:type="star"
+     style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+     id="path14587"
+     sodipodi:sides="64"
+     sodipodi:cx="25"
+     sodipodi:cy="44.457546"
+     sodipodi:r1="3.9412203"
+     sodipodi:r2="3.9364729"
+     sodipodi:arg1="0.78539816"
+     sodipodi:arg2="0.83448555"
+     inkscape:flatsided="true"
+     inkscape:rounded="0"
+     inkscape:randomized="0"
+     d="m 27.786864,47.24441 -0.28658,0.259741 -0.310659,0.2304 -0.331747,0.198841 -0.349638,0.165367 -0.364164,0.1303 -0.375182,0.09398 -0.382587,0.05675 L 25,48.398767 l -0.386307,-0.01898 -0.382587,-0.05675 -0.375182,-0.09398 -0.364164,-0.1303 -0.349638,-0.165367 -0.331747,-0.198841 -0.310659,-0.2304 -0.28658,-0.259741 -0.25974,-0.28658 -0.230401,-0.310659 -0.198841,-0.331746 -0.165367,-0.349639 -0.1303,-0.364164 -0.09398,-0.375182 -0.05675,-0.382587 -0.01898,-0.386307 0.01898,-0.386307 0.05675,-0.382587 0.09398,-0.375182 0.1303,-0.364163 0.165367,-0.349639 0.198841,-0.331746 0.230401,-0.310659 0.25974,-0.28658 0.28658,-0.259741 0.310659,-0.230401 0.331747,-0.198841 0.349638,-0.165367 0.364164,-0.130299 0.375182,-0.09398 0.382587,-0.05675 L 25,40.516326 l 0.386307,0.01898 0.382587,0.05675 0.375182,0.09398 0.364164,0.130299 0.349638,0.165367 0.331747,0.198841 0.310659,0.230401 0.28658,0.259741 0.25974,0.28658 0.230401,0.310659 0.198841,0.331746 0.165367,0.349639 0.1303,0.364163 0.09398,0.375182 0.05675,0.382587 0.01898,0.386307 -0.01898,0.386307 -0.05675,0.382587 -0.09398,0.375182 -0.1303,0.364164 -0.165367,0.349639 -0.198841,0.331746 -0.230401,0.310659 z"
+     transform="matrix(0,0.95,-0.95,0,47.629715,1.6421021)" />
+  <g
+     id="g19380"
+     transform="matrix(0.77598955,0,0,0.77598955,5.3934327,3.4879779)">
+    <g
+       transform="matrix(1.0975945,0,0,1.0975945,-107.62233,17.126787)"
+       style="opacity:1;fill:#1f1a17;fill-opacity:1;stroke-width:1.54272723;stroke-miterlimit:4;stroke-dasharray:none"
+       id="g5357">
+      <path
+         style="fill:#1f1a17;fill-opacity:1;stroke:none;stroke-width:1.54272723;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 119.66608,20.578823 c 0.12511,0.773672 0.40427,1.44388 1.3,1.7 11.23011,-0.424319 16.82956,-5.233235 20.30001,-11.7 l 0.2,-2.099999 c -2.10707,-8.89280401 -8.15113,-13.4502442 -16.2,-15.8 -4.40015,-0.5317426 -7.59668,1.3815851 -10.20001,4.5 -2.59354,2.64077835 -4.39616,5.9439949 -5.3,10 -0.9084,3.60641 -5.79067,1.6990508 -4.9,-0.6 2.76583,-4.0566968 11.00069,-10.7605086 4.9,-12.3 -8.75831,-2.0518262 -7.05798,4.7061225 -5.2,6.20000004 1.23982,-0.5457366 2.00197,-1.22280981 2.4,-2.00000004 -0.25951,-0.4357328 -0.98217,-0.8162564 0,-1.4 0.5387,0.045976 0.81918,0.2856122 1,0.6 0,1 0.50403,1.1455069 -3.6,4 -7.640521,5.2325602 -2.06546,17.121851 4.61159,18.198353 1.32064,-0.324595 1.53284,-0.226663 2.43634,0.347926 l 3.15207,0.35372 c 2.39802,-0.822905 4.4665,-1.650139 5.70313,-3.159477 0.32094,-0.38845 0.4935,-0.247984 -0.60313,3.159477 z"
+         id="path5349"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccccccccccccccc" />
+      <path
+         style="fill:#1f1a17;fill-opacity:1;stroke:none;stroke-width:1.54272723;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 109.56608,17.578823 c -1.32838,4.066443 -4.04985,6.321863 -6.6,8.8 -0.20576,0.304421 0.14574,0.397532 1,0.3 3.90473,-1.863513 7.52129,-4.086217 8.76166,-7.725974 -0.78642,-0.41302 -1.9736,-1.357866 -3.16166,-1.374026 z"
+         id="path5353"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc" />
+    </g>
+    <g
+       transform="matrix(0.79655895,0,0,0.79655895,-75.421737,16.247409)"
+       style="opacity:1;fill:#ffff00;fill-opacity:1;stroke-width:1.54272723;stroke-miterlimit:4;stroke-dasharray:none"
+       id="g5357-2">
+      <path
+         style="fill:url(#linearGradient4545);fill-opacity:1;stroke:none;stroke-width:1.54272723;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 133.58361,1.5558616 c -8.75606,10.1109584 -4.19979,7.5116959 -2.74223,10.1130104 -0.10968,5.65697 -1.90023,10.862018 -3.55112,15.867945 0.12511,0.773672 0.47829,1.517901 1.37402,1.774021 12.03339,-0.558199 18.98339,-7.721951 22.11462,-14.132179 l 0.43477,-2.601728 c -2.89219,-8.7881214 -9.12021,-14.2749978 -15.98474,-18.0311568 -3.95603,-2.012167 -6.44991,-1.8836905 -11.42192,-0.2457 -8.66328,7.0080302 -11.21253,16.0768238 -12.11637,20.1328288 -1.01612,3.667963 -15.446226,0.776698 -6.82456,-7.854079 3.2983,-3.3578275 11.23128,-10.4578594 4.9,-12.3 -8.75831,-2.0518262 -6.68787,4.85416494 -5.71815,5.60783029 0.8142,-0.43470477 0.7066,-0.35306049 1.38221,-0.98220829 -1.17923,-0.8361833 -0.84585,-1.8283785 0.25907,-2.5103183 1.26041,-0.7312468 2.29961,-0.5841371 3.68327,0.3779364 2.30121,3.99968414 -3.10867,6.3374791 -6.06121,8.5893156 -7.571668,6.8550703 0.11863,18.3130553 6.94372,20.6479193 l 0.77482,-1.497349 c 1.024,0.222539 2.43711,0.731241 3.93177,1.474031 0.11862,0.05895 -0.0661,1.049227 -0.0564,1.233499 0.78343,-0.270382 4.65893,-6.09553 4.7812,-6.115529 1.48143,0.230311 1.07354,3.434896 -1.37652,5.984803 4.20113,-1.72865 7.84001,-6.076464 9.2663,-9.632977 2.12212,-5.291587 -0.65644,-3.773127 -1.42504,-5.631192 C 125.75704,7.2456297 128.89,0.31884652 133.58364,1.5558406 Z"
+         id="path5349-8"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccccccccccccccscccsccc" />
+      <path
+         style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.54272723;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 111.72715,26.876138 c -1.99457,3.992422 -2.2307,3.850363 -4.55878,6.92067 -0.57956,1.378028 4.89591,-3.943837 5.76902,-6.496225 -1.02889,-0.498698 -0.43741,-0.404465 -1.21024,-0.424445 z"
+         id="path5353-9"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path3879"
+       d="m 17.809955,22.804124 c -0.364,-0.186 -0.542,-0.279 -0.542,-0.279 -0.499,-0.195 -0.652,-0.559 -0.474,-1.092 0.195,-0.491 0.576,-0.66 1.143,-0.491 1.947,0.711 3.294,2.02 4.04,3.92 0.118,0.542 -0.076,0.914 -0.592999,1.118 -0.516001,0.161 -0.864001,-0.017 -1.041001,-0.55 -0.136,-0.279 -0.229,-0.466 -0.296,-0.542 -0.186,0.144 -0.423,0.245 -0.72,0.296 -1.01,0.161 -1.6,-0.279 -1.761,-1.338 -0.051,-0.364 0.034,-0.711 0.246,-1.041"
+       style="fill:#000000;stroke-width:1" />
+  </g>
+  <path
+     sodipodi:type="star"
+     style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60862446;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+     id="path14581"
+     sodipodi:sides="64"
+     sodipodi:cx="24.943983"
+     sodipodi:cy="6.1232343"
+     sodipodi:r1="3.7441592"
+     sodipodi:r2="3.7396493"
+     sodipodi:arg1="0.78539816"
+     sodipodi:arg2="0.83448555"
+     inkscape:flatsided="true"
+     inkscape:rounded="0"
+     inkscape:randomized="0"
+     d="m 27.591503,8.7707546 -0.27225,0.2467539 -0.295127,0.2188804 -0.315158,0.188899 -0.332157,0.1570984 -0.345956,0.123785 -0.356423,0.089279 -0.363457,0.053914 -0.366992,0.018029 L 24.576991,9.8493643 24.213534,9.7954505 23.857111,9.7061713 23.511155,9.5823863 23.178999,9.4252879 22.86384,9.2363889 22.568714,9.0175085 22.296463,8.7707547 22.049709,8.4985037 21.830828,8.2033777 21.641929,7.8882187 21.484831,7.556062 21.361046,7.2101063 l -0.08928,-0.3564228 -0.05391,-0.3634574 -0.01803,-0.3669918 0.01803,-0.3669918 0.05391,-0.3634574 0.08928,-0.3564229 0.123785,-0.3459556 0.157098,-0.3321568 0.188899,-0.3151589 0.218881,-0.2951261 0.246754,-0.2722509 0.272251,-0.2467538 0.295126,-0.2188804 0.315159,-0.1888991 0.332156,-0.1570984 0.345956,-0.1237849 0.356423,-0.089279 0.363457,-0.053914 0.366992,-0.018029 0.366992,0.018029 0.363457,0.053914 0.356423,0.089279 0.345956,0.1237849 0.332157,0.1570984 0.315158,0.188899 0.295127,0.2188804 0.27225,0.2467539 0.246754,0.2722509 0.218881,0.2951261 0.188899,0.3151589 0.157098,0.3321568 0.123785,0.3459556 0.08928,0.3564228 0.05391,0.3634575 0.01803,0.3669918 -0.01803,0.3669917 -0.05391,0.3634575 -0.08928,0.3564228 -0.123785,0.3459557 -0.157098,0.3321567 -0.188899,0.315159 -0.218881,0.295126 z" />
+  <path
+     d="m 27.591503,46.524287 -0.27225,0.246753 -0.295127,0.218881 -0.315158,0.188899 -0.332157,0.157098 -0.345956,0.123785 -0.356423,0.08928 -0.363457,0.05391 -0.366992,0.01803 -0.366992,-0.01803 -0.363457,-0.05391 -0.356423,-0.08928 -0.345956,-0.123785 -0.332156,-0.157098 -0.315159,-0.188899 -0.295126,-0.218881 -0.272251,-0.246753 -0.246754,-0.272251 -0.218881,-0.295126 -0.188899,-0.315159 -0.157098,-0.332157 -0.123785,-0.345956 -0.08928,-0.356423 -0.05391,-0.363457 -0.01803,-0.366992 0.01803,-0.366992 0.05391,-0.363457 0.08928,-0.356423 0.123785,-0.345955 0.157098,-0.332157 0.188899,-0.315159 0.218881,-0.295126 0.246754,-0.272251 0.272251,-0.246754 0.295126,-0.21888 0.315159,-0.188899 0.332156,-0.157099 0.345956,-0.123785 0.356423,-0.08928 0.363457,-0.05391 0.366992,-0.01803 0.366992,0.01803 0.363457,0.05391 0.356423,0.08928 0.345956,0.123785 0.332157,0.157099 0.315158,0.188899 0.295127,0.21888 0.27225,0.246754 0.246754,0.272251 0.218881,0.295126 0.188899,0.315159 0.157098,0.332156 0.123785,0.345956 0.08928,0.356423 0.05391,0.363457 0.01803,0.366992 -0.01803,0.366992 -0.05391,0.363457 -0.08928,0.356423 -0.123785,0.345956 -0.157098,0.332157 -0.188899,0.315159 -0.218881,0.295126 z"
+     inkscape:randomized="0"
+     inkscape:rounded="0"
+     inkscape:flatsided="true"
+     sodipodi:arg2="0.83448555"
+     sodipodi:arg1="0.78539816"
+     sodipodi:r2="3.7396493"
+     sodipodi:r1="3.7441592"
+     sodipodi:cy="43.876766"
+     sodipodi:cx="24.943983"
+     sodipodi:sides="64"
+     id="path14583"
+     style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60862446;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+     sodipodi:type="star" />
+  <path
+     d="M 27.786864,7.5038459 27.500284,7.7635868 27.189625,7.9939873 26.857878,8.1928283 26.50824,8.3581951 26.144076,8.488495 25.768894,8.5824732 25.386307,8.6392246 25,8.6582026 24.613693,8.6392246 24.231106,8.5824732 23.855924,8.488495 23.49176,8.3581951 23.142122,8.1928283 22.810375,7.9939873 22.499716,7.7635869 22.213136,7.503846 21.953396,7.2172661 21.722995,6.906607 21.524154,6.5748608 21.358787,6.2252221 l -0.1303,-0.3641639 -0.09398,-0.3751819 -0.05675,-0.3825868 -0.01898,-0.3863071 0.01898,-0.3863072 0.05675,-0.3825868 0.09398,-0.3751819 0.1303,-0.3641638 0.165367,-0.3496387 0.198841,-0.3317463 0.230401,-0.310659 0.25974,-0.2865799 0.28658,-0.2597409 0.310659,-0.2304004 0.331747,-0.1988411 0.349638,-0.1653668 0.364164,-0.13029989 0.375182,-0.0939782 0.382587,-0.0567514 L 25,0.77576208 l 0.386307,0.018978 0.382587,0.0567514 0.375182,0.0939782 0.364164,0.1302999 0.349638,0.1653668 0.331747,0.1988411 0.310659,0.2304004 0.28658,0.2597409 0.25974,0.2865799 0.230401,0.310659 0.198841,0.3317463 0.165367,0.3496386 0.1303,0.3641639 0.09398,0.3751819 0.05675,0.3825868 0.01898,0.3863072 -0.01898,0.3863071 -0.05675,0.3825868 -0.09398,0.3751819 -0.1303,0.3641639 -0.165367,0.3496386 -0.198841,0.3317463 -0.230401,0.310659 z"
+     inkscape:randomized="0"
+     inkscape:rounded="0"
+     inkscape:flatsided="true"
+     sodipodi:arg2="0.83448555"
+     sodipodi:arg1="0.78539816"
+     sodipodi:r2="3.9364729"
+     sodipodi:r1="3.9412203"
+     sodipodi:cy="4.7169824"
+     sodipodi:cx="25"
+     sodipodi:sides="64"
+     id="path14585"
+     style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+     sodipodi:type="star"
+     transform="matrix(0,0.95,-0.95,0,49.086086,1.6421021)" />
+</svg>
diff --git a/client/public/images/pieces/Cwda/wg.svg b/client/public/images/pieces/Cwda/wg.svg
new file mode 100644 (file)
index 0000000..4290d9c
--- /dev/null
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="100%"
+   width="100%"
+   version="1.1"
+   viewBox="0 0 2048 2048"
+   id="svg18"
+   sodipodi:docname="wg.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+  <metadata
+     id="metadata24">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs22" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="960"
+     inkscape:window-height="1060"
+     id="namedview20"
+     showgrid="false"
+     inkscape:zoom="0.43115234"
+     inkscape:cx="1024"
+     inkscape:cy="1024"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg18" />
+  <path
+     style="color:#000000"
+     d="m 1161,1706 h 170 v 137 h 274 V 1468 L 1383,1297 V 819 L 1553,649 V 444 h 153 V 205 H 341 v 239 h 153 v 205 l 171,170 v 478 l -222,171 v 375 h 273 v -137 h 171 v 137 h 274 z M 1639,376 H 409 V 273 H 1639 Z M 1484,580 H 564 V 444 h 920 z m -170,717 H 734 V 819 h 580 z m 222,239 v 239 h -137 v -137 h -308 v 137 H 956 V 1638 H 649 v 137 H 512 V 1536 Z M 1459,649 1356,751 H 693 L 588,649 Z m -110,716 127,103 H 572 l 128,-103 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#000000"
+     id="path2" />
+  <g
+     fill-rule="nonzero"
+     fill="#ffffff"
+     id="g12"
+     transform="matrix(1,0,0,-1,0,2048)">
+    <path
+       style="color:#000000"
+       d="M 1639,1672 H 409 v 103 h 1230 z"
+       display="block"
+       id="path4" />
+    <path
+       style="color:#000000"
+       d="M 1484,1468 H 564 v 136 h 920 z"
+       display="block"
+       id="path6" />
+    <path
+       style="color:#000000"
+       d="M 1314,751 H 734 v 478 h 580 z"
+       display="block"
+       id="path8" />
+    <path
+       style="color:#000000"
+       d="M 1536,512 V 273 H 1399 V 410 H 1091 V 273 H 956 V 410 H 649 V 273 H 512 v 239 z"
+       display="block"
+       id="path10" />
+  </g>
+  <path
+     style="color:#000000"
+     d="M 1459,649 1356,751 H 693 L 588,649 Z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#ffffff"
+     id="path14" />
+  <path
+     style="color:#000000"
+     d="m 1349,1365 127,103 H 572 l 128,-103 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#ffffff"
+     id="path16" />
+</svg>
index 0e24975..96843bf 100644 (file)
@@ -5,32 +5,28 @@
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:svg="http://www.w3.org/2000/svg"
    xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="177.17"
-   height="177.17"
-   shape-rendering="geometricPrecision"
-   image-rendering="optimizeQuality"
-   fill-rule="evenodd"
-   clip-rule="evenodd"
-   viewBox="0 0 50 50"
+   height="100%"
+   width="100%"
    version="1.1"
    version="1.1"
-   id="svg974"
-   sodipodi:docname="wWaffle.svg"
-   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+   viewBox="0 0 2048 2048"
+   id="svg18"
+   sodipodi:docname="wh.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
   <metadata
   <metadata
-     id="metadata978">
+     id="metadata24">
     <rdf:RDF>
       <cc:Work
          rdf:about="">
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
     <rdf:RDF>
       <cc:Work
          rdf:about="">
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
       </cc:Work>
     </rdf:RDF>
   </metadata>
       </cc:Work>
     </rdf:RDF>
   </metadata>
+  <defs
+     id="defs22" />
   <sodipodi:namedview
      pagecolor="#ffffff"
      bordercolor="#666666"
   <sodipodi:namedview
      pagecolor="#ffffff"
      bordercolor="#666666"
      guidetolerance="10"
      inkscape:pageopacity="0"
      inkscape:pageshadow="2"
      guidetolerance="10"
      inkscape:pageopacity="0"
      inkscape:pageshadow="2"
-     inkscape:window-width="1920"
+     inkscape:window-width="960"
      inkscape:window-height="1060"
      inkscape:window-height="1060"
-     id="namedview976"
+     id="namedview20"
      showgrid="false"
      showgrid="false"
-     inkscape:zoom="2.3931818"
-     inkscape:cx="8.4123423"
-     inkscape:cy="122.97195"
+     inkscape:zoom="0.43115234"
+     inkscape:cx="1024"
+     inkscape:cy="1021.6806"
      inkscape:window-x="0"
      inkscape:window-y="20"
      inkscape:window-maximized="0"
      inkscape:window-x="0"
      inkscape:window-y="20"
      inkscape:window-maximized="0"
-     inkscape:current-layer="svg974"
-     showguides="false" />
-  <defs
-     id="defs968">
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient4543">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="0"
-         id="stop4539" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0;"
-         offset="1"
-         id="stop4541" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient1002">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1"
-         offset="0"
-         id="stop998" />
-      <stop
-         style="stop-color:#dcdbdb;stop-opacity:1"
-         offset="1"
-         id="stop1000" />
-    </linearGradient>
-    <linearGradient
-       id="0"
-       x1="21.376"
-       x2="77.64"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         stop-color="#fff"
-         id="stop963" />
-      <stop
-         offset="1"
-         stop-color="#fff"
-         stop-opacity="0"
-         id="stop965" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient1002"
-       id="linearGradient1004"
-       x1="-41.790333"
-       y1="22.581646"
-       x2="-15.82877"
-       y2="22.581646"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       id="linearGradient5398"
-       x1="0"
-       y1="0"
-       x2="0"
-       y2="1">
-      <stop
-         offset="20%"
-         style="stop-color:#000000;stop-opacity:1"
-         id="stop5394" />
-      <stop
-         offset="100%"
-         style="stop-color:#4d4d4d;stop-opacity:1"
-         id="stop5396" />
-    </linearGradient>
-    <linearGradient
-       gradientTransform="translate(0.47111842,-0.19973575)"
-       id="0-1"
-       x1="21.253"
-       y1="37.591999"
-       x2="77.639999"
-       y2="37.469002"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         stop-color="#fff"
-         id="stop3285" />
-      <stop
-         offset="1"
-         stop-color="#fff"
-         stop-opacity="0"
-         id="stop3287" />
-    </linearGradient>
-    <linearGradient
-       gradientTransform="translate(50.633198,2.6998865)"
-       id="0-5"
-       x1="21.405001"
-       x2="77.639999"
-       gradientUnits="userSpaceOnUse">
-      <stop
-         stop-color="#fff"
-         id="stop3911" />
-      <stop
-         offset="1"
-         stop-color="#fff"
-         stop-opacity="0"
-         id="stop3913" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4543"
-       id="linearGradient4545"
-       x1="119.21609"
-       y1="11.441374"
-       x2="209.83548"
-       y2="11.441374"
-       gradientUnits="userSpaceOnUse" />
-  </defs>
-  <g
-     transform="matrix(0.95,0,0,0.95,1.1939867,1.6421008)"
-     id="g14577">
-    <rect
-       y="4.245285"
-       x="23.113207"
-       height="40.212261"
-       width="3.7735846"
-       id="rect14571"
-       style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
-    <rect
-       transform="rotate(90)"
-       style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.84308159;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
-       id="rect14573"
-       width="3.7735846"
-       height="47.641506"
-       x="23.231133"
-       y="-48.820751" />
-  </g>
+     inkscape:current-layer="svg18"
+     inkscape:document-rotation="0" />
+  <path
+     style="color:#000000"
+     d="m 1024,864.11538 q 97,0 186,-15 98,35 142,109 38,64.00002 38,141.00002 0,46 -23,101 -23,55 -75,101 -59,49 -129,107 -70,58 -139,137 -70,-78 -140,-136 -70,-58 -128,-108 -53,-45 -75,-100 -22,-55 -23,-102 0,-77 37,-141.00002 43,-74 143,-109 88,15 186,15 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#ffffff"
+     id="path2" />
   <path
   <path
-     sodipodi:type="star"
-     style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
-     id="path14587"
-     sodipodi:sides="64"
-     sodipodi:cx="25"
-     sodipodi:cy="44.457546"
-     sodipodi:r1="3.9412203"
-     sodipodi:r2="3.9364729"
-     sodipodi:arg1="0.78539816"
-     sodipodi:arg2="0.83448555"
-     inkscape:flatsided="true"
-     inkscape:rounded="0"
-     inkscape:randomized="0"
-     d="m 27.786864,47.24441 -0.28658,0.259741 -0.310659,0.2304 -0.331747,0.198841 -0.349638,0.165367 -0.364164,0.1303 -0.375182,0.09398 -0.382587,0.05675 L 25,48.398767 l -0.386307,-0.01898 -0.382587,-0.05675 -0.375182,-0.09398 -0.364164,-0.1303 -0.349638,-0.165367 -0.331747,-0.198841 -0.310659,-0.2304 -0.28658,-0.259741 -0.25974,-0.28658 -0.230401,-0.310659 -0.198841,-0.331746 -0.165367,-0.349639 -0.1303,-0.364164 -0.09398,-0.375182 -0.05675,-0.382587 -0.01898,-0.386307 0.01898,-0.386307 0.05675,-0.382587 0.09398,-0.375182 0.1303,-0.364163 0.165367,-0.349639 0.198841,-0.331746 0.230401,-0.310659 0.25974,-0.28658 0.28658,-0.259741 0.310659,-0.230401 0.331747,-0.198841 0.349638,-0.165367 0.364164,-0.130299 0.375182,-0.09398 0.382587,-0.05675 L 25,40.516326 l 0.386307,0.01898 0.382587,0.05675 0.375182,0.09398 0.364164,0.130299 0.349638,0.165367 0.331747,0.198841 0.310659,0.230401 0.28658,0.259741 0.25974,0.28658 0.230401,0.310659 0.198841,0.331746 0.165367,0.349639 0.1303,0.364163 0.09398,0.375182 0.05675,0.382587 0.01898,0.386307 -0.01898,0.386307 -0.05675,0.382587 -0.09398,0.375182 -0.1303,0.364164 -0.165367,0.349639 -0.198841,0.331746 -0.230401,0.310659 z"
-     transform="matrix(0,0.95,-0.95,0,47.629715,1.6421021)" />
+     style="color:#000000"
+     d="m 988,1120.1154 -83,1 q -34,0 -34,34 0,34 34,34 h 83 v 86 q 0,35 36,35 35,0 35,-35 v -86 h 86 q 33,0 33,-34 0,-34 -33,-34 h -86 v -82 q 0,-36 -35,-36 -36,0 -36,36 z m 36,-578.00002 q 68,0 132,11 64,11 125,28 -117,31 -257,31 -142,0 -257,-31 58,-16 123,-27 65,-11 134,-12 z m 0,1089.00002 q 68,0 68,68 0,68 -68,68 -68,0 -68,-68 0,-68 68,-68 z m 0,-949.00002 q 117,0 225,-23 l -48,123 q -88,14 -177,14 -91,0 -178,-14 l -48,-123 q 107,23 226,23 z m 0,182 q 97,0 186,-15 98,35 142,109 38,64.00002 38,141.00002 0,46 -23,101 -23,55 -75,101 -59,49 -129,107 -70,58 -139,137 -70,-78 -140,-136 -70,-58 -128,-108 -53,-45 -75,-100 -22,-55 -23,-102 0,-77 37,-141.00002 43,-74 143,-109 88,15 186,15 z m -36,-377 h -32 q -56,-90 -107,-113 -24,-12 -53,-22 -29,-10 -67,-10 -7,0 -107,16 -48,7 -76,15 -28,8 -44,10 -57,7 -133,-6 -46,-8 -86,-29 l 48,-78 q 12,12 31,15 19,3 36,8 42,7 80,2 13,-3 51,-7 38,-4 101,-15 75,-11 102,-11 105,0 161,40 34,26 64,72 30,46 31,113 z m 36,-113 q -14,-57 -34,-79 -20,-22 -53,-46 -36,-25 -85,-42 -49,-17 -109,-9 l -281,39 q -17,2 -30,0 -13,-2 -26,-2 -21,0 -53,-9 -32,-9 -51,-28 l -97,159 q 18,20 32,28 14,8 33,17 58,27 124,33 28,2 55,1 27,-1 56,2 54,-9 108,-16 54,-7 110,-16 60,0 81,12 11,6 35,22 24,16 48,47 -53,6 -108,20 -55,14 -97,31 l 104,258 q -78,45 -109,72 -31,27 -49,64 -26,46 -33,89.00002 -7,43 -7,77 1,60 28,132 27,72 104,130 63,48 123,99 60,51 119,119 -74,38 -74,121 0,56 39,96 39,40 97,40 56,0 96,-40 40,-40 40,-96 0,-82 -74,-121 58,-68 117,-119 59,-51 125,-99 75,-57 102,-129 27,-72 29,-133 0,-34 -7,-77 -7,-43.00002 -32,-89.00002 -20,-36 -50,-63 -30,-27 -108,-73 l 104,-258 q -44,-16 -99,-30 -55,-14 -106,-21 23,-31 47,-47 24,-16 36,-22 21,-12 81,-12 54,8 108,15 54,7 110,17 27,-3 54,-2 27,1 57,-1 64,-6 124,-33 18,-9 32,-17 14,-8 33,-28 l -98,-159 q -18,18 -50,27 -32,9 -53,10 -13,0 -26,2 -13,2 -31,0 l -280,-39 q -60,-9 -111,8 -51,17 -85,45 -33,27 -52,46 -19,19 -33,77 z m 35,113 q 0,-66 30,-112 30,-46 66,-73 55,-40 161,-40 26,0 102,11 62,10 100,14 38,4 51,8 38,5 80,-2 16,-4 35,-7 19,-3 33,-16 l 48,78 q -41,21 -87,29 -76,13 -133,6 -17,-2 -44,-10 -27,-8 -75,-15 -101,-16 -107,-16 -39,0 -68,10 -29,10 -52,22 -53,24 -108,113 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#000000"
+     id="path4" />
   <g
   <g
-     id="g19380"
-     transform="matrix(0.77598955,0,0,0.77598955,5.3934327,3.4879779)">
-    <g
-       transform="matrix(1.0975945,0,0,1.0975945,-107.62233,17.126787)"
-       style="opacity:1;fill:#1f1a17;fill-opacity:1;stroke-width:1.54272723;stroke-miterlimit:4;stroke-dasharray:none"
-       id="g5357">
-      <path
-         style="fill:#1f1a17;fill-opacity:1;stroke:none;stroke-width:1.54272723;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         d="m 119.66608,20.578823 c 0.12511,0.773672 0.40427,1.44388 1.3,1.7 11.23011,-0.424319 16.82956,-5.233235 20.30001,-11.7 l 0.2,-2.099999 c -2.10707,-8.89280401 -8.15113,-13.4502442 -16.2,-15.8 -4.40015,-0.5317426 -7.59668,1.3815851 -10.20001,4.5 -2.59354,2.64077835 -4.39616,5.9439949 -5.3,10 -0.9084,3.60641 -5.79067,1.6990508 -4.9,-0.6 2.76583,-4.0566968 11.00069,-10.7605086 4.9,-12.3 -8.75831,-2.0518262 -7.05798,4.7061225 -5.2,6.20000004 1.23982,-0.5457366 2.00197,-1.22280981 2.4,-2.00000004 -0.25951,-0.4357328 -0.98217,-0.8162564 0,-1.4 0.5387,0.045976 0.81918,0.2856122 1,0.6 0,1 0.50403,1.1455069 -3.6,4 -7.640521,5.2325602 -2.06546,17.121851 4.61159,18.198353 1.32064,-0.324595 1.53284,-0.226663 2.43634,0.347926 l 3.15207,0.35372 c 2.39802,-0.822905 4.4665,-1.650139 5.70313,-3.159477 0.32094,-0.38845 0.4935,-0.247984 -0.60313,3.159477 z"
-         id="path5349"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="ccccccccccccccccccc" />
-      <path
-         style="fill:#1f1a17;fill-opacity:1;stroke:none;stroke-width:1.54272723;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         d="m 109.56608,17.578823 c -1.32838,4.066443 -4.04985,6.321863 -6.6,8.8 -0.20576,0.304421 0.14574,0.397532 1,0.3 3.90473,-1.863513 7.52129,-4.086217 8.76166,-7.725974 -0.78642,-0.41302 -1.9736,-1.357866 -3.16166,-1.374026 z"
-         id="path5353"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="ccccc" />
-    </g>
-    <g
-       transform="matrix(0.79655895,0,0,0.79655895,-75.421737,16.247409)"
-       style="opacity:1;fill:#ffff00;fill-opacity:1;stroke-width:1.54272723;stroke-miterlimit:4;stroke-dasharray:none"
-       id="g5357-2">
-      <path
-         style="fill:url(#linearGradient4545);fill-opacity:1;stroke:none;stroke-width:1.54272723;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         d="m 133.58361,1.5558616 c -8.75606,10.1109584 -4.19979,7.5116959 -2.74223,10.1130104 -0.10968,5.65697 -1.90023,10.862018 -3.55112,15.867945 0.12511,0.773672 0.47829,1.517901 1.37402,1.774021 12.03339,-0.558199 18.98339,-7.721951 22.11462,-14.132179 l 0.43477,-2.601728 c -2.89219,-8.7881214 -9.12021,-14.2749978 -15.98474,-18.0311568 -3.95603,-2.012167 -6.44991,-1.8836905 -11.42192,-0.2457 -8.66328,7.0080302 -11.21253,16.0768238 -12.11637,20.1328288 -1.01612,3.667963 -15.446226,0.776698 -6.82456,-7.854079 3.2983,-3.3578275 11.23128,-10.4578594 4.9,-12.3 -8.75831,-2.0518262 -6.68787,4.85416494 -5.71815,5.60783029 0.8142,-0.43470477 0.7066,-0.35306049 1.38221,-0.98220829 -1.17923,-0.8361833 -0.84585,-1.8283785 0.25907,-2.5103183 1.26041,-0.7312468 2.29961,-0.5841371 3.68327,0.3779364 2.30121,3.99968414 -3.10867,6.3374791 -6.06121,8.5893156 -7.571668,6.8550703 0.11863,18.3130553 6.94372,20.6479193 l 0.77482,-1.497349 c 1.024,0.222539 2.43711,0.731241 3.93177,1.474031 0.11862,0.05895 -0.0661,1.049227 -0.0564,1.233499 0.78343,-0.270382 4.65893,-6.09553 4.7812,-6.115529 1.48143,0.230311 1.07354,3.434896 -1.37652,5.984803 4.20113,-1.72865 7.84001,-6.076464 9.2663,-9.632977 2.12212,-5.291587 -0.65644,-3.773127 -1.42504,-5.631192 C 125.75704,7.2456297 128.89,0.31884652 133.58364,1.5558406 Z"
-         id="path5349-8"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="ccccccccccccccccccscccsccc" />
-      <path
-         style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.54272723;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         d="m 111.72715,26.876138 c -1.99457,3.992422 -2.2307,3.850363 -4.55878,6.92067 -0.57956,1.378028 4.89591,-3.943837 5.76902,-6.496225 -1.02889,-0.498698 -0.43741,-0.404465 -1.21024,-0.424445 z"
-         id="path5353-9"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="cccc" />
-    </g>
+     fill-rule="nonzero"
+     fill="#ffffff"
+     id="g16"
+     transform="matrix(1,0,0,-1,0,2030.1154)">
+    <path
+       style="color:#000000"
+       d="m 1024,1488 q 68,0 132,-11 64,-11 125,-28 -117,-31 -257,-31 -142,0 -257,31 58,16 123,27 65,11 134,12 z"
+       display="block"
+       id="path6" />
     <path
     <path
-       inkscape:connector-curvature="0"
-       id="path3879"
-       d="m 17.809955,22.804124 c -0.364,-0.186 -0.542,-0.279 -0.542,-0.279 -0.499,-0.195 -0.652,-0.559 -0.474,-1.092 0.195,-0.491 0.576,-0.66 1.143,-0.491 1.947,0.711 3.294,2.02 4.04,3.92 0.118,0.542 -0.076,0.914 -0.592999,1.118 -0.516001,0.161 -0.864001,-0.017 -1.041001,-0.55 -0.136,-0.279 -0.229,-0.466 -0.296,-0.542 -0.186,0.144 -0.423,0.245 -0.72,0.296 -1.01,0.161 -1.6,-0.279 -1.761,-1.338 -0.051,-0.364 0.034,-0.711 0.246,-1.041"
-       style="fill:#000000;stroke-width:1" />
+       style="color:#000000"
+       d="m 1024,399 q 68,0 68,-68 0,-68 -68,-68 -68,0 -68,68 0,68 68,68 z"
+       display="block"
+       id="path8" />
+    <path
+       style="color:#000000"
+       d="m 1024,1348 q 117,0 225,23 l -48,-123 q -88,-14 -177,-14 -91,0 -178,14 l -48,123 q 107,-23 226,-23 z"
+       display="block"
+       id="path10" />
+    <path
+       style="color:#000000"
+       d="m 988,1543 h -32 q -56,90 -107,113 -24,12 -53,22 -29,10 -67,10 -7,0 -107,-16 -48,-7 -76,-15 -28,-8 -44,-10 -57,-7 -133,6 -46,8 -86,29 l 48,78 q 12,-12 31,-15 19,-3 36,-8 42,-7 80,-2 13,3 51,7 38,4 101,15 75,11 102,11 105,0 161,-40 34,-26 64,-72 30,-46 31,-113 z"
+       display="block"
+       id="path12" />
+    <path
+       style="color:#000000"
+       d="m 1059,1543 q 0,66 30,112 30,46 66,73 55,40 161,40 26,0 102,-11 62,-10 100,-14 38,-4 51,-8 38,-5 80,2 16,4 35,7 19,3 33,16 l 48,-78 q -41,-21 -87,-29 -76,-13 -133,-6 -17,2 -44,10 -27,8 -75,15 -101,16 -107,16 -39,0 -68,-10 -29,-10 -52,-22 -53,-24 -108,-113 z"
+       display="block"
+       id="path14" />
   </g>
   <path
   </g>
   <path
-     sodipodi:type="star"
-     style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60862446;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
-     id="path14581"
-     sodipodi:sides="64"
-     sodipodi:cx="24.943983"
-     sodipodi:cy="6.1232343"
-     sodipodi:r1="3.7441592"
-     sodipodi:r2="3.7396493"
-     sodipodi:arg1="0.78539816"
-     sodipodi:arg2="0.83448555"
-     inkscape:flatsided="true"
-     inkscape:rounded="0"
-     inkscape:randomized="0"
-     d="m 27.591503,8.7707546 -0.27225,0.2467539 -0.295127,0.2188804 -0.315158,0.188899 -0.332157,0.1570984 -0.345956,0.123785 -0.356423,0.089279 -0.363457,0.053914 -0.366992,0.018029 L 24.576991,9.8493643 24.213534,9.7954505 23.857111,9.7061713 23.511155,9.5823863 23.178999,9.4252879 22.86384,9.2363889 22.568714,9.0175085 22.296463,8.7707547 22.049709,8.4985037 21.830828,8.2033777 21.641929,7.8882187 21.484831,7.556062 21.361046,7.2101063 l -0.08928,-0.3564228 -0.05391,-0.3634574 -0.01803,-0.3669918 0.01803,-0.3669918 0.05391,-0.3634574 0.08928,-0.3564229 0.123785,-0.3459556 0.157098,-0.3321568 0.188899,-0.3151589 0.218881,-0.2951261 0.246754,-0.2722509 0.272251,-0.2467538 0.295126,-0.2188804 0.315159,-0.1888991 0.332156,-0.1570984 0.345956,-0.1237849 0.356423,-0.089279 0.363457,-0.053914 0.366992,-0.018029 0.366992,0.018029 0.363457,0.053914 0.356423,0.089279 0.345956,0.1237849 0.332157,0.1570984 0.315158,0.188899 0.295127,0.2188804 0.27225,0.2467539 0.246754,0.2722509 0.218881,0.2951261 0.188899,0.3151589 0.157098,0.3321568 0.123785,0.3459556 0.08928,0.3564228 0.05391,0.3634575 0.01803,0.3669918 -0.01803,0.3669917 -0.05391,0.3634575 -0.08928,0.3564228 -0.123785,0.3459557 -0.157098,0.3321567 -0.188899,0.315159 -0.218881,0.295126 z" />
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 947.17182,471.41109 c -30.45334,-45.32634 -64.86074,-80.9966 -91.76761,-95.13576 -22.95398,-12.06198 -61.45362,-26.6333 -81.08074,-30.68739 -26.67391,-5.50965 -51.01232,-4.28682 -116.05835,5.8311 -72.89746,11.33921 -76.88494,12.10192 -119.01258,22.76439 -33.45007,8.46618 -33.89255,8.5119 -82.33748,8.50794 -66.52062,-0.005 -108.55722,-7.30624 -155.48269,-27.00384 l -17.29486,-7.25975 5.09615,-8.37924 c 2.80289,-4.60858 13.30666,-21.68954 23.34173,-37.95769 l 18.24557,-29.57846 9.70164,5.52032 c 5.33589,3.03617 22.74806,8.43988 38.6937,12.00823 40.29849,9.0181 76.74353,9.11601 142.641,0.38322 26.78868,-3.55006 60.80841,-8.50481 75.5994,-11.01056 85.2588,-14.44374 136.26154,-18.40583 179.53084,-13.94666 71.73861,7.39311 116.60421,29.22282 153.48533,74.67949 36.13568,44.53787 51.19578,79.03611 55.36431,126.823 l 1.65194,18.9377 h -15.28893 -15.28896 z"
+     id="path98" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 960.21744,609.71854 c -30.46594,-1.92131 -88.37044,-8.34131 -113.06287,-12.53553 -34.16061,-5.80248 -71.32671,-14.1993 -71.32671,-16.11462 0,-3.20983 87.1612,-22.0073 134.42087,-28.98966 62.98166,-9.30519 159.43327,-10.45377 215.80337,-2.56986 47.4172,6.63175 146.12,27.88938 146.12,31.46988 0,4.28726 -90.4772,20.37707 -143.8006,25.57245 -26.8902,2.61996 -142.34881,4.79472 -168.15406,3.16734 z"
+     id="path100" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 1061.8034,464.453 c 3.254,-50.76824 23.7655,-92.95822 66.2041,-136.17488 32.4584,-33.05348 60.9141,-48.19648 108.9705,-57.98975 48.4347,-9.87036 92.2077,-8.96955 177.8351,3.6597 21.6861,3.1985 59.2598,8.3515 83.4972,11.45111 24.2374,3.09962 53.8564,7.35888 65.8201,9.46503 39.7549,6.99867 118.5147,-2.11356 143.1736,-16.56469 l 9.875,-5.78713 18.2456,29.57846 c 10.0351,16.26815 20.5389,33.34911 23.3417,37.95769 l 5.0962,8.37924 -17.2949,7.25975 c -46.8542,19.66769 -89.5876,26.97583 -157.802,26.98684 l -48.7067,0.008 -38.2695,-9.86495 c -45.6661,-11.77155 -163.9011,-30.71085 -191.723,-30.71085 -34.8132,0 -72.4411,10.70844 -114.0588,32.45977 -31.5375,16.48291 -63.3679,48.11742 -92.5737,92.00384 l -12.8686,19.33707 h -15.0685 -15.0685 z"
+     id="path102" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 926.58664,790.93079 c -48.45784,-4.4723 -76.71362,-8.51955 -79.27829,-11.35554 -1.96603,-2.17401 -48.13304,-117.97896 -47.38055,-118.84898 0.13937,-0.16115 13.29983,2.13616 29.24547,5.10512 122.21863,22.7562 264.35173,22.78487 389.07363,0.0785 15.6267,-2.84494 28.4122,-4.79397 28.4122,-4.33117 0,3.21136 -45.0594,115.95904 -47.1855,118.06753 -2.8563,2.83272 -47.2869,8.7649 -93.1361,12.43514 -37.9794,3.04026 -141.52393,2.37747 -179.75086,-1.15058 z"
+     id="path104" />
   <path
   <path
-     d="m 27.591503,46.524287 -0.27225,0.246753 -0.295127,0.218881 -0.315158,0.188899 -0.332157,0.157098 -0.345956,0.123785 -0.356423,0.08928 -0.363457,0.05391 -0.366992,0.01803 -0.366992,-0.01803 -0.363457,-0.05391 -0.356423,-0.08928 -0.345956,-0.123785 -0.332156,-0.157098 -0.315159,-0.188899 -0.295126,-0.218881 -0.272251,-0.246753 -0.246754,-0.272251 -0.218881,-0.295126 -0.188899,-0.315159 -0.157098,-0.332157 -0.123785,-0.345956 -0.08928,-0.356423 -0.05391,-0.363457 -0.01803,-0.366992 0.01803,-0.366992 0.05391,-0.363457 0.08928,-0.356423 0.123785,-0.345955 0.157098,-0.332157 0.188899,-0.315159 0.218881,-0.295126 0.246754,-0.272251 0.272251,-0.246754 0.295126,-0.21888 0.315159,-0.188899 0.332156,-0.157099 0.345956,-0.123785 0.356423,-0.08928 0.363457,-0.05391 0.366992,-0.01803 0.366992,0.01803 0.363457,0.05391 0.356423,0.08928 0.345956,0.123785 0.332157,0.157099 0.315158,0.188899 0.295127,0.21888 0.27225,0.246754 0.246754,0.272251 0.218881,0.295126 0.188899,0.315159 0.157098,0.332156 0.123785,0.345956 0.08928,0.356423 0.05391,0.363457 0.01803,0.366992 -0.01803,0.366992 -0.05391,0.363457 -0.08928,0.356423 -0.123785,0.345956 -0.157098,0.332157 -0.188899,0.315159 -0.218881,0.295126 z"
-     inkscape:randomized="0"
-     inkscape:rounded="0"
-     inkscape:flatsided="true"
-     sodipodi:arg2="0.83448555"
-     sodipodi:arg1="0.78539816"
-     sodipodi:r2="3.7396493"
-     sodipodi:r1="3.7441592"
-     sodipodi:cy="43.876766"
-     sodipodi:cx="24.943983"
-     sodipodi:sides="64"
-     id="path14583"
-     style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60862446;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
-     sodipodi:type="star" />
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 971.81427,1489.269 c -33.7343,-34.0367 -67.92481,-65.5709 -100.89241,-93.0538 C 727.7932,1276.898 712.94334,1262.0988 689.43513,1215.3477 c -35.64978,-70.8972 -38.89555,-152.0899 -8.95504,-224.01025 17.47633,-41.98002 48.40993,-80.56982 83.42688,-104.0754 20.8143,-13.97185 67.23106,-35.85433 75.65918,-35.66836 3.8513,0.085 19.52694,1.82817 34.83475,3.87375 49.50664,6.61557 86.90237,8.81829 149.5991,8.81183 64.5397,-0.007 103.5443,-2.40639 155.2128,-9.54937 35.4041,-4.89449 34.5399,-5.05898 71.4319,13.59618 49.5753,25.06869 85.7117,60.84318 109.4786,108.38215 49.3986,98.80777 32.1307,215.45167 -44.2309,298.77907 -8.1005,8.8394 -51.2582,46.4757 -95.906,83.6361 -92.232,76.7649 -127.2998,108.6652 -166.9212,151.8437 -15.2675,16.6383 -28.314,30.1466 -28.992,30.0184 -0.6781,-0.1281 -24.1946,-23.4006 -52.25893,-51.7165 z m 74.36703,-183.3493 c 12.8571,-8.4243 13.7046,-12.2248 14.5769,-65.3684 l 0.808,-49.2261 47.8987,-0.7453 c 55.0636,-0.8567 59.784,-2.1479 66.1661,-18.0983 4.7794,-11.9451 4.7794,-22.9297 0,-34.8748 -6.3581,-15.8903 -11.0983,-17.1878 -66.1595,-18.1099 l -47.892,-0.8019 -0.8887,-46.7677 c -0.9815,-51.6509 -2.6343,-58.5058 -15.7406,-65.2833 -10.1912,-5.27 -34.187,-4.6222 -43.7036,1.1799 -12.77518,7.7888 -14.35645,15.0548 -14.35645,65.968 v 45.3021 l -41.16875,0.1009 c -48.20479,0.1183 -59.1611,1.7612 -67.52557,10.1257 -5.64188,5.642 -6.11429,7.6295 -6.11429,25.7236 0,18.0106 0.49019,20.0993 6.013,25.6222 8.62666,8.6266 18.87421,10.2104 66.46718,10.2726 l 42.32843,0.055 v 44.9378 c 0,48.9596 0.71455,55.7952 6.65597,63.6719 8.67818,11.505 39.13738,15.1598 52.63518,6.3157 z"
+     id="path106" />
   <path
   <path
-     d="M 27.786864,7.5038459 27.500284,7.7635868 27.189625,7.9939873 26.857878,8.1928283 26.50824,8.3581951 26.144076,8.488495 25.768894,8.5824732 25.386307,8.6392246 25,8.6582026 24.613693,8.6392246 24.231106,8.5824732 23.855924,8.488495 23.49176,8.3581951 23.142122,8.1928283 22.810375,7.9939873 22.499716,7.7635869 22.213136,7.503846 21.953396,7.2172661 21.722995,6.906607 21.524154,6.5748608 21.358787,6.2252221 l -0.1303,-0.3641639 -0.09398,-0.3751819 -0.05675,-0.3825868 -0.01898,-0.3863071 0.01898,-0.3863072 0.05675,-0.3825868 0.09398,-0.3751819 0.1303,-0.3641638 0.165367,-0.3496387 0.198841,-0.3317463 0.230401,-0.310659 0.25974,-0.2865799 0.28658,-0.2597409 0.310659,-0.2304004 0.331747,-0.1988411 0.349638,-0.1653668 0.364164,-0.13029989 0.375182,-0.0939782 0.382587,-0.0567514 L 25,0.77576208 l 0.386307,0.018978 0.382587,0.0567514 0.375182,0.0939782 0.364164,0.1302999 0.349638,0.1653668 0.331747,0.1988411 0.310659,0.2304004 0.28658,0.2597409 0.25974,0.2865799 0.230401,0.310659 0.198841,0.3317463 0.165367,0.3496386 0.1303,0.3641639 0.09398,0.3751819 0.05675,0.3825868 0.01898,0.3863072 -0.01898,0.3863071 -0.05675,0.3825868 -0.09398,0.3751819 -0.1303,0.3641639 -0.165367,0.3496386 -0.198841,0.3317463 -0.230401,0.310659 z"
-     inkscape:randomized="0"
-     inkscape:rounded="0"
-     inkscape:flatsided="true"
-     sodipodi:arg2="0.83448555"
-     sodipodi:arg1="0.78539816"
-     sodipodi:r2="3.9364729"
-     sodipodi:r1="3.9412203"
-     sodipodi:cy="4.7169824"
-     sodipodi:cx="25"
-     sodipodi:sides="64"
-     id="path14585"
-     style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
-     sodipodi:type="star"
-     transform="matrix(0,0.95,-0.95,0,49.086086,1.6421021)" />
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 997.32729,1762.3466 c -16.51064,-5.022 -26.29282,-13.3548 -33.30723,-28.3726 -5.20533,-11.1445 -6.07755,-16.1561 -6.09806,-35.0385 -0.0216,-19.8695 0.65961,-23.4011 6.93417,-35.9502 5.32746,-10.6549 9.47402,-15.4484 17.69378,-20.4544 22.68075,-13.8128 60.21935,-13.8128 82.90005,0 8.2198,5.006 12.3664,9.7995 17.6938,20.4544 6.2664,12.5327 6.9581,16.1067 6.9581,35.9502 0,19.8434 -0.6917,23.4174 -6.9581,35.9501 -4.307,8.6142 -9.9728,15.9127 -14.8709,19.1563 -17.8607,11.8278 -47.8295,15.3358 -70.94561,8.3047 z"
+     id="path108" />
 </svg>
 </svg>
diff --git a/client/public/images/pieces/Cwda/wi.svg b/client/public/images/pieces/Cwda/wi.svg
new file mode 100644 (file)
index 0000000..38d5991
--- /dev/null
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="100%"
+   width="100%"
+   version="1.1"
+   viewBox="0 0 2048 2048"
+   id="svg6"
+   sodipodi:docname="wi.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+  <metadata
+     id="metadata12">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs10" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="960"
+     inkscape:window-height="1060"
+     id="namedview8"
+     showgrid="false"
+     inkscape:zoom="0.43115234"
+     inkscape:cx="1024"
+     inkscape:cy="1024"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg6" />
+  <path
+     style="color:#000000"
+     d="m 1756,234 q -1,0 2,54 3,54 3,118 1,125 0,258 -1,133 -36,267 -34,128 -75,218 -41,90 -89,157 -72,108 -196,183 -124,75 -259,98 9,-49 8,-96 -2,-36 -34,-36 -37,0 -33,36 3,132 -94,226 -76,-80 -82,-186 -2,-35 -36,-31 -32,1 -32,37 0,0 2,8 -41,-13 -86,-37 -29,-20 -47,10 -18,30 16,47 43,22 65,33 -86,88 -196,142 12,-139 76,-263 17,-26 -8,-46 -28,-22 -47,7 -7,10 -20,36 -21,-21 -28,-31 -7,-9 -24,-40 -17,-31 -26,-51 -9,-25 -8,-40 1,-15 3,-35 -9,-59 -40,-111 -31,-52 -81,-127 -47,-72 -72,-108 -25,-36 -38,-92 -9,-34 0,-82 9,-48 39,-76 46,-47 89,-43 14,0 37,11 23,11 37,42 26,57 43,57 25,0 27,-28 0,-6 -16,-50 -9,-20 -24,-42 -19,-26 -17,-22 16,-57 53,-20 11,11 25,41 14,30 44,81 35,59 75,96 40,37 71,60 18,13 44,30 26,17 70,35 35,14 77,34 42,20 76,53 46,45 71,111 13,37 10,91 -9,34 34,34 32,0 36,-33 0,-113 -64,-206 21,-64 11,-140 -9,-61 -42,-130 Q 1017,674 914,588 707,416 718,234 q 0,0 170,0 170,0 321,0 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#ffffff"
+     id="path2" />
+  <path
+     style="color:#000000"
+     d="m 697,1319 q 13,-20 10,-42 -10,-64 -71,-54 -18,3 -29,12 -4,-5 -12,-22 -11,-32 -42,-22 -31,12 -24,45 45,115 163,158 34,10 45,-20 12,-32 -18,-44 -6,-3 -11,-5 -5,-2 -11,-6 z M 400,842 q -29,-18 -35,-48 1,-33 -31,-36 -35,-4 -36,30 4,66 59,105 26,21 48,-4 22,-27 -5,-47 z m 679,815 q 157,-10 291,-81 134,-71 228,-182 66,-78 124,-188 58,-110 94,-233 40,-143 50,-300 10,-157 11,-292 V 163 q 0,0 -155,0 -155,0 -404,0 H 647 q -9,0 -9,49 0,49 7,79 4,24 19,68 15,44 50,107 16,32 76,93 60,61 138,143 45,46 70,116 25,70 22,127 -37,-30 -81,-49 -212,-76 -307,-220 -7,-9 -45,-81 -20,-38 -34,-52 -19,-19 -55,-21 -56,-3 -87,54 -42,-12 -75,-10 -56,21 -81,45 -51,51 -66,102 -15,51 -16,110 0,84 104,222 122,159 130,242 0,36 7,81 6,31 25,60 13,20 17,27 4,7 17,23 9,12 15,18 6,6 15,18 11,13 28,30 -53,146 -43,301 199,-71 334,-223 33,113 130,183 80,-56 127,-148 z M 1756,234 q -1,0 2,54 3,54 3,118 1,125 0,258 -1,133 -36,267 -34,128 -75,218 -41,90 -89,157 -72,108 -196,183 -124,75 -259,98 9,-49 8,-96 -2,-36 -34,-36 -37,0 -33,36 3,132 -94,226 -76,-80 -82,-186 -2,-35 -36,-31 -32,1 -32,37 0,0 2,8 -41,-13 -86,-37 -29,-20 -47,10 -18,30 16,47 43,22 65,33 -86,88 -196,142 12,-139 76,-263 17,-26 -8,-46 -28,-22 -47,7 -7,10 -20,36 -21,-21 -28,-31 -7,-9 -24,-40 -17,-31 -26,-51 -9,-25 -8,-40 1,-15 3,-35 -9,-59 -40,-111 -31,-52 -81,-127 -47,-72 -72,-108 -25,-36 -38,-92 -9,-34 0,-82 9,-48 39,-76 46,-47 89,-43 14,0 37,11 23,11 37,42 26,57 43,57 25,0 27,-28 0,-6 -16,-50 -9,-20 -24,-42 -19,-26 -17,-22 16,-57 53,-20 11,11 25,41 14,30 44,81 35,59 75,96 40,37 71,60 18,13 44,30 26,17 70,35 35,14 77,34 42,20 76,53 46,45 71,111 13,37 10,91 -9,34 34,34 32,0 36,-33 0,-113 -64,-206 21,-64 11,-140 -9,-61 -42,-130 Q 1017,674 914,588 707,416 718,234 q 0,0 170,0 170,0 321,0 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#000000"
+     id="path4" />
+</svg>
diff --git a/client/public/images/pieces/Cwda/wl.svg b/client/public/images/pieces/Cwda/wl.svg
new file mode 100644 (file)
index 0000000..44814bb
--- /dev/null
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="100%"
+   width="100%"
+   version="1.1"
+   viewBox="0 0 2048 2048"
+   id="svg34"
+   sodipodi:docname="wl.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+  <metadata
+     id="metadata40">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs38" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="960"
+     inkscape:window-height="1060"
+     id="namedview36"
+     showgrid="false"
+     inkscape:zoom="0.43115234"
+     inkscape:cx="1024"
+     inkscape:cy="1024"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg34" />
+  <path
+     style="color:#000000"
+     d="m 1024,1593 q -57,0 -96,40 -39,40 -40,97 0,56 39,96 39,40 97,40 56,0 96,-40 40,-40 41,-96 0,-57 -40,-97 -40,-40 -97,-40 z m 0,70 q 67,0 67,67 0,66 -67,66 -66,0 -66,-66 0,-67 66,-67 z M 1533,656 q -193,49 -505,49 -320,0 -511,-50 l 15,-96 q 195,46 496,46 299,0 488,-45 z m 25,60 65,115 q -48,-19 -98,-19 -134,0 -214,109 -60,-50 -134,-50 -96,0 -153,75 -64,-70 -153,-70 -72,0 -132,49 -84,-107 -217,-107 -51,0 -101,19 l 70,-120 q 194,56 533,56 345,0 534,-57 z m -448,239 -85,489 -85,-483 q 3,2 14,10 23,45 70,45 51,0 66,-45 6,-6 20,-16 z m 277,-19 v 463 L 1222,945 q 19,7 32,18 20,25 54,25 40,0 64,-35 3,-4 7,-8 4,-4 8,-9 z M 825,950 661,1399 V 942 q 3,4 9,10 20,42 66,42 38,0 62,-32 27,-12 27,-12 z M 571,894 356,1265 411,927 q 57,-40 111,-40 21,0 49,7 z m 903,-5 q 23,-7 51,-7 61,0 114,38 l 55,346 z m 60,-506 -30,113 q -196,43 -480,43 -281,0 -479,-43 L 514,382 q 186,56 511,56 317,0 509,-55 z m 106,-128 q -49,-43 -220,-72 -171,-29 -394,-29 -227,0 -399,30 -172,30 -217,75 l 63,240 -28,157 -88,153 -85,622 49,19 274,-462 6,550 68,12 209,-553 112,595 h 69 l 112,-593 207,551 69,-12 6,-550 275,463 47,-22 -83,-619 -89,-153 -28,-159 z m -81,36 q -183,76 -531,76 -355,0 -537,-78 175,-69 534,-69 172,0 314,19 142,19 220,52 z M 604,1543 q -57,0 -97,39 -40,39 -40,97 0,56 40,96 40,40 97,40 56,0 96,-40 40,-40 40,-96 0,-57 -40,-96 -40,-39 -96,-40 z m 0,70 q 66,0 66,66 0,66 -66,66 -67,0 -67,-66 0,-66 67,-66 z m 840,0 q 67,0 67,66 0,66 -67,66 -66,0 -66,-66 0,-66 66,-66 z m 0,-70 q -57,0 -96,39 -39,39 -40,97 0,56 39,96 39,40 97,40 57,0 97,-40 40,-40 40,-96 0,-57 -40,-96 -40,-39 -97,-40 z M 236,1433 q -57,0 -96,39 -39,39 -40,97 0,56 39,96 39,40 97,41 57,0 97,-40 40,-40 40,-97 0,-57 -40,-96 -40,-39 -97,-40 z m 0,70 q 67,0 67,66 0,67 -67,67 -66,0 -66,-67 0,-66 66,-66 z m 1578,0 q 66,0 66,66 0,67 -66,67 -67,0 -67,-67 0,-66 67,-66 z m 0,-70 q -57,0 -97,39 -40,39 -40,97 0,56 40,96 40,40 97,41 56,0 96,-40 40,-40 40,-97 0,-57 -40,-96 -40,-39 -96,-40 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#000000"
+     id="path2" />
+  <g
+     fill-rule="nonzero"
+     fill="#ffffff"
+     id="g32"
+     transform="matrix(1,0,0,-1,0,2020)">
+    <path
+       style="color:#000000"
+       d="m 1024,357 q 67,0 67,-67 0,-66 -67,-66 -66,0 -66,66 0,67 66,67 z"
+       display="block"
+       id="path4" />
+    <path
+       style="color:#000000"
+       d="m 1533,1364 q -193,-49 -505,-49 -320,0 -511,50 l 15,96 q 195,-46 496,-46 299,0 488,45 z"
+       display="block"
+       id="path6" />
+    <path
+       style="color:#000000"
+       d="m 1558,1304 65,-115 q -48,19 -98,19 -134,0 -214,-109 -60,50 -134,50 -96,0 -153,-75 -64,70 -153,70 -72,0 -132,-49 -84,107 -217,107 -51,0 -101,-19 l 70,120 q 194,-56 533,-56 345,0 534,57 z"
+       display="block"
+       id="path8" />
+    <path
+       style="color:#000000"
+       d="m 1110,1065 -85,-489 -85,483 q 3,-2 14,-10 23,-45 70,-45 51,0 66,45 6,6 20,16 z"
+       display="block"
+       id="path10" />
+    <path
+       style="color:#000000"
+       d="M 1387,1084 V 621 l -165,454 q 19,-7 32,-18 20,-25 54,-25 40,0 64,35 3,4 7,8 4,4 8,9 z"
+       display="block"
+       id="path12" />
+    <path
+       style="color:#000000"
+       d="M 825,1070 661,621 v 457 q 3,-4 9,-10 20,-42 66,-42 38,0 62,32 27,12 27,12 z"
+       display="block"
+       id="path14" />
+    <path
+       style="color:#000000"
+       d="m 571,1126 -215,-371 55,338 q 57,40 111,40 21,0 49,-7 z"
+       display="block"
+       id="path16" />
+    <path
+       style="color:#000000"
+       d="m 1474,1131 q 23,7 51,7 61,0 114,-38 l 55,-346 z"
+       display="block"
+       id="path18" />
+    <path
+       style="color:#000000"
+       d="m 1534,1637 -30,-113 q -196,-43 -480,-43 -281,0 -479,43 l -31,114 q 186,-56 511,-56 317,0 509,55 z"
+       display="block"
+       id="path20" />
+    <path
+       style="color:#000000"
+       d="m 1559,1729 q -183,-76 -531,-76 -355,0 -537,78 175,69 534,69 172,0 314,-19 142,-19 220,-52 z"
+       display="block"
+       id="path22" />
+    <path
+       style="color:#000000"
+       d="m 604,407 q 66,0 66,-66 0,-66 -66,-66 -67,0 -67,66 0,66 67,66 z"
+       display="block"
+       id="path24" />
+    <path
+       style="color:#000000"
+       d="m 1444,407 q 67,0 67,-66 0,-66 -67,-66 -66,0 -66,66 0,66 66,66 z"
+       display="block"
+       id="path26" />
+    <path
+       style="color:#000000"
+       d="m 236,517 q 67,0 67,-66 0,-67 -67,-67 -66,0 -66,67 0,66 66,66 z"
+       display="block"
+       id="path28" />
+    <path
+       style="color:#000000"
+       d="m 1814,517 q 66,0 66,-66 0,-67 -66,-67 -67,0 -67,67 0,66 67,66 z"
+       display="block"
+       id="path30" />
+  </g>
+</svg>
diff --git a/client/public/images/pieces/Cwda/wo.svg b/client/public/images/pieces/Cwda/wo.svg
new file mode 100644 (file)
index 0000000..2524dba
--- /dev/null
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="100%"
+   width="100%"
+   version="1.1"
+   viewBox="0 0 2048 2048"
+   id="svg34"
+   sodipodi:docname="wo.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+  <metadata
+     id="metadata40">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs38" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="960"
+     inkscape:window-height="1060"
+     id="namedview36"
+     showgrid="false"
+     inkscape:zoom="0.43115234"
+     inkscape:cx="1024"
+     inkscape:cy="1021.6806"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg34"
+     inkscape:document-rotation="0" />
+  <path
+     style="color:#000000"
+     d="m 1024,1593 q -57,0 -96,40 -39,40 -40,97 0,56 39,96 39,40 97,40 56,0 96,-40 40,-40 41,-96 0,-57 -40,-97 -40,-40 -97,-40 z m 0,70 q 67,0 67,67 0,66 -67,66 -66,0 -66,-66 0,-67 66,-67 z M 1533,656 q -193,49 -505,49 -320,0 -511,-50 l 15,-96 q 195,46 496,46 299,0 488,-45 z m 25,60 65,115 q -48,-19 -98,-19 -134,0 -214,109 -60,-50 -134,-50 -96,0 -153,75 -64,-70 -153,-70 -72,0 -132,49 -84,-107 -217,-107 -51,0 -101,19 l 70,-120 q 194,56 533,56 345,0 534,-57 z m -448,239 -85,489 -85,-483 q 3,2 14,10 23,45 70,45 51,0 66,-45 6,-6 20,-16 z m 277,-19 v 463 L 1222,945 q 19,7 32,18 20,25 54,25 40,0 64,-35 3,-4 7,-8 4,-4 8,-9 z M 825,950 661,1399 V 942 q 3,4 9,10 20,42 66,42 38,0 62,-32 27,-12 27,-12 z M 571,894 356,1265 411,927 q 57,-40 111,-40 21,0 49,7 z m 903,-5 q 23,-7 51,-7 61,0 114,38 l 55,346 z m 60,-506 -30,113 q -196,43 -480,43 -281,0 -479,-43 L 514,382 q 186,56 511,56 317,0 509,-55 z m 106,-128 q -49,-43 -220,-72 -171,-29 -394,-29 -227,0 -399,30 -172,30 -217,75 l 63,240 -28,157 -88,153 -85,622 49,19 274,-462 6,550 68,12 209,-553 112,595 h 69 l 112,-593 207,551 69,-12 6,-550 275,463 47,-22 -83,-619 -89,-153 -28,-159 z m -81,36 q -183,76 -531,76 -355,0 -537,-78 175,-69 534,-69 172,0 314,19 142,19 220,52 z M 604,1543 q -57,0 -97,39 -40,39 -40,97 0,56 40,96 40,40 97,40 56,0 96,-40 40,-40 40,-96 0,-57 -40,-96 -40,-39 -96,-40 z m 0,70 q 66,0 66,66 0,66 -66,66 -67,0 -67,-66 0,-66 67,-66 z m 840,0 q 67,0 67,66 0,66 -67,66 -66,0 -66,-66 0,-66 66,-66 z m 0,-70 q -57,0 -96,39 -39,39 -40,97 0,56 39,96 39,40 97,40 57,0 97,-40 40,-40 40,-96 0,-57 -40,-96 -40,-39 -97,-40 z M 236,1433 q -57,0 -96,39 -39,39 -40,97 0,56 39,96 39,40 97,41 57,0 97,-40 40,-40 40,-97 0,-57 -40,-96 -40,-39 -97,-40 z m 0,70 q 67,0 67,66 0,67 -67,67 -66,0 -66,-67 0,-66 66,-66 z m 1578,0 q 66,0 66,66 0,67 -66,67 -67,0 -67,-67 0,-66 67,-66 z m 0,-70 q -57,0 -97,39 -40,39 -40,97 0,56 40,96 40,40 97,41 56,0 96,-40 40,-40 40,-97 0,-57 -40,-96 -40,-39 -96,-40 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#000000"
+     id="path2" />
+  <g
+     fill-rule="nonzero"
+     fill="#ffffff"
+     id="g32"
+     transform="matrix(1,0,0,-1,0,2020)">
+    <path
+       style="color:#000000"
+       d="m 1024,357 q 67,0 67,-67 0,-66 -67,-66 -66,0 -66,66 0,67 66,67 z"
+       display="block"
+       id="path4" />
+    <path
+       style="color:#000000"
+       d="m 1533,1364 q -193,-49 -505,-49 -320,0 -511,50 l 15,96 q 195,-46 496,-46 299,0 488,45 z"
+       display="block"
+       id="path6" />
+    <path
+       style="color:#000000"
+       d="m 1558,1304 65,-115 q -48,19 -98,19 -134,0 -214,-109 -60,50 -134,50 -96,0 -153,-75 -64,70 -153,70 -72,0 -132,-49 -84,107 -217,107 -51,0 -101,-19 l 70,120 q 194,-56 533,-56 345,0 534,57 z"
+       display="block"
+       id="path8" />
+    <path
+       style="color:#000000"
+       d="m 1110,1065 -85,-489 -85,483 q 3,-2 14,-10 23,-45 70,-45 51,0 66,45 6,6 20,16 z"
+       display="block"
+       id="path10" />
+    <path
+       style="color:#000000"
+       d="M 1387,1084 V 621 l -165,454 q 19,-7 32,-18 20,-25 54,-25 40,0 64,35 3,4 7,8 4,4 8,9 z"
+       display="block"
+       id="path12" />
+    <path
+       style="color:#000000"
+       d="M 825,1070 661,621 v 457 q 3,-4 9,-10 20,-42 66,-42 38,0 62,32 27,12 27,12 z"
+       display="block"
+       id="path14" />
+    <path
+       style="color:#000000"
+       d="m 571,1126 -215,-371 55,338 q 57,40 111,40 21,0 49,-7 z"
+       display="block"
+       id="path16" />
+    <path
+       style="color:#000000"
+       d="m 1474,1131 q 23,7 51,7 61,0 114,-38 l 55,-346 z"
+       display="block"
+       id="path18" />
+    <path
+       style="color:#000000"
+       d="m 1534,1637 -30,-113 q -196,-43 -480,-43 -281,0 -479,43 l -31,114 q 186,-56 511,-56 317,0 509,55 z"
+       display="block"
+       id="path20" />
+    <path
+       style="color:#000000"
+       d="m 1559,1729 q -183,-76 -531,-76 -355,0 -537,78 175,69 534,69 172,0 314,-19 142,-19 220,-52 z"
+       display="block"
+       id="path22" />
+    <path
+       style="color:#000000"
+       d="m 604,407 q 66,0 66,-66 0,-66 -66,-66 -67,0 -67,66 0,66 67,66 z"
+       display="block"
+       id="path24" />
+    <path
+       style="color:#000000"
+       d="m 1444,407 q 67,0 67,-66 0,-66 -67,-66 -66,0 -66,66 0,66 66,66 z"
+       display="block"
+       id="path26" />
+    <path
+       style="color:#000000"
+       d="m 236,517 q 67,0 67,-66 0,-67 -67,-67 -66,0 -66,67 0,66 66,66 z"
+       display="block"
+       id="path28" />
+    <path
+       style="color:#000000"
+       d="m 1814,517 q 66,0 66,-66 0,-67 -66,-67 -67,0 -67,67 0,66 67,66 z"
+       display="block"
+       id="path30" />
+  </g>
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="M 889.47678,362.90619 C 730.17696,354.10255 593.79445,329.77628 507.96343,294.85644 l -13.79035,-5.61052 9.20338,-3.86817 c 30.41234,-12.78231 109.73294,-32.12785 171.17501,-41.74798 88.42775,-13.84533 173.4185,-19.73686 308.85963,-21.41004 180.2871,-2.22719 318.2009,7.74617 441.8392,31.95199 52.992,10.37474 127.5651,31.89837 127.5651,36.81841 0,2.61331 -35.7458,15.254 -72.9319,25.79067 -75.5906,21.41861 -154.9807,33.99216 -278.452,44.10033 -38.6307,3.16256 -264.80493,4.63078 -311.95472,2.02506 z"
+     id="path70" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 866.28312,534.5427 c -88.18293,-4.755 -182.28514,-14.66593 -253.197,-26.66694 -45.53136,-7.70566 -64.62258,-11.76771 -66.71693,-14.19539 -2.01445,-2.33506 -30.76576,-107.82364 -29.68288,-108.90651 0.40788,-0.40789 10.08794,1.84517 21.51122,5.00679 78.12793,21.62346 189.71561,37.19241 325.76623,45.45161 59.06158,3.58544 259.07664,3.5748 321.23214,-0.0172 128.3292,-7.41589 247.134,-23.8579 326.4508,-45.17911 11.1619,-3.00046 20.2944,-4.90317 20.2944,-4.22825 0,1.93989 -28.242,108.13763 -28.9644,108.91412 -1.3501,1.45121 -57.3734,11.93946 -94.0462,17.60662 -49.7773,7.69223 -109.3579,14.25153 -172.7085,19.01367 -58.2448,4.37833 -308.02102,6.53929 -369.93888,3.20056 z"
+     id="path72" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="M 888.3171,701.59761 C 777.74593,696.7451 681.16019,686.89563 601.87542,672.38728 c -28.37286,-5.19195 -81.33543,-16.88631 -83.01873,-18.33087 -0.658,-0.56468 13.39491,-92.31459 14.27719,-93.2142 0.23966,-0.24438 9.5828,1.59384 20.76253,4.08493 139.09659,30.99373 365.96638,46.54415 575.51679,39.44785 147.0785,-4.98072 241.5785,-14.38137 341.8322,-34.00468 23.3838,-4.57707 42.9629,-7.87516 43.5089,-7.32909 0.5461,0.54607 4.5855,21.21889 8.9764,45.9396 5.4341,30.59313 7.1951,45.43407 5.5145,46.47274 -3.5622,2.20157 -65.5875,15.20633 -98.1965,20.58874 -60.277,9.94925 -133.5157,17.73831 -219.1801,23.31015 -49.6787,3.23123 -266.75837,4.73757 -323.5515,2.24516 z"
+     id="path74" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 1017.9812,937.83079 c -10.6763,-12.06104 -40.20143,-33.05464 -59.72727,-42.46868 -28.52808,-13.7543 -43.90956,-17.57057 -76.89493,-19.07823 -46.35255,-2.11863 -83.99585,8.05785 -121.79479,32.92599 -10.64881,7.00592 -19.67205,12.73803 -20.05161,12.73803 -0.37957,0 -9.32427,-9.03704 -19.87713,-20.08231 -43.14904,-45.16246 -89.89235,-70.42527 -149.55868,-80.83021 -38.09475,-6.64317 -92.13637,-3.27697 -128.35323,7.99498 -8.11863,2.5268 -15.1596,4.19574 -15.64659,3.70875 -0.63937,-0.63937 62.69896,-111.36656 65.27493,-114.11273 0.1945,-0.20735 9.74708,2.14989 21.22794,5.23832 32.87062,8.84242 95.92719,21.08624 141.48131,27.4717 103.85554,14.55775 182.67803,19.74622 325.8709,21.45036 231.10985,2.75044 401.53895,-11.39853 534.46105,-44.37082 22.8777,-5.67497 42.3314,-9.86347 43.2306,-9.30776 2.8275,1.7475 60.7508,105.58261 59.5616,106.77188 -0.6225,0.62249 -9.9939,-1.43632 -20.8253,-4.57514 -100.838,-29.2217 -214.059,5.9525 -275.4977,85.58851 l -9.3672,12.14171 -20.2413,-13.46339 c -36.5341,-24.30042 -70.7114,-34.64989 -114.4251,-34.64989 -56.423,0 -97.4043,16.34243 -134.9942,53.8327 -9.9636,9.9372 -18.4125,18.06764 -18.7753,18.06764 -0.3628,0 -2.6479,-2.24614 -5.078,-4.99141 z"
+     id="path76" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 359.23528,1250.1382 c 0.78932,-3.827 12.94057,-77.8704 27.00276,-164.5408 14.0622,-86.67054 25.87784,-157.89297 26.25698,-158.27212 0.37914,-0.37914 9.27789,-5.85121 19.77499,-12.16015 34.86477,-20.95435 73.20082,-30.03033 108.38013,-25.65878 10.66961,1.32585 21.45035,3.16938 23.9572,4.09672 4.0864,1.51166 -6.1819,20.21547 -99.25956,180.80223 -57.09962,98.5139 -104.65677,179.9205 -105.68257,180.9035 -1.02579,0.9831 -1.21926,-1.3437 -0.42993,-5.1706 z"
+     id="path78" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 662.41565,1168.9604 -0.0901,-222.65915 5.14528,6.24058 c 2.8299,3.43232 8.4919,10.89508 12.58221,16.5839 5.16924,7.18939 11.82408,12.5356 21.82459,17.53292 12.33224,6.16249 16.92646,7.18959 32.15896,7.18959 23.95519,0 36.84679,-4.78311 52.97173,-19.65385 11.20019,-10.32905 35.20688,-24.40108 35.20688,-20.63727 0,0.92209 -142.61927,392.28598 -156.6787,429.94458 -2.53101,6.7794 -3.04554,-28.5927 -3.12082,-214.5413 z"
+     id="path80" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 1024.2976,1435.6874 c -0.1322,-1.2756 -18.6519,-106.9921 -41.15468,-234.9256 -22.50283,-127.9334 -40.36048,-233.15995 -39.68366,-233.83677 2.09904,-2.09903 10.50234,4.35981 13.1054,10.07289 4.7092,10.33557 23.49428,27.92978 35.6281,33.36948 9.59164,4.3 16.17004,5.4254 31.80724,5.4417 10.843,0.011 23.8017,-1.4104 28.7969,-3.1592 12.0351,-4.2135 28.8568,-19.92521 34.2127,-31.95506 4.3705,-9.81656 18.5355,-24.01416 19.8937,-19.93951 0.6118,1.83513 -78.6411,462.67967 -81.4761,473.77237 -0.489,1.9135 -0.9973,2.4354 -1.1296,1.1597 z"
+     id="path82" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 1304.404,1169.4977 c -44.1415,-121.4824 -79.9899,-221.21083 -79.663,-221.61873 1.6178,-2.01887 22.063,10.66248 31.8514,19.75614 16.5379,15.36411 29.1817,20.35028 51.5299,20.32123 26.6439,-0.0346 38.3653,-5.8132 60.4288,-29.79101 l 17.27,-18.76831 v 225.53138 c 0,124.0423 -0.261,225.5123 -0.5799,225.4889 -0.3189,-0.023 -36.6956,-99.4371 -80.8372,-220.9196 z"
+     id="path84" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 1584.1944,1075.5446 c -58.4976,-100.42384 -106.7415,-183.32285 -107.2087,-184.22005 -3.9048,-7.49958 63.9484,-10.02487 90.7716,-3.37824 25.7576,6.3826 70.7828,28.69932 70.9264,35.15469 0.028,1.27927 11.9597,76.9361 26.5138,168.1262 14.5542,91.1901 26.2133,166.0491 25.9092,166.3532 -0.3041,0.3041 -48.4146,-81.612 -106.9123,-182.0358 z"
+     id="path86" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 1783.3806,1630.2605 c -12.07,-4.2822 -23.5325,-15.3987 -29.6328,-28.7384 -6.4346,-14.0707 -6.8306,-47.3018 -0.7516,-63.0553 8.3498,-21.6378 30.8402,-34.3581 60.7479,-34.3581 43.0628,0 65.2513,22.6607 64.7244,66.102 -0.1083,8.9295 -1.4739,20.7659 -3.0347,26.303 -3.8641,13.708 -18.5861,29.2285 -32.0888,33.8293 -13.4702,4.5898 -46.9244,4.5437 -59.9644,-0.082 z"
+     id="path88" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 1415.3883,1739.6942 c -21.6129,-7.7128 -33.5513,-25.0784 -35.8136,-52.0944 -3.5131,-41.9512 13.7421,-66.4513 51.0304,-72.4564 36.4408,-5.8686 67.565,9.5473 75.9954,37.6405 3.8123,12.7043 3.1662,41.886 -1.2199,55.0911 -4.6392,13.9675 -19.2604,28.1959 -33.295,32.4008 -12.1449,3.6387 -45.8399,3.2931 -56.6973,-0.5816 z"
+     id="path90" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 998.47196,1791.9871 c -26.32252,-8.5718 -39.4142,-29.0618 -39.4142,-61.6879 0,-39.9455 19.67585,-62.6986 56.63604,-65.4939 31.8922,-2.412 53.768,6.4143 65.4954,26.4256 5.4743,9.3411 6.5591,14.1418 7.3663,32.5996 1.115,25.4926 -1.8883,38.442 -11.6668,50.3052 -11.6137,14.0893 -22.7259,18.388 -49.4097,19.1137 -12.7565,0.347 -25.8097,-0.2211 -29.00704,-1.2623 z"
+     id="path92" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 570.56398,1737.4757 c -22.88704,-10.8199 -31.68544,-27.0374 -31.60473,-58.2549 0.0264,-10.2052 1.11843,-22.1018 2.42676,-26.4369 6.14979,-20.3769 22.07991,-33.2143 46.28194,-37.2965 29.29527,-4.9413 56.99662,3.419 69.77411,21.0578 18.36862,25.3571 13.77794,77.2331 -8.32662,94.0931 -11.99243,9.1471 -23.31337,12.1543 -46.08034,12.2406 -17.23538,0.065 -22.8959,-0.8765 -32.47112,-5.4032 z"
+     id="path94" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 206.21183,1630.2605 c -12.09745,-4.2919 -23.56007,-15.4279 -29.58126,-28.7384 -6.40416,-14.1571 -6.82809,-47.4419 -0.8031,-63.0553 8.34974,-21.6378 30.84019,-34.3581 60.74783,-34.3581 43.06283,0 65.25134,22.6607 64.72448,66.102 -0.29462,24.292 -4.20952,35.3624 -16.82976,47.5907 -6.25786,6.0636 -14.83371,11.6844 -20.34741,13.3364 -12.73523,3.8156 -46.10806,3.31 -57.91078,-0.8773 z"
+     id="path96" />
+</svg>
index ee56aff..539083d 100644 (file)
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
 <svg
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="45"
-   height="45"
-   id="svg3128"
-   sodipodi:version="0.32"
-   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
-   version="1.0"
-   sodipodi:docname="wc.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs3130">
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 22.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="45 : 22.5 : 1"
-       inkscape:persp3d-origin="22.5 : 15 : 1"
-       id="perspective15" />
-    <inkscape:perspective
-       id="perspective12"
-       inkscape:persp3d-origin="22.5 : 15 : 1"
-       inkscape:vp_z="45 : 22.5 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_x="0 : 22.5 : 1"
-       sodipodi:type="inkscape:persp3d" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     gridtolerance="10000"
-     guidetolerance="10"
-     objecttolerance="10"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="8.0000004"
-     inkscape:cx="60.308779"
-     inkscape:cy="24.511479"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     height="45px"
-     width="45px"
-     inkscape:grid-points="true"
-     showgrid="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1060"
-     inkscape:window-x="0"
-     inkscape:window-y="20"
-     inkscape:window-maximized="0">
-    <inkscape:grid
-       id="GridFromPre046Settings"
-       type="xygrid"
-       originx="0"
-       originy="0"
-       spacingx="0.5"
-       spacingy="0.5"
-       color="#0000ff"
-       empcolor="#0000ff"
-       opacity="0.2"
-       empopacity="0.4"
-       empspacing="5" />
-  </sodipodi:namedview>
+   height="100%"
+   width="100%"
+   version="1.1"
+   viewBox="0 0 2048 2048"
+   id="svg18"
+   sodipodi:docname="ws.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
   <metadata
   <metadata
-     id="metadata3133">
+     id="metadata24">
     <rdf:RDF>
       <cc:Work
          rdf:about="">
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
     <rdf:RDF>
       <cc:Work
          rdf:about="">
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
       </cc:Work>
     </rdf:RDF>
   </metadata>
       </cc:Work>
     </rdf:RDF>
   </metadata>
+  <defs
+     id="defs22" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="960"
+     inkscape:window-height="1060"
+     id="namedview20"
+     showgrid="false"
+     inkscape:zoom="0.43115234"
+     inkscape:cx="1024"
+     inkscape:cy="1021.6806"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg18"
+     inkscape:document-rotation="0" />
+  <path
+     style="color:#000000"
+     d="m 1161,1706 h 170 v 137 h 274 V 1468 L 1383,1297 V 819 L 1553,649 V 444 h 153 V 205 H 341 v 239 h 153 v 205 l 171,170 v 478 l -222,171 v 375 h 273 v -137 h 171 v 137 h 274 z M 1639,376 H 409 V 273 H 1639 Z M 1484,580 H 564 V 444 h 920 z m -170,717 H 734 V 819 h 580 z m 222,239 v 239 h -137 v -137 h -308 v 137 H 956 V 1638 H 649 v 137 H 512 V 1536 Z M 1459,649 1356,751 H 693 L 588,649 Z m -110,716 127,103 H 572 l 128,-103 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#000000"
+     id="path2" />
   <g
   <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     style="display:inline">
+     fill-rule="nonzero"
+     fill="#ffffff"
+     id="g12"
+     transform="matrix(1,0,0,-1,0,2048)">
+    <path
+       style="color:#000000"
+       d="M 1639,1672 H 409 v 103 h 1230 z"
+       display="block"
+       id="path4" />
     <path
     <path
-       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 37.725,38.008918 c -3.723781,-1.069562 -11.126219,0.473903 -14.85,-2.2 -3.723782,2.673903 -11.12622,1.130438 -14.8500002,2.2 0,0 -1.8104878,0.595658 -3.3,2.2 0.7447561,1.069561 1.8104878,1.08478 3.3,0.55 3.7237802,-1.069561 11.1262182,0.504342 14.8500002,-1.1 3.723781,1.604342 11.126219,0.03044 14.85,1.1 1.489512,0.53478 2.555244,0.519561 3.3,-0.55 -1.489512,-2.139123 -3.3,-2.2 -3.3,-2.2 z"
-       id="path4582"
-       sodipodi:nodetypes="ccccccccc"
-       inkscape:connector-curvature="0" />
+       style="color:#000000"
+       d="M 1484,1468 H 564 v 136 h 920 z"
+       display="block"
+       id="path6" />
     <path
     <path
-       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 31.125,33.608918 c -2.75,2.75 -13.75,2.75 -16.5,0 -0.55,-1.65 0,-2.2 0,-2.2 h 16.5 c 0,0 0.55,0.55 0,2.2 z"
-       id="path4584"
-       sodipodi:nodetypes="ccccc"
-       inkscape:connector-curvature="0" />
+       style="color:#000000"
+       d="M 1314,751 H 734 v 478 h 580 z"
+       display="block"
+       id="path8" />
     <path
     <path
-       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 31.125,31.408918 h -16.5"
-       id="path4590"
-       sodipodi:nodetypes="cc"
-       inkscape:connector-curvature="0" />
-    <g
-       id="g3323"
-       inkscape:label="Layer 1"
-       transform="matrix(-0.84196464,0,0,-0.84196464,39.051174,37.108928)">
-      <path
-         sodipodi:nodetypes="cccc"
-         id="path3491"
-         d="M 22.028958,36 C 11.528958,35 5.5289585,28 6.0289585,7 H 29.028958 c 0,9 -10,6.5 -8,21"
-         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:connector-curvature="0" />
-      <path
-         sodipodi:nodetypes="csccccccccccc"
-         id="path3495"
-         d="m 20.028958,28 c -0.384461,-2.911278 5.552936,-7.368624 8,-9 3,-2 2.819198,-4.342892 5,-4 1.04172,0.944016 -1.413429,3.037549 0,3 1,0 -0.187332,-1.231727 1,-2 1,0 4.003161,-0.999999 4,4 0,2 -6,12 -6,12 0,0 -1.885866,1.902129 -2,3.5 0.726047,0.994369 0.5,2 0.5,3 -1,1 -3,-2.5 -3,-2.5 h -2 c 0,0 -0.781781,1.991926 -2.5,3 -1,0 -1,-3 -1,-3"
-         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:connector-curvature="0" />
-      <circle
-         transform="rotate(180,21.764479,22)"
-         id="path3499"
-         style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         cx="8.5"
-         cy="23.5"
-         r="0.5" />
-      <ellipse
-         transform="rotate(-149.99999,24.024104,20.986505)"
-         id="path3501"
-         style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.50000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         cx="14.5"
-         cy="15.5"
-         rx="0.5"
-         ry="1.5" />
-      <path
-         sodipodi:nodetypes="cc"
-         id="path8049"
-         d="m 7.0289585,7 c -1,20 5.4999995,27.5 11.9999995,28.5"
-         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:connector-curvature="0" />
-    </g>
+       style="color:#000000"
+       d="M 1536,512 V 273 H 1399 V 410 H 1091 V 273 H 956 V 410 H 649 V 273 H 512 v 239 z"
+       display="block"
+       id="path10" />
   </g>
   </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer2"
-     inkscape:label="Layer 1#1"
-     style="display:inline" />
+  <path
+     style="color:#000000"
+     d="M 1459,649 1356,751 H 693 L 588,649 Z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#ffffff"
+     id="path14" />
+  <path
+     style="color:#000000"
+     d="m 1349,1365 127,103 H 572 l 128,-103 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#ffffff"
+     id="path16" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="M 734.07927,1057.6308 V 819.89581 H 1024 1313.9207 v 237.73499 237.735 H 1024 734.07927 Z"
+     id="path56" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 642.46432,700.4574 -51.02605,-49.68534 432.56173,0.0234 432.5617,0.0234 -51.026,49.71003 -51.0261,49.71003 -330.5096,-0.0481 -330.50963,-0.0481 z"
+     id="path60" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 564.76557,511.42015 v -67.2616 H 1024 1483.2344 v 67.2616 67.26161 H 1024 564.76557 Z"
+     id="path62" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="M 409.36806,324.71121 V 274.84484 H 1024 1638.6319 v 49.86637 49.86636 H 1024 409.36806 Z"
+     id="path64" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="M 513.73952,1654.8675 V 1536.5798 H 1024 1534.2605 v 118.2877 118.2877 h -67.2616 -67.2616 v -68.4378 -68.4377 l -154.8177,0.5963 -154.8177,0.5963 -0.6148,67.8414 -0.6149,67.8415 h -66.0669 -66.06691 v -68.4213 -68.4213 H 802.50056 648.26274 v 68.4213 68.4213 h -67.26161 -67.26161 z"
+     id="path66" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 578.7646,1463.8788 c 1.86792,-1.716 30.26808,-24.6778 63.11148,-51.026 l 59.71527,-47.906 322.98005,0.02 322.9801,0.02 60.3035,48.8812 c 33.167,26.8847 61.2951,49.8374 62.507,51.006 1.3347,1.2872 -174.6518,2.1249 -446.3951,2.1249 -375.95171,0 -448.04853,-0.5053 -445.2023,-3.1201 z"
+     id="path68" />
 </svg>
 </svg>
diff --git a/client/public/images/pieces/Cwda/wt.svg b/client/public/images/pieces/Cwda/wt.svg
new file mode 100644 (file)
index 0000000..9029126
--- /dev/null
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="100%"
+   width="100%"
+   version="1.1"
+   viewBox="0 0 2048 2048"
+   id="svg18"
+   sodipodi:docname="wt.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+  <metadata
+     id="metadata24">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs22" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="960"
+     inkscape:window-height="1060"
+     id="namedview20"
+     showgrid="false"
+     inkscape:zoom="0.43115234"
+     inkscape:cx="1024"
+     inkscape:cy="1024"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg18" />
+  <path
+     style="color:#000000"
+     d="m 1024,864.11538 q 97,0 186,-15 98,35 142,109 38,64.00002 38,141.00002 0,46 -23,101 -23,55 -75,101 -59,49 -129,107 -70,58 -139,137 -70,-78 -140,-136 -70,-58 -128,-108 -53,-45 -75,-100 -22,-55 -23,-102 0,-77 37,-141.00002 43,-74 143,-109 88,15 186,15 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#ffffff"
+     id="path2" />
+  <path
+     style="color:#000000"
+     d="m 988,1120.1154 -83,1 q -34,0 -34,34 0,34 34,34 h 83 v 86 q 0,35 36,35 35,0 35,-35 v -86 h 86 q 33,0 33,-34 0,-34 -33,-34 h -86 v -82 q 0,-36 -35,-36 -36,0 -36,36 z m 36,-578.00002 q 68,0 132,11 64,11 125,28 -117,31 -257,31 -142,0 -257,-31 58,-16 123,-27 65,-11 134,-12 z m 0,1089.00002 q 68,0 68,68 0,68 -68,68 -68,0 -68,-68 0,-68 68,-68 z m 0,-949.00002 q 117,0 225,-23 l -48,123 q -88,14 -177,14 -91,0 -178,-14 l -48,-123 q 107,23 226,23 z m 0,182 q 97,0 186,-15 98,35 142,109 38,64.00002 38,141.00002 0,46 -23,101 -23,55 -75,101 -59,49 -129,107 -70,58 -139,137 -70,-78 -140,-136 -70,-58 -128,-108 -53,-45 -75,-100 -22,-55 -23,-102 0,-77 37,-141.00002 43,-74 143,-109 88,15 186,15 z m -36,-377 h -32 q -56,-90 -107,-113 -24,-12 -53,-22 -29,-10 -67,-10 -7,0 -107,16 -48,7 -76,15 -28,8 -44,10 -57,7 -133,-6 -46,-8 -86,-29 l 48,-78 q 12,12 31,15 19,3 36,8 42,7 80,2 13,-3 51,-7 38,-4 101,-15 75,-11 102,-11 105,0 161,40 34,26 64,72 30,46 31,113 z m 36,-113 q -14,-57 -34,-79 -20,-22 -53,-46 -36,-25 -85,-42 -49,-17 -109,-9 l -281,39 q -17,2 -30,0 -13,-2 -26,-2 -21,0 -53,-9 -32,-9 -51,-28 l -97,159 q 18,20 32,28 14,8 33,17 58,27 124,33 28,2 55,1 27,-1 56,2 54,-9 108,-16 54,-7 110,-16 60,0 81,12 11,6 35,22 24,16 48,47 -53,6 -108,20 -55,14 -97,31 l 104,258 q -78,45 -109,72 -31,27 -49,64 -26,46 -33,89.00002 -7,43 -7,77 1,60 28,132 27,72 104,130 63,48 123,99 60,51 119,119 -74,38 -74,121 0,56 39,96 39,40 97,40 56,0 96,-40 40,-40 40,-96 0,-82 -74,-121 58,-68 117,-119 59,-51 125,-99 75,-57 102,-129 27,-72 29,-133 0,-34 -7,-77 -7,-43.00002 -32,-89.00002 -20,-36 -50,-63 -30,-27 -108,-73 l 104,-258 q -44,-16 -99,-30 -55,-14 -106,-21 23,-31 47,-47 24,-16 36,-22 21,-12 81,-12 54,8 108,15 54,7 110,17 27,-3 54,-2 27,1 57,-1 64,-6 124,-33 18,-9 32,-17 14,-8 33,-28 l -98,-159 q -18,18 -50,27 -32,9 -53,10 -13,0 -26,2 -13,2 -31,0 l -280,-39 q -60,-9 -111,8 -51,17 -85,45 -33,27 -52,46 -19,19 -33,77 z m 35,113 q 0,-66 30,-112 30,-46 66,-73 55,-40 161,-40 26,0 102,11 62,10 100,14 38,4 51,8 38,5 80,-2 16,-4 35,-7 19,-3 33,-16 l 48,78 q -41,21 -87,29 -76,13 -133,6 -17,-2 -44,-10 -27,-8 -75,-15 -101,-16 -107,-16 -39,0 -68,10 -29,10 -52,22 -53,24 -108,113 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#000000"
+     id="path4" />
+  <g
+     fill-rule="nonzero"
+     fill="#ffffff"
+     id="g16"
+     transform="matrix(1,0,0,-1,0,2030.1154)">
+    <path
+       style="color:#000000"
+       d="m 1024,1488 q 68,0 132,-11 64,-11 125,-28 -117,-31 -257,-31 -142,0 -257,31 58,16 123,27 65,11 134,12 z"
+       display="block"
+       id="path6" />
+    <path
+       style="color:#000000"
+       d="m 1024,399 q 68,0 68,-68 0,-68 -68,-68 -68,0 -68,68 0,68 68,68 z"
+       display="block"
+       id="path8" />
+    <path
+       style="color:#000000"
+       d="m 1024,1348 q 117,0 225,23 l -48,-123 q -88,-14 -177,-14 -91,0 -178,14 l -48,123 q 107,-23 226,-23 z"
+       display="block"
+       id="path10" />
+    <path
+       style="color:#000000"
+       d="m 988,1543 h -32 q -56,90 -107,113 -24,12 -53,22 -29,10 -67,10 -7,0 -107,-16 -48,-7 -76,-15 -28,-8 -44,-10 -57,-7 -133,6 -46,8 -86,29 l 48,78 q 12,-12 31,-15 19,-3 36,-8 42,-7 80,-2 13,3 51,7 38,4 101,15 75,11 102,11 105,0 161,-40 34,-26 64,-72 30,-46 31,-113 z"
+       display="block"
+       id="path12" />
+    <path
+       style="color:#000000"
+       d="m 1059,1543 q 0,66 30,112 30,46 66,73 55,40 161,40 26,0 102,-11 62,-10 100,-14 38,-4 51,-8 38,-5 80,2 16,4 35,7 19,3 33,16 l 48,-78 q -41,-21 -87,-29 -76,-13 -133,-6 -17,2 -44,10 -27,8 -75,15 -101,16 -107,16 -39,0 -68,-10 -29,-10 -52,-22 -53,-24 -108,-113 z"
+       display="block"
+       id="path14" />
+  </g>
+</svg>
diff --git a/client/public/images/pieces/Cwda/wy.svg b/client/public/images/pieces/Cwda/wy.svg
new file mode 100644 (file)
index 0000000..75bdb6d
--- /dev/null
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="100%"
+   width="100%"
+   version="1.1"
+   viewBox="0 0 2048 2048"
+   id="svg6"
+   sodipodi:docname="wy.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+  <metadata
+     id="metadata12">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs10" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="960"
+     inkscape:window-height="1060"
+     id="namedview8"
+     showgrid="false"
+     inkscape:zoom="0.43115234"
+     inkscape:cx="1024"
+     inkscape:cy="1024"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg6"
+     inkscape:document-rotation="0" />
+  <path
+     style="color:#000000"
+     d="m 1756,234 q -1,0 2,54 3,54 3,118 1,125 0,258 -1,133 -36,267 -34,128 -75,218 -41,90 -89,157 -72,108 -196,183 -124,75 -259,98 9,-49 8,-96 -2,-36 -34,-36 -37,0 -33,36 3,132 -94,226 -76,-80 -82,-186 -2,-35 -36,-31 -32,1 -32,37 0,0 2,8 -41,-13 -86,-37 -29,-20 -47,10 -18,30 16,47 43,22 65,33 -86,88 -196,142 12,-139 76,-263 17,-26 -8,-46 -28,-22 -47,7 -7,10 -20,36 -21,-21 -28,-31 -7,-9 -24,-40 -17,-31 -26,-51 -9,-25 -8,-40 1,-15 3,-35 -9,-59 -40,-111 -31,-52 -81,-127 -47,-72 -72,-108 -25,-36 -38,-92 -9,-34 0,-82 9,-48 39,-76 46,-47 89,-43 14,0 37,11 23,11 37,42 26,57 43,57 25,0 27,-28 0,-6 -16,-50 -9,-20 -24,-42 -19,-26 -17,-22 16,-57 53,-20 11,11 25,41 14,30 44,81 35,59 75,96 40,37 71,60 18,13 44,30 26,17 70,35 35,14 77,34 42,20 76,53 46,45 71,111 13,37 10,91 -9,34 34,34 32,0 36,-33 0,-113 -64,-206 21,-64 11,-140 -9,-61 -42,-130 Q 1017,674 914,588 707,416 718,234 q 0,0 170,0 170,0 321,0 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#ffffff"
+     id="path2" />
+  <path
+     style="color:#000000"
+     d="m 697,1319 q 13,-20 10,-42 -10,-64 -71,-54 -18,3 -29,12 -4,-5 -12,-22 -11,-32 -42,-22 -31,12 -24,45 45,115 163,158 34,10 45,-20 12,-32 -18,-44 -6,-3 -11,-5 -5,-2 -11,-6 z M 400,842 q -29,-18 -35,-48 1,-33 -31,-36 -35,-4 -36,30 4,66 59,105 26,21 48,-4 22,-27 -5,-47 z m 679,815 q 157,-10 291,-81 134,-71 228,-182 66,-78 124,-188 58,-110 94,-233 40,-143 50,-300 10,-157 11,-292 V 163 q 0,0 -155,0 -155,0 -404,0 H 647 q -9,0 -9,49 0,49 7,79 4,24 19,68 15,44 50,107 16,32 76,93 60,61 138,143 45,46 70,116 25,70 22,127 -37,-30 -81,-49 -212,-76 -307,-220 -7,-9 -45,-81 -20,-38 -34,-52 -19,-19 -55,-21 -56,-3 -87,54 -42,-12 -75,-10 -56,21 -81,45 -51,51 -66,102 -15,51 -16,110 0,84 104,222 122,159 130,242 0,36 7,81 6,31 25,60 13,20 17,27 4,7 17,23 9,12 15,18 6,6 15,18 11,13 28,30 -53,146 -43,301 199,-71 334,-223 33,113 130,183 80,-56 127,-148 z M 1756,234 q -1,0 2,54 3,54 3,118 1,125 0,258 -1,133 -36,267 -34,128 -75,218 -41,90 -89,157 -72,108 -196,183 -124,75 -259,98 9,-49 8,-96 -2,-36 -34,-36 -37,0 -33,36 3,132 -94,226 -76,-80 -82,-186 -2,-35 -36,-31 -32,1 -32,37 0,0 2,8 -41,-13 -86,-37 -29,-20 -47,10 -18,30 16,47 43,22 65,33 -86,88 -196,142 12,-139 76,-263 17,-26 -8,-46 -28,-22 -47,7 -7,10 -20,36 -21,-21 -28,-31 -7,-9 -24,-40 -17,-31 -26,-51 -9,-25 -8,-40 1,-15 3,-35 -9,-59 -40,-111 -31,-52 -81,-127 -47,-72 -72,-108 -25,-36 -38,-92 -9,-34 0,-82 9,-48 39,-76 46,-47 89,-43 14,0 37,11 23,11 37,42 26,57 43,57 25,0 27,-28 0,-6 -16,-50 -9,-20 -24,-42 -19,-26 -17,-22 16,-57 53,-20 11,11 25,41 14,30 44,81 35,59 75,96 40,37 71,60 18,13 44,30 26,17 70,35 35,14 77,34 42,20 76,53 46,45 71,111 13,37 10,91 -9,34 34,34 32,0 36,-33 0,-113 -64,-206 21,-64 11,-140 -9,-61 -42,-130 Q 1017,674 914,588 707,416 718,234 q 0,0 170,0 170,0 321,0 z"
+     fill-rule="nonzero"
+     display="block"
+     fill="#000000"
+     id="path4" />
+  <path
+     style="fill:#ffd700;stroke:#000000;stroke-width:2.31937"
+     d="m 559.35852,1727.3477 c 9.06079,-80.4896 30.96157,-157.3391 65.9241,-231.3268 8.81211,-18.6482 16.01812,-36.4599 16.01335,-39.5817 -0.009,-6.148 -7.56023,-19.954 -13.62127,-24.9052 -8.50845,-6.9505 -23.01163,-12.0598 -30.16906,-10.6283 -8.56681,1.7133 -20.95447,14.6818 -28.99474,30.3542 -11.17391,21.7805 -10.49513,21.6397 -25.12557,5.2152 -14.15657,-15.8925 -26.48303,-35.5961 -47.82811,-76.4524 -19.22248,-36.7935 -21.55403,-46.1127 -20.98117,-83.8616 0.38977,-25.6833 -0.41451,-34.3003 -4.7286,-50.6617 -13.29917,-50.4375 -27.44043,-75.3004 -137.29082,-241.3821 -34.23287,-51.75629 -64.74473,-99.76717 -67.80412,-106.69082 -9.22738,-20.8822 -19.48412,-55.50166 -22.42987,-75.70726 -2.14635,-14.72236 -2.15475,-24.40668 -0.037,-42.62319 5.61799,-48.32424 16.73199,-71.93954 47.86344,-101.70141 41.34398,-39.5251 74.63083,-47.59174 115.63441,-28.02255 18.60917,8.88134 26.34854,18.17612 44.4146,53.34084 7.61093,14.8143 18.00494,31.15426 23.43933,36.84788 9.25706,9.69866 10.28119,10.16077 19.71461,8.89574 7.1632,-0.96058 11.73687,-3.33369 16.32857,-8.47222 8.70609,-9.74298 8.36187,-21.13743 -1.52556,-50.49735 -8.76528,-26.02778 -19.17411,-45.98108 -36.09186,-69.18668 -10.41734,-14.28915 -11.07455,-15.98236 -8.82277,-22.73046 3.60827,-10.81319 12.81838,-22.13545 19.33696,-23.77151 15.18744,-3.8118 32.37427,13.1965 51.06156,50.53117 18.53973,37.03983 50.25277,92.51769 65.38842,114.38852 36.55075,52.81542 95.54087,107.26047 165.20365,152.47502 24.75204,16.0653 37.70913,22.55546 88.21239,44.1854 58.99105,25.26516 78.72856,35.05207 101.76285,50.45945 49.28186,32.96403 91.78326,89.24783 111.13396,147.17233 6.6134,19.7965 10.4761,56.2908 8.6435,81.6618 -1.0359,14.3399 -0.6757,22.9786 1.0961,26.2892 3.8315,7.1592 16.265,11.4976 32.9227,11.4877 22.1985,-0.014 33.1486,-8.5653 37.6311,-29.3901 1.9376,-9.0013 -2.201,-55.6108 -7.0588,-79.4971 -7.742,-38.0692 -29.4755,-91.1989 -49.2332,-120.3556 -6.7301,-9.9317 -6.7799,-10.2371 -3.597,-22.0339 9.5875,-35.53484 12.734,-85.89565 7.7754,-124.45193 -5.2969,-41.18663 -23.4931,-96.93472 -45.6636,-139.9006 C 1025.2237,692.95819 984.67798,647.11052 916.14949,587.89016 851.8942,532.36257 814.3378,491.95926 782.03207,443.60623 741.91135,383.55625 720.72249,321.8015 719.52085,261.41783 l -0.51746,-26.00221 517.55701,-0.58494 517.5571,-0.58494 1.9809,34.21574 c 1.0895,18.81866 1.9809,131.28121 1.9809,249.91677 0,193.87563 -0.4252,219.22124 -4.2018,250.49151 -10.8217,89.60167 -30.343,173.95021 -62.2673,269.04644 -45.0901,134.3148 -110.1475,251.4853 -187.0231,336.8343 -73.5943,81.7062 -200.2441,157.846 -320.5509,192.71 -33.8937,9.8221 -73.2746,18.3845 -75.2894,16.3698 -0.6893,-0.6893 -0.1797,-6.3841 1.1325,-12.6551 1.3122,-6.2709 2.9624,-29.6667 3.6671,-51.9906 1.4545,-46.0731 -0.3387,-53.1058 -15.5234,-60.8798 -15.5306,-7.951 -40.8939,-3.6978 -48.3834,8.1136 -2.303,3.6319 -3.8322,16.8579 -5.028,43.4887 -1.9626,43.7034 -8.2256,73.0955 -22.7735,106.8751 -10.7052,24.857 -34.37011,61.0095 -53.4711,81.6869 l -14.56699,15.7693 -5.74662,-5.3321 c -9.19944,-8.5359 -25.33717,-30.322 -36.71183,-49.5614 -21.28951,-36.0097 -33.19532,-72.7737 -38.21605,-118.0074 -1.40865,-12.691 -4.06397,-25.9807 -5.90072,-29.5326 -5.19195,-10.0401 -15.63422,-14.2788 -31.60834,-12.8303 -22.19056,2.0122 -32.48959,12.0087 -32.88717,31.9213 -0.12571,6.2996 -0.42744,11.4602 -0.67032,11.4681 -3.8867,0.1259 -41.82513,-15.7572 -67.0746,-28.081 -17.99914,-8.785 -34.54083,-15.9727 -36.75933,-15.9727 -9.38427,0 -20.22603,7.8489 -26.88957,19.4667 -15.16798,26.4454 -8.99737,35.5152 41.84115,61.5003 l 38.15823,19.5037 -18.48509,17.1559 c -25.83771,23.9798 -63.0302,53.783 -90.40551,72.444 -19.66855,13.4075 -80.00822,48.8241 -83.1822,48.8241 -0.55725,0 -0.51381,-4.4358 0.0965,-9.8573 z M 715.6562,1396.26 c 14.68098,-4.0784 25.38117,-20.4073 25.38117,-38.7326 0,-13.4536 -5.34152,-20.1561 -23.65129,-29.6775 -9.31569,-4.8443 -17.2112,-9.016 -17.54559,-9.2705 -0.33438,-0.2545 1.62715,-5.5157 4.359,-11.6914 9.68991,-21.9057 1.30153,-58.3631 -17.0411,-74.0637 -16.67578,-14.2739 -47.44194,-16.3617 -70.33264,-4.773 l -10.41544,5.273 -8.17114,-16.9885 c -12.887,-26.7932 -25.488,-33.798 -46.31289,-25.7448 -26.6886,10.3206 -31.5787,31.9237 -14.99085,66.2253 19.88534,41.1203 45.45806,72.5797 80.01587,98.4351 19.34135,14.4707 69.13285,40.0363 81.1778,41.6811 3.82696,0.5225 7.47996,1.1006 8.11778,1.2846 0.63783,0.184 4.87202,-0.6967 9.40932,-1.9571 z M 391.0026,900.72719 c 10.89621,-4.3598 22.12955,-18.14574 24.32597,-29.85367 2.01293,-10.72983 -4.48453,-23.06665 -16.50389,-31.33619 -19.75275,-13.59025 -33.52457,-35.69146 -33.52457,-53.80068 0,-9.65039 -5.96597,-19.71377 -14.21643,-23.98025 -11.35557,-5.87219 -29.57001,-6.67655 -39.09672,-1.72655 -10.52292,5.46764 -13.87238,12.64274 -13.91427,29.80675 -0.0792,32.43354 14.48454,64.13742 41.058,89.37961 15.63834,14.85489 31.6994,25.14693 39.45884,25.28552 1.56875,0.0281 7.15463,-1.67053 12.41307,-3.77454 z"
+     id="path52" />
+</svg>
index 0c20b59..7c1c823 100644 (file)
@@ -40,7 +40,7 @@ export const ChessRules = class ChessRules {
         {
           label: "Randomness",
           variable: "randomness",
         {
           label: "Randomness",
           variable: "randomness",
-          defaut: 2,
+          defaut: 0,
           options: [
             { label: "Deterministic", value: 0 },
             { label: "Symmetric random", value: 1 },
           options: [
             { label: "Deterministic", value: 0 },
             { label: "Symmetric random", value: 1 },
@@ -58,6 +58,10 @@ export const ChessRules = class ChessRules {
     //return "R" + opts.randomness;
   }
 
     //return "R" + opts.randomness;
   }
 
+  static IsValidOptions(opts) {
+    return true;
+  }
+
   // Some variants don't have flags:
   static get HasFlags() {
     return true;
   // Some variants don't have flags:
   static get HasFlags() {
     return true;
@@ -368,8 +372,7 @@ export const ChessRules = class ChessRules {
 
   // Setup the initial random (asymmetric) position
   static GenRandInitFen(options) {
 
   // Setup the initial random (asymmetric) position
   static GenRandInitFen(options) {
-    const randomness = parseInt(options.randomness, 10);
-    if (!randomness || randomness == 0)
+    if (!options.randomness || options.randomness == 0)
       // Deterministic:
       return "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 ahah -";
 
       // Deterministic:
       return "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 ahah -";
 
@@ -746,14 +749,15 @@ export const ChessRules = class ChessRules {
 
   // Generic method to find possible moves of non-pawn pieces:
   // "sliding or jumping"
 
   // Generic method to find possible moves of non-pawn pieces:
   // "sliding or jumping"
-  getSlideNJumpMoves([x, y], steps, oneStep) {
+  getSlideNJumpMoves([x, y], steps, nbSteps) {
     let moves = [];
     outerLoop: for (let step of steps) {
       let i = x + step[0];
       let j = y + step[1];
     let moves = [];
     outerLoop: for (let step of steps) {
       let i = x + step[0];
       let j = y + step[1];
+      let stepCounter = 0;
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
         moves.push(this.getBasicMove([x, y], [i, j]));
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
         moves.push(this.getBasicMove([x, y], [i, j]));
-        if (!!oneStep) continue outerLoop;
+        if (nbSteps && ++stepCounter >= nbSteps) continue outerLoop;
         i += step[0];
         j += step[1];
       }
         i += step[0];
         j += step[1];
       }
@@ -895,7 +899,7 @@ export const ChessRules = class ChessRules {
 
   // What are the knight moves from square x,y ?
   getPotentialKnightMoves(sq) {
 
   // What are the knight moves from square x,y ?
   getPotentialKnightMoves(sq) {
-    return this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep");
+    return this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1);
   }
 
   // What are the bishop moves from square x,y ?
   }
 
   // What are the bishop moves from square x,y ?
@@ -906,19 +910,14 @@ export const ChessRules = class ChessRules {
   // What are the queen moves from square x,y ?
   getPotentialQueenMoves(sq) {
     return this.getSlideNJumpMoves(
   // What are the queen moves from square x,y ?
   getPotentialQueenMoves(sq) {
     return this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP])
-    );
+      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]));
   }
 
   // What are the king moves from square x,y ?
   getPotentialKingMoves(sq) {
     // Initialize with normal moves
     let moves = this.getSlideNJumpMoves(
   }
 
   // What are the king moves from square x,y ?
   getPotentialKingMoves(sq) {
     // Initialize with normal moves
     let moves = this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
     if (V.HasCastle && this.castleFlags[this.turn].some(v => v < V.size.y))
       moves = moves.concat(this.getCastleMoves(sq));
     return moves;
     if (V.HasCastle && this.castleFlags[this.turn].some(v => v < V.size.y))
       moves = moves.concat(this.getCastleMoves(sq));
     return moves;
@@ -1102,13 +1101,18 @@ export const ChessRules = class ChessRules {
 
   // Generic method for non-pawn pieces ("sliding or jumping"):
   // is x,y attacked by a piece of given color ?
 
   // Generic method for non-pawn pieces ("sliding or jumping"):
   // is x,y attacked by a piece of given color ?
-  isAttackedBySlideNJump([x, y], color, piece, steps, oneStep) {
+  isAttackedBySlideNJump([x, y], color, piece, steps, nbSteps) {
     for (let step of steps) {
       let rx = x + step[0],
           ry = y + step[1];
     for (let step of steps) {
       let rx = x + step[0],
           ry = y + step[1];
-      while (V.OnBoard(rx, ry) && this.board[rx][ry] == V.EMPTY && !oneStep) {
+      let stepCounter = 1;
+      while (
+        V.OnBoard(rx, ry) && this.board[rx][ry] == V.EMPTY &&
+        (!nbSteps || stepCounter < nbSteps)
+      ) {
         rx += step[0];
         ry += step[1];
         rx += step[0];
         ry += step[1];
+        stepCounter++;
       }
       if (
         V.OnBoard(rx, ry) &&
       }
       if (
         V.OnBoard(rx, ry) &&
index 7627f2d..4b6529f 100644 (file)
@@ -167,7 +167,8 @@ export default {
       baseGameDiv.tabIndex = 0;
       baseGameDiv.addEventListener("click", this.focusBg);
       baseGameDiv.addEventListener("keydown", this.handleKeys);
       baseGameDiv.tabIndex = 0;
       baseGameDiv.addEventListener("click", this.focusBg);
       baseGameDiv.addEventListener("keydown", this.handleKeys);
-      baseGameDiv.addEventListener("wheel", this.handleScroll);
+      if (this.st.settings.scrollmove)
+        baseGameDiv.addEventListener("wheel", this.handleScroll);
     }
     document.getElementById("eogDiv")
       .addEventListener("click", processModalClick);
     }
     document.getElementById("eogDiv")
       .addEventListener("click", processModalClick);
@@ -340,6 +341,7 @@ export default {
         pgn += '[Url "' + params.serverUrl + '/game/' + this.game.id + '"]\n';
       if (!!this.game.cadence)
         pgn += '[Cadence "' + this.game.cadence + '"]\n';
         pgn += '[Url "' + params.serverUrl + '/game/' + this.game.id + '"]\n';
       if (!!this.game.cadence)
         pgn += '[Cadence "' + this.game.cadence + '"]\n';
+      pgn += '[Options "' + JSON.stringify(this.game.options) + '"]\n';
       pgn += '\n';
       for (let i = 0; i < this.moves.length; i += 2) {
         if (i > 0) pgn += " ";
       pgn += '\n';
       for (let i = 0; i < this.moves.length; i += 2) {
         if (i > 0) pgn += " ";
index 21179a6..a1c46cd 100644 (file)
@@ -62,17 +62,14 @@ export default {
         return c.to || this.st.tr["Any player"];
       return c.from.name || "@nonymous";
     },
         return c.to || this.st.tr["Any player"];
       return c.from.name || "@nonymous";
     },
+    // TODO: duplicated from Hall
     getRandomnessClass: function(c) {
     getRandomnessClass: function(c) {
-      if (
-        // TODO: one extra test here
-        !Number.isInteger(c.options.randomness) &&
-        !parseInt(c.options.randomness, 10)
-      ) {
+      const opts = c.options;
+      if (opts.randomness === undefined && opts.random === undefined)
         return {};
         return {};
-      }
-      return {
-        ["random-" + c.options.randomness]: true
-      };
+      if (opts.randomness !== undefined)
+        return { ["random-" + opts.randomness]: true };
+      return { ["random-" + (opts.random ? 2 : 0)]: true };
     }
   }
 };
     }
   }
 };
index 514e704..e04cbdf 100644 (file)
@@ -60,6 +60,13 @@ div
             type="checkbox"
             v-model="st.settings.gotonext"
           )
             type="checkbox"
             v-model="st.settings.gotonext"
           )
+        fieldset(v-if="desktopBrowser")
+          label(for="setScrollmove")
+            | {{ st.tr["Mouse scroll to replay moves"] }}
+          input#setScrollmove(
+            type="checkbox"
+            v-model="st.settings.scrollmove"
+          )
 </template>
 
 <script>
 </template>
 
 <script>
@@ -83,6 +90,9 @@ export default {
   computed: {
     flagImage: function() {
       return `/images/flags/${this.st.lang}.svg`;
   computed: {
     flagImage: function() {
       return `/images/flags/${this.st.lang}.svg`;
+    },
+    desktopBrowser: function() {
+      return !("ontouchstart" in window);
     }
   },
   methods: {
     }
   },
   methods: {
index ea85ea7..b57a23e 100644 (file)
@@ -64,6 +64,9 @@ export default {
           case "Cadence":
             game.cadence = value;
             break;
           case "Cadence":
             game.cadence = value;
             break;
+          case "Options":
+            game.options = value;
+            break;
         }
         idx++;
       }
         }
         idx++;
       }
index 7665f6f..554dfdf 100644 (file)
@@ -19,5 +19,7 @@ export function checkChallenge(c) {
   }
   else c.fen = "";
 
   }
   else c.fen = "";
 
+  if (!V.IsValidOptions(c.options)) return "Invalid options";
+
   return "";
 }
   return "";
 }
index 13c600b..6489b93 100644 (file)
@@ -79,17 +79,18 @@ export const store = {
       this.state.user.notify = json.notify;
     });
     // Settings initialized with values from localStorage
       this.state.user.notify = json.notify;
     });
     // Settings initialized with values from localStorage
-    const getItemDefaultTrue = (item) => {
+    const getItemDefault = (item, defaut) => {
       const value = localStorage.getItem(item);
       const value = localStorage.getItem(item);
-      if (!value) return true;
+      if (!value) return defaut;
       return value == "true";
     };
     this.state.settings = {
       bcolor: localStorage.getItem("bcolor") || "lichess",
       return value == "true";
     };
     this.state.settings = {
       bcolor: localStorage.getItem("bcolor") || "lichess",
-      sound: getItemDefaultTrue("sound"),
-      hints: getItemDefaultTrue("hints"),
-      highlight: getItemDefaultTrue("highlight"),
-      gotonext: getItemDefaultTrue("gotonext"),
+      sound: getItemDefault("sound", true),
+      hints: getItemDefault("hints", true),
+      highlight: getItemDefault("highlight", true),
+      gotonext: getItemDefault("gotonext", true),
+      scrollmove: getItemDefault("scrollmove", false)
     };
     const supportedLangs = ["en", "es", "fr"];
     const navLanguage = navigator.language.substr(0, 2);
     };
     const supportedLangs = ["en", "es", "fr"];
     const navLanguage = navigator.language.substr(0, 2);
index 82fabd0..5ab686b 100644 (file)
@@ -14,9 +14,8 @@ h3 Notes
 p ELO rating is purposely absent from this website.
 
 p.
 p ELO rating is purposely absent from this website.
 
 p.
-  Games start by default with a random asymmetric position.
-  Random symmetric or even deterministic positions are available too,
-  if you prefer more fairness (but also less fun? :-P ).
+  Most games can start from three initial setups: deterministic
+  (the usual one), or random &ndash; symmetric or not.
 
 h3 Contribute
 
 
 h3 Contribute
 
index 95f69c0..ffbc5c3 100644 (file)
@@ -13,9 +13,8 @@ h3 Notas
 p El ranking ELO está ausente a propósito de este sitio.
 
 p.
 p El ranking ELO está ausente a propósito de este sitio.
 
 p.
-  Las partidas comienzan por defecto con una posición aleatoria no simétrica.
-  Es posible una posición aleatoria simétrica o incluso determinista,
-  si prefieres más justicia (¿pero también más aburrimiento? :-P).
+  La mayoría de los juegos pueden comenzar desde tres tipos de posiciones:
+  determinista (patrón habitual) o aleatorio &ndash; simétrico o no.
 
 h3 Contribuir
 
 
 h3 Contribuir
 
index eb47ccd..c6d076e 100644 (file)
@@ -14,9 +14,8 @@ h3 Notes
 p Le classement ELO est Ã  dessein absent de ce site.
 
 p.
 p Le classement ELO est Ã  dessein absent de ce site.
 
 p.
-  Les parties démarrent par défaut avec une position aléatoire non symétrique.
-  Une position aléatoire symétrique ou même déterministe est possible,
-  si vous préférez plus de justice (mais aussi plus d'ennui ? :-P ).
+  La plupart des jeux peuvent démarrer depuis trois types de positions :
+  déterministe (schéma habituel), ou aléatoire &ndash; symétrique ou non.
 
 h3 Contribuer
 
 
 h3 Contribuer
 
index 832bcb9..cdcb7ea 100644 (file)
@@ -11,6 +11,8 @@ export const translations = {
   "Any player": "Any player",
   Apply: "Apply",
   "Are you sure?": "Are you sure?",
   "Any player": "Any player",
   Apply: "Apply",
   "Are you sure?": "Are you sure?",
+  "Army 1": "Army 1",
+  "Army 2": "Army 2",
   "Asymmetric random": "Asymmetric random",
   "Authentication successful!": "Authentication successful!",
   "Back to list": "Back to list",
   "Asymmetric random": "Asymmetric random",
   "Authentication successful!": "Authentication successful!",
   "Back to list": "Back to list",
@@ -31,6 +33,7 @@ export const translations = {
   "Clear history": "Clear history",
   Code: "Code",
   Color: "Color",
   "Clear history": "Clear history",
   Code: "Code",
   Color: "Color",
+  "Colorbound Clobberers": "Colorbound Clobberers",
   "Color option only for targeted challenge": "Color option only for targeted challenge",
   "Connection token sent. Check your emails!": "Connection token sent. Check your emails!",
   Contact: "Contact",
   "Color option only for targeted challenge": "Color option only for targeted challenge",
   "Connection token sent. Check your emails!": "Connection token sent. Check your emails!",
   Contact: "Contact",
@@ -49,6 +52,8 @@ export const translations = {
   "Error: try to delete cookies": "Error: try to delete cookies",
   "Errors in FEN": "Errors in FEN",
   "Example game": "Example game",
   "Error: try to delete cookies": "Error: try to delete cookies",
   "Errors in FEN": "Errors in FEN",
   "Example game": "Example game",
+  Fide: "Fide",
+  Four: "Four",
   Go: "Go",
   green: "green",
   Hall: "Hall",
   Go: "Go",
   green: "green",
   Hall: "Hall",
@@ -56,6 +61,7 @@ export const translations = {
   "Imported games": "Imported games",
   Instructions: "Instructions",
   "Invalid email": "Invalid email",
   "Imported games": "Imported games",
   Instructions: "Instructions",
   "Invalid email": "Invalid email",
+  "Invalid options": "Invalid options",
   "It's your turn!": "It's your turn!",
   "is not online": "is not online",
   Language: "Language",
   "It's your turn!": "It's your turn!",
   "is not online": "is not online",
   Language: "Language",
@@ -73,6 +79,7 @@ export const translations = {
   "Missing name": "Missing name",
   "Missing solution": "Missing solution",
   "Modifications applied!": "Modifications applied!",
   "Missing name": "Missing name",
   "Missing solution": "Missing solution",
   "Modifications applied!": "Modifications applied!",
+  "Mouse scroll to replay moves": "Mouse scroll to replay moves",
   "Move played:": "Move played:",
   "Mutual agreement": "Mutual agreement",
   "My games": "My games",
   "Move played:": "Move played:",
   "Mutual agreement": "Mutual agreement",
   "My games": "My games",
@@ -91,9 +98,12 @@ export const translations = {
   "No subject. Send anyway?": "No subject. Send anyway?",
   "Notifications by email": "Notifications by email",
   "Number": "Number",
   "No subject. Send anyway?": "No subject. Send anyway?",
   "Notifications by email": "Notifications by email",
   "Number": "Number",
+  "Number of pawns": "Number of pawns",
+  "Nutty Knights": "Nutty Knights",
   Observe: "Observe",
   "Offer draw?": "Offer draw?",
   "Opponent action": "Opponent action",
   Observe: "Observe",
   "Offer draw?": "Offer draw?",
   "Opponent action": "Opponent action",
+  Options: "Options",
   orange: "orange",
   "Participant(s):": "Participant(s):",
   "Play with": "Play with",
   orange: "orange",
   "Participant(s):": "Participant(s):",
   "Play with": "Play with",
@@ -108,9 +118,12 @@ export const translations = {
   Previous_p: "Previous",
   "Processing... Please wait": "Processing... Please wait",
   Problems: "Problems",
   Previous_p: "Previous",
   "Processing... Please wait": "Processing... Please wait",
   Problems: "Problems",
+  Random: "Random",
+  Randomness: "Randomness",
   Refuse: "Refuse",
   Register: "Register",
   "Registration complete! Please check your emails now": "Registration complete! Please check your emails now",
   Refuse: "Refuse",
   Register: "Register",
   "Registration complete! Please check your emails now": "Registration complete! Please check your emails now",
+  "Remarkable Rookies": "Remarkable Rookies",
   Rematch: "Rematch",
   "Rematch in progress": "Rematch in progress",
   "Remove game?": "Remove game?",
   Rematch: "Rematch",
   "Rematch in progress": "Rematch in progress",
   "Remove game?": "Remove game?",
@@ -127,6 +140,7 @@ export const translations = {
   "Show next game after a move": "Show next game after move",
   "Show possible moves": "Show possible moves",
   "Show solution": "Show solution",
   "Show next game after a move": "Show next game after move",
   "Show possible moves": "Show possible moves",
   "Show solution": "Show solution",
+  Six: "Six",
   Solution: "Solution",
   "Sound alert at game start": "Sound alert at game start",
   Stop: "Stop",
   Solution: "Solution",
   "Sound alert at game start": "Sound alert at game start",
   Stop: "Stop",
@@ -138,6 +152,7 @@ export const translations = {
   "The game was already imported": "The game was already imported",
   "Three repetitions": "Three repetitions",
   Time: "Time",
   "The game was already imported": "The game was already imported",
   "Three repetitions": "Three repetitions",
   Time: "Time",
+  Two: "Two",
   "Undetermined result": "Undetermined result",
   Update: "Update",
   "Upload a game": "Upload a game",
   "Undetermined result": "Undetermined result",
   Update: "Update",
   "Upload a game": "Upload a game",
@@ -155,6 +170,7 @@ export const translations = {
   "White win": "White win",
   "Who's there?": "Who's there?",
   With: "With",
   "White win": "White win",
   "Who's there?": "Who's there?",
   With: "With",
+  "With switch": "With switch",
   with: "with",
   "Wrong color": "Wrong color",
   "Wrong time control": "Wrong time control",
   with: "with",
   "Wrong color": "Wrong color",
   "Wrong time control": "Wrong time control",
@@ -404,9 +420,4 @@ export const translations = {
   "vg30": "Pieces can temporarily borrow powers from others.",
   "vt31": "Miscelleanous",
   "vg31": "These variants are not classified yet, generally because they are the only one of their kind on this website.",
   "vg30": "Pieces can temporarily borrow powers from others.",
   "vt31": "Miscelleanous",
   "vg31": "These variants are not classified yet, generally because they are the only one of their kind on this website.",
-
-  // Variants' options
-  "Options": "Options",
-  "Randomness": "Randomness",
-  "With switch": "With switch",
 };
 };
index 4c458fb..0e8af8c 100644 (file)
@@ -11,6 +11,8 @@ export const translations = {
   "Any player": "Cualquier jugador",
   Apply: "Aplicar",
   "Are you sure?": "¿Está usted seguro?",
   "Any player": "Cualquier jugador",
   Apply: "Aplicar",
   "Are you sure?": "¿Está usted seguro?",
+  "Army 1": "Ejército 1",
+  "Army 2": "Ejército 2",
   "Asymmetric random": "Aleatorio asimétrico",
   "Authentication successful!": "¡Autenticación exitosa!",
   "Back to list": "Volver a la lista",
   "Asymmetric random": "Aleatorio asimétrico",
   "Authentication successful!": "¡Autenticación exitosa!",
   "Back to list": "Volver a la lista",
@@ -31,6 +33,7 @@ export const translations = {
   "Clear history": "Clara historia",
   Code: "Código",
   Color: "Color",
   "Clear history": "Clara historia",
   Code: "Código",
   Color: "Color",
+  "Colorbound Clobberers": "Batidores Unicolor",
   "Color option only for targeted challenge": "Elección de color solo para desafíos específicos",
   "Connection token sent. Check your emails!": "Token de conexión enviado. Â¡Revisa tus correos!",
   Contact: "Contacto",
   "Color option only for targeted challenge": "Elección de color solo para desafíos específicos",
   "Connection token sent. Check your emails!": "Token de conexión enviado. Â¡Revisa tus correos!",
   Contact: "Contacto",
@@ -49,6 +52,8 @@ export const translations = {
   "Error: try to delete cookies": "Error: intente eliminar las cookies",
   "Errors in FEN": "FEN errónea",
   "Example game": "Ejemplo de partida",
   "Error: try to delete cookies": "Error: intente eliminar las cookies",
   "Errors in FEN": "FEN errónea",
   "Example game": "Ejemplo de partida",
+  Fide: "Fide",
+  Four: "Cuatro",
   Go: "Go",
   green: "verde",
   Hall: "Salón",
   Go: "Go",
   green: "verde",
   Hall: "Salón",
@@ -56,6 +61,7 @@ export const translations = {
   "Imported games": "Partidas importadas",
   Instructions: "Instrucciones",
   "Invalid email": "Email inválido",
   "Imported games": "Partidas importadas",
   Instructions: "Instrucciones",
   "Invalid email": "Email inválido",
+  "Invalid options": "Optiones inválidas",
   "It's your turn!": "¡Es su turno!",
   "is not online": "no está en línea",
   Language: "Idioma",
   "It's your turn!": "¡Es su turno!",
   "is not online": "no está en línea",
   Language: "Idioma",
@@ -73,6 +79,7 @@ export const translations = {
   "Missing name": "Nombre falta",
   "Missing solution": "Solución falta",
   "Modifications applied!": "¡Modificaciones aplicadas!",
   "Missing name": "Nombre falta",
   "Missing solution": "Solución falta",
   "Modifications applied!": "¡Modificaciones aplicadas!",
+  "Mouse scroll to replay moves": "Pergamino mouse para repetir las jugadas",
   "Move played:": "Movimiento jugado:",
   "Mutual agreement": "Acuerdo mutuo",
   "My games": "Mis partidas",
   "Move played:": "Movimiento jugado:",
   "Mutual agreement": "Acuerdo mutuo",
   "My games": "Mis partidas",
@@ -91,9 +98,12 @@ export const translations = {
   "No subject. Send anyway?": "Sin asunto. Â¿Enviar sin embargo?",
   "Notifications by email": "Notificaciones por email",
   "Number": "Número",
   "No subject. Send anyway?": "Sin asunto. Â¿Enviar sin embargo?",
   "Notifications by email": "Notificaciones por email",
   "Number": "Número",
+  "Number of pawns": "Número de peones",
+  "Nutty Knights": "Caballeros Locos",
   "Offer draw?": "¿Ofrecer tablas?",
   Observe: "Observar",
   "Opponent action": "Acción del adversario",
   "Offer draw?": "¿Ofrecer tablas?",
   Observe: "Observar",
   "Opponent action": "Acción del adversario",
+  Options: "Optiones",
   orange: "naranja",
   "Participant(s):": "Participante(s):",
   "Play with": "Jugar con",
   orange: "naranja",
   "Participant(s):": "Participante(s):",
   "Play with": "Jugar con",
@@ -108,9 +118,12 @@ export const translations = {
   Previous_n: "Anterior",
   "Processing... Please wait": "Procesando... por favor espere",
   Problems: "Problemas",
   Previous_n: "Anterior",
   "Processing... Please wait": "Procesando... por favor espere",
   Problems: "Problemas",
+  Random: "Aleatorio",
+  Randomness: "Grado de azar",
   Refuse: "Rechazar",
   Register: "Inscribirse",
   "Registration complete! Please check your emails now": "¡Registro completo! Revise sus correos electrónicos ahora",
   Refuse: "Rechazar",
   Register: "Inscribirse",
   "Registration complete! Please check your emails now": "¡Registro completo! Revise sus correos electrónicos ahora",
+  "Remarkable Rookies": "Reclutas Notables",
   Rematch: "Revancha",
   "Rematch in progress": "Revancha en progreso",
   "Remove game?": "¿Eliminar la partida?",
   Rematch: "Revancha",
   "Rematch in progress": "Revancha en progreso",
   "Remove game?": "¿Eliminar la partida?",
@@ -127,6 +140,7 @@ export const translations = {
   "Show next game after a move": "Mostrar la siguiente partida después de una jugada",
   "Show possible moves": "Mostrar posibles movimientos",
   "Show solution": "Mostrar la solución",
   "Show next game after a move": "Mostrar la siguiente partida después de una jugada",
   "Show possible moves": "Mostrar posibles movimientos",
   "Show solution": "Mostrar la solución",
+  Six: "Seis",
   Solution: "Solución",
   "Sound alert at game start": "Alerta audible cuando comienza una partida",
   Stop: "Interrupción",
   Solution: "Solución",
   "Sound alert at game start": "Alerta audible cuando comienza una partida",
   Stop: "Interrupción",
@@ -138,6 +152,7 @@ export const translations = {
   "The game was already imported": "La partida ya ha sido importada",
   "Three repetitions": "Tres repeticiones",
   Time: "Tiempo",
   "The game was already imported": "La partida ya ha sido importada",
   "Three repetitions": "Tres repeticiones",
   Time: "Tiempo",
+  Two: "Dos",
   "Undetermined result": "Resultado indeterminado",
   Update: "Actualización",
   "Upload a game": "Enviar una partida",
   "Undetermined result": "Resultado indeterminado",
   Update: "Actualización",
   "Upload a game": "Enviar una partida",
@@ -155,6 +170,7 @@ export const translations = {
   "White win": "Las blancas ganan",
   "Who's there?": "¿Quién está ahí?",
   With: "Con",
   "White win": "Las blancas ganan",
   "Who's there?": "¿Quién está ahí?",
   With: "Con",
+  "With switch": "Con switch",
   with: "con",
   "Wrong color": "Color incorrecto",
   "Wrong time control": "Cadencia errónea",
   with: "con",
   "Wrong color": "Color incorrecto",
   "Wrong time control": "Cadencia errónea",
@@ -404,9 +420,4 @@ export const translations = {
   "vg30": "Las piezas pueden temporalmente tomar prestados poderes de otras",
   "vt31": "Varios",
   "vg31": "Estas variantes aún no están clasificadas, en general porque son el Ãºnico representante de su tipo en este sitio.",
   "vg30": "Las piezas pueden temporalmente tomar prestados poderes de otras",
   "vt31": "Varios",
   "vg31": "Estas variantes aún no están clasificadas, en general porque son el Ãºnico representante de su tipo en este sitio.",
-
-  // Variants' options
-  "Options": "Optiones",
-  "Randomness": "Grado de azar",
-  "With switch": "Con switch",
 };
 };
index 0f914b7..3062b0b 100644 (file)
@@ -7,14 +7,6 @@
   against the computer. Keep in mind that the "engine" is generally quite weak.
   It's here for illustration and learning purpose only.
 
   against the computer. Keep in mind that the "engine" is generally quite weak.
   It's here for illustration and learning purpose only.
 
-.question.
-  The initial position looks weird?
-.answer.
-  Everything is randomized by default - when possible. This is the initial
-  spirit of the website. However, you can change this for a practice game
-  using the upper-right Settings menu ("randomness level"), and for a game
-  from main Hall by changing this same parameter in the form.
-
 .question.
   The bot is too weak! Where should I continue?
 .answer
 .question.
   The bot is too weak! Where should I continue?
 .answer
index 8a8f464..23f12c3 100644 (file)
@@ -9,15 +9,6 @@
   en general bastante débil.
   Se utiliza solo para ilustrar y aprender las reglas.
 
   en general bastante débil.
   Se utiliza solo para ilustrar y aprender las reglas.
 
-.question.
-  Â¿Es extraña la posición inicial?
-.answer.
-  Todo es aleatorio por defecto - cuando es posible. Es el espíritu
-  inicial del sitio. Sin embargo, puede cambiar esto por una partida de
-  entrenamiento a través de la configuración en la parte superior derecha
-  ("grado de azar"), y para una partida del Salón principal cambiando el mismo
-  parámetro en el formulario.
-
 .question.
   Â¡La computadora está jugando demasiado mal! Â¿Dónde debo continuar?
 .answer
 .question.
   Â¡La computadora está jugando demasiado mal! Â¿Dónde debo continuar?
 .answer
index cb89549..e5fce10 100644 (file)
@@ -8,15 +8,6 @@
   en général plutôt faible.
   Il sert Ã  illustrer et Ã  apprendre les règles seulement.
 
   en général plutôt faible.
   Il sert Ã  illustrer et Ã  apprendre les règles seulement.
 
-.question.
-  La position initiale est bizarre ?
-.answer.
-  Tout est rendu aléatoire par défaut - quand c'est possible. C'est l'esprit
-  initial du site. Cependant, vous pouvez changer cela pour une partie
-  d'entraînement via les Réglages en haut Ã  droite ("degré d'aléa"), et pour
-  une partie depuis le Salon principal en changeant le même paramètre dans le
-  formulaire.
-
 .question.
   L'ordinateur joue trop mal ! Où dois-je continuer ?
 .answer
 .question.
   L'ordinateur joue trop mal ! Où dois-je continuer ?
 .answer
index 5d3dbf1..bc8b408 100644 (file)
@@ -10,9 +10,11 @@ export const translations = {
   "Analysis disabled for this variant": "Analyse désactivée pour cette variante",
   "Any player": "N'importe qui",
   Apply: "Appliquer",
   "Analysis disabled for this variant": "Analyse désactivée pour cette variante",
   "Any player": "N'importe qui",
   Apply: "Appliquer",
-  "Authentication successful!": "Authentification réussie !",
   "Are you sure?": "Étes vous sûr?",
   "Are you sure?": "Étes vous sûr?",
+  "Army 1": "Armée 1",
+  "Army 2": "Armée 2",
   "Asymmetric random": "Aléatoire asymétrique",
   "Asymmetric random": "Aléatoire asymétrique",
+  "Authentication successful!": "Authentification réussie !",
   "Back to list": "Retour Ã  la liste",
   "Black": "Noirs",
   "Black to move": "Trait aux noirs",
   "Back to list": "Retour Ã  la liste",
   "Black": "Noirs",
   "Black to move": "Trait aux noirs",
@@ -31,6 +33,7 @@ export const translations = {
   "Clear history": "Effacer l'historique",
   Code: "Code",
   Color: "Couleur",
   "Clear history": "Effacer l'historique",
   Code: "Code",
   Color: "Couleur",
+  "Colorbound Clobberers": "Tabasseurs Unicolores",
   "Color option only for targeted challenge": "Choix de la couleur seulement pour défis ciblés",
   "Connection token sent. Check your emails!": "Token de connection envoyé. Allez voir vos emails !",
   Contact: "Contact",
   "Color option only for targeted challenge": "Choix de la couleur seulement pour défis ciblés",
   "Connection token sent. Check your emails!": "Token de connection envoyé. Allez voir vos emails !",
   Contact: "Contact",
@@ -49,6 +52,8 @@ export const translations = {
   "Error: try to delete cookies": "Erreur : essayez de supprimer les cookies",
   "Errors in FEN": "FEN erronée",
   "Example game": "Partie exemple",
   "Error: try to delete cookies": "Erreur : essayez de supprimer les cookies",
   "Errors in FEN": "FEN erronée",
   "Example game": "Partie exemple",
+  Fide: "Fide",
+  Four: "Quatre",
   Go: "Go",
   green: "vert",
   Hall: "Salon",
   Go: "Go",
   green: "vert",
   Hall: "Salon",
@@ -56,6 +61,7 @@ export const translations = {
   "Imported games": "Parties importées",
   Instructions: "Instructions",
   "Invalid email": "Email invalide",
   "Imported games": "Parties importées",
   Instructions: "Instructions",
   "Invalid email": "Email invalide",
+  "Invalid options": "Options invalides",
   "It's your turn!": "À vous de jouer !",
   "is not online": "n'est pas en ligne",
   Language: "Langue",
   "It's your turn!": "À vous de jouer !",
   "is not online": "n'est pas en ligne",
   Language: "Langue",
@@ -73,6 +79,7 @@ export const translations = {
   "Missing name": "Nom manquant",
   "Missing solution": "Solution manquante",
   "Modifications applied!": "Modifications effectuées !",
   "Missing name": "Nom manquant",
   "Missing solution": "Solution manquante",
   "Modifications applied!": "Modifications effectuées !",
+  "Mouse scroll to replay moves": "Défilement souris pour rejouer les coups",
   "Move played:": "Coup joué :",
   "Mutual agreement": "Accord mutuel",
   "My games": "Mes parties",
   "Move played:": "Coup joué :",
   "Mutual agreement": "Accord mutuel",
   "My games": "Mes parties",
@@ -91,9 +98,12 @@ export const translations = {
   "No subject. Send anyway?": "Pas de sujet. Envoyer quand-même ??",
   "Notifications by email": "Notifications par email",
   "Number": "Numéro",
   "No subject. Send anyway?": "Pas de sujet. Envoyer quand-même ??",
   "Notifications by email": "Notifications par email",
   "Number": "Numéro",
+  "Number of pawns": "Nombre de pions",
+  "Nutty Knights": "Chevaliers Fous",
   "Offer draw?": "Proposer nulle ?",
   Observe: "Observer",
   "Opponent action": "Action de l'adversaire",
   "Offer draw?": "Proposer nulle ?",
   Observe: "Observer",
   "Opponent action": "Action de l'adversaire",
+  Options: "Options",
   orange: "orange",
   "Participant(s):": "Participant(s) :",
   "Play with": "Jouer avec",
   orange: "orange",
   "Participant(s):": "Participant(s) :",
   "Play with": "Jouer avec",
@@ -108,9 +118,12 @@ export const translations = {
   Previous_n: "Précédente",
   "Processing... Please wait": "Traitement en cours... Attendez SVP",
   Problems: "Problèmes",
   Previous_n: "Précédente",
   "Processing... Please wait": "Traitement en cours... Attendez SVP",
   Problems: "Problèmes",
+  Random: "Aléatoire",
+  Randomness: "Degré d'aléa",
   Refuse: "Refuser",
   Register: "S'inscrire",
   "Registration complete! Please check your emails now": "Enregistrement terminé ! Allez voir vos emails maintenant",
   Refuse: "Refuser",
   Register: "S'inscrire",
   "Registration complete! Please check your emails now": "Enregistrement terminé ! Allez voir vos emails maintenant",
+  "Remarkable Rookies": "Recrues Remarquables",
   Rematch: "Rejouer",
   "Rematch in progress": "Revanche en cours",
   "Remove game?": "Supprimer la partie ?",
   Rematch: "Rejouer",
   "Rematch in progress": "Revanche en cours",
   "Remove game?": "Supprimer la partie ?",
@@ -127,6 +140,7 @@ export const translations = {
   "Show next game after a move": "Montrer la partie suivante après un coup",
   "Show possible moves": "Montrer les coups possibles",
   "Show solution": "Montrer la solution",
   "Show next game after a move": "Montrer la partie suivante après un coup",
   "Show possible moves": "Montrer les coups possibles",
   "Show solution": "Montrer la solution",
+  Six: "Six",
   Solution: "Solution",
   "Sound alert at game start": "Alerte sonore quand une partie démarre",
   Stop: "Arrêt",
   Solution: "Solution",
   "Sound alert at game start": "Alerte sonore quand une partie démarre",
   Stop: "Arrêt",
@@ -138,6 +152,7 @@ export const translations = {
   "The game was already imported": "La partie a déjà Ã©té importée",
   "Three repetitions": "Triple répétition",
   Time: "Temps",
   "The game was already imported": "La partie a déjà Ã©té importée",
   "Three repetitions": "Triple répétition",
   Time: "Temps",
+  Two: "Deux",
   "Undetermined result": "Résultat indéterminé",
   Update: "Mise Ã  jour",
   "Upload a game": "Envoyer une partie",
   "Undetermined result": "Résultat indéterminé",
   Update: "Mise Ã  jour",
   "Upload a game": "Envoyer une partie",
@@ -155,6 +170,7 @@ export const translations = {
   "White win": "Les blancs gagnent",
   "Who's there?": "Qui est là ?",
   With: "Avec",
   "White win": "Les blancs gagnent",
   "Who's there?": "Qui est là ?",
   With: "Avec",
+  "With switch": "Avec switch",
   with: "avec",
   "Wrong color": "Mauvaise couleur",
   "Wrong time control": "Cadence erronée",
   with: "avec",
   "Wrong color": "Mauvaise couleur",
   "Wrong time control": "Cadence erronée",
@@ -404,9 +420,4 @@ export const translations = {
   "vg30": "Les pièces peuvent temporairement emprunter des pouvoir aux autres",
   "vt31": "Divers",
   "vg31": "Ces variantes ne sont pas encore classées, en général car elles sont l'unique représentant de leur type sur ce site.",
   "vg30": "Les pièces peuvent temporairement emprunter des pouvoir aux autres",
   "vt31": "Divers",
   "vg31": "Ces variantes ne sont pas encore classées, en général car elles sont l'unique représentant de leur type sur ce site.",
-
-  // Variants' options
-  "Options": "Options",
-  "Randomness": "Degré d'aléa",
-  "With switch": "Avec switch",
 };
 };
index 0007569..64246b0 100644 (file)
@@ -18,8 +18,7 @@ figure.diagram-container
 h3 More information
 
 p
 h3 More information
 
 p
-  | The variant idea was suggested recently (2020) by Vincent Rothuis.
-  | It is mentioned on 
+  | The variant is mentioned on 
   a(href="https://www.chessvariants.com/other.dir/modest-various.html")
     | this page
   | .
   a(href="https://www.chessvariants.com/other.dir/modest-various.html")
     | this page
   | .
index 7cd1882..a38b8ca 100644 (file)
@@ -18,8 +18,7 @@ figure.diagram-container
 h3 Más información
 
 p
 h3 Más información
 
 p
-  | Esta idea fue sugerida recientemente (2020) por Vincent Rothuis.
-  | La variante es mencionada en 
+  | Esta variante es mencionada en 
   a(href="https://www.chessvariants.com/other.dir/modest-various.html")
     | esta página
   | .
   a(href="https://www.chessvariants.com/other.dir/modest-various.html")
     | esta página
   | .
index e956d8a..b04fd91 100644 (file)
@@ -18,8 +18,7 @@ figure.diagram-container
 h3 Plus d'information
 
 p
 h3 Plus d'information
 
 p
-  | Cette idée a Ã©té suggérée récemment (2020) par Vincent Rothuis.
-  | La variante est mentionnée sur 
+  | Cette variante est mentionnée sur 
   a(href="https://www.chessvariants.com/other.dir/modest-various.html")
     | cette page
   | .
   a(href="https://www.chessvariants.com/other.dir/modest-various.html")
     | cette page
   | .
index 603c8d7..30c016d 100644 (file)
 p.boxed
 p.boxed
-  | TODO: other armies as well
-  | Black pieces are replaced by a new army, where most pieces are quite
-  | colorbound.
+  | White and black pieces are replaced by different armies.
 
 
-p Black pawns and king move as usual, but the other pieces do not:
+p.
+  Pawns and kings move as usual, but the other pieces generally do not.
+  Indeed, before the game start you must select two armies, defining
+  new movements for "rooks", "knights", "bishops" and "queens".
+
+p Pieces movements are described using these simple pieces:
 ul
 ul
-  li Rook = bishop + dabbabah (D),
-  li Knight = wazir + alfil = "phoenix" (H),
-  li Bishop = ferz + alfil + dabbabah (A),
-  li Queen = bishop + knight = "princess" (S).
+  li Dabbabah = jump two squares orthogonally
+  li Alfil = jump two squares diagonally
+  li Wazir = one square orthogonally
+  li Ferz = one square diagonally
+  li Three leaper (L3) = jump three squares orthogonally
+  li Narrow knight = knight without "2+1 lateral moves"
+
+p Pawns can be promoted into a piece of any of the two armies playing.
+
+h3 The Colorbound Clobberers
+
+figure.showPieces.text-center
+  img(src="/images/pieces/Cwda/bd.svg")
+  img(src="/images/pieces/Cwda/ww.svg")
+  img(src="/images/pieces/Cwda/bf.svg")
+  img(src="/images/pieces/Cwda/wc.svg")
+
+ul
+  li Rook = bishop + dabbabah = "bede" (D),
+  li Knight = wazir + alfil = "waffle" (W),
+  li Bishop = ferz + alfil + dabbabah = "fad" (F),
+  li Queen = bishop + knight = "cardinal" (C).
+
+figure.diagram-container
+  .diagram.diag12
+    | fen:8/8/8/3D4/8/8/8/8 a8,b7,c6,e4,f3,g2,h1,c4,b3,a2,e6,f7,g8,f5,d3,b5,d7:
+  .diagram.diag22
+    | fen:8/8/8/4w3/8/8/8/8 e6,f5,e4,d5,c7,g7,g3,c3:
+  figcaption.
+    Moves of the Bede on the left, and of the Waffle on the right.
+
 p.
 p.
-  The Ferz and Wazir move respectively like a single-step bishop, and
-  single-step rook. The Alfil and Dabbabah move respectively like a
-  double-step bishop and a double-step rook. They can both leap over a piece.
+  When castling large, the king and rook arrive respectively on
+  b1/b8 and c1/c8 so that the rook remains on the same color.
+
+h3 The Nutty Knights
+
+figure.showPieces.text-center
+  img(src="/images/pieces/Cwda/bg.svg")
+  img(src="/images/pieces/Cwda/wi.svg")
+  img(src="/images/pieces/Cwda/bt.svg")
+  img(src="/images/pieces/Cwda/wl.svg")
+
+ul
+  li Rook = rook forward and sideways + king backwards = "charging rook" (G),
+  li Knight = narrow knight + ferz = "fibnif" (I),
+  li.
+    Bishop = knight forward + king sideways and backwards =
+    "charging knight" (T),
+  li Queen = rook forward and sideways + knight forward + king = "colonel" (L).
 
 figure.diagram-container
   .diagram.diag12
 
 figure.diagram-container
   .diagram.diag12
-    | fen:8/8/8/3d4/8/8/8/8 a8,b7,c6,e4,f3,g2,h1,c4,b3,a2,e6,f7,g8,f5,d3,b5,d7:
+    | fen:8/8/8/3i4/8/8/8/8 c7,c3,e7,e3,c4,c6,e6,e4:
   .diagram.diag22
   .diagram.diag22
-    | fen:8/8/8/4h3/8/8/8/8 e6,f5,e4,d5,c7,g7,g3,c3:
+    | fen:8/8/8/4T3/8/8/8/8 c6,d7,f7,g6,d5,f5,d4,e4,f4:
   figcaption.
   figcaption.
-    Moves of the black rook on the left, and of the black knight on the right.
+    Moves of the Fibnif on the left, and of the Charging knight on the right.
+
+h3 The Remarkable Rookies
+
+figure.showPieces.text-center
+  img(src="/images/pieces/Cwda/bs.svg")
+  img(src="/images/pieces/Cwda/wy.svg")
+  img(src="/images/pieces/Cwda/bh.svg")
+  img(src="/images/pieces/Cwda/wo.svg")
+
+ul
+  li Rook = rook limited to 4 squares = "short rook" (S),
+  li Knight = dabbabah + wazir = "woody rook" (Y),
+  li Bishop = dabbabah + ferz + L3 = "half-duck" (H),
+  li Queen = rook + knight = "chancellor" (O).
 
 figure.diagram-container
   .diagram.diag12
 
 figure.diagram-container
   .diagram.diag12
-    | fen:8/8/8/3a4/8/8/8/8 c6,b7,e6,f7,e4,f3,c4,b3,d7,f5,d3,b5:
+    | fen:8/8/8/3y4/8/8/8/8 d3,b5,d7,f5,c5,d6,e5,d4:
   .diagram.diag22
   .diagram.diag22
-    | fen:8/8/8/4s3/8/8/8/8 a1,b2,c3,d4,f6,g7,h8,b8,c7,d6,f4,g3,h2,c6,d7,f7,g6,g4,f3,d3,c4:
+    | fen:8/8/8/4H3/8/8/8/8 c5,e7,g5,e3,b5,e8,h5,e2,d4,d6,f6,f4:
   figcaption.
   figcaption.
-    Moves of the black bishop on the left, and of the black queen on the right.
+    Moves of the Woody rook on the left, and of the Half-duck on the right.
 
 
-p Pawns can be promoted into any piece (including those of the other team).
+h3 Fide army
 
 
-p.
-  When castling large, the black king arrives on b8 and the a8 rook moves
-  to c8, to remain on the same color.
+p The standard chess pieces.
 
 h3 Source
 
 p
 
 h3 Source
 
 p
-  a(href="https://www.chessvariants.com/d.betza/chessvar/dan/colclob.html")
-    | The colorbound clobberers
+  a(href="https://www.chessvariants.com/unequal.dir/cwda.html")
+    | Chess with different armies
   | &nbsp;on chessvariants.com.
 
 p Inventor: Ralph Betza (1996)
   | &nbsp;on chessvariants.com.
 
 p Inventor: Ralph Betza (1996)
index bb3cf20..a5b5ac8 100644 (file)
 p.boxed
 p.boxed
-  | Las piezas negras son reemplazadas por un nuevo equipo, que incluye
-  | la mayoría de las piezas se estiraron para evolucionar en un solo color.
+  | Las piezas blancas y negras son reemplazadas por diferentes ejércitos.
 
 p.
 
 p.
-  Los peones negros y el rey mantienen sus movimientos habituales, pero este
-  no es el caso para las otras piezas:
+  Los peones y los reyes se mueven como de costumbre, pero normalmente no
+  las otras piezas. De hecho, antes del inicio del juego debes
+  seleccionar dos ejércitos, definiendo nuevos movimientos para los
+  "torres", "caballos", "alfiles" y "damas".
+
+p Los movimientos de las piezas se describen utilizando estas piezas básicas:
 ul
 ul
-  li Torre = alfil + dabbabah (D),
-  li Caballo = wazir + alfil = "phoenix" (H),
-  li Alfil = ferz + elefante + dabbabah (A),
-  li Dama = alfil + caballo = "princesa" (S).
+  li Dabbabah = saltar dos casillas ortogonalmente
+  li Alfil_A = saltar dos casillas en diagonal
+  li Wazir = una casilla ortogonalmente
+  li Ferz = una casilla diagonal
+  li Three leaper (L3) = saltar tres casillas ortogonalmente
+  li Narrow knight = Caballo sin "movimientos laterales 2+1"
+
+p.
+  Los peones pueden promocionarse en una pieza de cualquier
+  cuál de los ejércitos presentes.
+
+h3 Los Batidores Unicolor
+
+figure.showPieces.text-center
+  img(src="/images/pieces/Cwda/bd.svg")
+  img(src="/images/pieces/Cwda/ww.svg")
+  img(src="/images/pieces/Cwda/bf.svg")
+  img(src="/images/pieces/Cwda/wc.svg")
+
+ul
+  li Torre = alfil_A + dabbabah = "bede" (D),
+  li Caballo = wazir + alfil = "gofre" (W),
+  li Alfil = ferz + alfil_A + dabbabah = "fad" (F),
+  li Dama = alfil + caballo = "cardenal" (C).
+
+figure.diagram-container
+  .diagram.diag12
+    | fen:8/8/8/3D4/8/8/8/8 a8,b7,c6,e4,f3,g2,h1,c4,b3,a2,e6,f7,g8,f5,d3,b5,d7:
+  .diagram.diag22
+    | fen:8/8/8/4w3/8/8/8/8 e6,f5,e4,d5,c7,g7,g3,c3:
+  figcaption Jugadas del Bede a la izquierda y del Gofre a la derecha.
+
 p.
 p.
-  El Ferz y el Wazir viajan respectivamente como un alfil y una torre,
-  pero de una casilla solamente. El Elefante y el Dabbabah se mueven
-  respectivamente de dos casillas como un alfil y una torre,
-  posiblemente saltando sobre una pieza.
+  Después del gran enroque, el rey y la torre llegan respectivamente en b1/b8
+  y c1/c8 para que la torre permanezca al mismo color.
+
+h3 Los Caballeros Locos
+
+figure.showPieces.text-center
+  img(src="/images/pieces/Cwda/bg.svg")
+  img(src="/images/pieces/Cwda/wi.svg")
+  img(src="/images/pieces/Cwda/bt.svg")
+  img(src="/images/pieces/Cwda/wl.svg")
+
+ul
+  li.
+    Torre = torre hacia adelante y hacia los lados + rey atrás =
+    "torre de carga" (G),
+  li Caballo = narrow knight + ferz = "fibnif" (I),
+  li.
+    Alfil = caballo hacia adelante + rey lateralmente y hacia atrás =
+    "caballo de carga" (T),
+  li.
+    Dama = torre hacia adelante y hacia los lados + caballo hacia adelante
+    + rey = "coronel" (L).
 
 figure.diagram-container
   .diagram.diag12
 
 figure.diagram-container
   .diagram.diag12
-    | fen:8/8/8/3d4/8/8/8/8 a8,b7,c6,e4,f3,g2,h1,c4,b3,a2,e6,f7,g8,f5,d3,b5,d7:
+    | fen:8/8/8/3i4/8/8/8/8 c7,c3,e7,e3,c4,c6,e6,e4:
   .diagram.diag22
   .diagram.diag22
-    | fen:8/8/8/4h3/8/8/8/8 e6,f5,e4,d5,c7,g7,g3,c3:
+    | fen:8/8/8/4T3/8/8/8/8 c6,d7,f7,g6,d5,f5,d4,e4,f4:
   figcaption.
   figcaption.
-    Jugadas de la torre negra a la izquierda y del caballo negro a la derecha.
+    Jugadas del Fibnif a la izquierda, y del Caballo de carga a la derecha.
+
+h3 Las Reclutas Notables
+
+figure.showPieces.text-center
+  img(src="/images/pieces/Cwda/bs.svg")
+  img(src="/images/pieces/Cwda/wy.svg")
+  img(src="/images/pieces/Cwda/bh.svg")
+  img(src="/images/pieces/Cwda/wo.svg")
+
+ul
+  li Torre = torre limitada a 4 casillas = "torre corta" (S),
+  li Caballo = dabbabah + wazir = "torre arbolada" (Y),
+  li Alfil = dabbabah + ferz + L3 = "medio-pato" (H),
+  li Dama = torre + caballo = "canciller" (O).
 
 figure.diagram-container
   .diagram.diag12
 
 figure.diagram-container
   .diagram.diag12
-    | fen:8/8/8/3a4/8/8/8/8 c6,b7,e6,f7,e4,f3,c4,b3,d7,f5,d3,b5:
+    | fen:8/8/8/3y4/8/8/8/8 d3,b5,d7,f5,c5,d6,e5,d4:
   .diagram.diag22
   .diagram.diag22
-    | fen:8/8/8/4s3/8/8/8/8 a1,b2,c3,d4,f6,g7,h8,b8,c7,d6,f4,g3,h2,c6,d7,f7,g6,g4,f3,d3,c4:
+    | fen:8/8/8/4H3/8/8/8/8 c5,e7,g5,e3,b5,e8,h5,e2,d4,d6,f6,f4:
   figcaption.
   figcaption.
-    Jugadas del alfil negro a la izquierda, y de la dama negra a la derecha.
+    Jugadas de la Torre arbolada a la izquierda y del Medio-pato a la derecha.
 
 
-p.
-  Los peones pueden ser promovidos a cualquier piezas (incluidos las del
-  otro equipo)
+h3 Ejército Fide
 
 
-p.
-  Después del gran enroque, el rey negro llega en b8 y la torre a8 entra en c8,
-  para permanecer en el mismo color.
+p Piezas de ajedrez estándar.
 
 h3 Fuente
 
 p
 
 h3 Fuente
 
 p
-  a(href="https://www.chessvariants.com/d.betza/chessvar/dan/colclob.html")
-    | Los "batidores unicolor"
+  a(href="https://www.chessvariants.com/unequal.dir/cwda.html")
+    | Ajedrez con diferentes ejércitos.
   | &nbsp;en chessvariants.com.
 
 p Inventor: Ralph Betza (1996)
   | &nbsp;en chessvariants.com.
 
 p Inventor: Ralph Betza (1996)
index 4d5a82b..53e51d8 100644 (file)
 p.boxed
 p.boxed
-  | Les pièces noires sont remplacées par une nouvelle Ã©quipe, dont
-  | la plupart des pièces tendent Ã  Ã©voluer sur une seule couleur.
+  | Les pièces noires et blanches sont remplacées par des armées différentes.
 
 p.
 
 p.
-  Les pions et le roi noirs conservent leur déplacements habituels, mais ce
-  n'est pas le cas des autres pièces :
+  Les pions et rois se déplacent comme d'habitude, mais en général pas
+  les autres pièces. En effet, avant le début de la partie vous devez
+  sélectionner deux armées, définissant de nouveaux déplacements pour les
+  "tours", "cavaliers", "fous" et "dames".
+
+p Les mouvements des pièces sont décrits en utilisant ces pièces Ã©lmentaires :
 ul
 ul
-  li Tour = fou + dabbabah (D),
-  li Cavalier = wazir + alfil = "phoenix" (H),
-  li Fou = ferz + alfil + dabbabah (A),
-  li Dame = fou + cavalier = "princesse" (S).
+  li Dabbabah = saute deux cases orthogonalement
+  li Alfil = saute deux cases en diagonale
+  li Wazir = une case orthogonalement
+  li Ferz = une case en diagonale
+  li Three leaper (L3) = saute trois cases orthogonalement
+  li Narrow knight = cavalier sans "coups latéraux 2+1"
+
+p.
+  Les pions peuvent se promouvoir en une pièce de n'importe
+  laquelle des armées présentes.
+
+h3 Les Tabasseurs Unicolores
+
+figure.showPieces.text-center
+  img(src="/images/pieces/Cwda/bd.svg")
+  img(src="/images/pieces/Cwda/ww.svg")
+  img(src="/images/pieces/Cwda/bf.svg")
+  img(src="/images/pieces/Cwda/wc.svg")
+
+ul
+  li Tour = fou + dabbabah = "bede" (D),
+  li Cavalier = wazir + alfil = "gaufre" (W),
+  li Fou = ferz + alfil + dabbabah = "fad" (F),
+  li Dame = fou + cavalier = "cardinal" (C).
+
+figure.diagram-container
+  .diagram.diag12
+    | fen:8/8/8/3D4/8/8/8/8 a8,b7,c6,e4,f3,g2,h1,c4,b3,a2,e6,f7,g8,f5,d3,b5,d7:
+  .diagram.diag22
+    | fen:8/8/8/4w3/8/8/8/8 e6,f5,e4,d5,c7,g7,g3,c3:
+  figcaption Coups du Bede Ã  gauche, et de la Gaufre Ã  droite.
+
 p.
 p.
-  Le Ferz et le Wazir se déplacent respectivement comme un fou et une tour
-  mais d'une seule case. L'Alfil et le Dabbabah se déplacent respectivement
-  de deux cases comme un fou et une tour,
-  en sautant Ã©ventuellement par dessus une pièce.
+  Après le grand roque, roi et tour arrivent respectivement en b1/b8 et c1/c8
+  afin que la tour reste sur la même couleur.
+
+h3 Les Chevaliers Fous
+
+figure.showPieces.text-center
+  img(src="/images/pieces/Cwda/bg.svg")
+  img(src="/images/pieces/Cwda/wi.svg")
+  img(src="/images/pieces/Cwda/bt.svg")
+  img(src="/images/pieces/Cwda/wl.svg")
+
+ul
+  li.
+    Tour = tour vers l'avant et latéralement + roi vers l'arrière =
+    "tour chargeante" (G),
+  li Cavalier = narrow knight + ferz = "fibnif" (I),
+  li.
+    Fou = cavalier vers l'avant + roi latéralement et vers l'arrière =
+    "cavalier chargeant" (T),
+  li.
+    Dame = tour vers l'avant et latéralement + cavalier vers l'avant + roi =
+    "colonel" (L).
 
 figure.diagram-container
   .diagram.diag12
 
 figure.diagram-container
   .diagram.diag12
-    | fen:8/8/8/3d4/8/8/8/8 a8,b7,c6,e4,f3,g2,h1,c4,b3,a2,e6,f7,g8,f5,d3,b5,d7:
+    | fen:8/8/8/3i4/8/8/8/8 c7,c3,e7,e3,c4,c6,e6,e4:
   .diagram.diag22
   .diagram.diag22
-    | fen:8/8/8/4h3/8/8/8/8 e6,f5,e4,d5,c7,g7,g3,c3:
-  figcaption.
-    Coups de la tour noire Ã  gauche, et du cavalier noir Ã  droite.
+    | fen:8/8/8/4T3/8/8/8/8 c6,d7,f7,g6,d5,f5,d4,e4,f4:
+  figcaption Coups du Fibnif Ã  gauche, et du Cavalier chargeant Ã  droite.
+
+h3 Les Recrues Remarquables
+
+figure.showPieces.text-center
+  img(src="/images/pieces/Cwda/bs.svg")
+  img(src="/images/pieces/Cwda/wy.svg")
+  img(src="/images/pieces/Cwda/bh.svg")
+  img(src="/images/pieces/Cwda/wo.svg")
+
+ul
+  li Tour = tour limitée Ã  4 cases = "tour courte" (S),
+  li Cavalier = dabbabah + wazir = "tour boisée" (Y),
+  li Fou = dabbabah + ferz + L3 = "demi-canard" (H),
+  li Dame = tour + cavalier = "chancelier" (O).
 
 figure.diagram-container
   .diagram.diag12
 
 figure.diagram-container
   .diagram.diag12
-    | fen:8/8/8/3a4/8/8/8/8 c6,b7,e6,f7,e4,f3,c4,b3,d7,f5,d3,b5:
+    | fen:8/8/8/3y4/8/8/8/8 d3,b5,d7,f5,c5,d6,e5,d4:
   .diagram.diag22
   .diagram.diag22
-    | fen:8/8/8/4s3/8/8/8/8 a1,b2,c3,d4,f6,g7,h8,b8,c7,d6,f4,g3,h2,c6,d7,f7,g6,g4,f3,d3,c4:
-  figcaption.
-    Coups du fou noir Ã  gauche, et de la dame noire Ã  droite.
+    | fen:8/8/8/4H3/8/8/8/8 c5,e7,g5,e3,b5,e8,h5,e2,d4,d6,f6,f4:
+  figcaption Coups de la Tour boisée Ã  gauche, et du Demi-canard Ã  droite.
 
 
-p.
-  Les pions peuvent Ãªtre promus en n'importe quelle pièce (incluant celles
-  de l'autre Ã©quipe).
+h3 Armée Fide
 
 
-p.
-  Après le grand roque, le roi noir arrive en b8 et la tour a8 vient en c8,
-  afin de rester sur la même couleur.
+p Les pièces d'échecs standard.
 
 h3 Source
 
 p
 
 h3 Source
 
 p
-  a(href="https://www.chessvariants.com/d.betza/chessvar/dan/colclob.html")
-    | Les "tabasseurs unicolores"
-    | &nbsp;sur chessvariants.com.
+  a(href="https://www.chessvariants.com/unequal.dir/cwda.html")
+    | Ã‰checs avec armées différentes
+  | &nbsp;sur chessvariants.com.
 
 p Inventeur : Ralph Betza (1996)
 
 p Inventeur : Ralph Betza (1996)
index 33c8351..293238d 100644 (file)
@@ -116,7 +116,7 @@ export class AbsorptionRules extends ChessRules {
     return (
       this.isAttackedBySlideNJump(sq, color, V.BN, V.steps[V.BISHOP]) ||
       this.isAttackedBySlideNJump(
     return (
       this.isAttackedBySlideNJump(sq, color, V.BN, V.steps[V.BISHOP]) ||
       this.isAttackedBySlideNJump(
-        sq, color, V.BN, V.steps[V.KNIGHT], "oneStep")
+        sq, color, V.BN, V.steps[V.KNIGHT], 1)
     );
   }
 
     );
   }
 
@@ -124,7 +124,7 @@ export class AbsorptionRules extends ChessRules {
     return (
       this.isAttackedBySlideNJump(sq, color, V.RN, V.steps[V.ROOK]) ||
       this.isAttackedBySlideNJump(
     return (
       this.isAttackedBySlideNJump(sq, color, V.RN, V.steps[V.ROOK]) ||
       this.isAttackedBySlideNJump(
-        sq, color, V.RN, V.steps[V.KNIGHT], "oneStep")
+        sq, color, V.RN, V.steps[V.KNIGHT], 1)
     );
   }
 
     );
   }
 
@@ -133,7 +133,7 @@ export class AbsorptionRules extends ChessRules {
       this.isAttackedBySlideNJump(
         sq, color, V.QN, V.steps[V.BISHOP].concat(V.steps[V.ROOK])) ||
       this.isAttackedBySlideNJump(
       this.isAttackedBySlideNJump(
         sq, color, V.QN, V.steps[V.BISHOP].concat(V.steps[V.ROOK])) ||
       this.isAttackedBySlideNJump(
-        sq, color, V.QN, V.steps[V.KNIGHT], "oneStep")
+        sq, color, V.QN, V.steps[V.KNIGHT], 1)
     );
   }
 
     );
   }
 
index 3037954..2d2a790 100644 (file)
@@ -34,16 +34,14 @@ export class AlapoRules extends ChessRules {
   }
 
   getPotentialMinirookMoves(sq) {
   }
 
   getPotentialMinirookMoves(sq) {
-    return super.getSlideNJumpMoves(sq, V.steps[V.ROOK], "oneStep");
+    return super.getSlideNJumpMoves(sq, V.steps[V.ROOK], 1);
   }
   getPotentialMinibishopMoves(sq) {
   }
   getPotentialMinibishopMoves(sq) {
-    return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], "oneStep");
+    return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1);
   }
   getPotentialMiniqueenMoves(sq) {
   }
   getPotentialMiniqueenMoves(sq) {
-    return (
-      super.getSlideNJumpMoves(
-        sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), "oneStep")
-    );
+    return super.getSlideNJumpMoves(
+      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   getPotentialMovesFrom(sq) {
   }
 
   getPotentialMovesFrom(sq) {
@@ -68,8 +66,8 @@ export class AlapoRules extends ChessRules {
     return "Alapo/" + b + suffix;
   }
 
     return "Alapo/" + b + suffix;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "rbqqbr/tcssct/6/6/TCSSCT/RBQQBR w 0";
 
     const piece2pawn = {
       return "rbqqbr/tcssct/6/6/TCSSCT/RBQQBR w 0";
 
     const piece2pawn = {
@@ -81,7 +79,7 @@ export class AlapoRules extends ChessRules {
     let pieces = { w: new Array(6), b: new Array(6) };
     // Shuffle pieces on first (and last rank if randomness == 2)
     for (let c of ["w", "b"]) {
     let pieces = { w: new Array(6), b: new Array(6) };
     // Shuffle pieces on first (and last rank if randomness == 2)
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
         pieces['b'] = pieces['w'];
         break;
       }
index fb43871..47f0092 100644 (file)
@@ -2,8 +2,21 @@ import { ChessRules, Move, PiPo } from "@/base_rules";
 
 export class Align4Rules extends ChessRules {
 
 
 export class Align4Rules extends ChessRules {
 
-  static GenRandInitFen(randomness) {
-    const baseFen = ChessRules.GenRandInitFen(Math.min(randomness, 1));
+  static get Options() {
+    return {
+      check: [
+        {
+          label: "Random",
+          defaut: false,
+          variable: "random"
+        }
+      ]
+    };
+  }
+
+  static GenRandInitFen(options) {
+    const baseFen = ChessRules.GenRandInitFen(
+      { randomness: (options.random ? 1 : 0) });
     return "4k3/8" + baseFen.substring(17, 50) + " -";
   }
 
     return "4k3/8" + baseFen.substring(17, 50) + " -";
   }
 
@@ -80,10 +93,7 @@ export class Align4Rules extends ChessRules {
     if (this.getColor(x, y) == 'w') return super.getPotentialKingMoves([x, y]);
     // Black doesn't castle:
     return super.getSlideNJumpMoves(
     if (this.getColor(x, y) == 'w') return super.getPotentialKingMoves([x, y]);
     // Black doesn't castle:
     return super.getSlideNJumpMoves(
-      [x, y],
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   getAllValidMoves() {
   }
 
   getAllValidMoves() {
index 86409c2..9c43a46 100644 (file)
@@ -11,8 +11,8 @@ export class AllmateRules extends ChessRules {
     return [];
   }
 
     return [];
   }
 
-  static GenRandInitFen(randomness) {
-    return ChessRules.GenRandInitFen(randomness).slice(0, -2);
+  static GenRandInitFen(options) {
+    return ChessRules.GenRandInitFen(options).slice(0, -2);
   }
 
   getPotentialMovesFrom([x, y]) {
   }
 
   getPotentialMovesFrom([x, y]) {
@@ -69,10 +69,7 @@ export class AllmateRules extends ChessRules {
                 case V.KING:
                   // Do not allow castling to escape from check
                   oppMoves = super.getSlideNJumpMoves(
                 case V.KING:
                   // Do not allow castling to escape from check
                   oppMoves = super.getSlideNJumpMoves(
-                    [i, j],
-                    V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-                    "oneStep"
-                  );
+                    [i, j], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
                   break;
               }
               for (let om of oppMoves) {
                   break;
               }
               for (let om of oppMoves) {
index b478887..5e2b32a 100644 (file)
@@ -232,13 +232,13 @@ export class AmbiguousRules extends ChessRules {
       this.kingPos[this.turn] = [move.vanish[1].x, move.vanish[1].y];
   }
 
       this.kingPos[this.turn] = [move.vanish[1].x, move.vanish[1].y];
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 -";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     for (let c of ["w", "b"]) {
       return "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 -";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
         pieces['b'] = pieces['w'];
         break;
       }
index 92034a3..781984f 100644 (file)
@@ -5,6 +5,10 @@ import { randInt } from "@/utils/alea";
 
 export class Antiking1Rules extends BerolinaRules {
 
 
 export class Antiking1Rules extends BerolinaRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get PawnSpecs() {
     return Object.assign(
       {},
   static get PawnSpecs() {
     return Object.assign(
       {},
@@ -132,10 +136,7 @@ export class Antiking1Rules extends BerolinaRules {
   getPotentialAntikingMoves(sq) {
     // The antiking moves like a king (only captured colors differ)
     return this.getSlideNJumpMoves(
   getPotentialAntikingMoves(sq) {
     // The antiking moves like a king (only captured colors differ)
     return this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   isAttacked(sq, color) {
   }
 
   isAttacked(sq, color) {
@@ -149,24 +150,14 @@ export class Antiking1Rules extends BerolinaRules {
     // Antiking is not attacked by king:
     if (this.getPiece(x, y) == V.ANTIKING) return false;
     return this.isAttackedBySlideNJump(
     // Antiking is not attacked by king:
     if (this.getPiece(x, y) == V.ANTIKING) return false;
     return this.isAttackedBySlideNJump(
-      [x, y],
-      color,
-      V.KING,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      [x, y], color, V.KING, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   isAttackedByAntiking([x, y], color) {
     // (Anti)King is not attacked by antiking
     if ([V.KING, V.ANTIKING].includes(this.getPiece(x, y))) return false;
     return this.isAttackedBySlideNJump(
   }
 
   isAttackedByAntiking([x, y], color) {
     // (Anti)King is not attacked by antiking
     if ([V.KING, V.ANTIKING].includes(this.getPiece(x, y))) return false;
     return this.isAttackedBySlideNJump(
-      [x, y],
-      color,
-      V.ANTIKING,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      [x, y], color, V.ANTIKING, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   underCheck(color) {
   }
 
   underCheck(color) {
index df76458..fa0bbcc 100644 (file)
@@ -79,10 +79,7 @@ export class Antiking2Rules extends ChessRules {
   getPotentialAntikingMoves(sq) {
     // The antiking moves like a king (only captured colors differ)
     return this.getSlideNJumpMoves(
   getPotentialAntikingMoves(sq) {
     // The antiking moves like a king (only captured colors differ)
     return this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   isAttacked(sq, color) {
   }
 
   isAttacked(sq, color) {
@@ -102,12 +99,7 @@ export class Antiking2Rules extends ChessRules {
     // (Anti)King is not attacked by antiking
     if ([V.KING, V.ANTIKING].includes(this.getPiece(x, y))) return false;
     return this.isAttackedBySlideNJump(
     // (Anti)King is not attacked by antiking
     if ([V.KING, V.ANTIKING].includes(this.getPiece(x, y))) return false;
     return this.isAttackedBySlideNJump(
-      [x, y],
-      color,
-      V.ANTIKING,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      [x, y], color, V.ANTIKING, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   underCheck(color) {
   }
 
   underCheck(color) {
@@ -154,15 +146,15 @@ export class Antiking2Rules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "rnbqkbnr/pppppppp/3A4/8/8/3a4/PPPPPPPP/RNBQKBNR w 0 ahah -";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     let flags = "";
     let antikingPos = { w: -1, b: -1 };
     for (let c of ["w", "b"]) {
       return "rnbqkbnr/pppppppp/3A4/8/8/3a4/PPPPPPPP/RNBQKBNR w 0 ahah -";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     let flags = "";
     let antikingPos = { w: -1, b: -1 };
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         antikingPos['b'] = antikingPos['w'];
         flags += flags;
         pieces['b'] = pieces['w'];
         antikingPos['b'] = antikingPos['w'];
         flags += flags;
index e817296..fc30915 100644 (file)
@@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea";
 
 export class ApocalypseRules extends ChessRules {
 
 
 export class ApocalypseRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get PawnSpecs() {
     return Object.assign(
       {},
   static get PawnSpecs() {
     return Object.assign(
       {},
index 285dd4c..880f008 100644 (file)
@@ -2,6 +2,13 @@ import { ChessRules } from "@/base_rules";
 
 export class ArenaRules extends ChessRules {
 
 
 export class ArenaRules extends ChessRules {
 
+  static get Lines() {
+    return [
+      [[2, 0], [2, 8]],
+      [[6, 0], [6, 8]]
+    ];
+  }
+
   static get HasFlags() {
     return false;
   }
   static get HasFlags() {
     return false;
   }
@@ -45,8 +52,8 @@ export class ArenaRules extends ChessRules {
 
   scanKings() {}
 
 
   scanKings() {}
 
-  static GenRandInitFen(randomness) {
-    return ChessRules.GenRandInitFen(randomness).slice(0, -6) + "-";
+  static GenRandInitFen(options) {
+    return ChessRules.GenRandInitFen(options).slice(0, -6) + "-";
   }
 
   static InArena(x) {
   }
 
   static InArena(x) {
@@ -69,27 +76,13 @@ export class ArenaRules extends ChessRules {
   }
 
   getPotentialQueenMoves(sq) {
   }
 
   getPotentialQueenMoves(sq) {
-    return this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP])
-    ).filter(m => {
-      // Filter out moves longer than 3 squares
-      return Math.max(
-        Math.abs(m.end.x - m.start.x),
-        Math.abs(m.end.y - m.start.y)) <= 3;
-    });
+    return super.getSlideNJumpMoves(
+      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 3);
   }
 
   getPotentialKingMoves(sq) {
   }
 
   getPotentialKingMoves(sq) {
-    return this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP])
-    ).filter(m => {
-      // Filter out moves longer than 3 squares
-      return Math.max(
-        Math.abs(m.end.x - m.start.x),
-        Math.abs(m.end.y - m.start.y)) <= 3;
-    });
+    return super.getSlideNJumpMoves(
+      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 3);
   }
 
   getCheckSquares() {
   }
 
   getCheckSquares() {
index f2c84a8..07e9e67 100644 (file)
@@ -4,6 +4,10 @@ import { ArrayFun } from "@/utils/array";
 
 export class AtarigoRules extends ChessRules {
 
 
 export class AtarigoRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get Monochrome() {
     return true;
   }
   static get Monochrome() {
     return true;
   }
index 6c39e94..c05b4d9 100644 (file)
@@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea";
 
 export class Avalam2Rules extends ChessRules {
 
 
 export class Avalam2Rules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
   static get HasFlags() {
     return false;
   }
index 17e2138..40a4393 100644 (file)
@@ -340,6 +340,7 @@ export class AvalancheRules extends ChessRules {
       this.play(moves[3]); //HACK... 3 = queen index
       const res = this.getComputerMove();
       this.undo(moves[3]);
       this.play(moves[3]); //HACK... 3 = queen index
       const res = this.getComputerMove();
       this.undo(moves[3]);
+      if (Array.isArray(res)) return [moves[3]].concat(res);
       return [moves[3], res];
     }
     // subTurn == 1 (necessarily)
       return [moves[3], res];
     }
     // subTurn == 1 (necessarily)
index 835aa96..6a38a51 100644 (file)
@@ -46,11 +46,10 @@ export class BalaklavaRules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     // No collision between 'n' and castle flags, so next replacement is fine
     return (
     // No collision between 'n' and castle flags, so next replacement is fine
     return (
-      ChessRules.GenRandInitFen(randomness)
-        .replace(/n/g, 'm').replace(/N/g, 'M')
+      ChessRules.GenRandInitFen(options).replace(/n/g, 'm').replace(/N/g, 'M')
     );
   }
 
     );
   }
 
@@ -90,7 +89,7 @@ export class BalaklavaRules extends ChessRules {
   }
 
   getPotentialMammothMoves(sq) {
   }
 
   getPotentialMammothMoves(sq) {
-    return this.getSlideNJumpMoves(sq, V.steps[V.MAMMOTH], "oneStep");
+    return this.getSlideNJumpMoves(sq, V.steps[V.MAMMOTH], 1);
   }
 
   isAttacked(sq, color) {
   }
 
   isAttacked(sq, color) {
@@ -101,10 +100,8 @@ export class BalaklavaRules extends ChessRules {
   }
 
   isAttackedByMammoth(sq, color) {
   }
 
   isAttackedByMammoth(sq, color) {
-    return (
-      this.isAttackedBySlideNJump(
-        sq, color, V.MAMMOTH, V.steps[V.MAMMOTH], "oneStep")
-    );
+    return this.isAttackedBySlideNJump(
+      sq, color, V.MAMMOTH, V.steps[V.MAMMOTH], 1);
   }
 
   static get SEARCH_DEPTH() {
   }
 
   static get SEARCH_DEPTH() {
index 8f6493a..4768975 100644 (file)
@@ -186,13 +186,13 @@ export class BallRules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "hbnrqrnhb/ppppppppp/9/9/4a4/9/9/PPPPPPPPP/HBNRQRNHB w 0 - -";
 
     let pieces = { w: new Array(9), b: new Array(9) };
     for (let c of ["w", "b"]) {
       return "hbnrqrnhb/ppppppppp/9/9/4a4/9/9/PPPPPPPPP/HBNRQRNHB w 0 - -";
 
     let pieces = { w: new Array(9), b: new Array(9) };
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
         pieces['b'] = pieces['w'];
         break;
       }
@@ -411,28 +411,13 @@ export class BallRules extends ChessRules {
     return moves;
   }
 
     return moves;
   }
 
-  // "Sliders": at most 3 steps
-  getSlideNJumpMoves([x, y], steps, oneStep) {
-    let moves = [];
-    outerLoop: for (let step of steps) {
-      let i = x + step[0];
-      let j = y + step[1];
-      let stepCount = 1;
-      while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
-        moves.push(this.getBasicMove([x, y], [i, j]));
-        if (oneStep || stepCount == 3) continue outerLoop;
-        i += step[0];
-        j += step[1];
-        stepCount++;
-      }
-      if (V.OnBoard(i, j) && this.canTake([x, y], [i, j]))
-        moves.push(this.getBasicMove([x, y], [i, j]));
-    }
-    return moves;
+  getSlideNJumpMoves(sq, steps, nbSteps) {
+    // "Sliders": at most 3 steps
+    return super.getSlideNJumpMoves(sq, steps, !nbSteps ? 3 : 1);
   }
 
   getPotentialPhoenixMoves(sq) {
   }
 
   getPotentialPhoenixMoves(sq) {
-    return this.getSlideNJumpMoves(sq, V.steps[V.PHOENIX], "oneStep");
+    return super.getSlideNJumpMoves(sq, V.steps[V.PHOENIX], 1);
   }
 
   getPmove(move) {
   }
 
   getPmove(move) {
index 3564e74..3e07665 100644 (file)
@@ -4,6 +4,10 @@ import { randInt } from "@/utils/alea";
 
 export class BarioRules extends ChessRules {
 
 
 export class BarioRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   // Does not really seem necessary (although the author mention it)
   // Instead, first move = pick a square for the king.
   static get HasFlags() {
   // Does not really seem necessary (although the author mention it)
   // Instead, first move = pick a square for the king.
   static get HasFlags() {
index 063b182..7abb77d 100644 (file)
@@ -107,23 +107,11 @@ export class BaroqueRules extends ChessRules {
     }
   }
 
     }
   }
 
-  getSlideNJumpMoves([x, y], steps, oneStep) {
-    const piece = this.getPiece(x, y);
-    let moves = [];
-    outerLoop: for (let step of steps) {
-      let i = x + step[0];
-      let j = y + step[1];
-      while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
-        moves.push(this.getBasicMove([x, y], [i, j]));
-        if (oneStep !== undefined) continue outerLoop;
-        i += step[0];
-        j += step[1];
-      }
-      // Only king can take on occupied square:
-      if (piece == V.KING && V.OnBoard(i, j) && this.canTake([x, y], [i, j]))
-        moves.push(this.getBasicMove([x, y], [i, j]));
-    }
-    return moves;
+  canTake([x1, y1], [x2, y2]) {
+    return (
+      this.getPiece(x1, y1) == V.KING &&
+      this.getColor(x1, y1) != this.getColor(x2, y2)
+    );
   }
 
   // Modify capturing moves among listed pawn moves
   }
 
   // Modify capturing moves among listed pawn moves
@@ -531,15 +519,15 @@ export class BaroqueRules extends ChessRules {
     return false;
   }
 
     return false;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       // Deterministic:
       return "rnbkqbnm/pppppppp/8/8/8/8/PPPPPPPP/MNBQKBNR w 0";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     // Shuffle pieces on first and last rank
     for (let c of ["w", "b"]) {
       // Deterministic:
       return "rnbkqbnm/pppppppp/8/8/8/8/PPPPPPPP/MNBQKBNR w 0";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     // Shuffle pieces on first and last rank
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
         pieces['b'] = pieces['w'];
         break;
       }
index 40d7a09..5584fb8 100644 (file)
@@ -14,22 +14,8 @@ export class BenedictRules extends ChessRules {
     );
   }
 
     );
   }
 
-  // TODO(?): some duplicated code in 2 next functions
-  getSlideNJumpMoves([x, y], steps, oneStep) {
-    let moves = [];
-    outerLoop: for (let loop = 0; loop < steps.length; loop++) {
-      const step = steps[loop];
-      let i = x + step[0];
-      let j = y + step[1];
-      while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
-        moves.push(this.getBasicMove([x, y], [i, j]));
-        if (oneStep) continue outerLoop;
-        i += step[0];
-        j += step[1];
-      }
-      // No capture check: handled elsewhere (next method)
-    }
-    return moves;
+  canTake() {
+    return false;
   }
 
   // Find possible captures from a square
   }
 
   // Find possible captures from a square
index 795f4ba..c426b81 100644 (file)
@@ -14,8 +14,8 @@ export class BicolourRules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "rqbnkbnr/pppppppp/8/8/8/8/PPPPPPPP/RQBNKBNR w 0 -";
 
     // Place pieces at random but the king cannot be next to a rook or queen.
       return "rqbnkbnr/pppppppp/8/8/8/8/PPPPPPPP/RQBNKBNR w 0 -";
 
     // Place pieces at random but the king cannot be next to a rook or queen.
@@ -23,7 +23,7 @@ export class BicolourRules extends ChessRules {
     let pieces = { w: new Array(8), b: new Array(8) };
     let flags = "";
     for (let c of ["w", "b"]) {
     let pieces = { w: new Array(8), b: new Array(8) };
     let flags = "";
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
         pieces['b'] = pieces['w'];
         break;
       }
index feecd45..57a6051 100644 (file)
@@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules";
 
 export class BishopawnsRules extends ChessRules {
 
 
 export class BishopawnsRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get PawnSpecs() {
     return Object.assign(
       {},
   static get PawnSpecs() {
     return Object.assign(
       {},
index ec1e299..a58263c 100644 (file)
@@ -51,13 +51,13 @@ export class CapablancaRules extends ChessRules {
 
   getPotentialEmpressMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat(
 
   getPotentialEmpressMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")
+      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)
     );
   }
 
   getPotentialPrincessMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat(
     );
   }
 
   getPotentialPrincessMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")
+      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)
     );
   }
 
     );
   }
 
@@ -72,26 +72,14 @@ export class CapablancaRules extends ChessRules {
   isAttackedByEmpress(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.EMPRESS, V.steps[V.ROOK]) ||
   isAttackedByEmpress(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.EMPRESS, V.steps[V.ROOK]) ||
-      this.isAttackedBySlideNJump(
-        sq,
-        color,
-        V.EMPRESS,
-        V.steps[V.KNIGHT],
-        "oneStep"
-      )
+      this.isAttackedBySlideNJump(sq, color, V.EMPRESS, V.steps[V.KNIGHT], 1)
     );
   }
 
   isAttackedByPrincess(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.PRINCESS, V.steps[V.BISHOP]) ||
     );
   }
 
   isAttackedByPrincess(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.PRINCESS, V.steps[V.BISHOP]) ||
-      this.isAttackedBySlideNJump(
-        sq,
-        color,
-        V.PRINCESS,
-        V.steps[V.KNIGHT],
-        "oneStep"
-      )
+      this.isAttackedBySlideNJump(sq, color, V.PRINCESS, V.steps[V.KNIGHT], 1)
     );
   }
 
     );
   }
 
@@ -106,8 +94,8 @@ export class CapablancaRules extends ChessRules {
     return 2;
   }
 
     return 2;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0) {
+  static GenRandInitFen(options) {
+    if (options.randomness == 0) {
       return (
         "rnsbqkbenr/pppppppppp/91/91/91/91/PPPPPPPPPP/RNSBQKBENR w 0 ajaj -"
       );
       return (
         "rnsbqkbenr/pppppppppp/91/91/91/91/PPPPPPPPPP/RNSBQKBENR w 0 ajaj -"
       );
@@ -116,7 +104,7 @@ export class CapablancaRules extends ChessRules {
     let pieces = { w: new Array(10), b: new Array(10) };
     let flags = "";
     for (let c of ["w", "b"]) {
     let pieces = { w: new Array(10), b: new Array(10) };
     let flags = "";
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         flags += flags;
         break;
         pieces['b'] = pieces['w'];
         flags += flags;
         break;
index ad584e3..0042bf1 100644 (file)
@@ -1149,9 +1149,9 @@ export class ChakartRules extends ChessRules {
     return "*";
   }
 
     return "*";
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     return (
     return (
-      SuicideRules.GenRandInitFen(randomness).slice(0, -1) +
+      SuicideRules.GenRandInitFen(options).slice(0, -1) +
       // Add Peach + Mario flags + capture counts
       "1111 000000000000"
     );
       // Add Peach + Mario flags + capture counts
       "1111 000000000000"
     );
index 5036a82..aac3e02 100644 (file)
@@ -2,6 +2,26 @@ import { ChessRules, Move, PiPo } from "@/base_rules";
 
 export class CheckeredRules extends ChessRules {
 
 
 export class CheckeredRules extends ChessRules {
 
+  static get Options() {
+    return Object.assign(
+      {},
+      ChessRules.Options,
+      {
+        check: [
+          {
+            label: "With switch",
+            defaut: true,
+            variable: "switch"
+          }
+        ]
+      }
+    );
+  }
+
+  static AbbreviateOptions(opts) {
+    return (!opts["switch"] ? "NS" : "");
+  }
+
   static board2fen(b) {
     const checkered_codes = {
       p: "s",
   static board2fen(b) {
     const checkered_codes = {
       p: "s",
@@ -41,26 +61,6 @@ export class CheckeredRules extends ChessRules {
     return (b[0] == "c" ? "Checkered/" : "") + b;
   }
 
     return (b[0] == "c" ? "Checkered/" : "") + b;
   }
 
-  static get Options() {
-    return Object.assign(
-      {},
-      ChessRules.Options,
-      {
-        check: [
-          {
-            label: "With switch",
-            defaut: true,
-            variable: "switch"
-          }
-        ]
-      }
-    );
-  }
-
-  static AbbreviateOptions(opts) {
-    return (!opts["switch"] ? "NS" : "");
-  }
-
   setOtherVariables(fen) {
     super.setOtherVariables(fen);
     // Local stack of non-capturing checkered moves:
   setOtherVariables(fen) {
     super.setOtherVariables(fen);
     // Local stack of non-capturing checkered moves:
@@ -433,12 +433,7 @@ export class CheckeredRules extends ChessRules {
 
   isAttackedByKnight(sq, colors) {
     return this.isAttackedBySlideNJump(
 
   isAttackedByKnight(sq, colors) {
     return this.isAttackedBySlideNJump(
-      sq,
-      colors,
-      V.KNIGHT,
-      V.steps[V.KNIGHT],
-      "oneStep"
-    );
+      sq, colors, V.KNIGHT, V.steps[V.KNIGHT], "oneStep");
   }
 
   isAttackedByBishop(sq, colors) {
   }
 
   isAttackedByBishop(sq, colors) {
@@ -448,20 +443,13 @@ export class CheckeredRules extends ChessRules {
 
   isAttackedByQueen(sq, colors) {
     return this.isAttackedBySlideNJump(
 
   isAttackedByQueen(sq, colors) {
     return this.isAttackedBySlideNJump(
-      sq,
-      colors,
-      V.QUEEN,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP])
-    );
+      sq, colors, V.QUEEN, V.steps[V.ROOK].concat(V.steps[V.BISHOP]));
   }
 
   isAttackedByKing(sq, colors) {
     return this.isAttackedBySlideNJump(
   }
 
   isAttackedByKing(sq, colors) {
     return this.isAttackedBySlideNJump(
-      sq,
-      colors,
-      V.KING,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
+      sq, colors, V.KING,
+      V.steps[V.ROOK].concat(V.steps[V.BISHOP]), "oneStep"
     );
   }
 
     );
   }
 
index 968ec1c..8d5cbaf 100644 (file)
@@ -15,8 +15,7 @@ export class Chess960Rules extends ChessRules {
             { label: "Asymmetric random", value: 2 }
           ]
         }
             { label: "Asymmetric random", value: 2 }
           ]
         }
-      ],
-      check: []
+      ]
     };
   }
 
     };
   }
 
index 4775844..333ad32 100644 (file)
@@ -35,8 +35,8 @@ export class CircularRules extends ChessRules {
     this.pawnFlags = flags;
   }
 
     this.pawnFlags = flags;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0) {
+  static GenRandInitFen(options) {
+    if (options.randomness == 0) {
       return "8/8/pppppppp/rnbqkbnr/8/8/PPPPPPPP/RNBQKBNR " +
         "w 0 1111111111111111";
     }
       return "8/8/pppppppp/rnbqkbnr/8/8/PPPPPPPP/RNBQKBNR " +
         "w 0 1111111111111111";
     }
@@ -44,7 +44,7 @@ export class CircularRules extends ChessRules {
     let pieces = { w: new Array(8), b: new Array(8) };
     // Shuffle pieces on first and last rank
     for (let c of ["w", "b"]) {
     let pieces = { w: new Array(8), b: new Array(8) };
     // Shuffle pieces on first and last rank
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
         pieces['b'] = pieces['w'];
         break;
       }
@@ -92,7 +92,7 @@ export class CircularRules extends ChessRules {
       let j = y + step[1];
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
         moves.push(this.getBasicMove([x, y], [i, j]));
       let j = y + step[1];
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
         moves.push(this.getBasicMove([x, y], [i, j]));
-        if (oneStep !== undefined) continue outerLoop;
+        if (oneStep) continue outerLoop;
         i = V.ComputeX(i + step[0]);
         j += step[1];
       }
         i = V.ComputeX(i + step[0]);
         j += step[1];
       }
index d4ec1ef..30256fa 100644 (file)
@@ -20,9 +20,9 @@ export class ClorangeRules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     // Capturing and non-capturing reserves:
     // Capturing and non-capturing reserves:
-    return ChessRules.GenRandInitFen(randomness) + " 00000000000000000000";
+    return ChessRules.GenRandInitFen(options) + " 00000000000000000000";
   }
 
   getFen() {
   }
 
   getFen() {
@@ -195,22 +195,11 @@ export class ClorangeRules extends ChessRules {
     return moves;
   }
 
     return moves;
   }
 
-  getSlideNJumpMoves([x, y], steps, oneStep) {
-    let moves = [];
-    const canTake = ChessRules.PIECES.includes(this.getPiece(x, y));
-    outerLoop: for (let step of steps) {
-      let i = x + step[0];
-      let j = y + step[1];
-      while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
-        moves.push(this.getBasicMove([x, y], [i, j]));
-        if (oneStep) continue outerLoop;
-        i += step[0];
-        j += step[1];
-      }
-      if (V.OnBoard(i, j) && canTake && this.canTake([x, y], [i, j]))
-        moves.push(this.getBasicMove([x, y], [i, j]));
-    }
-    return moves;
+  canTake([x1, y1], [x2, y2]) {
+    return (
+      this.getColor(x1, y1) !== this.getColor(x2, y2) &&
+      ChessRules.PIECES.includes(this.getPiece(x1, y1))
+    );
   }
 
   getAllValidMoves() {
   }
 
   getAllValidMoves() {
index 1180e37..c501c02 100644 (file)
@@ -13,10 +13,8 @@ export class ConvertRules extends ChessRules {
     this.lastMoveEnd = [null];
   }
 
     this.lastMoveEnd = [null];
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
-      return "rnbqkbnr/8/pppppppp/8/8/PPPPPPPP/8/RNBQKBNR w 0 ahah";
-    const baseFen = ChessRules.GenRandInitFen(randomness);
+  static GenRandInitFen(options) {
+    const baseFen = ChessRules.GenRandInitFen(options);
     return (
       baseFen.substr(0, 8) +
       "/8/pppppppp/8/8/PPPPPPPP/8/" +
     return (
       baseFen.substr(0, 8) +
       "/8/pppppppp/8/8/PPPPPPPP/8/" +
index 78299c6..c7d12a5 100644 (file)
@@ -8,7 +8,6 @@ export class CopycatRules extends ChessRules {
     const piece = this.getPiece(x,y);
     if ([V.PAWN, V.KING].includes(piece)) return moves;
     const color = this.turn;
     const piece = this.getPiece(x,y);
     if ([V.PAWN, V.KING].includes(piece)) return moves;
     const color = this.turn;
-    const oneStep = (piece == V.PAWN);
     let movements = {},
         steps = [];
     if (piece == V.QUEEN) steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
     let movements = {},
         steps = [];
     if (piece == V.QUEEN) steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
@@ -39,8 +38,9 @@ export class CopycatRules extends ChessRules {
         (piece != V.QUEEN && type != piece) ||
         (piece == V.QUEEN && type == V.KNIGHT)
       ) {
         (piece != V.QUEEN && type != piece) ||
         (piece == V.QUEEN && type == V.KNIGHT)
       ) {
+        const nbSteps = (type == V.KNIGHT ? 1 : undefined);
         Array.prototype.push.apply(moves,
         Array.prototype.push.apply(moves,
-          this.getSlideNJumpMoves([x, y], V.steps[type], type == V.KNIGHT));
+          super.getSlideNJumpMoves([x, y], V.steps[type], nbSteps));
       }
     });
     return moves;
       }
     });
     return moves;
index cf83f1f..aa023c1 100644 (file)
@@ -78,15 +78,15 @@ export class CoregalRules extends ChessRules {
     return squares;
   }
 
     return squares;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       // Castle flags here indicate pieces positions (if can castle)
       return "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 adehadeh -";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     let flags = "";
     for (let c of ["w", "b"]) {
       // Castle flags here indicate pieces positions (if can castle)
       return "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 adehadeh -";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     let flags = "";
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         flags += flags;
         break;
         pieces['b'] = pieces['w'];
         flags += flags;
         break;
@@ -186,10 +186,7 @@ export class CoregalRules extends ChessRules {
 
   getPotentialKingMoves([x, y]) {
     let moves = this.getSlideNJumpMoves(
 
   getPotentialKingMoves([x, y]) {
     let moves = this.getSlideNJumpMoves(
-      [x, y],
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
     const c = this.getColor(x, y);
     if (this.castleFlags[c].slice(1, 3).includes(y))
       moves = moves.concat(this.getCastleMoves([x, y]));
     const c = this.getColor(x, y);
     if (this.castleFlags[c].slice(1, 3).includes(y))
       moves = moves.concat(this.getCastleMoves([x, y]));
index 56e6541..eabdd49 100644 (file)
@@ -38,8 +38,8 @@ export class CrazyhouseRules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
-    return ChessRules.GenRandInitFen(randomness) + " 0000000000 -";
+  static GenRandInitFen(options) {
+    return ChessRules.GenRandInitFen(options) + " 0000000000 -";
   }
 
   getFen() {
   }
 
   getFen() {
@@ -237,11 +237,13 @@ export class CrazyhouseRules extends ChessRules {
     if (move.vanish.length > 0) return super.getNotation(move);
     // Rebirth:
     let piece = move.appear[0].p;
     if (move.vanish.length > 0) return super.getNotation(move);
     // Rebirth:
     let piece = move.appear[0].p;
-    if (ChessRules.PIECES.includes(piece)) {
-      if (move.appear[0].p != V.PAWN) piece = move.appear[0].p.toUpperCase();
+    let prefix = "";
+    const endNotation = "@" + V.CoordsToSquare(move.end);
+    if (piece != V.PAWN) {
+      if (ChessRules.PIECES.includes(piece)) prefix = piece.toUpperCase();
+      else piece = V.PromotionMap[piece].toUpperCase();
     }
     }
-    else piece = V.PromotionMap[piece].toUpperCase();
-    return piece + "@" + V.CoordsToSquare(move.end);
+    return prefix + endNotation;
   }
 
 };
   }
 
 };
index 6e30e68..c0d36ed 100644 (file)
-import { ChessRules, Move, PiPo } from "@/base_rules";
-import { ArrayFun } from "@/utils/array";
-import { randInt } from "@/utils/alea";
+import { ChessRules } from "@/base_rules";
 
 export class CwdaRules extends ChessRules {
 
 
 export class CwdaRules extends ChessRules {
 
-  static get PawnSpecs() {
-    return Object.assign(
-      {},
-      ChessRules.PawnSpecs,
-      {
-        promotions:
-          ChessRules.PawnSpecs.promotions.concat(
-          [V.C_ROOK, V.C_KNIGHT, V.C_BISHOP, V.C_QUEEN])
-      }
+  static get Options() {
+    return {
+      select: ChessRules.Options.select.concat([
+        {
+          label: "Army 1",
+          variable: "army1",
+          defaut: 'C',
+          options: [
+            { label: "Colorbound Clobberers", value: 'C' },
+            { label: "Nutty Knights", value: 'N' },
+            { label: "Remarkable Rookies", value: 'R' },
+            { label: "Fide", value: 'F' }
+          ]
+        },
+        {
+          label: "Army 2",
+          variable: "army2",
+          defaut: 'C',
+          options: [
+            { label: "Colorbound Clobberers", value: 'C' },
+            { label: "Nutty Knights", value: 'N' },
+            { label: "Remarkable Rookies", value: 'R' },
+            { label: "Fide", value: 'F' }
+          ]
+        }
+      ])
+    };
+  }
+
+  static AbbreviateOptions(opts) {
+    return opts["army1"] + opts["army2"];
+  }
+
+  static IsValidOptions(opts) {
+    // Both armies filled, avoid Fide vs Fide
+    return (
+      opts.army1 && opts.army2 &&
+      (opts.army1 != 'F' || opts.army2 != 'F')
     );
   }
 
   getPpath(b) {
     );
   }
 
   getPpath(b) {
-    if ([V.C_ROOK, V.C_KNIGHT, V.C_BISHOP, V.C_QUEEN].includes(b[1]))
-      return "Cwda/" + b;
-    return b;
-  }
-
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
-      return "dhaskahd/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 ahah -";
-
-    // Mapping white --> black (at least at start):
-    const piecesMap = {
-      'r': 'd',
-      'n': 'h',
-      'b': 'a',
-      'q': 's',
-      'k': 'k'
+    return (ChessRules.PIECES.includes(b[1]) ? "" : "Cwda/") + b;
+  }
+
+  static get PiecesMap() {
+    return {
+      // Colorbound Clobberers
+      'C': {
+        'r': 'd',
+        'n': 'w',
+        'b': 'f',
+        'q': 'c',
+        'k': 'k'
+      },
+      // Nutty Knights
+      'N': {
+        'r': 'g',
+        'n': 'i',
+        'b': 't',
+        'q': 'l',
+        'k': 'k'
+      },
+      // Remarkable Rookies
+      'R': {
+        'r': 's',
+        'n': 'y',
+        'b': 'h',
+        'q': 'o',
+        'k': 'k'
+      }
     };
     };
+  }
 
 
-    const baseFen = ChessRules.GenRandInitFen(randomness);
+  static GenRandInitFen(options) {
+    const baseFen = ChessRules.GenRandInitFen(options.randomness);
+    let blackLine = baseFen.substr(0, 8);
+    if (options.army2 != 'F') {
+      blackLine = blackLine.split('')
+        .map(p => V.PiecesMap[options.army2][p]).join('');
+    }
+    let whiteLine = baseFen.substr(35, 8);
+    if (options.army1 != 'F') {
+      whiteLine = whiteLine.split('')
+        .map(p => V.PiecesMap[options.army1][p.toLowerCase()])
+        .join('').toUpperCase();
+    }
     return (
     return (
-      baseFen.substr(0, 8).split('').map(p => piecesMap[p]).join('') +
-      baseFen.substr(8)
+      blackLine + baseFen.substring(8, 35) + whiteLine +
+      baseFen.substr(43) + " " + options.army1 + options.army2
     );
   }
 
     );
   }
 
+  setOtherVariables(fen) {
+    super.setOtherVariables(fen);
+    const armies = V.ParseFen(fen).armies;
+    this.army1 = armies.charAt(0);
+    this.army2 = armies.charAt(1);
+  }
+
+  static ParseFen(fen) {
+    return Object.assign(
+      { armies: fen.split(" ")[5] },
+      ChessRules.ParseFen(fen)
+    );
+  }
+
+  static IsGoodFen(fen) {
+    if (!ChessRules.IsGoodFen(fen)) return false;
+    const armies = V.ParseFen(fen).armies;
+    if (!armies || !armies.match(/^[CNRF]{2,2}$/)) return false;
+    return true;
+  }
+
+  getFen() {
+    return super.getFen() + " " + this.army1 + this.army2;
+  }
+
   static get C_ROOK() {
     return 'd';
   }
   static get C_KNIGHT() {
   static get C_ROOK() {
     return 'd';
   }
   static get C_KNIGHT() {
-    return 'h';
+    return 'w';
   }
   static get C_BISHOP() {
   }
   static get C_BISHOP() {
-    return 'a';
+    return 'f';
   }
   static get C_QUEEN() {
   }
   static get C_QUEEN() {
+    return 'c';
+  }
+  static get N_ROOK() {
+    return 'g';
+  }
+  static get N_KNIGHT() {
+    return 'i';
+  }
+  static get N_BISHOP() {
+    return 't';
+  }
+  static get N_QUEEN() {
+    return 'l';
+  }
+  static get R_ROOK() {
     return 's';
   }
     return 's';
   }
+  static get R_KNIGHT() {
+    return 'y';
+  }
+  static get R_BISHOP() {
+    return 'h';
+  }
+  static get R_QUEEN() {
+    return 'o';
+  }
 
   static get PIECES() {
 
   static get PIECES() {
-    return (
-      ChessRules.PIECES.concat([V.C_ROOK, V.C_KNIGHT, V.C_BISHOP, V.C_QUEEN])
-    );
+    return ChessRules.PIECES.concat(
+      [V.C_ROOK, V.C_KNIGHT, V.C_BISHOP, V.C_QUEEN]).concat(
+      [V.N_ROOK, V.N_KNIGHT, V.N_BISHOP, V.N_QUEEN]).concat(
+      [V.R_ROOK, V.R_KNIGHT, V.R_BISHOP, V.R_QUEEN]);
   }
 
   }
 
-  getPotentialMovesFrom([x, y]) {
-    switch (this.getPiece(x, y)) {
-      case V.C_ROOK: return this.getPotentialC_rookMoves([x, y]);
-      case V.C_KNIGHT: return this.getPotentialC_knightMoves([x, y]);
-      case V.C_BISHOP: return this.getPotentialC_bishopMoves([x, y]);
-      case V.C_QUEEN: return this.getPotentialC_queenMoves([x, y]);
-      default: return super.getPotentialMovesFrom([x, y]);
+  getPotentialMovesFrom(sq) {
+    switch (this.getPiece(sq[0], sq[1])) {
+      case V.C_ROOK: return this.getPotentialC_rookMoves(sq);
+      case V.C_KNIGHT: return this.getPotentialC_knightMoves(sq);
+      case V.C_BISHOP: return this.getPotentialC_bishopMoves(sq);
+      case V.C_QUEEN: return this.getPotentialC_queenMoves(sq);
+      case V.N_ROOK: return this.getPotentialN_rookMoves(sq);
+      case V.N_KNIGHT: return this.getPotentialN_knightMoves(sq);
+      case V.N_BISHOP: return this.getPotentialN_bishopMoves(sq);
+      case V.N_QUEEN: return this.getPotentialN_queenMoves(sq);
+      case V.R_ROOK: return this.getPotentialR_rookMoves(sq);
+      case V.R_KNIGHT: return this.getPotentialR_knightMoves(sq);
+      case V.R_BISHOP: return this.getPotentialR_bishopMoves(sq);
+      case V.R_QUEEN: return this.getPotentialR_queenMoves(sq);
+      case V.PAWN: {
+        // Can promote in anything from the two current armies
+        let promotions = [];
+        for (let army of ["army1", "army2"]) {
+          if (army == "army2" && this.army2 == this.army1) break;
+          switch (this[army]) {
+            case 'C': {
+              Array.prototype.push.apply(promotions,
+                [V.C_ROOK, V.C_KNIGHT, V.C_BISHOP, V.C_QUEEN]);
+              break;
+            }
+            case 'N': {
+              Array.prototype.push.apply(promotions,
+                [V.N_ROOK, V.N_KNIGHT, V.N_BISHOP, V.N_QUEEN]);
+              break;
+            }
+            case 'R': {
+              Array.prototype.push.apply(promotions,
+                [V.R_ROOK, V.R_KNIGHT, V.R_BISHOP, V.R_QUEEN]);
+              break;
+            }
+            case 'F': {
+              Array.prototype.push.apply(promotions,
+                [V.ROOK, V.KNIGHT, V.BISHOP, V.QUEEN]);
+              break;
+            }
+          }
+        }
+        return super.getPotentialPawnMoves(sq, promotions);
+      }
+      default: return super.getPotentialMovesFrom(sq);
     }
     return [];
   }
 
   static get steps() {
     return Object.assign(
     }
     return [];
   }
 
   static get steps() {
     return Object.assign(
-      {},
-      ChessRules.steps,
       {
         // Dabbabah
         'd': [
       {
         // Dabbabah
         'd': [
@@ -97,106 +236,301 @@ export class CwdaRules extends ChessRules {
           [1, -1],
           [-1, 1],
           [-1, -1]
           [1, -1],
           [-1, 1],
           [-1, -1]
+        ],
+        // Wazir
+        'w': [
+          [-1, 0],
+          [0, -1],
+          [1, 0],
+          [0, 1]
+        ],
+        // Threeleaper
+        '$3': [
+          [-3, 0],
+          [0, -3],
+          [3, 0],
+          [0, 3]
+        ],
+        // Narrow knight
+        '$n': [
+          [-2, -1],
+          [-2, 1],
+          [2, -1],
+          [2, 1]
         ]
         ]
-      }
+      },
+      ChessRules.steps,
     );
   }
 
   getPotentialC_rookMoves(sq) {
     return (
     );
   }
 
   getPotentialC_rookMoves(sq) {
     return (
-      this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat(
-      this.getSlideNJumpMoves(sq, V.steps['d'], "oneStep"))
+      this.getSlideNJumpMoves(sq, V.steps.b).concat(
+      this.getSlideNJumpMoves(sq, V.steps.d, 1))
     );
   }
 
   getPotentialC_knightMoves(sq) {
     return (
     );
   }
 
   getPotentialC_knightMoves(sq) {
     return (
-      this.getSlideNJumpMoves(sq, V.steps['a'], "oneStep").concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.ROOK], "oneStep"))
+      this.getSlideNJumpMoves(sq, V.steps.a, 1).concat(
+      this.getSlideNJumpMoves(sq, V.steps.r, 1))
     );
   }
 
   getPotentialC_bishopMoves(sq) {
     return (
     );
   }
 
   getPotentialC_bishopMoves(sq) {
     return (
-      this.getSlideNJumpMoves(sq, V.steps['d'], "oneStep").concat(
-      this.getSlideNJumpMoves(sq, V.steps['a'], "oneStep")).concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], "oneStep"))
+      this.getSlideNJumpMoves(sq, V.steps.d, 1).concat(
+      this.getSlideNJumpMoves(sq, V.steps.a, 1)).concat(
+      this.getSlideNJumpMoves(sq, V.steps.b, 1))
     );
   }
 
   getPotentialC_queenMoves(sq) {
     return (
     );
   }
 
   getPotentialC_queenMoves(sq) {
     return (
-      this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat(
-        this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep"))
+      this.getSlideNJumpMoves(sq, V.steps.b).concat(
+        this.getSlideNJumpMoves(sq, V.steps.n, 1))
+    );
+  }
+
+  getPotentialN_rookMoves(sq) {
+    const c = this.turn;
+    const rookSteps = [ [0, -1], [0, 1], [c == 'w' ? -1 : 1, 0] ];
+    const backward = (c == 'w' ? 1 : -1);
+    const kingSteps = [ [backward, -1], [backward, 0], [backward, 1] ];
+    return (
+      this.getSlideNJumpMoves(sq, rookSteps).concat(
+      this.getSlideNJumpMoves(sq, kingSteps, 1))
+    );
+  }
+
+  getPotentialN_knightMoves(sq) {
+    const backward = (this.turn == 'w' ? 1 : -1);
+    const kingSteps = [
+      [0, -1], [0, 1], [backward, -1], [backward, 0], [backward, 1]
+    ];
+    return (
+      this.getSlideNJumpMoves(sq, V.steps.$n, 1).concat(
+      this.getSlideNJumpMoves(sq, kingSteps, 1))
+    );
+  }
+
+  getPotentialN_bishopMoves(sq) {
+    const backward = (this.turn == 'w' ? 1 : -1);
+    const kingSteps = [
+      [0, -1], [0, 1], [backward, -1], [backward, 0], [backward, 1]
+    ];
+    const forward = -backward;
+    const knightSteps = [
+      [2*forward, -1], [2*forward, 1], [forward, -2], [forward, 2]
+    ];
+    return (
+      this.getSlideNJumpMoves(sq, knightSteps, 1).concat(
+      this.getSlideNJumpMoves(sq, kingSteps, 1))
+    );
+  }
+
+  getPotentialN_queenMoves(sq) {
+    const backward = (this.turn == 'w' ? 1 : -1);
+    const forward = -backward;
+    const kingSteps = [
+      [forward, -1], [forward, 1],
+      [backward, -1], [backward, 0], [backward, 1]
+    ];
+    const knightSteps = [
+      [2*forward, -1], [2*forward, 1], [forward, -2], [forward, 2]
+    ];
+    const rookSteps = [ [0, -1], [0, 1], [forward, 0] ];
+    return (
+      this.getSlideNJumpMoves(sq, rookSteps).concat(
+      this.getSlideNJumpMoves(sq, kingSteps, 1)).concat(
+      this.getSlideNJumpMoves(sq, knightSteps, 1))
+    );
+  }
+
+  getPotentialR_rookMoves(sq) {
+    return this.getSlideNJumpMoves(sq, V.steps.r, 4);
+  }
+
+  getPotentialR_knightMoves(sq) {
+    return (
+      this.getSlideNJumpMoves(sq, V.steps.d, 1).concat(
+      this.getSlideNJumpMoves(sq, V.steps.w, 1))
+    );
+  }
+
+  getPotentialR_bishopMoves(sq) {
+    return (
+      this.getSlideNJumpMoves(sq, V.steps.d, 1).concat(
+      this.getSlideNJumpMoves(sq, V.steps.f, 1)).concat(
+      this.getSlideNJumpMoves(sq, V.steps.$3, 1))
+    );
+  }
+
+  getPotentialR_queenMoves(sq) {
+    return (
+      this.getSlideNJumpMoves(sq, V.steps.r).concat(
+      this.getSlideNJumpMoves(sq, V.steps.n, 1))
     );
   }
 
   getCastleMoves([x, y]) {
     const color = this.getColor(x, y);
     );
   }
 
   getCastleMoves([x, y]) {
     const color = this.getColor(x, y);
-    const finalSquares = [
-      // Black castle long in an unusual way:
-      (color == 'w' ? [2, 3] : [1, 2]),
-      [V.size.y - 2, V.size.y - 3]
-    ];
+    let finalSquares = [ [2, 3], [V.size.y - 2, V.size.y - 3] ];
+    if (
+      (color == 'w' && this.army1 == 'C') ||
+      (color == 'b' && this.army2 == 'C')
+    ) {
+      // Colorbound castle long in an unusual way:
+      finalSquares[0] = [1, 2];
+    }
     return super.getCastleMoves([x, y], finalSquares);
   }
 
   isAttacked(sq, color) {
     return super.getCastleMoves([x, y], finalSquares);
   }
 
   isAttacked(sq, color) {
-    return (
-      super.isAttacked(sq, color) ||
-      this.isAttackedByC_rook(sq, color) ||
-      this.isAttackedByC_knight(sq, color) ||
-      this.isAttackedByC_bishop(sq, color) ||
-      this.isAttackedByC_queen(sq, color)
-    );
+    if (super.isAttackedByPawn(sq, color) || super.isAttackedByKing(sq, color))
+      return true;
+    for (let army of ['C', 'N', 'R', 'F']) {
+      if (
+        [this.army1, this.army2].includes(army) &&
+        (
+          this["isAttackedBy" + army + "_rook"](sq, color) ||
+          this["isAttackedBy" + army + "_knight"](sq, color) ||
+          this["isAttackedBy" + army + "_bishop"](sq, color) ||
+          this["isAttackedBy" + army + "_queen"](sq, color)
+        )
+      ) {
+        return true;
+      }
+    }
+    return false;
   }
 
   isAttackedByC_rook(sq, color) {
     return (
   }
 
   isAttackedByC_rook(sq, color) {
     return (
-      this.isAttackedBySlideNJump(sq, color, V.C_ROOK, V.steps[V.BISHOP]) ||
-      this.isAttackedBySlideNJump(
-        sq, color, V.C_ROOK, V.steps['d'], "oneStep")
+      this.isAttackedBySlideNJump(sq, color, V.C_ROOK, V.steps.b) ||
+      this.isAttackedBySlideNJump(sq, color, V.C_ROOK, V.steps.d, 1)
     );
   }
 
   isAttackedByC_knight(sq, color) {
     return (
     );
   }
 
   isAttackedByC_knight(sq, color) {
     return (
-      this.isAttackedBySlideNJump(
-        sq, color, V.C_KNIGHT, V.steps[V.ROOK], "oneStep") ||
-      this.isAttackedBySlideNJump(
-        sq, color, V.C_KNIGHT, V.steps['a'], "oneStep")
+      this.isAttackedBySlideNJump(sq, color, V.C_KNIGHT, V.steps.r, 1) ||
+      this.isAttackedBySlideNJump(sq, color, V.C_KNIGHT, V.steps.a, 1)
     );
   }
 
   isAttackedByC_bishop(sq, color) {
     return (
     );
   }
 
   isAttackedByC_bishop(sq, color) {
     return (
-      this.isAttackedBySlideNJump(
-        sq, color, V.C_BISHOP, V.steps['d'], "oneStep") ||
-      this.isAttackedBySlideNJump(
-        sq, color, V.C_BISHOP, V.steps['a'], "oneStep") ||
-      this.isAttackedBySlideNJump(
-        sq, color, V.C_BISHOP, V.steps['f'], "oneStep")
+      this.isAttackedBySlideNJump(sq, color, V.C_BISHOP, V.steps.d, 1) ||
+      this.isAttackedBySlideNJump(sq, color, V.C_BISHOP, V.steps.a, 1) ||
+      this.isAttackedBySlideNJump(sq, color, V.C_BISHOP, V.steps.f, 1)
     );
   }
 
   isAttackedByC_queen(sq, color) {
     return (
     );
   }
 
   isAttackedByC_queen(sq, color) {
     return (
-      this.isAttackedBySlideNJump(sq, color, V.C_QUEEN, V.steps[V.BISHOP]) ||
-      this.isAttackedBySlideNJump(
-        sq, color, V.C_QUEEN, V.steps[V.KNIGHT], "oneStep")
+      this.isAttackedBySlideNJump(sq, color, V.C_QUEEN, V.steps.b) ||
+      this.isAttackedBySlideNJump(sq, color, V.C_QUEEN, V.steps.n, 1)
+    );
+  }
+
+  isAttackedByN_rook(sq, color) {
+    const rookSteps = [ [0, -1], [0, 1], [color == 'w' ? 1 : -1, 0] ];
+    const backward = (color == 'w' ? -1 : 1);
+    const kingSteps = [ [backward, -1], [backward, 0], [backward, 1] ];
+    return (
+      this.isAttackedBySlideNJump(sq, color, V.N_ROOK, rookSteps) ||
+      this.isAttackedBySlideNJump(sq, color, V.N_ROOK, kingSteps, 1)
+    );
+  }
+
+  isAttackedByN_knight(sq, color) {
+    const backward = (color == 'w' ? -1 : 1);
+    const kingSteps = [
+      [0, -1], [0, 1], [backward, -1], [backward, 0], [backward, 1]
+    ];
+    return (
+      this.isAttackedBySlideNJump(sq, color, V.N_KNIGHT, V.steps.$n) ||
+      this.isAttackedBySlideNJump(sq, color, V.N_KNIGHT, kingSteps, 1)
+    );
+  }
+
+  isAttackedByN_bishop(sq, color) {
+    const backward = (color == 'w' ? -1 : 1);
+    const kingSteps = [
+      [0, -1], [0, 1], [backward, -1], [backward, 0], [backward, 1]
+    ];
+    const forward = -backward;
+    const knightSteps = [
+      [2*forward, -1], [2*forward, 1], [forward, -2], [forward, 2]
+    ];
+    return (
+      this.isAttackedBySlideNJump(sq, color, V.N_BISHOP, knightSteps, 1) ||
+      this.isAttackedBySlideNJump(sq, color, V.N_BISHOP, kingSteps, 1)
+    );
+  }
+
+  isAttackedByN_queen(sq, color) {
+    const backward = (color == 'w' ? -1 : 1);
+    const forward = -backward;
+    const kingSteps = [
+      [forward, -1], [forward, 1],
+      [backward, -1], [backward, 0], [backward, 1]
+    ];
+    const knightSteps = [
+      [2*forward, -1], [2*forward, 1], [forward, -2], [forward, 2]
+    ];
+    const rookSteps = [ [0, -1], [0, 1], [forward, 0] ];
+    return (
+      this.isAttackedBySlideNJump(sq, color, V.N_QUEEN, knightSteps, 1) ||
+      this.isAttackedBySlideNJump(sq, color, V.N_QUEEN, kingSteps, 1) ||
+      this.isAttackedBySlideNJump(sq, color, V.N_QUEEN, rookSteps)
+    );
+  }
+
+  isAttackedByR_rook(sq, color) {
+    return this.isAttackedBySlideNJump(sq, color, V.R_ROOK, V.steps.r, 4);
+  }
+
+  isAttackedByR_knight(sq, color) {
+    return (
+      this.isAttackedBySlideNJump(sq, color, V.R_KNIGHT, V.steps.d, 1) ||
+      this.isAttackedBySlideNJump(sq, color, V.R_KNIGHT, V.steps.w, 1)
+    );
+  }
+
+  isAttackedByR_bishop(sq, color) {
+    return (
+      this.isAttackedBySlideNJump(sq, color, V.R_BISHOP, V.steps.d, 1) ||
+      this.isAttackedBySlideNJump(sq, color, V.R_BISHOP, V.steps.f, 1) ||
+      this.isAttackedBySlideNJump(sq, color, V.R_BISHOP, V.steps.$3, 1)
+    );
+  }
+
+  isAttackedByR_queen(sq, color) {
+    return (
+      this.isAttackedBySlideNJump(sq, color, V.R_QUEEN, V.steps.r) ||
+      this.isAttackedBySlideNJump(sq, color, V.R_QUEEN, V.steps.n, 1)
     );
   }
 
   static get VALUES() {
     return Object.assign(
     );
   }
 
   static get VALUES() {
     return Object.assign(
-      {},
-      ChessRules.VALUES,
       {
         d: 4,
       {
         d: 4,
-        h: 3,
-        a: 5,
-        s: 6
-      }
+        w: 3,
+        f: 5,
+        c: 7,
+        g: 4,
+        i: 3,
+        t: 4,
+        l: 7,
+        s: 4,
+        y: 3,
+        h: 4,
+        o: 8
+      },
+      ChessRules.VALUES
     );
   }
 
     );
   }
 
index 8b68e9c..bcb5393 100644 (file)
@@ -22,7 +22,7 @@ export class CylinderRules extends ChessRules {
       let j = V.ComputeY(y + step[1]);
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
         moves.push(this.getBasicMove([x, y], [i, j]));
       let j = V.ComputeY(y + step[1]);
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
         moves.push(this.getBasicMove([x, y], [i, j]));
-        if (oneStep !== undefined) continue outerLoop;
+        if (oneStep) continue outerLoop;
         i += step[0];
         j = V.ComputeY(j + step[1]);
       }
         i += step[0];
         j = V.ComputeY(j + step[1]);
       }
index 1aa9b0e..658b7ad 100644 (file)
@@ -12,12 +12,12 @@ export class DiamondRules extends ChessRules {
     return false;
   }
 
     return false;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "krbp4/rqnp4/nbpp4/pppp4/4PPPP/4PPBN/4PNQR/4PBRK w 0";
     let pieces = { w: new Array(8), b: new Array(8) };
     for (let c of ["w", "b"]) {
       return "krbp4/rqnp4/nbpp4/pppp4/4PPPP/4PPBN/4PNQR/4PBRK w 0";
     let pieces = { w: new Array(8), b: new Array(8) };
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
         pieces['b'] = pieces['w'];
         break;
       }
index 262f273..2e98776 100644 (file)
@@ -35,8 +35,8 @@ export class DiceRules extends ChessRules {
     return (L > 0 ? this.p2play[L-1] : "-");
   }
 
     return (L > 0 ? this.p2play[L-1] : "-");
   }
 
-  static GenRandInitFen(randomness) {
-    return ChessRules.GenRandInitFen(randomness) + " -";
+  static GenRandInitFen(options) {
+    return ChessRules.GenRandInitFen(options) + " -";
   }
 
   canMove(piece, color, [x, y]) {
   }
 
   canMove(piece, color, [x, y]) {
index f573570..635e6db 100644 (file)
@@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules";
 
 export class DiscoduelRules extends ChessRules {
 
 
 export class DiscoduelRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get PawnSpecs() {
     return Object.assign(
       {},
   static get PawnSpecs() {
     return Object.assign(
       {},
index da632b8..af8c4f6 100644 (file)
@@ -4,6 +4,10 @@ import { sample, shuffle } from "@/utils/alea";
 
 export class DobutsuRules extends ChessRules {
 
 
 export class DobutsuRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
   static get HasFlags() {
     return false;
   }
@@ -207,15 +211,15 @@ export class DobutsuRules extends ChessRules {
     const c = this.turn;
     const forward = (c == 'w' ? -1 : 1);
     const steps = V.steps[V.ROOK].concat([[forward, 1], [forward, -1]]);
     const c = this.turn;
     const forward = (c == 'w' ? -1 : 1);
     const steps = V.steps[V.ROOK].concat([[forward, 1], [forward, -1]]);
-    return super.getSlideNJumpMoves(sq, steps, "oneStep");
+    return super.getSlideNJumpMoves(sq, steps, 1);
   }
 
   getPotentialElephantMoves(sq) {
   }
 
   getPotentialElephantMoves(sq) {
-    return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], "oneStep");
+    return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1);
   }
 
   getPotentialGiraffeMoves(sq) {
   }
 
   getPotentialGiraffeMoves(sq) {
-    return super.getSlideNJumpMoves(sq, V.steps[V.ROOK], "oneStep");
+    return super.getSlideNJumpMoves(sq, V.steps[V.ROOK], 1);
   }
 
   getAllValidMoves() {
   }
 
   getAllValidMoves() {
index 8a6c806..87d262a 100644 (file)
@@ -19,8 +19,8 @@ export class DoublearmyRules extends ChessRules {
     return (b[1] == V.COMMONER ? "Doublearmy/" : "") + b;
   }
 
     return (b[1] == V.COMMONER ? "Doublearmy/" : "") + b;
   }
 
-  static GenRandInitFen(randomness) {
-    const fen = ChessRules.GenRandInitFen(randomness);
+  static GenRandInitFen(options) {
+    const fen = ChessRules.GenRandInitFen(options);
     const rows = fen.split(" ")[0].split("/");
     return (
       rows[0] + "/" +
     const rows = fen.split(" ")[0].split("/");
     return (
       rows[0] + "/" +
@@ -45,10 +45,7 @@ export class DoublearmyRules extends ChessRules {
 
   getPotentialCommonerMoves(sq) {
     return this.getSlideNJumpMoves(
 
   getPotentialCommonerMoves(sq) {
     return this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   isAttacked(sq, color) {
   }
 
   isAttacked(sq, color) {
@@ -60,19 +57,13 @@ export class DoublearmyRules extends ChessRules {
 
   isAttackedByCommoner(sq, color) {
     return this.isAttackedBySlideNJump(
 
   isAttackedByCommoner(sq, color) {
     return this.isAttackedBySlideNJump(
-      sq,
-      color,
-      V.COMMONER,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      sq, color, V.COMMONER, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   static get VALUES() {
     return Object.assign(
   }
 
   static get VALUES() {
     return Object.assign(
-      {},
-      ChessRules.VALUES,
-      { c: 5 }
+      { c: 5 },
+      ChessRules.VALUES
     );
   }
 
     );
   }
 
index c380610..927530c 100644 (file)
@@ -167,11 +167,11 @@ export class EightpiecesRules extends ChessRules {
     }
   }
 
     }
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "jfsqkbnr/pppppppp/8/8/8/8/PPPPPPPP/JDSQKBNR w 0 ahah - -";
 
       return "jfsqkbnr/pppppppp/8/8/8/8/PPPPPPPP/JDSQKBNR w 0 ahah - -";
 
-    const baseFen = ChessRules.GenRandInitFen(randomness);
+    const baseFen = ChessRules.GenRandInitFen(options);
     const fenParts = baseFen.split(' ');
     const posParts = fenParts[0].split('/');
 
     const fenParts = baseFen.split(' ');
     const posParts = fenParts[0].split('/');
 
@@ -671,10 +671,7 @@ export class EightpiecesRules extends ChessRules {
 
   getPotentialKingMoves(sq) {
     const moves = this.getSlideNJumpMoves(
 
   getPotentialKingMoves(sq) {
     const moves = this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
     return (
       this.subTurn == 1
         ? moves.concat(this.getCastleMoves(sq))
     return (
       this.subTurn == 1
         ? moves.concat(this.getCastleMoves(sq))
index a1a9848..13069de 100644 (file)
@@ -8,6 +8,10 @@ export class EmergoRules extends ChessRules {
   // Lowercase if black controls.
   // Single piece (no prisoners): A@ to L@ (+ lowercase)
 
   // Lowercase if black controls.
   // Single piece (no prisoners): A@ to L@ (+ lowercase)
 
+  static get Options() {
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
   static get HasFlags() {
     return false;
   }
@@ -105,7 +109,7 @@ export class EmergoRules extends ChessRules {
     return { x: 9, y: 9 };
   }
 
     return { x: 9, y: 9 };
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen() {
     return "9/9/9/9/9/9/9/9/9 w 0 12,12";
   }
 
     return "9/9/9/9/9/9/9/9/9 w 0 12,12";
   }
 
index c8577a7..d04e4a8 100644 (file)
@@ -23,8 +23,8 @@ export class EmpireRules extends ChessRules {
     return (b[0] == 'w' ? "Empire/" : "") + b;
   }
 
     return (b[0] == 'w' ? "Empire/" : "") + b;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "rnbqkbnr/pppppppp/8/8/8/PPPSSPPP/8/TECDKCET w 0 ah -";
 
     // Mapping kingdom --> empire:
       return "rnbqkbnr/pppppppp/8/8/8/PPPSSPPP/8/TECDKCET w 0 ah -";
 
     // Mapping kingdom --> empire:
@@ -36,7 +36,7 @@ export class EmpireRules extends ChessRules {
       'K': 'K'
     };
 
       'K': 'K'
     };
 
-    const baseFen = ChessRules.GenRandInitFen(randomness);
+    const baseFen = ChessRules.GenRandInitFen(options);
     return (
       baseFen.substr(0, 24) + "PPPSSPPP/8/" +
       baseFen.substr(35, 8).split('').map(p => piecesMap[p]).join('') +
     return (
       baseFen.substr(0, 24) + "PPPSSPPP/8/" +
       baseFen.substr(35, 8).split('').map(p => piecesMap[p]).join('') +
@@ -211,6 +211,7 @@ export class EmpireRules extends ChessRules {
     });
   }
 
     });
   }
 
+  // TODO: some merging to do with Orda method (and into base_rules.js)
   getSlideNJumpMoves_([x, y], steps, oneStep) {
     let moves = [];
     outerLoop: for (let step of steps) {
   getSlideNJumpMoves_([x, y], steps, oneStep) {
     let moves = [];
     outerLoop: for (let step of steps) {
@@ -221,7 +222,7 @@ export class EmpireRules extends ChessRules {
         if (!step.onlyTake) moves.push(this.getBasicMove([x, y], [i, j]));
         // NOTE: (bad) HACK here, since onlyTake is true only for Eagle
         // capturing moves, which are oneStep...
         if (!step.onlyTake) moves.push(this.getBasicMove([x, y], [i, j]));
         // NOTE: (bad) HACK here, since onlyTake is true only for Eagle
         // capturing moves, which are oneStep...
-        if (!!oneStep || !!step.onlyTake) continue outerLoop;
+        if (oneStep || step.onlyTake) continue outerLoop;
         i += s[0];
         j += s[1];
       }
         i += s[0];
         j += s[1];
       }
@@ -318,10 +319,7 @@ export class EmpireRules extends ChessRules {
     if (this.getColor(x, y) == 'b') return super.getPotentialKingMoves([x, y]);
     // Empire doesn't castle:
     return super.getSlideNJumpMoves(
     if (this.getColor(x, y) == 'b') return super.getPotentialKingMoves([x, y]);
     // Empire doesn't castle:
     return super.getSlideNJumpMoves(
-      [x, y],
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   getPotentialSoldierMoves([x, y]) {
   }
 
   getPotentialSoldierMoves([x, y]) {
@@ -332,7 +330,7 @@ export class EmpireRules extends ChessRules {
     if (!lastRank) steps.push([shiftX, 0]);
     if (y > 0) steps.push([0, -1]);
     if (y < 9) steps.push([0, 1]);
     if (!lastRank) steps.push([shiftX, 0]);
     if (y > 0) steps.push([0, -1]);
     if (y < 9) steps.push([0, 1]);
-    return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+    return super.getSlideNJumpMoves([x, y], steps, 1);
   }
 
   isAttacked(sq, color) {
   }
 
   isAttacked(sq, color) {
@@ -356,7 +354,7 @@ export class EmpireRules extends ChessRules {
 
   isAttackedByEagle(sq, color) {
     return super.isAttackedBySlideNJump(
 
   isAttackedByEagle(sq, color) {
     return super.isAttackedBySlideNJump(
-      sq, color, V.EAGLE, V.steps[V.KNIGHT], "oneStep");
+      sq, color, V.EAGLE, V.steps[V.KNIGHT], 1);
   }
 
   isAttackedByCardinal(sq, color) {
   }
 
   isAttackedByCardinal(sq, color) {
@@ -368,7 +366,7 @@ export class EmpireRules extends ChessRules {
     return (
       super.isAttackedBySlideNJump(
         sq, color, V.DUKE,
     return (
       super.isAttackedBySlideNJump(
         sq, color, V.DUKE,
-        V.steps[V.ROOK].concat(V.steps[V.BISHOP]), "oneStep"
+        V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1
       )
     );
   }
       )
     );
   }
@@ -376,7 +374,7 @@ export class EmpireRules extends ChessRules {
   isAttackedBySoldier([x, y], color) {
     const shiftX = (color == 'w' ? 1 : -1); //shift from king
     return super.isAttackedBySlideNJump(
   isAttackedBySoldier([x, y], color) {
     const shiftX = (color == 'w' ? 1 : -1); //shift from king
     return super.isAttackedBySlideNJump(
-      [x, y], color, V.SOLDIER, [[shiftX, 0], [0, 1], [0, -1]], "oneStep");
+      [x, y], color, V.SOLDIER, [[shiftX, 0], [0, 1], [0, -1]], 1);
   }
 
   updateCastleFlags(move, piece) {
   }
 
   updateCastleFlags(move, piece) {
index 4593e6b..e1e653a 100644 (file)
@@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea";
 
 export class FanoronaRules extends ChessRules {
 
 
 export class FanoronaRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
   static get HasFlags() {
     return false;
   }
index d63cfee..7829c2d 100644 (file)
@@ -104,13 +104,13 @@ export class FootballRules extends ChessRules {
     }
   }
 
     }
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "rnbq1knbr/9/9/9/4a4/9/9/9/RNBQ1KNBR w 0";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     for (let c of ["w", "b"]) {
       return "rnbq1knbr/9/9/9/4a4/9/9/9/RNBQ1KNBR w 0";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
         pieces['b'] = pieces['w'];
         break;
       }
@@ -314,22 +314,8 @@ export class FootballRules extends ChessRules {
     return moves;
   }
 
     return moves;
   }
 
-  // No captures:
-  getSlideNJumpMoves([x, y], steps, oneStep) {
-    let moves = [];
-    outerLoop: for (let step of steps) {
-      let i = x + step[0];
-      let j = y + step[1];
-      let stepCount = 1;
-      while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
-        moves.push(this.getBasicMove([x, y], [i, j]));
-        if (!!oneStep) continue outerLoop;
-        i += step[0];
-        j += step[1];
-        stepCount++;
-      }
-    }
-    return moves;
+  canTake() {
+    return false;
   }
 
   // Extra arg "computer" to avoid trimming all redundant pass moves:
   }
 
   // Extra arg "computer" to avoid trimming all redundant pass moves:
index c29324a..2c83fb2 100644 (file)
@@ -122,7 +122,11 @@ export class FugueRules extends ChessRules {
   }
 
   canTake([x1, y1], [x2, y2]) {
   }
 
   canTake([x1, y1], [x2, y2]) {
-    return !this.isProtected([x2, y2]) && super.canTake([x1, y1], [x2, y2]);
+    return (
+      [V.QUEEN, V.KING].includes(this.getPiece(x1, y1)) &&
+      !this.isProtected([x2, y2]) &&
+      this.getColor(x1, y1) != this.getColor(x2, y2)
+    );
   }
 
   getPotentialMovesFrom([x, y]) {
   }
 
   getPotentialMovesFrom([x, y]) {
@@ -143,30 +147,6 @@ export class FugueRules extends ChessRules {
     }
   }
 
     }
   }
 
-  getSlideNJumpMoves([x, y], steps, oneStep) {
-    const piece = this.getPiece(x, y);
-    let moves = [];
-    outerLoop: for (let step of steps) {
-      let i = x + step[0];
-      let j = y + step[1];
-      while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
-        moves.push(this.getBasicMove([x, y], [i, j]));
-        if (oneStep !== undefined) continue outerLoop;
-        i += step[0];
-        j += step[1];
-      }
-      // Only queen and king can take on occupied square:
-      if (
-        [V.KING, V.QUEEN].includes(piece) &&
-        V.OnBoard(i, j) &&
-        this.canTake([x, y], [i, j])
-      ) {
-        moves.push(this.getBasicMove([x, y], [i, j]));
-      }
-    }
-    return moves;
-  }
-
   // "Cannon/grasshopper pawn"
   getPotentialPawnMoves([x, y]) {
     const c = this.turn;
   // "Cannon/grasshopper pawn"
   getPotentialPawnMoves([x, y]) {
     const c = this.turn;
@@ -228,7 +208,7 @@ export class FugueRules extends ChessRules {
 
   getPotentialKingMoves(sq) {
     const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
 
   getPotentialKingMoves(sq) {
     const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
-    return this.getSlideNJumpMoves(sq, steps, "oneStep");
+    return this.getSlideNJumpMoves(sq, steps, 1);
   }
 
   // NOTE: not really captures, but let's keep the name
   }
 
   // NOTE: not really captures, but let's keep the name
@@ -512,8 +492,8 @@ export class FugueRules extends ChessRules {
     }
   }
 
     }
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0) {
+  static GenRandInitFen(options) {
+    if (options.randomness == 0) {
       return (
         "wlqksaui/pppppppp/8/8/8/8/PPPPPPPP/IUASKQLW w 0"
       );
       return (
         "wlqksaui/pppppppp/8/8/8/8/PPPPPPPP/IUASKQLW w 0"
       );
@@ -522,7 +502,7 @@ export class FugueRules extends ChessRules {
     let pieces = { w: new Array(8), b: new Array(8) };
     // Shuffle pieces on first and last rank
     for (let c of ["w", "b"]) {
     let pieces = { w: new Array(8), b: new Array(8) };
     // Shuffle pieces on first and last rank
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
         pieces['b'] = pieces['w'];
         break;
       }
index c211aa8..07951f6 100644 (file)
@@ -88,12 +88,12 @@ export class FullcavalryRules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       // Deterministic:
       return "enbqkbnm/pppppppp/8/8/8/8/PPPPPPPP/ENBQKBNM w 0 ahah -";
 
       // Deterministic:
       return "enbqkbnm/pppppppp/8/8/8/8/PPPPPPPP/ENBQKBNM w 0 ahah -";
 
-    const baseFen = ChessRules.GenRandInitFen(randomness);
+    const baseFen = ChessRules.GenRandInitFen(options);
     // Replace rooks by lancers with expected orientation:
     const firstBlackRook = baseFen.indexOf('r'),
           lastBlackRook = baseFen.lastIndexOf('r'),
     // Replace rooks by lancers with expected orientation:
     const firstBlackRook = baseFen.indexOf('r'),
           lastBlackRook = baseFen.lastIndexOf('r'),
index 2eb8b2d..2179aae 100644 (file)
@@ -185,7 +185,7 @@ export class FusionRules extends ChessRules {
             ]
           })
         );
             ]
           })
         );
-        if (!!oneStep) continue outerLoop;
+        if (oneStep) continue outerLoop;
         i += step[0];
         j += step[1];
       }
         i += step[0];
         j += step[1];
       }
@@ -326,32 +326,29 @@ export class FusionRules extends ChessRules {
   isAttackedByBN(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.BN, V.steps[V.BISHOP]) ||
   isAttackedByBN(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.BN, V.steps[V.BISHOP]) ||
-      this.isAttackedBySlideNJump(
-        sq, color, V.BN, V.steps[V.KNIGHT], "oneStep")
+      this.isAttackedBySlideNJump(sq, color, V.BN, V.steps[V.KNIGHT], 1)
     );
   }
 
   isAttackedByRN(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.RN, V.steps[V.ROOK]) ||
     );
   }
 
   isAttackedByRN(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.RN, V.steps[V.ROOK]) ||
-      this.isAttackedBySlideNJump(
-        sq, color, V.RN, V.steps[V.KNIGHT], "oneStep")
+      this.isAttackedBySlideNJump(sq, color, V.RN, V.steps[V.KNIGHT], 1)
     );
   }
 
   isAttackedByKN(sq, color) {
     const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
     return (
     );
   }
 
   isAttackedByKN(sq, color) {
     const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
     return (
-      this.isAttackedBySlideNJump(sq, color, V.KN, steps, "oneStep") ||
-      this.isAttackedBySlideNJump(
-        sq, color, V.KN, V.steps[V.KNIGHT], "oneStep")
+      this.isAttackedBySlideNJump(sq, color, V.KN, steps, 1) ||
+      this.isAttackedBySlideNJump(sq, color, V.KN, V.steps[V.KNIGHT], 1)
     );
   }
 
   isAttackedByKB(sq, color) {
     const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
     return (
     );
   }
 
   isAttackedByKB(sq, color) {
     const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
     return (
-      this.isAttackedBySlideNJump(sq, color, V.KB, steps, "oneStep") ||
+      this.isAttackedBySlideNJump(sq, color, V.KB, steps, 1) ||
       this.isAttackedBySlideNJump(sq, color, V.KB, V.steps[V.BISHOP])
     );
   }
       this.isAttackedBySlideNJump(sq, color, V.KB, V.steps[V.BISHOP])
     );
   }
@@ -359,7 +356,7 @@ export class FusionRules extends ChessRules {
   isAttackedByKR(sq, color) {
     const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
     return (
   isAttackedByKR(sq, color) {
     const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
     return (
-      this.isAttackedBySlideNJump(sq, color, V.KR, steps, "oneStep") ||
+      this.isAttackedBySlideNJump(sq, color, V.KR, steps, 1) ||
       this.isAttackedBySlideNJump(sq, color, V.KR, V.steps[V.ROOK])
     );
   }
       this.isAttackedBySlideNJump(sq, color, V.KR, V.steps[V.ROOK])
     );
   }
index 51d0bed..621f6e6 100644 (file)
@@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea";
 
 export class GomokuRules extends ChessRules {
 
 
 export class GomokuRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get Monochrome() {
     return true;
   }
   static get Monochrome() {
     return true;
   }
index 43cad10..7be8886 100644 (file)
@@ -121,13 +121,13 @@ export class GrandRules extends ChessRules {
 
   getPotentialMarshallMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat(
 
   getPotentialMarshallMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")
+      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)
     );
   }
 
   getPotentialCardinalMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat(
     );
   }
 
   getPotentialCardinalMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")
+      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)
     );
   }
 
     );
   }
 
@@ -142,26 +142,14 @@ export class GrandRules extends ChessRules {
   isAttackedByMarshall(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.MARSHALL, V.steps[V.ROOK]) ||
   isAttackedByMarshall(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.MARSHALL, V.steps[V.ROOK]) ||
-      this.isAttackedBySlideNJump(
-        sq,
-        color,
-        V.MARSHALL,
-        V.steps[V.KNIGHT],
-        "oneStep"
-      )
+      this.isAttackedBySlideNJump(sq, color, V.MARSHALL, V.steps[V.KNIGHT], 1)
     );
   }
 
   isAttackedByCardinal(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.CARDINAL, V.steps[V.BISHOP]) ||
     );
   }
 
   isAttackedByCardinal(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.CARDINAL, V.steps[V.BISHOP]) ||
-      this.isAttackedBySlideNJump(
-        sq,
-        color,
-        V.CARDINAL,
-        V.steps[V.KNIGHT],
-        "oneStep"
-      )
+      this.isAttackedBySlideNJump(sq, color, V.CARDINAL, V.steps[V.KNIGHT], 1)
     );
   }
 
     );
   }
 
@@ -176,8 +164,8 @@ export class GrandRules extends ChessRules {
     return 2;
   }
 
     return 2;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0) {
+  static GenRandInitFen(options) {
+    if (options.randomness == 0) {
       return (
         "r8r/1nbqkmcbn1/pppppppppp/91/91/91/91/PPPPPPPPPP/1NBQKMCBN1/R8R " +
         "w 0 -"
       return (
         "r8r/1nbqkmcbn1/pppppppppp/91/91/91/91/PPPPPPPPPP/1NBQKMCBN1/R8R " +
         "w 0 -"
@@ -187,7 +175,7 @@ export class GrandRules extends ChessRules {
     let pieces = { w: new Array(8), b: new Array(8) };
     // Shuffle pieces on second and before-last rank
     for (let c of ["w", "b"]) {
     let pieces = { w: new Array(8), b: new Array(8) };
     // Shuffle pieces on second and before-last rank
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
         pieces['b'] = pieces['w'];
         break;
       }
index 90411d1..fcc6bb1 100644 (file)
@@ -101,8 +101,8 @@ export class GrasshopperRules extends ChessRules {
     return 2;
   }
 
     return 2;
   }
 
-  static GenRandInitFen(randomness) {
-    return ChessRules.GenRandInitFen(randomness)
+  static GenRandInitFen(options) {
+    return ChessRules.GenRandInitFen(options)
       .slice(0, -2)
       .replace(
         "/pppppppp/8/8/8/8/PPPPPPPP/",
       .slice(0, -2)
       .replace(
         "/pppppppp/8/8/8/8/PPPPPPPP/",
index 856725c..8738b28 100644 (file)
@@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea";
 
 export class HamiltonRules extends ChessRules {
 
 
 export class HamiltonRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
   static get HasFlags() {
     return false;
   }
index 280062c..24b8dd0 100644 (file)
@@ -4,6 +4,11 @@ import { randInt } from "@/utils/alea";
 
 export class HiddenRules extends ChessRules {
 
 
 export class HiddenRules extends ChessRules {
 
+  static get Options() {
+    // TODO: later, option "free placement"
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
   static get HasFlags() {
     return false;
   }
index cbe7f92..1ce85be 100644 (file)
@@ -152,8 +152,8 @@ export class HiddenqueenRules extends ChessRules {
     return this.filterValid(this.getPotentialMovesFrom(sq));
   }
 
     return this.filterValid(this.getPotentialMovesFrom(sq));
   }
 
-  static GenRandInitFen(randomness) {
-    let fen = ChessRules.GenRandInitFen(randomness);
+  static GenRandInitFen(options) {
+    let fen = ChessRules.GenRandInitFen(options);
     // Place hidden queens at random (always):
     let hiddenQueenPos = randInt(8);
     let pawnRank = "PPPPPPPP".split("");
     // Place hidden queens at random (always):
     let hiddenQueenPos = randInt(8);
     let pawnRank = "PPPPPPPP".split("");
index 59c20bb..59574f8 100644 (file)
@@ -2,6 +2,7 @@ import { ChessRules } from "@/base_rules";
 
 export class HoppelpoppelRules extends ChessRules {
 
 
 export class HoppelpoppelRules extends ChessRules {
 
+  // TODO: merge with base_rules.js (see also Orda, Empire)
   getSlideNJumpMoves_([x, y], steps, oneStep, options) {
     options = options || {};
     let moves = [];
   getSlideNJumpMoves_([x, y], steps, oneStep, options) {
     options = options || {};
     let moves = [];
@@ -10,7 +11,7 @@ export class HoppelpoppelRules extends ChessRules {
       let j = y + step[1];
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
         if (!options.onlyTake) moves.push(this.getBasicMove([x, y], [i, j]));
       let j = y + step[1];
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
         if (!options.onlyTake) moves.push(this.getBasicMove([x, y], [i, j]));
-        if (!!oneStep) continue outerLoop;
+        if (oneStep) continue outerLoop;
         i += step[0];
         j += step[1];
       }
         i += step[0];
         j += step[1];
       }
@@ -44,21 +45,12 @@ export class HoppelpoppelRules extends ChessRules {
 
   isAttackedByKnight([x, y], color) {
     return super.isAttackedBySlideNJump(
 
   isAttackedByKnight([x, y], color) {
     return super.isAttackedBySlideNJump(
-      [x, y],
-      color,
-      V.KNIGHT,
-      V.steps[V.BISHOP]
-    );
+      [x, y], color, V.KNIGHT, V.steps[V.BISHOP]);
   }
 
   isAttackedByBishop([x, y], color) {
     return super.isAttackedBySlideNJump(
   }
 
   isAttackedByBishop([x, y], color) {
     return super.isAttackedBySlideNJump(
-      [x, y],
-      color,
-      V.BISHOP,
-      V.steps[V.KNIGHT],
-      "oneStep"
-    );
+      [x, y], color, V.BISHOP, V.steps[V.KNIGHT], 1);
   }
 
 };
   }
 
 };
index 33157c9..a54b509 100644 (file)
@@ -2,6 +2,18 @@ import { ChessRules } from "@/base_rules";
 
 export class HordeRules extends ChessRules {
 
 
 export class HordeRules extends ChessRules {
 
+  static get Options() {
+    return {
+      check: [
+        {
+          label: "Random",
+          defaut: false,
+          variable: "random"
+        }
+      ]
+    };
+  }
+
   static get HasFlags() {
     return false;
   }
   static get HasFlags() {
     return false;
   }
@@ -36,9 +48,9 @@ export class HordeRules extends ChessRules {
     return true;
   }
 
     return true;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 2) randomness--;
-    const fen = ChessRules.GenRandInitFen(randomness);
+  static GenRandInitFen(options) {
+    const fen =
+      ChessRules.GenRandInitFen({ randomness: (options.random ? 1 : 0) });
     return (
       // 20 first chars are 3 rows + 3 slashes
       fen.substr(0, 20)
     return (
       // 20 first chars are 3 rows + 3 slashes
       fen.substr(0, 20)
index a429c7c..3b67843 100644 (file)
@@ -23,8 +23,8 @@ export class HypnoticRules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
-    return ChessRules.GenRandInitFen(randomness) + " -";
+  static GenRandInitFen(options) {
+    return ChessRules.GenRandInitFen(options) + " -";
   }
 
   setOtherVariables(fen) {
   }
 
   setOtherVariables(fen) {
@@ -69,7 +69,7 @@ export class HypnoticRules extends ChessRules {
       this.getPiece(x, y) == V.KING
         // No castling with enemy king (...yes, should eat it but...)
         ? super.getSlideNJumpMoves(
       this.getPiece(x, y) == V.KING
         // No castling with enemy king (...yes, should eat it but...)
         ? super.getSlideNJumpMoves(
-          [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), "oneStep")
+          [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1)
         : super.getPotentialMovesFrom([x, y]);
     return moves;
   }
         : super.getPotentialMovesFrom([x, y]);
     return moves;
   }
index 01f82d8..a9c9fba 100644 (file)
@@ -47,8 +47,8 @@ export class IceageRules extends ChessRules {
     return true;
   }
 
     return true;
   }
 
-  static GenRandInitFen(randomness) {
-    return ChessRules.GenRandInitFen(randomness).replace(/8/g, "cccccccc");
+  static GenRandInitFen(options) {
+    return ChessRules.GenRandInitFen(options).replace(/8/g, "cccccccc");
   }
 
   play(move) {
   }
 
   play(move) {
index 1a9cd94..3277c74 100644 (file)
@@ -8,13 +8,13 @@ export class InterweaveRules extends ChessRules {
     return false;
   }
 
     return false;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "rbnkknbr/pppppppp/8/8/8/8/PPPPPPPP/RBNKKNBR w 0 - 000000";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     for (let c of ["w", "b"]) {
       return "rbnkknbr/pppppppp/8/8/8/8/PPPPPPPP/RBNKKNBR w 0 - 000000";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
         pieces['b'] = pieces['w'];
         break;
       }
index aecc8fe..8ede111 100644 (file)
@@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea";
 
 export class JanggiRules extends ChessRules {
 
 
 export class JanggiRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get Monochrome() {
     return true;
   }
   static get Monochrome() {
     return true;
   }
@@ -193,7 +197,7 @@ export class JanggiRules extends ChessRules {
       if (y == 3) steps.push([shiftX, 1]);
       else if (y == 5) steps.push([shiftX, -1]);
     }
       if (y == 3) steps.push([shiftX, 1]);
       else if (y == 5) steps.push([shiftX, -1]);
     }
-    return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+    return super.getSlideNJumpMoves([x, y], steps, 1);
   }
 
   knightStepsFromRookStep(step) {
   }
 
   knightStepsFromRookStep(step) {
@@ -211,7 +215,7 @@ export class JanggiRules extends ChessRules {
           this.knightStepsFromRookStep(rookStep));
       }
     }
           this.knightStepsFromRookStep(rookStep));
       }
     }
-    return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+    return super.getSlideNJumpMoves([x, y], steps, 1);
   }
 
   elephantStepsFromRookStep(step) {
   }
 
   elephantStepsFromRookStep(step) {
@@ -234,7 +238,7 @@ export class JanggiRules extends ChessRules {
         }
       }
     }
         }
       }
     }
-    return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+    return super.getSlideNJumpMoves([x, y], steps, 1);
   }
 
   palacePeopleMoves([x, y]) {
   }
 
   palacePeopleMoves([x, y]) {
@@ -278,7 +282,7 @@ export class JanggiRules extends ChessRules {
       // At the middle: all directions available
       Array.prototype.push.apply(steps, ChessRules.steps[V.BISHOP]);
     }
       // At the middle: all directions available
       Array.prototype.push.apply(steps, ChessRules.steps[V.BISHOP]);
     }
-    return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+    return super.getSlideNJumpMoves([x, y], steps, 1);
   }
 
   getPotentialAdvisorMoves(sq) {
   }
 
   getPotentialAdvisorMoves(sq) {
@@ -310,9 +314,7 @@ export class JanggiRules extends ChessRules {
       // In the middle of a palace: 4 one-diagonal-step to check
       Array.prototype.push.apply(
         moves,
       // In the middle of a palace: 4 one-diagonal-step to check
       Array.prototype.push.apply(
         moves,
-        super.getSlideNJumpMoves([x, y],
-                                 ChessRules.steps[V.BISHOP],
-                                 "oneStep")
+        super.getSlideNJumpMoves([x, y], ChessRules.steps[V.BISHOP], 1)
       );
     }
     return moves;
       );
     }
     return moves;
@@ -391,7 +393,7 @@ export class JanggiRules extends ChessRules {
   isAttackedByPawn([x, y], color) {
     const shiftX = (color == 'w' ? 1 : -1); //shift from king
     if (super.isAttackedBySlideNJump(
   isAttackedByPawn([x, y], color) {
     const shiftX = (color == 'w' ? 1 : -1); //shift from king
     if (super.isAttackedBySlideNJump(
-      [x, y], color, V.PAWN, [[shiftX, 0], [0, 1], [0, -1]], "oneStep")
+      [x, y], color, V.PAWN, [[shiftX, 0], [0, 1], [0, -1]], 1)
     ) {
       return true;
     }
     ) {
       return true;
     }
@@ -428,7 +430,7 @@ export class JanggiRules extends ChessRules {
       }
     }
     return (
       }
     }
     return (
-      super.isAttackedBySlideNJump([x, y], color, V.KNIGHT, steps, "oneStep")
+      super.isAttackedBySlideNJump([x, y], color, V.KNIGHT, steps, 1)
     );
   }
 
     );
   }
 
@@ -450,7 +452,7 @@ export class JanggiRules extends ChessRules {
       }
     }
     return (
       }
     }
     return (
-      super.isAttackedBySlideNJump([x, y], color, V.ELEPHANT, steps, "oneStep")
+      super.isAttackedBySlideNJump([x, y], color, V.ELEPHANT, steps, 1)
     );
   }
 
     );
   }
 
index fd302bb..bc3a7f1 100644 (file)
@@ -11,8 +11,8 @@ export class JokerRules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
-    const antikingFen = Antiking2Rules.GenRandInitFen(randomness);
+  static GenRandInitFen(options) {
+    const antikingFen = Antiking2Rules.GenRandInitFen(options);
     return antikingFen.replace('a', 'J').replace('A', 'j');
   }
 
     return antikingFen.replace('a', 'J').replace('A', 'j');
   }
 
@@ -48,7 +48,7 @@ export class JokerRules extends ChessRules {
 
   getPotentialJokerMoves([x, y]) {
     const moving =
 
   getPotentialJokerMoves([x, y]) {
     const moving =
-      super.getSlideNJumpMoves([x, y], V.steps[V.KNIGHT], "oneStep")
+      super.getSlideNJumpMoves([x, y], V.steps[V.KNIGHT], 1)
       .concat(super.getSlideNJumpMoves([x, y],
         V.steps[V.ROOK].concat(V.steps[V.BISHOP])));
     let swapping = [];
       .concat(super.getSlideNJumpMoves([x, y],
         V.steps[V.ROOK].concat(V.steps[V.BISHOP])));
     let swapping = [];
index 80e7005..7946d6a 100644 (file)
@@ -14,8 +14,8 @@ export class Knightmate1Rules extends ChessRules {
     return ([V.KING, V.COMMONER].includes(b[1]) ? "Knightmate/" : "") + b;
   }
 
     return ([V.KING, V.COMMONER].includes(b[1]) ? "Knightmate/" : "") + b;
   }
 
-  static GenRandInitFen(randomness) {
-    return ChessRules.GenRandInitFen(randomness)
+  static GenRandInitFen(options) {
+    return ChessRules.GenRandInitFen(options)
       .replace(/n/g, 'c').replace(/N/g, 'C');
   }
 
       .replace(/n/g, 'c').replace(/N/g, 'C');
   }
 
@@ -30,10 +30,7 @@ export class Knightmate1Rules extends ChessRules {
 
   getPotentialCommonerMoves(sq) {
     return this.getSlideNJumpMoves(
 
   getPotentialCommonerMoves(sq) {
     return this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   getPotentialKingMoves(sq) {
   }
 
   getPotentialKingMoves(sq) {
@@ -53,22 +50,12 @@ export class Knightmate1Rules extends ChessRules {
 
   isAttackedByKing(sq, color) {
     return this.isAttackedBySlideNJump(
 
   isAttackedByKing(sq, color) {
     return this.isAttackedBySlideNJump(
-      sq,
-      color,
-      V.KING,
-      V.steps[V.KNIGHT],
-      "oneStep"
-    );
+      sq, color, V.KING, V.steps[V.KNIGHT], 1);
   }
 
   isAttackedByCommoner(sq, color) {
     return this.isAttackedBySlideNJump(
   }
 
   isAttackedByCommoner(sq, color) {
     return this.isAttackedBySlideNJump(
-      sq,
-      color,
-      V.COMMONER,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      sq, color, V.COMMONER, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   static get VALUES() {
   }
 
   static get VALUES() {
index 3630b5c..bbdd12d 100644 (file)
@@ -43,9 +43,9 @@ export class Knightmate2Rules extends ChessRules {
 
   scanKings() {}
 
 
   scanKings() {}
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     return (
     return (
-      ChessRules.GenRandInitFen(randomness)
+      ChessRules.GenRandInitFen(options)
       .replace(/k/g, 'c').replace(/K/g, 'C')
       .replace(/n/g, 'k').replace(/N/g, 'K')
     );
       .replace(/k/g, 'c').replace(/K/g, 'C')
       .replace(/n/g, 'k').replace(/N/g, 'K')
     );
@@ -62,10 +62,7 @@ export class Knightmate2Rules extends ChessRules {
 
   getPotentialCommonerMoves(sq) {
     return this.getSlideNJumpMoves(
 
   getPotentialCommonerMoves(sq) {
     return this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   getPotentialKingMoves(sq) {
   }
 
   getPotentialKingMoves(sq) {
@@ -85,22 +82,12 @@ export class Knightmate2Rules extends ChessRules {
 
   isAttackedByKing(sq, color) {
     return this.isAttackedBySlideNJump(
 
   isAttackedByKing(sq, color) {
     return this.isAttackedBySlideNJump(
-      sq,
-      color,
-      V.KING,
-      V.steps[V.KNIGHT],
-      "oneStep"
-    );
+      sq, color, V.KING, V.steps[V.KNIGHT], 1);
   }
 
   isAttackedByCommoner(sq, color) {
     return this.isAttackedBySlideNJump(
   }
 
   isAttackedByCommoner(sq, color) {
     return this.isAttackedBySlideNJump(
-      sq,
-      color,
-      V.COMMONER,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      sq, color, V.COMMONER, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   postPlay() {}
   }
 
   postPlay() {}
index c8c1cea..bf3e773 100644 (file)
@@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules";
 
 export class KnightpawnsRules extends ChessRules {
 
 
 export class KnightpawnsRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get PawnSpecs() {
     return Object.assign(
       {},
   static get PawnSpecs() {
     return Object.assign(
       {},
index 8031181..7931347 100644 (file)
@@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea";
 
 export class KonaneRules extends ChessRules {
 
 
 export class KonaneRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
   static get HasFlags() {
     return false;
   }
index a624eeb..38b3e88 100644 (file)
@@ -216,9 +216,7 @@ export class KoopaRules extends ChessRules {
   getPotentialKingMoves(sq) {
     return (
       this.getSlideNJumpMoves(
   getPotentialKingMoves(sq) {
     return (
       this.getSlideNJumpMoves(
-        sq,
-        V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-        "oneStep"
+        sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1
       ).concat(super.getCastleMoves(sq, null, true, ['r']))
     );
   }
       ).concat(super.getCastleMoves(sq, null, true, ['r']))
     );
   }
index f0db510..e16d78f 100644 (file)
@@ -25,8 +25,8 @@ export class MadrasiRules extends ChessRules {
         steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
         break;
     }
         steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
         break;
     }
-    return super.isAttackedBySlideNJump(
-      sq, oppCol, piece, steps, [V.KING, V.PAWN, V.KNIGHT].includes(piece))
+    const nbSteps = [V.KING, V.PAWN, V.KNIGHT].includes(piece) ? 1 : null;
+    return super.isAttackedBySlideNJump(sq, oppCol, piece, steps, nbSteps);
   }
 
   getPotentialMovesFrom([x, y]) {
   }
 
   getPotentialMovesFrom([x, y]) {
index a49828b..65523e7 100644 (file)
@@ -2,6 +2,18 @@ import { ChessRules } from "@/base_rules";
 
 export class MaharajahRules extends ChessRules {
 
 
 export class MaharajahRules extends ChessRules {
 
+  static get Options() {
+    return {
+      check: [
+        {
+          label: "Random",
+          defaut: false,
+          variable: "random"
+        }
+      ]
+    };
+  }
+
   static get HasEnpassant() {
     return false;
   }
   static get HasEnpassant() {
     return false;
   }
@@ -84,9 +96,10 @@ export class MaharajahRules extends ChessRules {
     }
   }
 
     }
   }
 
-  static GenRandInitFen(randomness) {
-    const sFen = ChessRules.GenRandInitFen(Math.max(randomness, 1));
-    return "3mm3/8/" + sFen.substring(18, 50);
+  static GenRandInitFen(options) {
+    const baseFen = ChessRules.GenRandInitFen(
+      { randomness: (options.random ? 1 : 0) });
+    return "3mm3/8/" + baseFen.substring(18, 50);
   }
 
   getFlagsFen() {
   }
 
   getFlagsFen() {
@@ -108,7 +121,7 @@ export class MaharajahRules extends ChessRules {
     let moves = super.getPotentialQueenMoves(sq);
     moves = moves.concat(super.getPotentialKnightMoves(sq));
     const otherJumpMoves =
     let moves = super.getPotentialQueenMoves(sq);
     moves = moves.concat(super.getPotentialKnightMoves(sq));
     const otherJumpMoves =
-      super.getSlideNJumpMoves(sq, V.M_EXTRA_STEPS, "oneStep")
+      super.getSlideNJumpMoves(sq, V.M_EXTRA_STEPS, 1)
       .filter(m =>
         moves.every(mv => mv.end.x != m.end.x || mv.end.y != m.end.y));
     return moves.concat(otherJumpMoves);
       .filter(m =>
         moves.every(mv => mv.end.x != m.end.x || mv.end.y != m.end.y));
     return moves.concat(otherJumpMoves);
index 75fb1da..b721273 100644 (file)
@@ -36,13 +36,13 @@ export class MakrukRules extends ChessRules {
     return 'f';
   }
 
     return 'f';
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "rnbqkbnr/8/pppppppp/8/8/PPPPPPPP/8/RNBKQBNR w 0";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     for (let c of ["w", "b"]) {
       return "rnbqkbnr/8/pppppppp/8/8/PPPPPPPP/8/RNBKQBNR w 0";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
         pieces['b'] = pieces['w'];
         break;
       }
@@ -95,18 +95,11 @@ export class MakrukRules extends ChessRules {
   getPotentialBishopMoves(sq) {
     const forward = (this.turn == 'w' ? -1 : 1);
     return this.getSlideNJumpMoves(
   getPotentialBishopMoves(sq) {
     const forward = (this.turn == 'w' ? -1 : 1);
     return this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.BISHOP].concat([ [forward, 0] ]),
-      "oneStep"
-    );
+      sq, V.steps[V.BISHOP].concat([ [forward, 0] ]), 1);
   }
 
   getPotentialQueenMoves(sq) {
   }
 
   getPotentialQueenMoves(sq) {
-    return this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.BISHOP],
-      "oneStep"
-    );
+    return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1);
   }
 
   isAttacked(sq, color) {
   }
 
   isAttacked(sq, color) {
@@ -118,32 +111,17 @@ export class MakrukRules extends ChessRules {
   isAttackedByBishop(sq, color) {
     const forward = (color == 'w' ? 1 : -1);
     return this.isAttackedBySlideNJump(
   isAttackedByBishop(sq, color) {
     const forward = (color == 'w' ? 1 : -1);
     return this.isAttackedBySlideNJump(
-      sq,
-      color,
-      V.BISHOP,
-      V.steps[V.BISHOP].concat([ [forward, 0] ]),
-      "oneStep"
-    );
+      sq, color, V.BISHOP, V.steps[V.BISHOP].concat([ [forward, 0] ]), 1);
   }
 
   isAttackedByQueen(sq, color) {
     return this.isAttackedBySlideNJump(
   }
 
   isAttackedByQueen(sq, color) {
     return this.isAttackedBySlideNJump(
-      sq,
-      color,
-      V.QUEEN,
-      V.steps[V.BISHOP],
-      "oneStep"
-    );
+      sq, color, V.QUEEN, V.steps[V.BISHOP], 1);
   }
 
   isAttackedByPromoted(sq, color) {
     return super.isAttackedBySlideNJump(
   }
 
   isAttackedByPromoted(sq, color) {
     return super.isAttackedBySlideNJump(
-      sq,
-      color,
-      V.PROMOTED,
-      V.steps[V.BISHOP],
-      "oneStep"
-    );
+      sq, color, V.PROMOTED, V.steps[V.BISHOP], 1);
   }
 
   static get VALUES() {
   }
 
   static get VALUES() {
index 05df0bd..df781b9 100644 (file)
@@ -4,6 +4,10 @@ import { shuffle } from "@/utils/alea";
 
 export class MaximaRules extends ChessRules {
 
 
 export class MaximaRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
   static get HasFlags() {
     return false;
   }
@@ -192,7 +196,7 @@ export class MaximaRules extends ChessRules {
       if (piece == V.KING) j = j % V.size.y;
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
         moves.push(this.getBasicMove(initSquare, [i, j]));
       if (piece == V.KING) j = j % V.size.y;
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
         moves.push(this.getBasicMove(initSquare, [i, j]));
-        if (!!oneStep) continue outerLoop;
+        if (oneStep) continue outerLoop;
         i += step[0];
         j += step[1];
       }
         i += step[0];
         j += step[1];
       }
@@ -450,14 +454,8 @@ export class MaximaRules extends ChessRules {
   }
 
   getPotentialGuardMoves(sq) {
   }
 
   getPotentialGuardMoves(sq) {
-    return (
-      this.getSlideNJumpMoves(
-        sq,
-        V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-        "oneStep",
-        null
-      )
-    );
+    return this.getSlideNJumpMoves(
+      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), "oneStep");
   }
 
   getNextMageSteps(step) {
   }
 
   getNextMageSteps(step) {
@@ -679,15 +677,8 @@ export class MaximaRules extends ChessRules {
   }
 
   isAttackedByGuard(sq, color) {
   }
 
   isAttackedByGuard(sq, color) {
-    return (
-      super.isAttackedBySlideNJump(
-        sq,
-        color,
-        V.GUARD,
-        V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-        "oneStep"
-      )
-    );
+    return super.isAttackedBySlideNJump(
+      sq, color, V.GUARD, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   getNextMageCheck(step) {
   }
 
   getNextMageCheck(step) {
index ec40b48..c522e73 100644 (file)
@@ -36,8 +36,8 @@ export class MesmerRules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
-    const antikingFen = Antiking2Rules.GenRandInitFen(randomness);
+  static GenRandInitFen(options) {
+    const antikingFen = Antiking2Rules.GenRandInitFen(options);
     return antikingFen.replace('a', 'M').replace('A', 'm') + " -";
   }
 
     return antikingFen.replace('a', 'M').replace('A', 'm') + " -";
   }
 
@@ -113,7 +113,7 @@ export class MesmerRules extends ChessRules {
       piece == V.KING
         // No castling with enemy king (...yes, should eat it but...)
         ? super.getSlideNJumpMoves(
       piece == V.KING
         // No castling with enemy king (...yes, should eat it but...)
         ? super.getSlideNJumpMoves(
-          [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), "oneStep")
+          [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1)
         : super.getPotentialMovesFrom([x, y]);
     return moves;
   }
         : super.getPotentialMovesFrom([x, y]);
     return moves;
   }
index fc1d164..d8f6ebb 100644 (file)
@@ -39,7 +39,7 @@ export class MinixiangqiRules extends XiangqiRules {
     if (!lastRank) steps.push([shiftX, 0]);
     if (y > 0) steps.push([0, -1]);
     if (y < 9) steps.push([0, 1]);
     if (!lastRank) steps.push([shiftX, 0]);
     if (y > 0) steps.push([0, -1]);
     if (y < 9) steps.push([0, 1]);
-    return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+    return super.getSlideNJumpMoves([x, y], steps, 1);
   }
 
   insidePalace(x, y, c) {
   }
 
   insidePalace(x, y, c) {
index 1e26369..1478f48 100644 (file)
@@ -156,9 +156,9 @@ export class MonocolorRules extends ChessRules {
     return "1/2";
   }
 
     return "1/2";
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     // Remove the en-passant + castle part of the FEN
     // Remove the en-passant + castle part of the FEN
-    let fen = ChessRules.GenRandInitFen(randomness).slice(0, -6);
+    let fen = ChessRules.GenRandInitFen(options).slice(0, -6);
     // Replace kings with queens
     fen = fen.replace("k", "q").replace("K", "Q");
     // Move pawns up:
     // Replace kings with queens
     fen = fen.replace("k", "q").replace("K", "Q");
     // Move pawns up:
index cb29ada..bbba319 100644 (file)
@@ -3,21 +3,53 @@ import { randInt } from "@/utils/alea";
 
 export class MonsterRules extends ChessRules {
 
 
 export class MonsterRules extends ChessRules {
 
+  static get Options() {
+    return {
+      check: [
+        {
+          label: "Random",
+          defaut: false,
+          variable: "random"
+        }
+      ],
+      select: [
+        {
+          label: "Number of pawns",
+          variable: "pawnsCount",
+          defaut: 4,
+          options: [
+            { label: "Two", value: 2 },
+            { label: "Four", value: 4 },
+            { label: "Six", value: 6 }
+          ]
+        }
+      ]
+    };
+  }
+
+  static AbbreviateOptions(opts) {
+    return opts["pawnsCount"];
+  }
+
   static IsGoodFlags(flags) {
     // Only black can castle
     return !!flags.match(/^[a-z]{2,2}$/);
   }
 
   static IsGoodFlags(flags) {
     // Only black can castle
     return !!flags.match(/^[a-z]{2,2}$/);
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 2) randomness--;
-    const fen = ChessRules.GenRandInitFen(randomness);
+  static GenRandInitFen(options) {
+    const baseFen = ChessRules.GenRandInitFen(
+      { randomness: (options.random ? 1 : 0) });
+    let pawnsLine = "";
+    switch (options.pawnsCount) {
+      case 2: pawnsLine = "3PP3"; break;
+      case 4: pawnsLine = "2PPPP2"; break;
+      case 6: pawnsLine = "1PPPPPP1"; break;
+    }
     return (
       // 26 first chars are 6 rows + 6 slashes
     return (
       // 26 first chars are 6 rows + 6 slashes
-      fen.substr(0, 26)
+      baseFen.substr(0, 26) + pawnsLine + "/4K3 w 0 " +
       // En passant available, and "half-castle"
       // En passant available, and "half-castle"
-      .concat("1PPPPPP1/4K3 w 0 ")
-      .concat(fen.substr(-6, 2))
-      .concat(" -")
+      baseFen.substr(-6, 2) + " -"
     );
   }
 
     );
   }
 
@@ -40,10 +72,7 @@ export class MonsterRules extends ChessRules {
     if (this.getColor(x, y) == 'b') return super.getPotentialKingMoves([x, y]);
     // White doesn't castle:
     return this.getSlideNJumpMoves(
     if (this.getColor(x, y) == 'b') return super.getPotentialKingMoves([x, y]);
     // White doesn't castle:
     return this.getSlideNJumpMoves(
-      [x, y],
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   isAttacked() {
   }
 
   isAttacked() {
index 14ba919..e10457f 100644 (file)
@@ -323,31 +323,6 @@ export class MusketeerRules extends ChessRules {
     return moves;
   }
 
     return moves;
   }
 
-  getSlideNJumpMoves([x, y], steps, nbSteps) {
-    let moves = [];
-    outerLoop: for (let step of steps) {
-      let i = x + step[0];
-      let j = y + step[1];
-      let stepCounter = 0;
-      while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
-        moves.push(this.getBasicMove([x, y], [i, j]));
-        stepCounter++;
-        if (
-          !!nbSteps &&
-          // Next condition to remain compatible with super method
-          (stepCounter >= nbSteps || isNaN(parseInt(nbSteps, 10)))
-        ) {
-          continue outerLoop;
-        }
-        i += step[0];
-        j += step[1];
-      }
-      if (V.OnBoard(i, j) && this.canTake([x, y], [i, j]))
-        moves.push(this.getBasicMove([x, y], [i, j]));
-    }
-    return moves;
-  }
-
   // All types of leaps used here:
   static get Leap2Ortho() {
     return [ [-2, 0], [0, -2], [2, 0], [0, 2] ];
   // All types of leaps used here:
   static get Leap2Ortho() {
     return [ [-2, 0], [0, -2], [2, 0], [0, 2] ];
@@ -385,13 +360,13 @@ export class MusketeerRules extends ChessRules {
     const steps =
       V.steps[V.ROOK].concat(V.steps[V.BISHOP])
       .concat(V.Leap2Ortho).concat(V.HorizontalKnight);
     const steps =
       V.steps[V.ROOK].concat(V.steps[V.BISHOP])
       .concat(V.Leap2Ortho).concat(V.HorizontalKnight);
-    return super.getSlideNJumpMoves(sq, steps, "oneStep");
+    return super.getSlideNJumpMoves(sq, steps, 1);
   }
 
   getPotentialUnicornMoves(sq) {
     return (
       super.getPotentialKnightMoves(sq)
   }
 
   getPotentialUnicornMoves(sq) {
     return (
       super.getPotentialKnightMoves(sq)
-      .concat(super.getSlideNJumpMoves(sq, V.CamelSteps, "oneStep"))
+      .concat(super.getSlideNJumpMoves(sq, V.CamelSteps, 1))
     );
   }
 
     );
   }
 
@@ -400,20 +375,20 @@ export class MusketeerRules extends ChessRules {
       V.steps[V.ROOK].concat(V.steps[V.BISHOP])
       .concat(V.Leap2Ortho)
       .concat(V.Leap2Diago);
       V.steps[V.ROOK].concat(V.steps[V.BISHOP])
       .concat(V.Leap2Ortho)
       .concat(V.Leap2Diago);
-    return super.getSlideNJumpMoves(sq, steps, "oneStep");
+    return super.getSlideNJumpMoves(sq, steps, 1);
   }
 
   getPotentialHawkMoves(sq) {
     const steps =
       V.Leap2Ortho.concat(V.Leap2Diago)
       .concat(V.Leap3Ortho).concat(V.Leap3Diago);
   }
 
   getPotentialHawkMoves(sq) {
     const steps =
       V.Leap2Ortho.concat(V.Leap2Diago)
       .concat(V.Leap3Ortho).concat(V.Leap3Diago);
-    return super.getSlideNJumpMoves(sq, steps, "oneStep");
+    return super.getSlideNJumpMoves(sq, steps, 1);
   }
 
   getPotentialFortressMoves(sq) {
     const steps = V.Leap2Ortho.concat(V.VerticalKnight)
     return (
   }
 
   getPotentialFortressMoves(sq) {
     const steps = V.Leap2Ortho.concat(V.VerticalKnight)
     return (
-      super.getSlideNJumpMoves(sq, steps, "oneStep")
+      super.getSlideNJumpMoves(sq, steps, 1)
       .concat(this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 3))
     );
   }
       .concat(this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 3))
     );
   }
@@ -421,7 +396,7 @@ export class MusketeerRules extends ChessRules {
   getPotentialSpiderMoves(sq) {
     const steps = V.Leap2Ortho.concat(V.steps[V.KNIGHT])
     return (
   getPotentialSpiderMoves(sq) {
     const steps = V.Leap2Ortho.concat(V.steps[V.KNIGHT])
     return (
-      super.getSlideNJumpMoves(sq, steps, "oneStep")
+      super.getSlideNJumpMoves(sq, steps, 1)
       .concat(this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 2))
     );
   }
       .concat(this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 2))
     );
   }
@@ -496,37 +471,10 @@ export class MusketeerRules extends ChessRules {
     return false;
   }
 
     return false;
   }
 
-  // Modify because of the limiyted steps options of some of the pieces here
-  isAttackedBySlideNJump([x, y], color, piece, steps, nbSteps) {
-    if (!!nbSteps && isNaN(parseInt(nbSteps, 10))) nbSteps = 1;
-    for (let step of steps) {
-      let rx = x + step[0],
-          ry = y + step[1];
-      let stepCounter = 1;
-      while (
-        V.OnBoard(rx, ry) && this.board[rx][ry] == V.EMPTY &&
-        (!nbSteps || stepCounter < nbSteps)
-      ) {
-        rx += step[0];
-        ry += step[1];
-        stepCounter++;
-      }
-      if (
-        V.OnBoard(rx, ry) &&
-        this.board[rx][ry] != V.EMPTY &&
-        this.getPiece(rx, ry) == piece &&
-        this.getColor(rx, ry) == color
-      ) {
-        return true;
-      }
-    }
-    return false;
-  }
-
   isAttackedByLeopard(sq, color) {
     return (
       super.isAttackedBySlideNJump(
   isAttackedByLeopard(sq, color) {
     return (
       super.isAttackedBySlideNJump(
-        sq, color, V.LEOPARD, V.steps[V.KNIGHT], "oneStep") ||
+        sq, color, V.LEOPARD, V.steps[V.KNIGHT], 1) ||
       this.isAttackedBySlideNJump(sq, color, V.LEOPARD, V.steps[V.BISHOP], 2)
     );
   }
       this.isAttackedBySlideNJump(sq, color, V.LEOPARD, V.steps[V.BISHOP], 2)
     );
   }
@@ -535,13 +483,13 @@ export class MusketeerRules extends ChessRules {
     const steps =
       V.steps[V.ROOK].concat(V.steps[V.BISHOP])
       .concat(V.Leap2Ortho).concat(V.HorizontalKnight);
     const steps =
       V.steps[V.ROOK].concat(V.steps[V.BISHOP])
       .concat(V.Leap2Ortho).concat(V.HorizontalKnight);
-    return super.isAttackedBySlideNJump(sq, color, V.CANNON, steps, "oneStep");
+    return super.isAttackedBySlideNJump(sq, color, V.CANNON, steps, 1);
   }
 
   isAttackedByUnicorn(sq, color) {
     const steps = V.steps[V.KNIGHT].concat(V.CamelSteps)
     return (
   }
 
   isAttackedByUnicorn(sq, color) {
     const steps = V.steps[V.KNIGHT].concat(V.CamelSteps)
     return (
-      super.isAttackedBySlideNJump(sq, color, V.UNICORN, steps, "oneStep")
+      super.isAttackedBySlideNJump(sq, color, V.UNICORN, steps, 1)
     );
   }
 
     );
   }
 
@@ -551,7 +499,7 @@ export class MusketeerRules extends ChessRules {
       .concat(V.Leap2Ortho)
       .concat(V.Leap2Diago);
     return (
       .concat(V.Leap2Ortho)
       .concat(V.Leap2Diago);
     return (
-      super.isAttackedBySlideNJump(sq, color, V.ELEPHANT, steps, "oneStep")
+      super.isAttackedBySlideNJump(sq, color, V.ELEPHANT, steps, 1)
     );
   }
 
     );
   }
 
@@ -559,13 +507,13 @@ export class MusketeerRules extends ChessRules {
     const steps =
       V.Leap2Ortho.concat(V.Leap2Diago)
       .concat(V.Leap3Ortho).concat(V.Leap3Diago);
     const steps =
       V.Leap2Ortho.concat(V.Leap2Diago)
       .concat(V.Leap3Ortho).concat(V.Leap3Diago);
-    return super.isAttackedBySlideNJump(sq, color, V.HAWK, steps, "oneStep");
+    return super.isAttackedBySlideNJump(sq, color, V.HAWK, steps, 1);
   }
 
   isAttackedByFortress(sq, color) {
     const steps = V.Leap2Ortho.concat(V.VerticalKnight)
     return (
   }
 
   isAttackedByFortress(sq, color) {
     const steps = V.Leap2Ortho.concat(V.VerticalKnight)
     return (
-      super.isAttackedBySlideNJump(sq, color, V.FORTRESS, steps, "oneStep") ||
+      super.isAttackedBySlideNJump(sq, color, V.FORTRESS, steps, 1) ||
       this.isAttackedBySlideNJump(sq, color, V.FORTRESS, V.steps[V.BISHOP], 3)
     );
   }
       this.isAttackedBySlideNJump(sq, color, V.FORTRESS, V.steps[V.BISHOP], 3)
     );
   }
@@ -573,7 +521,7 @@ export class MusketeerRules extends ChessRules {
   isAttackedBySpider(sq, color) {
     const steps = V.Leap2Ortho.concat(V.steps[V.KNIGHT])
     return (
   isAttackedBySpider(sq, color) {
     const steps = V.Leap2Ortho.concat(V.steps[V.KNIGHT])
     return (
-      super.isAttackedBySlideNJump(sq, color, V.SPIDER, steps, "oneStep") ||
+      super.isAttackedBySlideNJump(sq, color, V.SPIDER, steps, 1) ||
       this.isAttackedBySlideNJump(sq, color, V.SPIDER, V.steps[V.BISHOP], 2)
     );
   }
       this.isAttackedBySlideNJump(sq, color, V.SPIDER, V.steps[V.BISHOP], 2)
     );
   }
index eb7d625..3d78cba 100644 (file)
@@ -3,6 +3,7 @@ import { ChessRules } from "@/base_rules";
 // NOTE: a lot copy-pasted from Hoppelpoppel
 export class NewzealandRules extends ChessRules {
 
 // NOTE: a lot copy-pasted from Hoppelpoppel
 export class NewzealandRules extends ChessRules {
 
+  // TODO: merge with base_rules.js
   getSlideNJumpMoves_([x, y], steps, oneStep, options) {
     options = options || {};
     let moves = [];
   getSlideNJumpMoves_([x, y], steps, oneStep, options) {
     options = options || {};
     let moves = [];
@@ -11,7 +12,7 @@ export class NewzealandRules extends ChessRules {
       let j = y + step[1];
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
         if (!options.onlyTake) moves.push(this.getBasicMove([x, y], [i, j]));
       let j = y + step[1];
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
         if (!options.onlyTake) moves.push(this.getBasicMove([x, y], [i, j]));
-        if (!!oneStep) continue outerLoop;
+        if (oneStep) continue outerLoop;
         i += step[0];
         j += step[1];
       }
         i += step[0];
         j += step[1];
       }
@@ -45,21 +46,12 @@ export class NewzealandRules extends ChessRules {
 
   isAttackedByKnight([x, y], color) {
     return super.isAttackedBySlideNJump(
 
   isAttackedByKnight([x, y], color) {
     return super.isAttackedBySlideNJump(
-      [x, y],
-      color,
-      V.KNIGHT,
-      V.steps[V.ROOK]
-    );
+      [x, y], color, V.KNIGHT, V.steps[V.ROOK]);
   }
 
   isAttackedByRook([x, y], color) {
     return super.isAttackedBySlideNJump(
   }
 
   isAttackedByRook([x, y], color) {
     return super.isAttackedBySlideNJump(
-      [x, y],
-      color,
-      V.ROOK,
-      V.steps[V.KNIGHT],
-      "oneStep"
-    );
+      [x, y], color, V.ROOK, V.steps[V.KNIGHT], 1);
   }
 
 };
   }
 
 };
index a688a2e..29b58e5 100644 (file)
@@ -140,8 +140,8 @@ export class OmegaRules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0) {
+  static GenRandInitFen(options) {
+    if (options.randomness == 0) {
       return (
         "wxxxxxxxxxxw/xcrnbqkbnrcx/xppppppppppx/x91x/x91x/x91x/" +
         "x91x/x91x/x91x/xPPPPPPPPPPx/xCRNBQKBNRCx/WxxxxxxxxxxW " +
       return (
         "wxxxxxxxxxxw/xcrnbqkbnrcx/xppppppppppx/x91x/x91x/x91x/" +
         "x91x/x91x/x91x/xPPPPPPPPPPx/xCRNBQKBNRCx/WxxxxxxxxxxW " +
@@ -153,7 +153,7 @@ export class OmegaRules extends ChessRules {
     let flags = "";
     // Shuffle pieces on first (and last rank if randomness == 2)
     for (let c of ["w", "b"]) {
     let flags = "";
     // Shuffle pieces on first (and last rank if randomness == 2)
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         flags += flags;
         break;
         pieces['b'] = pieces['w'];
         flags += flags;
         break;
@@ -320,11 +320,11 @@ export class OmegaRules extends ChessRules {
   }
 
   getPotentialChampionMoves(sq) {
   }
 
   getPotentialChampionMoves(sq) {
-    return this.getSlideNJumpMoves(sq, V.steps[V.CHAMPION], "oneStep");
+    return this.getSlideNJumpMoves(sq, V.steps[V.CHAMPION], 1);
   }
 
   getPotentialWizardMoves(sq) {
   }
 
   getPotentialWizardMoves(sq) {
-    return this.getSlideNJumpMoves(sq, V.steps[V.WIZARD], "oneStep");
+    return this.getSlideNJumpMoves(sq, V.steps[V.WIZARD], 1);
   }
 
   getCastleMoves([x, y]) {
   }
 
   getCastleMoves([x, y]) {
@@ -346,14 +346,14 @@ export class OmegaRules extends ChessRules {
   isAttackedByWizard(sq, color) {
     return (
       this.isAttackedBySlideNJump(
   isAttackedByWizard(sq, color) {
     return (
       this.isAttackedBySlideNJump(
-        sq, color, V.WIZARD, V.steps[V.WIZARD], "oneStep")
+        sq, color, V.WIZARD, V.steps[V.WIZARD], 1)
     );
   }
 
   isAttackedByChampion(sq, color) {
     return (
       this.isAttackedBySlideNJump(
     );
   }
 
   isAttackedByChampion(sq, color) {
     return (
       this.isAttackedBySlideNJump(
-        sq, color, V.CHAMPION, V.steps[V.CHAMPION], "oneStep")
+        sq, color, V.CHAMPION, V.steps[V.CHAMPION], 1)
     );
   }
 
     );
   }
 
index 1fd5c1d..4bca549 100644 (file)
@@ -24,8 +24,8 @@ export class OrdaRules extends ChessRules {
     return b;
   }
 
     return b;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "lhaykahl/8/pppppppp/8/8/8/PPPPPPPP/RNBQKBNR w 0 ah -";
 
     // Mapping kingdom --> horde:
       return "lhaykahl/8/pppppppp/8/8/8/PPPPPPPP/RNBQKBNR w 0 ah -";
 
     // Mapping kingdom --> horde:
@@ -37,7 +37,7 @@ export class OrdaRules extends ChessRules {
       'k': 'k'
     };
 
       'k': 'k'
     };
 
-    const baseFen = ChessRules.GenRandInitFen(randomness);
+    const baseFen = ChessRules.GenRandInitFen(options);
     return (
       baseFen.substr(0, 8).split('').map(p => piecesMap[p]).join('') +
       // Skip 3 first rows + black castle flags
     return (
       baseFen.substr(0, 8).split('').map(p => piecesMap[p]).join('') +
       // Skip 3 first rows + black castle flags
@@ -89,6 +89,7 @@ export class OrdaRules extends ChessRules {
     return [];
   }
 
     return [];
   }
 
+  // TODO: merge this extension into base_rules.js
   getSlideNJumpMoves([x, y], steps, oneStep, options) {
     options = options || {};
     let moves = [];
   getSlideNJumpMoves([x, y], steps, oneStep, options) {
     options = options || {};
     let moves = [];
@@ -97,7 +98,7 @@ export class OrdaRules extends ChessRules {
       let j = y + step[1];
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
         if (!options.onlyTake) moves.push(this.getBasicMove([x, y], [i, j]));
       let j = y + step[1];
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
         if (!options.onlyTake) moves.push(this.getBasicMove([x, y], [i, j]));
-        if (!!oneStep) continue outerLoop;
+        if (oneStep) continue outerLoop;
         i += step[0];
         j += step[1];
       }
         i += step[0];
         j += step[1];
       }
@@ -109,60 +110,36 @@ export class OrdaRules extends ChessRules {
 
   getPotentialLancerMoves(sq) {
     const onlyMoves = this.getSlideNJumpMoves(
 
   getPotentialLancerMoves(sq) {
     const onlyMoves = this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.KNIGHT],
-      "oneStep",
-      { onlyMove: true }
-    );
+      sq, V.steps[V.KNIGHT], "oneStep", { onlyMove: true });
     const onlyTakes = this.getSlideNJumpMoves(
     const onlyTakes = this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.ROOK],
-      null,
-      { onlyTake: true }
-    );
+      sq, V.steps[V.ROOK], null, { onlyTake: true });
     return onlyMoves.concat(onlyTakes);
   }
 
   getPotentialArcherMoves(sq) {
     const onlyMoves = this.getSlideNJumpMoves(
     return onlyMoves.concat(onlyTakes);
   }
 
   getPotentialArcherMoves(sq) {
     const onlyMoves = this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.KNIGHT],
-      "oneStep",
-      { onlyMove: true }
-    );
+      sq, V.steps[V.KNIGHT], "oneStep", { onlyMove: true });
     const onlyTakes = this.getSlideNJumpMoves(
     const onlyTakes = this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.BISHOP],
-      null,
-      { onlyTake: true }
-    );
+      sq, V.steps[V.BISHOP], null, { onlyTake: true });
     return onlyMoves.concat(onlyTakes);
   }
 
   getPotentialKheshigMoves(sq) {
     return onlyMoves.concat(onlyTakes);
   }
 
   getPotentialKheshigMoves(sq) {
-    return super.getSlideNJumpMoves(
-      sq,
-      V.steps[V.KNIGHT].concat(V.steps[V.ROOK]).concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+    const steps =
+      V.steps[V.KNIGHT].concat(V.steps[V.ROOK]).concat(V.steps[V.BISHOP]);
+    return super.getSlideNJumpMoves(sq, steps, 1);
   }
 
   getPotentialYurtMoves(sq) {
     return super.getSlideNJumpMoves(
   }
 
   getPotentialYurtMoves(sq) {
     return super.getSlideNJumpMoves(
-      sq,
-      V.steps[V.BISHOP].concat([ [1, 0] ]),
-      "oneStep"
-    );
+      sq, V.steps[V.BISHOP].concat([ [1, 0] ]), 1);
   }
 
   getPotentialKingMoves([x, y]) {
     if (this.getColor(x, y) == 'w') return super.getPotentialKingMoves([x, y]);
     // Horde doesn't castle:
     return super.getSlideNJumpMoves(
   }
 
   getPotentialKingMoves([x, y]) {
     if (this.getColor(x, y) == 'w') return super.getPotentialKingMoves([x, y]);
     // Horde doesn't castle:
     return super.getSlideNJumpMoves(
-      [x, y],
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   isAttacked(sq, color) {
   }
 
   isAttacked(sq, color) {
@@ -193,23 +170,14 @@ export class OrdaRules extends ChessRules {
   }
 
   isAttackedByKheshig(sq, color) {
   }
 
   isAttackedByKheshig(sq, color) {
-    return super.isAttackedBySlideNJump(
-      sq,
-      color,
-      V.KHESHIG,
-      V.steps[V.KNIGHT].concat(V.steps[V.ROOK]).concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+    const steps =
+      V.steps[V.KNIGHT].concat(V.steps[V.ROOK]).concat(V.steps[V.BISHOP]);
+    return super.isAttackedBySlideNJump(sq, color, V.KHESHIG, steps, 1);
   }
 
   isAttackedByYurt(sq, color) {
     return super.isAttackedBySlideNJump(
   }
 
   isAttackedByYurt(sq, color) {
     return super.isAttackedBySlideNJump(
-      sq,
-      color,
-      V.YURT,
-      V.steps[V.BISHOP].concat([ [1, 0] ]),
-      "oneStep"
-    );
+      sq, color, V.YURT, V.steps[V.BISHOP].concat([ [1, 0] ]), 1);
   }
 
   updateCastleFlags(move, piece) {
   }
 
   updateCastleFlags(move, piece) {
index 8176b95..21aebaa 100644 (file)
@@ -25,14 +25,14 @@ export class OrdamirrorRules extends OrdaRules {
     return "Orda/" + b;
   }
 
     return "Orda/" + b;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "lhafkahl/8/pppppppp/8/8/PPPPPPPP/8/LHAFKAHL w 0 ah -";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     // Shuffle pieces on first (and last rank if randomness == 2)
     for (let c of ["w", "b"]) {
       return "lhafkahl/8/pppppppp/8/8/PPPPPPPP/8/LHAFKAHL w 0 ah -";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     // Shuffle pieces on first (and last rank if randomness == 2)
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
         pieces['b'] = pieces['w'];
         break;
       }
@@ -106,17 +106,9 @@ export class OrdamirrorRules extends OrdaRules {
 
   getPotentialFalconMoves(sq) {
     const onlyMoves = this.getSlideNJumpMoves(
 
   getPotentialFalconMoves(sq) {
     const onlyMoves = this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      null,
-      { onlyMove: true }
-    );
+      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), null, { onlyMove: true });
     const onlyTakes = this.getSlideNJumpMoves(
     const onlyTakes = this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.KNIGHT],
-      "oneStep",
-      { onlyTake: true }
-    );
+      sq, V.steps[V.KNIGHT], "oneStep", { onlyTake: true });
     return onlyMoves.concat(onlyTakes);
   }
 
     return onlyMoves.concat(onlyTakes);
   }
 
@@ -133,7 +125,7 @@ export class OrdamirrorRules extends OrdaRules {
 
   isAttackedByFalcon(sq, color) {
     return this.isAttackedBySlideNJump(
 
   isAttackedByFalcon(sq, color) {
     return this.isAttackedBySlideNJump(
-      sq, color, V.FALCON, V.steps[V.KNIGHT], "oneStep");
+      sq, color, V.FALCON, V.steps[V.KNIGHT], 1);
   }
 
   static get VALUES() {
   }
 
   static get VALUES() {
index 7915715..caf55c9 100644 (file)
@@ -197,9 +197,9 @@ export class OtageRules extends ChessRules {
     this.pawnFlags = flags[1];
   }
 
     this.pawnFlags = flags[1];
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     // Add 16 pawns flags:
     // Add 16 pawns flags:
-    return ChessRules.GenRandInitFen(randomness)
+    return ChessRules.GenRandInitFen(options)
       .slice(0, -2) + "1111111111111111 -";
   }
 
       .slice(0, -2) + "1111111111111111 -";
   }
 
@@ -390,10 +390,7 @@ export class OtageRules extends ChessRules {
         break;
       case V.KING:
         baseMoves = this.getSlideNJumpMoves(
         break;
       case V.KING:
         baseMoves = this.getSlideNJumpMoves(
-          [x, y],
-          V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-          "oneStep"
-        );
+          [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
         if (!noCastle && this.castleFlags[this.turn].some(v => v < V.size.y))
           baseMoves = baseMoves.concat(this.getCastleMoves([x, y]));
         break;
         if (!noCastle && this.castleFlags[this.turn].some(v => v < V.size.y))
           baseMoves = baseMoves.concat(this.getCastleMoves([x, y]));
         break;
index 37d0521..e595b0d 100644 (file)
@@ -154,21 +154,9 @@ export class Pacifist1Rules extends ChessRules {
     return moves;
   }
 
     return moves;
   }
 
-  getSlideNJumpMoves([x, y], steps, oneStep) {
-    let moves = [];
-    outerLoop: for (let loop = 0; loop < steps.length; loop++) {
-      const step = steps[loop];
-      let i = x + step[0];
-      let j = y + step[1];
-      while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
-        moves.push(this.getBasicMove([x, y], [i, j]));
-        if (oneStep) continue outerLoop;
-        i += step[0];
-        j += step[1];
-      }
-      // No captures
-    }
-    return moves;
+  canTake() {
+    // No captures
+    return false;
   }
 
   underCheck(color) {
   }
 
   underCheck(color) {
index 4745f63..0462d2d 100644 (file)
@@ -199,9 +199,9 @@ export class PacosakoRules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     // Add 16 pawns flags + empty umove:
     // Add 16 pawns flags + empty umove:
-    return ChessRules.GenRandInitFen(randomness)
+    return ChessRules.GenRandInitFen(options)
       .slice(0, -2) + "1111111111111111 - -";
   }
 
       .slice(0, -2) + "1111111111111111 - -";
   }
 
index 579ee9c..aef9c06 100644 (file)
@@ -25,8 +25,8 @@ export class Pandemonium1Rules extends Pandemonium2Rules {
     return true;
   }
 
     return true;
   }
 
-  static GenRandInitFen(randomness) {
-    const baseFen = Pandemonium2Rules.GenRandInitFen(randomness)
+  static GenRandInitFen(options) {
+    const baseFen = Pandemonium2Rules.GenRandInitFen(options)
     return baseFen.substr(0, 22) + "91/91/" + baseFen.substr(22);
   }
 
     return baseFen.substr(0, 22) + "91/91/" + baseFen.substr(22);
   }
 
index 7951608..4a98083 100644 (file)
@@ -139,8 +139,8 @@ export class Pandemonium2Rules extends ChessRules {
     return counts.join("");
   }
 
     return counts.join("");
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0) {
+  static GenRandInitFen(options) {
+    if (options.randomness == 0) {
       return (
         "rnbqkmcbnr/pppppppppp/91/91/91/91/PPPPPPPPPP/RNBQKMCBNR " +
         "w 0 ajaj - 00000000000000"
       return (
         "rnbqkmcbnr/pppppppppp/91/91/91/91/PPPPPPPPPP/RNBQKMCBNR " +
         "w 0 ajaj - 00000000000000"
@@ -150,7 +150,7 @@ export class Pandemonium2Rules extends ChessRules {
     let pieces = { w: new Array(10), b: new Array(10) };
     let flags = "";
     for (let c of ["w", "b"]) {
     let pieces = { w: new Array(10), b: new Array(10) };
     let flags = "";
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         flags += flags;
         break;
         pieces['b'] = pieces['w'];
         flags += flags;
         break;
@@ -379,39 +379,36 @@ export class Pandemonium2Rules extends ChessRules {
 
   getPotentialMarshalMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat(
 
   getPotentialMarshalMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")
+      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)
     );
   }
 
   getPotentialCardinalMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat(
     );
   }
 
   getPotentialCardinalMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")
+      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)
     );
   }
 
   getPotentialScepterMoves(sq) {
     const steps =
       V.steps[V.KNIGHT].concat(V.steps[V.BISHOP]).concat(V.steps[V.ROOK]);
     );
   }
 
   getPotentialScepterMoves(sq) {
     const steps =
       V.steps[V.KNIGHT].concat(V.steps[V.BISHOP]).concat(V.steps[V.ROOK]);
-    return this.getSlideNJumpMoves(sq, steps, "oneStep");
+    return this.getSlideNJumpMoves(sq, steps, 1);
   }
 
   getPotentialHorseMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat(
   }
 
   getPotentialHorseMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.ROOK], "oneStep"));
+      this.getSlideNJumpMoves(sq, V.steps[V.ROOK], 1));
   }
 
   getPotentialDragonMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat(
   }
 
   getPotentialDragonMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], "oneStep"));
+      this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1));
   }
 
   getPotentialKingMoves(sq) {
     // Initialize with normal moves
     let moves = this.getSlideNJumpMoves(
   }
 
   getPotentialKingMoves(sq) {
     // Initialize with normal moves
     let moves = this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
     const c = this.turn;
     if (
       this.castleFlags[c][0] < V.size.y ||
     const c = this.turn;
     if (
       this.castleFlags[c][0] < V.size.y ||
@@ -469,7 +466,7 @@ export class Pandemonium2Rules extends ChessRules {
     const steps =
       V.steps[V.KNIGHT].concat(V.steps[V.ROOK]).concat(V.steps[V.BISHOP]);
     return (
     const steps =
       V.steps[V.KNIGHT].concat(V.steps[V.ROOK]).concat(V.steps[V.BISHOP]);
     return (
-      super.isAttackedBySlideNJump(sq, color, V.SCEPTER, steps, "oneStep")
+      super.isAttackedBySlideNJump(sq, color, V.SCEPTER, steps, 1)
     );
   }
 
     );
   }
 
@@ -477,7 +474,7 @@ export class Pandemonium2Rules extends ChessRules {
     return (
       super.isAttackedBySlideNJump(sq, color, V.HORSE, V.steps[V.BISHOP]) ||
       super.isAttackedBySlideNJump(
     return (
       super.isAttackedBySlideNJump(sq, color, V.HORSE, V.steps[V.BISHOP]) ||
       super.isAttackedBySlideNJump(
-        sq, color, V.HORSE, V.steps[V.ROOK], "oneStep")
+        sq, color, V.HORSE, V.steps[V.ROOK], 1)
     );
   }
 
     );
   }
 
@@ -485,7 +482,7 @@ export class Pandemonium2Rules extends ChessRules {
     return (
       super.isAttackedBySlideNJump(sq, color, V.DRAGON, V.steps[V.ROOK]) ||
       super.isAttackedBySlideNJump(
     return (
       super.isAttackedBySlideNJump(sq, color, V.DRAGON, V.steps[V.ROOK]) ||
       super.isAttackedBySlideNJump(
-        sq, color, V.DRAGON, V.steps[V.BISHOP], "oneStep")
+        sq, color, V.DRAGON, V.steps[V.BISHOP], 1)
     );
   }
 
     );
   }
 
@@ -493,12 +490,7 @@ export class Pandemonium2Rules extends ChessRules {
     return (
       super.isAttackedBySlideNJump(sq, color, V.MARSHAL, V.steps[V.ROOK]) ||
       super.isAttackedBySlideNJump(
     return (
       super.isAttackedBySlideNJump(sq, color, V.MARSHAL, V.steps[V.ROOK]) ||
       super.isAttackedBySlideNJump(
-        sq,
-        color,
-        V.MARSHAL,
-        V.steps[V.KNIGHT],
-        "oneStep"
-      )
+        sq, color, V.MARSHAL, V.steps[V.KNIGHT], 1)
     );
   }
 
     );
   }
 
@@ -506,12 +498,7 @@ export class Pandemonium2Rules extends ChessRules {
     return (
       super.isAttackedBySlideNJump(sq, color, V.CARDINAL, V.steps[V.BISHOP]) ||
       super.isAttackedBySlideNJump(
     return (
       super.isAttackedBySlideNJump(sq, color, V.CARDINAL, V.steps[V.BISHOP]) ||
       super.isAttackedBySlideNJump(
-        sq,
-        color,
-        V.CARDINAL,
-        V.steps[V.KNIGHT],
-        "oneStep"
-      )
+        sq, color, V.CARDINAL, V.steps[V.KNIGHT], 1)
     );
   }
 
     );
   }
 
index 631301c..35ca6fb 100644 (file)
@@ -2,6 +2,11 @@ import { ChessRules, PiPo, Move } from "@/base_rules";
 
 export class ParachuteRules extends ChessRules {
 
 
 export class ParachuteRules extends ChessRules {
 
+  static get Options() {
+    // TODO: later, allow variant, placing piece giving check maybe...
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
   static get HasFlags() {
     return false;
   }
index 1fe61cb..c08b585 100644 (file)
@@ -10,9 +10,9 @@ export class PawnmassacreRules extends ChessRules {
     return true;
   }
 
     return true;
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     const bFen =
     const bFen =
-      ChessRules.GenRandInitFen(randomness)
+      ChessRules.GenRandInitFen(options)
       // Remove castle flags
       .slice(0, -6).concat("-");
     const splitIdx = bFen.indexOf(' ');
       // Remove castle flags
       .slice(0, -6).concat("-");
     const splitIdx = bFen.indexOf(' ');
index b3e84ea..fdecf0a 100644 (file)
@@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules";
 
 export class PawnsRules extends ChessRules {
 
 
 export class PawnsRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get PawnSpecs() {
     return Object.assign(
       {},
   static get PawnSpecs() {
     return Object.assign(
       {},
index bce2fe7..27fc90f 100644 (file)
@@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules";
 
 export class PawnskingRules extends ChessRules {
 
 
 export class PawnskingRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get PawnSpecs() {
     return Object.assign(
       {},
   static get PawnSpecs() {
     return Object.assign(
       {},
index 0c5e6e1..65334e2 100644 (file)
@@ -58,19 +58,19 @@ export class PerfectRules extends ChessRules {
 
   getPotentialAmazonMoves(sq) {
     return super.getPotentialQueenMoves(sq).concat(
 
   getPotentialAmazonMoves(sq) {
     return super.getPotentialQueenMoves(sq).concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")
+      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)
     );
   }
 
   getPotentialEmpressMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat(
     );
   }
 
   getPotentialEmpressMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")
+      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)
     );
   }
 
   getPotentialPrincessMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat(
     );
   }
 
   getPotentialPrincessMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")
+      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)
     );
   }
 
     );
   }
 
@@ -87,39 +87,21 @@ export class PerfectRules extends ChessRules {
     return (
       this.isAttackedBySlideNJump(sq, color, V.AMAZON, V.steps[V.BISHOP]) ||
       this.isAttackedBySlideNJump(sq, color, V.AMAZON, V.steps[V.ROOK]) ||
     return (
       this.isAttackedBySlideNJump(sq, color, V.AMAZON, V.steps[V.BISHOP]) ||
       this.isAttackedBySlideNJump(sq, color, V.AMAZON, V.steps[V.ROOK]) ||
-      this.isAttackedBySlideNJump(
-        sq,
-        color,
-        V.AMAZON,
-        V.steps[V.KNIGHT],
-        "oneStep"
-      )
+      this.isAttackedBySlideNJump(sq, color, V.AMAZON, V.steps[V.KNIGHT], 1)
     );
   }
 
   isAttackedByEmpress(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.EMPRESS, V.steps[V.ROOK]) ||
     );
   }
 
   isAttackedByEmpress(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.EMPRESS, V.steps[V.ROOK]) ||
-      this.isAttackedBySlideNJump(
-        sq,
-        color,
-        V.EMPRESS,
-        V.steps[V.KNIGHT],
-        "oneStep"
-      )
+      this.isAttackedBySlideNJump(sq, color, V.EMPRESS, V.steps[V.KNIGHT], 1)
     );
   }
 
   isAttackedByPrincess(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.PRINCESS, V.steps[V.BISHOP]) ||
     );
   }
 
   isAttackedByPrincess(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.PRINCESS, V.steps[V.BISHOP]) ||
-      this.isAttackedBySlideNJump(
-        sq,
-        color,
-        V.PRINCESS,
-        V.steps[V.KNIGHT],
-        "oneStep"
-      )
+      this.isAttackedBySlideNJump(sq, color, V.PRINCESS, V.steps[V.KNIGHT], 1)
     );
   }
 
     );
   }
 
@@ -134,11 +116,11 @@ export class PerfectRules extends ChessRules {
     return 2;
   }
 
     return 2;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "esqakbnr/pppppppp/8/8/8/8/PPPPPPPP/ESQAKBNR w 0 ahah -";
 
       return "esqakbnr/pppppppp/8/8/8/8/PPPPPPPP/ESQAKBNR w 0 ahah -";
 
-    const baseFen = ChessRules.GenRandInitFen(randomness);
+    const baseFen = ChessRules.GenRandInitFen(options);
     const fenParts = baseFen.split(' ');
     const posParts = fenParts[0].split('/');
 
     const fenParts = baseFen.split(' ');
     const posParts = fenParts[0].split('/');
 
index 41dbb72..ad17f93 100644 (file)
@@ -33,10 +33,9 @@ export class PocketknightRules extends ChessRules {
     this.subTurn = 1;
   }
 
     this.subTurn = 1;
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     // Add 2 knight flags
     // Add 2 knight flags
-    return ChessRules.GenRandInitFen(randomness)
-      .slice(0, -2) + "11 -";
+    return ChessRules.GenRandInitFen(options).slice(0, -2) + "11 -";
   }
 
   getFlagsFen() {
   }
 
   getFlagsFen() {
index 0ea2e45..1b02dcf 100644 (file)
@@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules";
 
 export class QueenpawnsRules extends ChessRules {
 
 
 export class QueenpawnsRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get PawnSpecs() {
     return Object.assign(
       {},
   static get PawnSpecs() {
     return Object.assign(
       {},
index e898a55..745843b 100644 (file)
@@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules";
 
 export class RacingkingsRules extends ChessRules {
 
 
 export class RacingkingsRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
   static get HasFlags() {
     return false;
   }
index 4afae21..de0ff50 100644 (file)
@@ -28,8 +28,8 @@ export class RecycleRules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
-    return ChessRules.GenRandInitFen(randomness) + " 0000000000";
+  static GenRandInitFen(options) {
+    return ChessRules.GenRandInitFen(options) + " 0000000000";
   }
 
   getFen() {
   }
 
   getFen() {
index 4f50d75..319d4ad 100644 (file)
@@ -29,8 +29,8 @@ export class Refusal1Rules extends ChessRules {
   // NOTE: with this variant's special rule,
   // some extra repetitions could be detected... TODO (...)
 
   // NOTE: with this variant's special rule,
   // some extra repetitions could be detected... TODO (...)
 
-  static GenRandInitFen(randomness) {
-    return ChessRules.GenRandInitFen(randomness).slice(0, -6)  + "- null";
+  static GenRandInitFen(options) {
+    return ChessRules.GenRandInitFen(options).slice(0, -6)  + "- null";
   }
 
   setOtherVariables(fen) {
   }
 
   setOtherVariables(fen) {
index 446c927..029eeb5 100644 (file)
@@ -46,7 +46,7 @@ export class RelayupRules extends ChessRules {
       else steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
       const extraMoves =
         super.getSlideNJumpMoves(
       else steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
       const extraMoves =
         super.getSlideNJumpMoves(
-          sq, steps, oneStep || [V.KNIGHT, V.KING].includes(pg))
+          sq, steps, (oneStep || [V.KNIGHT, V.KING].includes(pg) ? 1 : null))
         .filter(m => {
           return (
             (piece != V.PAWN || m.end.x != lastRank) &&
         .filter(m => {
           return (
             (piece != V.PAWN || m.end.x != lastRank) &&
index 6af29c0..3101a7c 100644 (file)
@@ -205,23 +205,11 @@ export class RococoRules extends ChessRules {
     // NOTE: not removing "dist" field; shouldn't matter much...
   }
 
     // NOTE: not removing "dist" field; shouldn't matter much...
   }
 
-  getSlideNJumpMoves([x, y], steps, oneStep) {
-    const piece = this.getPiece(x, y);
-    let moves = [];
-    outerLoop: for (let step of steps) {
-      let i = x + step[0];
-      let j = y + step[1];
-      while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
-        moves.push(this.getBasicMove([x, y], [i, j]));
-        if (oneStep !== undefined) continue outerLoop;
-        i += step[0];
-        j += step[1];
-      }
-      // Only king can take on occupied square:
-      if (piece == V.KING && V.OnBoard(i, j) && this.canTake([x, y], [i, j]))
-        moves.push(this.getBasicMove([x, y], [i, j]));
-    }
-    return moves;
+  canTake([x1, y1], [x2, y2]) {
+    return (
+      this.getPiece(x1, y1) == V.KING &&
+      this.getColor(x1, y1) != this.getColor(x2, y2)
+    );
   }
 
   // "Cannon/grasshopper pawn"
   }
 
   // "Cannon/grasshopper pawn"
@@ -632,8 +620,8 @@ export class RococoRules extends ChessRules {
     return false;
   }
 
     return false;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0) {
+  static GenRandInitFen(options) {
+    if (options.randomness == 0) {
       return (
         "91/1rqnbknqm1/1pppppppp1/91/91/91/91/1PPPPPPPP1/1MQNBKNQR1/91 w 0 -"
       );
       return (
         "91/1rqnbknqm1/1pppppppp1/91/91/91/91/1PPPPPPPP1/1MQNBKNQR1/91 w 0 -"
       );
@@ -642,7 +630,7 @@ export class RococoRules extends ChessRules {
     let pieces = { w: new Array(8), b: new Array(8) };
     // Shuffle pieces on first and last rank
     for (let c of ["w", "b"]) {
     let pieces = { w: new Array(8), b: new Array(8) };
     // Shuffle pieces on first and last rank
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
         pieces['b'] = pieces['w'];
         break;
       }
index 36373b2..c39339e 100644 (file)
@@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules";
 
 export class RollerballRules extends ChessRules {
 
 
 export class RollerballRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get HasEnpassant() {
     return false;
   }
   static get HasEnpassant() {
     return false;
   }
@@ -121,14 +125,14 @@ export class RollerballRules extends ChessRules {
       const forward = (y <= 1 ? -1 : 1);
       return (
         super.getSlideNJumpMoves(
       const forward = (y <= 1 ? -1 : 1);
       return (
         super.getSlideNJumpMoves(
-          [x, y], [[forward, -1], [forward, 0], [forward, 1]], "oneStep")
+          [x, y], [[forward, -1], [forward, 0], [forward, 1]], 1)
       );
     }
     if (inMiddleY) {
       const forward = (x <= 1 ? 1 : -1);
       let moves =
         super.getSlideNJumpMoves(
       );
     }
     if (inMiddleY) {
       const forward = (x <= 1 ? 1 : -1);
       let moves =
         super.getSlideNJumpMoves(
-          [x, y], [[-1, forward], [0, forward], [1, forward]], "oneStep");
+          [x, y], [[-1, forward], [0, forward], [1, forward]], 1);
       // Promotions may happen:
       let extraMoves = [];
       moves.forEach(m => {
       // Promotions may happen:
       let extraMoves = [];
       moves.forEach(m => {
@@ -154,13 +158,13 @@ export class RollerballRules extends ChessRules {
       const forward = (toRight ? 1 : -1);
       return (
         super.getSlideNJumpMoves(
       const forward = (toRight ? 1 : -1);
       return (
         super.getSlideNJumpMoves(
-          [x, y], [[-1, forward], [0, forward], [1, forward]], "oneStep")
+          [x, y], [[-1, forward], [0, forward], [1, forward]], 1)
       );
     }
     const forward = (toUp ? -1 : 1);
     return (
       super.getSlideNJumpMoves(
       );
     }
     const forward = (toUp ? -1 : 1);
     return (
       super.getSlideNJumpMoves(
-        [x, y], [[forward, -1], [forward, 0], [forward, 1]], "oneStep")
+        [x, y], [[forward, -1], [forward, 0], [forward, 1]], 1)
     );
   }
 
     );
   }
 
@@ -176,7 +180,7 @@ export class RollerballRules extends ChessRules {
     if (y >= 5) multiStep.push([1, 0]);
     else oneStep.push([1, 0]);
     const c = this.turn;
     if (y >= 5) multiStep.push([1, 0]);
     else oneStep.push([1, 0]);
     const c = this.turn;
-    let moves = super.getSlideNJumpMoves([x, y], oneStep, "oneStep");
+    let moves = super.getSlideNJumpMoves([x, y], oneStep, 1);
     for (let step of multiStep) {
       let [i, j] = [x + step[0], y + step[1]];
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
     for (let step of multiStep) {
       let [i, j] = [x + step[0], y + step[1]];
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
@@ -248,7 +252,7 @@ export class RollerballRules extends ChessRules {
       if (!multiStep[str]) oneStep.push(V.DictBishopSteps[str]);
     });
     const c = this.turn;
       if (!multiStep[str]) oneStep.push(V.DictBishopSteps[str]);
     });
     const c = this.turn;
-    let moves = super.getSlideNJumpMoves([x, y], oneStep, "oneStep");
+    let moves = super.getSlideNJumpMoves([x, y], oneStep, 1);
     for (let step of Object.values(multiStep)) {
       let [i, j] = [x + step[0], y + step[1]];
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
     for (let step of Object.values(multiStep)) {
       let [i, j] = [x + step[0], y + step[1]];
       while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
@@ -345,7 +349,7 @@ export class RollerballRules extends ChessRules {
           ? [ [forward, -1], [forward, 0], [forward, 1] ]
           : [ [-1, forward], [0, forward], [1, forward] ];
       return (
           ? [ [forward, -1], [forward, 0], [forward, 1] ]
           : [ [-1, forward], [0, forward], [1, forward] ];
       return (
-        super.isAttackedBySlideNJump([x, y], color, V.PAWN, steps, "oneStep")
+        super.isAttackedBySlideNJump([x, y], color, V.PAWN, steps, 1)
       );
     }
     // In a corner: can be attacked by one square only
       );
     }
     // In a corner: can be attacked by one square only
@@ -359,7 +363,7 @@ export class RollerballRules extends ChessRules {
       else step = [-1, 0];
     }
     return (
       else step = [-1, 0];
     }
     return (
-      super.isAttackedBySlideNJump([x, y], color, V.PAWN, [step], "oneStep")
+      super.isAttackedBySlideNJump([x, y], color, V.PAWN, [step], 1)
     );
   }
 
     );
   }
 
@@ -376,7 +380,7 @@ export class RollerballRules extends ChessRules {
     if (y >= 5) multiStep.push([-1, 0]);
     else oneStep.push([-1, 0]);
     if (
     if (y >= 5) multiStep.push([-1, 0]);
     else oneStep.push([-1, 0]);
     if (
-      super.isAttackedBySlideNJump([x, y], color, V.ROOK, oneStep, "oneStep")
+      super.isAttackedBySlideNJump([x, y], color, V.ROOK, oneStep, 1)
     ) {
       return true;
     }
     ) {
       return true;
     }
@@ -444,7 +448,7 @@ export class RollerballRules extends ChessRules {
       if (!multiStep[str]) oneStep.push(V.DictBishopSteps[str]);
     });
     if (
       if (!multiStep[str]) oneStep.push(V.DictBishopSteps[str]);
     });
     if (
-      super.isAttackedBySlideNJump([x, y], color, V.BISHOP, oneStep, "oneStep")
+      super.isAttackedBySlideNJump([x, y], color, V.BISHOP, oneStep, 1)
     ) {
       return true;
     }
     ) {
       return true;
     }
index 1daae90..3ffa6fc 100644 (file)
@@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules";
 
 export class RookpawnsRules extends ChessRules {
 
 
 export class RookpawnsRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get PawnSpecs() {
     return Object.assign(
       {},
   static get PawnSpecs() {
     return Object.assign(
       {},
index 5d5992c..3be0c14 100644 (file)
@@ -24,14 +24,14 @@ export class RoyalraceRules extends ChessRules {
     return (b[1] == V.KNIGHT ? "Enpassant/" : "") + b;
   }
 
     return (b[1] == V.KNIGHT ? "Enpassant/" : "") + b;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "92/92/92/92/92/92/92/92/92/qrbnp1PNBRQ/krbnp1PNBRK w 0";
 
     let pieces = { w: new Array(10), b: new Array(10) };
     // Shuffle pieces on first and second rank
     for (let c of ["w", "b"]) {
       return "92/92/92/92/92/92/92/92/92/qrbnp1PNBRQ/krbnp1PNBRK w 0";
 
     let pieces = { w: new Array(10), b: new Array(10) };
     // Shuffle pieces on first and second rank
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = JSON.parse(JSON.stringify(pieces['w'])).reverse();
         pieces['b'] =
           pieces['b'].splice(5,10).reverse().concat(
         pieces['b'] = JSON.parse(JSON.stringify(pieces['w'])).reverse();
         pieces['b'] =
           pieces['b'].splice(5,10).reverse().concat(
@@ -109,6 +109,7 @@ export class RoyalraceRules extends ChessRules {
     );
   }
 
     );
   }
 
+  // TODO: simplify this when base function is more general.
   getPotentialPawnMoves([x, y]) {
     // Normal moves (as a rook)
     let moves =
   getPotentialPawnMoves([x, y]) {
     // Normal moves (as a rook)
     let moves =
@@ -153,30 +154,13 @@ export class RoyalraceRules extends ChessRules {
 
   isAttackedByPawn([x, y], color) {
     // Pawns can capture forward and backward:
 
   isAttackedByPawn([x, y], color) {
     // Pawns can capture forward and backward:
-    for (let pawnShift of [-1, 1]) {
-      if (0 < x + pawnShift && x + pawnShift < V.size.x) {
-        for (let i of [-1, 1]) {
-          if (
-            y + i >= 0 &&
-            y + i < V.size.y &&
-            this.getPiece(x + pawnShift, y + i) == V.PAWN &&
-            this.getColor(x + pawnShift, y + i) == color
-          ) {
-            return true;
-          }
-        }
-      }
-    }
-    return false;
+    return this.isAttackedBySlideNJump(
+      sq, color, V.PAWN, V.steps[V.BISHOP], 1);
   }
 
   isAttackedByKnight(sq, color) {
     return this.isAttackedBySlideNJump(
   }
 
   isAttackedByKnight(sq, color) {
     return this.isAttackedBySlideNJump(
-      sq,
-      color,
-      V.KNIGHT,
-      V.steps[V.KNIGHT]
-    );
+      sq, color, V.KNIGHT, V.steps[V.KNIGHT]);
   }
 
   getCurrentScore() {
   }
 
   getCurrentScore() {
index d802ca1..64c9942 100644 (file)
@@ -3,6 +3,10 @@ import { ArrayFun } from "@/utils/array";
 
 export class RugbyRules extends ChessRules {
 
 
 export class RugbyRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
   static get HasFlags() {
     return false;
   }
@@ -29,7 +33,7 @@ export class RugbyRules extends ChessRules {
       this.turn == 'w'
         ? [ [-1,-1], [-1,1], [0,1], [0,-1], [1,-1], [1,0], [1,1] ]
         : [ [1,-1], [1,1], [0,1], [0,-1], [-1,-1], [-1,0], [-1,1] ];
       this.turn == 'w'
         ? [ [-1,-1], [-1,1], [0,1], [0,-1], [1,-1], [1,0], [1,1] ]
         : [ [1,-1], [1,1], [0,1], [0,-1], [-1,-1], [-1,0], [-1,1] ];
-    let addMoves = this.getSlideNJumpMoves(sq, steps, "oneStep");
+    let addMoves = this.getSlideNJumpMoves(sq, steps, 1);
     return moves.concat(addMoves.filter(m => m.vanish.length == 1));
   }
 
     return moves.concat(addMoves.filter(m => m.vanish.length == 1));
   }
 
index d8e1b1c..5f58571 100644 (file)
@@ -78,9 +78,9 @@ export class SchessRules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     return (
     return (
-      ChessRules.GenRandInitFen(randomness).slice(0, -2) +
+      ChessRules.GenRandInitFen(options).slice(0, -2) +
       // Add pieceFlags + pocket
       "1111111111111111 - 1111"
     );
       // Add pieceFlags + pocket
       "1111111111111111 - 1111"
     );
@@ -221,13 +221,13 @@ export class SchessRules extends ChessRules {
 
   getPotentialHawkMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat(
 
   getPotentialHawkMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")
+      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)
     );
   }
 
   getPotentialElephantMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat(
     );
   }
 
   getPotentialElephantMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")
+      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)
     );
   }
 
     );
   }
 
@@ -242,26 +242,14 @@ export class SchessRules extends ChessRules {
   isAttackedByHawk(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.HAWK, V.steps[V.BISHOP]) ||
   isAttackedByHawk(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.HAWK, V.steps[V.BISHOP]) ||
-      this.isAttackedBySlideNJump(
-        sq,
-        color,
-        V.HAWK,
-        V.steps[V.KNIGHT],
-        "oneStep"
-      )
+      this.isAttackedBySlideNJump(sq, color, V.HAWK, V.steps[V.KNIGHT], 1)
     );
   }
 
   isAttackedByElephant(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.ELEPHANT, V.steps[V.ROOK]) ||
     );
   }
 
   isAttackedByElephant(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.ELEPHANT, V.steps[V.ROOK]) ||
-      this.isAttackedBySlideNJump(
-        sq,
-        color,
-        V.ELEPHANT,
-        V.steps[V.KNIGHT],
-        "oneStep"
-      )
+      this.isAttackedBySlideNJump(sq, color, V.ELEPHANT, V.steps[V.KNIGHT], 1)
     );
   }
 
     );
   }
 
@@ -330,9 +318,11 @@ export class SchessRules extends ChessRules {
 
   static get VALUES() {
     return Object.assign(
 
   static get VALUES() {
     return Object.assign(
-      {},
-      ChessRules.VALUES,
-      { 'h': 5, 'e': 7 }
+      {
+        'h': 5,
+        'e': 7
+      },
+      ChessRules.VALUES
     );
   }
 
     );
   }
 
index 8785560..75da960 100644 (file)
@@ -4,6 +4,10 @@ import { ArrayFun } from "@/utils/array";
 
 export class ScreenRules extends ChessRules {
 
 
 export class ScreenRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
   static get HasFlags() {
     return false;
   }
index c3db279..2701f1e 100644 (file)
@@ -68,7 +68,7 @@ export class ShakoRules extends ChessRules {
   }
 
   getPotentialElephantMoves([x, y]) {
   }
 
   getPotentialElephantMoves([x, y]) {
-    return this.getSlideNJumpMoves([x, y], V.steps[V.ELEPHANT], "oneStep");
+    return this.getSlideNJumpMoves([x, y], V.steps[V.ELEPHANT], 1);
   }
 
   getPotentialCannonMoves([x, y]) {
   }
 
   getPotentialCannonMoves([x, y]) {
@@ -115,7 +115,7 @@ export class ShakoRules extends ChessRules {
   isAttackedByElephant(sq, color) {
     return (
       this.isAttackedBySlideNJump(
   isAttackedByElephant(sq, color) {
     return (
       this.isAttackedBySlideNJump(
-        sq, color, V.ELEPHANT, V.steps[V.ELEPHANT], "oneStep"
+        sq, color, V.ELEPHANT, V.steps[V.ELEPHANT], 1
       )
     );
   }
       )
     );
   }
@@ -185,8 +185,8 @@ export class ShakoRules extends ChessRules {
     return 2;
   }
 
     return 2;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0) {
+  static GenRandInitFen(options) {
+    if (options.randomness == 0) {
       return (
         "c8c/ernbqkbnre/pppppppppp/91/91/91/91/PPPPPPPPPP/ERNBQKBNRE/C8C " +
         "w 0 bibi -"
       return (
         "c8c/ernbqkbnre/pppppppppp/91/91/91/91/PPPPPPPPPP/ERNBQKBNRE/C8C " +
         "w 0 bibi -"
@@ -197,7 +197,7 @@ export class ShakoRules extends ChessRules {
     let flags = "";
     // Shuffle pieces on second (and before-last rank if randomness == 2)
     for (let c of ["w", "b"]) {
     let flags = "";
     // Shuffle pieces on second (and before-last rank if randomness == 2)
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         flags += flags;
         break;
         pieces['b'] = pieces['w'];
         flags += flags;
         break;
index 0569f71..568e2d9 100644 (file)
@@ -43,57 +43,40 @@ export class ShatranjRules extends ChessRules {
     ];
   }
 
     ];
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     // Remove castle flags and en-passant indication
     // Remove castle flags and en-passant indication
-    return ChessRules.GenRandInitFen(randomness).slice(0, -7);
+    return ChessRules.GenRandInitFen(options).slice(0, -7);
   }
 
   getPotentialBishopMoves(sq) {
   }
 
   getPotentialBishopMoves(sq) {
-    let moves = this.getSlideNJumpMoves(sq, V.ElephantSteps, "oneStep");
+    let moves = this.getSlideNJumpMoves(sq, V.ElephantSteps, 1);
     // Complete with "repositioning moves": like a queen, without capture
     // Complete with "repositioning moves": like a queen, without capture
-    let repositioningMoves = this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.BISHOP],
-      "oneStep"
-    ).filter(m => m.vanish.length == 1);
+    let repositioningMoves =
+      this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1)
+      .filter(m => m.vanish.length == 1);
     return moves.concat(repositioningMoves);
   }
 
   getPotentialQueenMoves(sq) {
     // Diagonal capturing moves
     return moves.concat(repositioningMoves);
   }
 
   getPotentialQueenMoves(sq) {
     // Diagonal capturing moves
-    let captures = this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.BISHOP],
-      "oneStep"
-    ).filter(m => m.vanish.length == 2);
+    let captures =
+      this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1)
+      .filter(m => m.vanish.length == 2);
     return captures.concat(
       // Orthogonal non-capturing moves
     return captures.concat(
       // Orthogonal non-capturing moves
-      this.getSlideNJumpMoves(
-        sq,
-        V.steps[V.ROOK],
-        "oneStep"
-      ).filter(m => m.vanish.length == 1)
+      this.getSlideNJumpMoves(sq, V.steps[V.ROOK], 1)
+      .filter(m => m.vanish.length == 1)
     );
   }
 
   isAttackedByBishop(sq, color) {
     return this.isAttackedBySlideNJump(
     );
   }
 
   isAttackedByBishop(sq, color) {
     return this.isAttackedBySlideNJump(
-      sq,
-      color,
-      V.BISHOP,
-      V.ElephantSteps,
-      "oneStep"
-    );
+      sq, color, V.BISHOP, V.ElephantSteps, 1);
   }
 
   isAttackedByQueen(sq, color) {
     return this.isAttackedBySlideNJump(
   }
 
   isAttackedByQueen(sq, color) {
     return this.isAttackedBySlideNJump(
-      sq,
-      color,
-      V.QUEEN,
-      V.steps[V.BISHOP],
-      "oneStep"
-    );
+      sq, color, V.QUEEN, V.steps[V.BISHOP], 1);
   }
 
   getCurrentScore() {
   }
 
   getCurrentScore() {
index 995d2b9..e993188 100644 (file)
@@ -208,37 +208,34 @@ export class ShinobiRules extends ChessRules {
     if (this.getColor(x, y) == 'b') return super.getPotentialKingMoves([x, y]);
     // Clan doesn't castle:
     return super.getSlideNJumpMoves(
     if (this.getColor(x, y) == 'b') return super.getPotentialKingMoves([x, y]);
     // Clan doesn't castle:
     return super.getSlideNJumpMoves(
-      [x, y],
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   getPotentialCaptainMoves(sq) {
     const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
   }
 
   getPotentialCaptainMoves(sq) {
     const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
-    return super.getSlideNJumpMoves(sq, steps, "oneStep");
+    return super.getSlideNJumpMoves(sq, steps, 1);
   }
 
   getPotentialNinjaMoves(sq) {
     return (
       super.getSlideNJumpMoves(sq, V.steps[V.BISHOP])
   }
 
   getPotentialNinjaMoves(sq) {
     return (
       super.getSlideNJumpMoves(sq, V.steps[V.BISHOP])
-      .concat(super.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep"))
+      .concat(super.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1))
     );
   }
 
   getPotentialDragonMoves(sq) {
     return (
       super.getSlideNJumpMoves(sq, V.steps[V.ROOK])
     );
   }
 
   getPotentialDragonMoves(sq) {
     return (
       super.getSlideNJumpMoves(sq, V.steps[V.ROOK])
-      .concat(super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], "oneStep"))
+      .concat(super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1))
     );
   }
 
   getPotentialMonkMoves(sq) {
     );
   }
 
   getPotentialMonkMoves(sq) {
-    return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], "oneStep");
+    return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1);
   }
 
   getPotentialHorseMoves(sq) {
   }
 
   getPotentialHorseMoves(sq) {
-    return super.getSlideNJumpMoves(sq, [ [-2, 1], [-2, -1] ], "oneStep");
+    return super.getSlideNJumpMoves(sq, [ [-2, 1], [-2, -1] ], 1);
   }
 
   getPotentialLanceMoves(sq) {
   }
 
   getPotentialLanceMoves(sq) {
@@ -267,7 +264,7 @@ export class ShinobiRules extends ChessRules {
   isAttackedByCaptain(sq, color) {
     const steps = V.steps[V.BISHOP].concat(V.steps[V.ROOK]);
     return (
   isAttackedByCaptain(sq, color) {
     const steps = V.steps[V.BISHOP].concat(V.steps[V.ROOK]);
     return (
-      super.isAttackedBySlideNJump(sq, color, V.CAPTAIN, steps, "oneStep")
+      super.isAttackedBySlideNJump(sq, color, V.CAPTAIN, steps, 1)
     );
   }
 
     );
   }
 
@@ -275,7 +272,7 @@ export class ShinobiRules extends ChessRules {
     return (
       super.isAttackedBySlideNJump(sq, color, V.NINJA, V.steps[V.BISHOP]) ||
       super.isAttackedBySlideNJump(
     return (
       super.isAttackedBySlideNJump(sq, color, V.NINJA, V.steps[V.BISHOP]) ||
       super.isAttackedBySlideNJump(
-        sq, color, V.NINJA, V.steps[V.KNIGHT], "oneStep")
+        sq, color, V.NINJA, V.steps[V.KNIGHT], 1)
     );
   }
 
     );
   }
 
@@ -283,21 +280,21 @@ export class ShinobiRules extends ChessRules {
     return (
       super.isAttackedBySlideNJump(sq, color, V.DRAGON, V.steps[V.ROOK]) ||
       super.isAttackedBySlideNJump(
     return (
       super.isAttackedBySlideNJump(sq, color, V.DRAGON, V.steps[V.ROOK]) ||
       super.isAttackedBySlideNJump(
-        sq, color, V.DRAGON, V.steps[V.BISHOP], "oneStep")
+        sq, color, V.DRAGON, V.steps[V.BISHOP], 1)
     );
   }
 
   isAttackedByMonk(sq, color) {
     return (
       super.isAttackedBySlideNJump(
     );
   }
 
   isAttackedByMonk(sq, color) {
     return (
       super.isAttackedBySlideNJump(
-        sq, color, V.MONK, V.steps[V.BISHOP], "oneStep")
+        sq, color, V.MONK, V.steps[V.BISHOP], 1)
     );
   }
 
   isAttackedByHorse(sq, color) {
     return (
       super.isAttackedBySlideNJump(
     );
   }
 
   isAttackedByHorse(sq, color) {
     return (
       super.isAttackedBySlideNJump(
-        sq, color, V.HORSE, [ [2, 1], [2, -1] ], "oneStep")
+        sq, color, V.HORSE, [ [2, 1], [2, -1] ], 1)
     );
   }
 
     );
   }
 
index bca3762..1526aab 100644 (file)
@@ -113,8 +113,8 @@ export class ShogiRules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0) {
+  static GenRandInitFen(options) {
+    if (options.randomness == 0) {
       return (
         "lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL " +
         "w 0 00000000000000"
       return (
         "lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL " +
         "w 0 00000000000000"
@@ -125,7 +125,7 @@ export class ShogiRules extends ChessRules {
     let pieces1 = { w: new Array(4), b: new Array(4) };
     let positions2 = { w: new Array(2), b: new Array(2) };
     for (let c of ["w", "b"]) {
     let pieces1 = { w: new Array(4), b: new Array(4) };
     let positions2 = { w: new Array(2), b: new Array(2) };
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces1['b'] = JSON.parse(JSON.stringify(pieces1['w'])).reverse();
         positions2['b'] =
           JSON.parse(JSON.stringify(positions2['w'])).reverse()
         pieces1['b'] = JSON.parse(JSON.stringify(pieces1['w'])).reverse();
         positions2['b'] =
           JSON.parse(JSON.stringify(positions2['w'])).reverse()
@@ -426,7 +426,7 @@ export class ShogiRules extends ChessRules {
     const forward = (this.turn == 'w' ? -1 : 1);
     return this.getSlideNJumpMoves(
       sq,
     const forward = (this.turn == 'w' ? -1 : 1);
     return this.getSlideNJumpMoves(
       sq,
-      [[forward, 0]],
+      [ [forward, 0] ],
       {
         promote: V.P_LANCE,
         force: true
       {
         promote: V.P_LANCE,
         force: true
@@ -492,35 +492,19 @@ export class ShogiRules extends ChessRules {
 
   isAttackedBySilver([x, y], color) {
     const shift = (color == 'w' ? 1 : -1);
 
   isAttackedBySilver([x, y], color) {
     const shift = (color == 'w' ? 1 : -1);
-    for (let step of V.steps[V.BISHOP].concat([[shift, 0]])) {
-      const [i, j] = [x + step[0], y + step[1]];
-      if (
-        V.OnBoard(i, j) &&
-        this.board[i][j] != V.EMPTY &&
-        this.getColor(i, j) == color &&
-        this.getPiece(i, j) == V.SILVER_G
-      ) {
-        return true;
-      }
-    }
-    return false;
+    return this.isAttackedBySlideNJump(
+      sq, color, V.SILVER, V.steps[V.BISHOP].concat([ [shift, 0] ]), 1);
   }
 
   isAttackedByPawn([x, y], color) {
     const shift = (color == 'w' ? 1 : -1);
   }
 
   isAttackedByPawn([x, y], color) {
     const shift = (color == 'w' ? 1 : -1);
-    const [i, j] = [x + shift, y];
-    return (
-      V.OnBoard(i, j) &&
-      this.board[i][j] != V.EMPTY &&
-      this.getColor(i, j) == color &&
-      this.getPiece(i, j) == V.PAWN
-    );
+    return this.isAttackedBySlideNJump(sq, color, V.PAWN, [ [shift, 0] ], 1);
   }
 
   isAttackedByKnight(sq, color) {
     const forward = (color == 'w' ? 2 : -2);
     return this.isAttackedBySlideNJump(
   }
 
   isAttackedByKnight(sq, color) {
     const forward = (color == 'w' ? 2 : -2);
     return this.isAttackedBySlideNJump(
-      sq, color, V.KNIGHT, [[forward, 1], [forward, -1]], "oneStep");
+      sq, color, V.KNIGHT, [ [forward, 1], [forward, -1] ], 1);
   }
 
   isAttackedByLance(sq, color) {
   }
 
   isAttackedByLance(sq, color) {
@@ -531,16 +515,14 @@ export class ShogiRules extends ChessRules {
   isAttackedByDragon(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.P_ROOK, V.steps[V.ROOK]) ||
   isAttackedByDragon(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.P_ROOK, V.steps[V.ROOK]) ||
-      this.isAttackedBySlideNJump(
-        sq, color, V.P_ROOK, V.steps[V.BISHOP], "oneStep")
+      this.isAttackedBySlideNJump(sq, color, V.P_ROOK, V.steps[V.BISHOP], 1)
     );
   }
 
   isAttackedByHorse(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.P_BISHOP, V.steps[V.BISHOP]) ||
     );
   }
 
   isAttackedByHorse(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.P_BISHOP, V.steps[V.BISHOP]) ||
-      this.isAttackedBySlideNJump(
-        sq, color, V.P_BISHOP, V.steps[V.ROOK], "oneStep")
+      this.isAttackedBySlideNJump(sq, color, V.P_BISHOP, V.steps[V.ROOK], 1)
     );
   }
 
     );
   }
 
index 1a20d32..c45dff2 100644 (file)
@@ -51,8 +51,8 @@ export class ShogunRules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
-    return ChessRules.GenRandInitFen(randomness) + " 0000000000";
+  static GenRandInitFen(options) {
+    return ChessRules.GenRandInitFen(options) + " 0000000000";
   }
 
   getFen() {
   }
 
   getFen() {
@@ -257,31 +257,31 @@ export class ShogunRules extends ChessRules {
   }
 
   getPotentialDuchessMoves(sq) {
   }
 
   getPotentialDuchessMoves(sq) {
-    return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], "oneStep");
+    return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1);
   }
 
   getPotentialCaptainMoves(sq) {
     const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
   }
 
   getPotentialCaptainMoves(sq) {
     const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
-    return super.getSlideNJumpMoves(sq, steps, "oneStep");
+    return super.getSlideNJumpMoves(sq, steps, 1);
   }
 
   getPotentialMortarMoves(sq) {
     return (
       super.getSlideNJumpMoves(sq, V.steps[V.ROOK])
   }
 
   getPotentialMortarMoves(sq) {
     return (
       super.getSlideNJumpMoves(sq, V.steps[V.ROOK])
-      .concat(super.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep"))
+      .concat(super.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1))
     );
   }
 
   getPotentialGeneralMoves(sq) {
     const steps =
       V.steps[V.BISHOP].concat(V.steps[V.ROOK]).concat(V.steps[V.KNIGHT]);
     );
   }
 
   getPotentialGeneralMoves(sq) {
     const steps =
       V.steps[V.BISHOP].concat(V.steps[V.ROOK]).concat(V.steps[V.KNIGHT]);
-    return super.getSlideNJumpMoves(sq, steps, "oneStep");
+    return super.getSlideNJumpMoves(sq, steps, 1);
   }
 
   getPotentialArchbishopMoves(sq) {
     return (
       super.getSlideNJumpMoves(sq, V.steps[V.BISHOP])
   }
 
   getPotentialArchbishopMoves(sq) {
     return (
       super.getSlideNJumpMoves(sq, V.steps[V.BISHOP])
-      .concat(super.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep"))
+      .concat(super.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1))
     );
   }
 
     );
   }
 
@@ -299,14 +299,14 @@ export class ShogunRules extends ChessRules {
   isAttackedByDuchess(sq, color) {
     return (
       super.isAttackedBySlideNJump(
   isAttackedByDuchess(sq, color) {
     return (
       super.isAttackedBySlideNJump(
-        sq, color, V.DUCHESS, V.steps[V.BISHOP], "oneStep")
+        sq, color, V.DUCHESS, V.steps[V.BISHOP], 1)
     );
   }
 
   isAttackedByCaptain(sq, color) {
     const steps = V.steps[V.BISHOP].concat(V.steps[V.ROOK]);
     return (
     );
   }
 
   isAttackedByCaptain(sq, color) {
     const steps = V.steps[V.BISHOP].concat(V.steps[V.ROOK]);
     return (
-      super.isAttackedBySlideNJump(sq, color, V.DUCHESS, steps, "oneStep")
+      super.isAttackedBySlideNJump(sq, color, V.DUCHESS, steps, 1)
     );
   }
 
     );
   }
 
@@ -314,7 +314,7 @@ export class ShogunRules extends ChessRules {
     return (
       super.isAttackedBySlideNJump(sq, color, V.MORTAR, V.steps[V.ROOK]) ||
       super.isAttackedBySlideNJump(
     return (
       super.isAttackedBySlideNJump(sq, color, V.MORTAR, V.steps[V.ROOK]) ||
       super.isAttackedBySlideNJump(
-        sq, color, V.MORTAR, V.steps[V.KNIGHT], "oneStep")
+        sq, color, V.MORTAR, V.steps[V.KNIGHT], 1)
     );
   }
 
     );
   }
 
@@ -322,7 +322,7 @@ export class ShogunRules extends ChessRules {
     const steps =
       V.steps[V.BISHOP].concat(V.steps[V.ROOK]).concat(V.steps[V.KNIGHT]);
     return (
     const steps =
       V.steps[V.BISHOP].concat(V.steps[V.ROOK]).concat(V.steps[V.KNIGHT]);
     return (
-      super.isAttackedBySlideNJump(sq, color, V.GENERAL, steps, "oneStep")
+      super.isAttackedBySlideNJump(sq, color, V.GENERAL, steps, 1)
     );
   }
 
     );
   }
 
@@ -331,7 +331,7 @@ export class ShogunRules extends ChessRules {
       super.isAttackedBySlideNJump(sq, color, V.ARCHBISHOP, V.steps[V.BISHOP])
       ||
       super.isAttackedBySlideNJump(
       super.isAttackedBySlideNJump(sq, color, V.ARCHBISHOP, V.steps[V.BISHOP])
       ||
       super.isAttackedBySlideNJump(
-        sq, color, V.ARCHBISHOP, V.steps[V.KNIGHT], "oneStep")
+        sq, color, V.ARCHBISHOP, V.steps[V.KNIGHT], 1)
     );
   }
 
     );
   }
 
index 5efd8cd..a18c2f0 100644 (file)
@@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea";
 
 export class SittuyinRules extends ChessRules {
 
 
 export class SittuyinRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
   static get HasFlags() {
     return false;
   }
@@ -260,18 +264,11 @@ export class SittuyinRules extends ChessRules {
   getPotentialBishopMoves(sq) {
     const forward = (this.turn == 'w' ? -1 : 1);
     return this.getSlideNJumpMoves(
   getPotentialBishopMoves(sq) {
     const forward = (this.turn == 'w' ? -1 : 1);
     return this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.BISHOP].concat([ [forward, 0] ]),
-      "oneStep"
-    );
+      sq, V.steps[V.BISHOP].concat([ [forward, 0] ]), 1);
   }
 
   getPotentialQueenMoves(sq) {
   }
 
   getPotentialQueenMoves(sq) {
-    return this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.BISHOP],
-      "oneStep"
-    );
+    return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1);
   }
 
   getAllValidMoves() {
   }
 
   getAllValidMoves() {
@@ -289,22 +286,12 @@ export class SittuyinRules extends ChessRules {
   isAttackedByBishop(sq, color) {
     const forward = (this.turn == 'w' ? 1 : -1);
     return this.isAttackedBySlideNJump(
   isAttackedByBishop(sq, color) {
     const forward = (this.turn == 'w' ? 1 : -1);
     return this.isAttackedBySlideNJump(
-      sq,
-      color,
-      V.BISHOP,
-      V.steps[V.BISHOP].concat([ [forward, 0] ]),
-      "oneStep"
-    );
+      sq, color, V.BISHOP, V.steps[V.BISHOP].concat([ [forward, 0] ]), 1);
   }
 
   isAttackedByQueen(sq, color) {
     return this.isAttackedBySlideNJump(
   }
 
   isAttackedByQueen(sq, color) {
     return this.isAttackedBySlideNJump(
-      sq,
-      color,
-      V.QUEEN,
-      V.steps[V.BISHOP],
-      "oneStep"
-    );
+      sq, color, V.QUEEN, V.steps[V.BISHOP], 1);
   }
 
   underCheck(color) {
   }
 
   underCheck(color) {
index 2400e04..20919ea 100644 (file)
@@ -16,8 +16,8 @@ export class SpartanRules extends ChessRules {
     return b;
   }
 
     return b;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "lgkcckwl/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 ah";
 
     // Mapping white --> black (first knight --> general; TODO):
       return "lgkcckwl/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 ah";
 
     // Mapping white --> black (first knight --> general; TODO):
@@ -30,7 +30,7 @@ export class SpartanRules extends ChessRules {
       'g': 'g'
     };
 
       'g': 'g'
     };
 
-    const baseFen = ChessRules.GenRandInitFen(randomness).replace('n', 'g');
+    const baseFen = ChessRules.GenRandInitFen(options).replace('n', 'g');
     return (
       baseFen.substr(0, 8).split('').map(p => piecesMap[p]).join('') +
       baseFen.substr(8)
     return (
       baseFen.substr(0, 8).split('').map(p => piecesMap[p]).join('') +
       baseFen.substr(8)
@@ -154,7 +154,7 @@ export class SpartanRules extends ChessRules {
   getPotentialSpartanKingMoves(sq) {
     // No castle:
     const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
   getPotentialSpartanKingMoves(sq) {
     // No castle:
     const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]);
-    return super.getSlideNJumpMoves(sq, steps, "oneStep");
+    return super.getSlideNJumpMoves(sq, steps, 1);
   }
 
   getPotentialHopliteMoves([x, y]) {
   }
 
   getPotentialHopliteMoves([x, y]) {
@@ -212,26 +212,26 @@ export class SpartanRules extends ChessRules {
     const steps = V.steps[V.BISHOP].concat(V.steps['a']);
     Array.prototype.push.apply(
       moves,
     const steps = V.steps[V.BISHOP].concat(V.steps['a']);
     Array.prototype.push.apply(
       moves,
-      super.getSlideNJumpMoves([x, y], steps, "oneStep")
+      super.getSlideNJumpMoves([x, y], steps, 1)
     );
     return moves;
   }
 
   getPotentialCaptainMoves([x, y]) {
     const steps = V.steps[V.ROOK].concat(V.steps['d']);
     );
     return moves;
   }
 
   getPotentialCaptainMoves([x, y]) {
     const steps = V.steps[V.ROOK].concat(V.steps['d']);
-    return super.getSlideNJumpMoves([x, y], steps, "oneStep")
+    return super.getSlideNJumpMoves([x, y], steps, 1)
   }
 
   getPotentialGeneralMoves([x, y]) {
     return (
   }
 
   getPotentialGeneralMoves([x, y]) {
     return (
-      super.getSlideNJumpMoves([x, y], V.steps[V.BISHOP], "oneStep")
+      super.getSlideNJumpMoves([x, y], V.steps[V.BISHOP], 1)
       .concat(super.getSlideNJumpMoves([x, y], V.steps[V.ROOK]))
     );
   }
 
   getPotentialWarlordMoves([x, y]) {
     return (
       .concat(super.getSlideNJumpMoves([x, y], V.steps[V.ROOK]))
     );
   }
 
   getPotentialWarlordMoves([x, y]) {
     return (
-      super.getSlideNJumpMoves([x, y], V.steps[V.KNIGHT], "oneStep")
+      super.getSlideNJumpMoves([x, y], V.steps[V.KNIGHT], 1)
       .concat(super.getSlideNJumpMoves([x, y], V.steps[V.BISHOP]))
     );
   }
       .concat(super.getSlideNJumpMoves([x, y], V.steps[V.BISHOP]))
     );
   }
@@ -249,25 +249,25 @@ export class SpartanRules extends ChessRules {
   }
 
   isAttackedByHoplite(sq) {
   }
 
   isAttackedByHoplite(sq) {
-    return super.isAttackedBySlideNJump(sq, 'b', V.PAWN, [[-1,0]], "oneStep");
+    return super.isAttackedBySlideNJump(sq, 'b', V.PAWN, [[-1,0]], 1);
   }
 
   isAttackedByLieutenant(sq) {
     const steps = V.steps[V.BISHOP].concat(V.steps['a']);
     return (
   }
 
   isAttackedByLieutenant(sq) {
     const steps = V.steps[V.BISHOP].concat(V.steps['a']);
     return (
-      super.isAttackedBySlideNJump(sq, 'b', V.LIEUTENANT, steps, "oneStep")
+      super.isAttackedBySlideNJump(sq, 'b', V.LIEUTENANT, steps, 1)
     );
   }
 
   isAttackedByCaptain(sq) {
     const steps = V.steps[V.ROOK].concat(V.steps['d']);
     );
   }
 
   isAttackedByCaptain(sq) {
     const steps = V.steps[V.ROOK].concat(V.steps['d']);
-    return super.isAttackedBySlideNJump(sq, 'b', V.CAPTAIN, steps, "oneStep");
+    return super.isAttackedBySlideNJump(sq, 'b', V.CAPTAIN, steps, 1);
   }
 
   isAttackedByGeneral(sq) {
     return (
       super.isAttackedBySlideNJump(
   }
 
   isAttackedByGeneral(sq) {
     return (
       super.isAttackedBySlideNJump(
-        sq, 'b', V.GENERAL, V.steps[V.BISHOP], "oneStep") ||
+        sq, 'b', V.GENERAL, V.steps[V.BISHOP], 1) ||
       super.isAttackedBySlideNJump(sq, 'b', V.GENERAL, V.steps[V.ROOK])
     );
   }
       super.isAttackedBySlideNJump(sq, 'b', V.GENERAL, V.steps[V.ROOK])
     );
   }
@@ -275,7 +275,7 @@ export class SpartanRules extends ChessRules {
   isAttackedByWarlord(sq) {
     return (
       super.isAttackedBySlideNJump(
   isAttackedByWarlord(sq) {
     return (
       super.isAttackedBySlideNJump(
-        sq, 'b', V.WARLORD, V.steps[V.KNIGHT], "oneStep") ||
+        sq, 'b', V.WARLORD, V.steps[V.KNIGHT], 1) ||
       super.isAttackedBySlideNJump(sq, 'b', V.WARLORD, V.steps[V.BISHOP])
     );
   }
       super.isAttackedBySlideNJump(sq, 'b', V.WARLORD, V.steps[V.BISHOP])
     );
   }
index 15caaf5..54c54c4 100644 (file)
@@ -81,8 +81,8 @@ export class Squatter2Rules extends ChessRules {
     return "1/2";
   }
 
     return "1/2";
   }
 
-  static GenRandInitFen(randomness) {
-    return SuicideRules.GenRandInitFen(randomness);
+  static GenRandInitFen(options) {
+    return SuicideRules.GenRandInitFen(options);
   }
 
 };
   }
 
 };
index dce7f5a..a82d170 100644 (file)
@@ -16,8 +16,7 @@ export class Stealthbomb1Rules extends ChessRules {
       t: "q",
       u: "r",
       c: "b",
       t: "q",
       u: "r",
       c: "b",
-      o: "n",
-      l: "k"
+      o: "n"
     };
   }
   static get BOMB_CODE() {
     };
   }
   static get BOMB_CODE() {
@@ -26,8 +25,7 @@ export class Stealthbomb1Rules extends ChessRules {
       q: "t",
       r: "u",
       b: "c",
       q: "t",
       r: "u",
       b: "c",
-      n: "o",
-      k: "l"
+      n: "o"
     };
   }
 
     };
   }
 
@@ -77,7 +75,7 @@ export class Stealthbomb1Rules extends ChessRules {
     );
   }
 
     );
   }
 
-  // Initiate the game by choosing a square for the bomb:
+  // Initiate the game by choosing a piece holding the bomb:
   doClick(square) {
     const c = this.turn;
     if (
   doClick(square) {
     const c = this.turn;
     if (
@@ -91,6 +89,7 @@ export class Stealthbomb1Rules extends ChessRules {
     }
     const [x, y] = square;
     const piece = super.getPiece(x, y);
     }
     const [x, y] = square;
     const piece = super.getPiece(x, y);
+    if (piece == V.KING) return null; //no bomb on king!
     return new Move({
       appear: [ new PiPo({ x: x, y: y, c: c, p: V.BOMB_CODE[piece] }) ],
       vanish: [ new PiPo({ x: x, y: y, c: c, p: piece }) ],
     return new Move({
       appear: [ new PiPo({ x: x, y: y, c: c, p: V.BOMB_CODE[piece] }) ],
       vanish: [ new PiPo({ x: x, y: y, c: c, p: piece }) ],
index 613a5c2..648ee29 100644 (file)
@@ -3,7 +3,7 @@ import { Stealthbomb1Rules } from "@/variants/Stealthbomb1";
 
 export class Stealthbomb2Rules extends Stealthbomb1Rules {
 
 
 export class Stealthbomb2Rules extends Stealthbomb1Rules {
 
-  // Initiate the game by choosing a square for the bomb:
+  // Initiate the game by choosing a pawn holding the bomb:
   doClick(square) {
     const c = this.turn;
     if (
   doClick(square) {
     const c = this.turn;
     if (
index 2bf3ecf..77aef39 100644 (file)
@@ -149,9 +149,9 @@ export class SuctionRules extends ChessRules {
     });
   }
 
     });
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     // Add empty cmove:
     // Add empty cmove:
-    return SuicideRules.GenRandInitFen(randomness) + " -";
+    return SuicideRules.GenRandInitFen(options) + " -";
   }
 
   getCmoveFen() {
   }
 
   getCmoveFen() {
index 13aaa6b..3b3c03c 100644 (file)
@@ -135,13 +135,13 @@ export class SuicideRules extends ChessRules {
     return -super.evalPosition();
   }
 
     return -super.evalPosition();
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 -";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     for (let c of ["w", "b"]) {
       return "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 -";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
         pieces['b'] = pieces['w'];
         break;
       }
index 167adea..3f4cde4 100644 (file)
@@ -146,9 +146,9 @@ export class SwapRules extends ChessRules {
     });
   }
 
     });
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     // Add empty smove:
     // Add empty smove:
-    return ChessRules.GenRandInitFen(randomness) + " -";
+    return ChessRules.GenRandInitFen(options) + " -";
   }
 
   getSmoveFen() {
   }
 
   getSmoveFen() {
index 7410d27..2aa5b45 100644 (file)
@@ -53,8 +53,8 @@ export class Synchrone1Rules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
-    return ChessRules.GenRandInitFen(randomness).slice(0, -1) + "-,- -";
+  static GenRandInitFen(options) {
+    return ChessRules.GenRandInitFen(options).slice(0, -1) + "-,- -";
   }
 
   getFen() {
   }
 
   getFen() {
index dc038ec..17b0be3 100644 (file)
@@ -47,8 +47,8 @@ export class Synchrone2Rules extends Synchrone1Rules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
-    const res = ChessRules.GenRandInitFen(randomness);
+  static GenRandInitFen(options) {
+    const res = ChessRules.GenRandInitFen(options);
     // Add initFen field:
     return res.slice(0, -1) + res.split(' ')[0] + " -";
   }
     // Add initFen field:
     return res.slice(0, -1) + res.split(' ')[0] + " -";
   }
index f5ee12a..74eecac 100644 (file)
@@ -2,6 +2,18 @@ import { ChessRules, Move, PiPo } from "@/base_rules";
 
 export class SynochessRules extends ChessRules {
 
 
 export class SynochessRules extends ChessRules {
 
+  static get Options() {
+    return {
+      check: [
+        {
+          label: "Random",
+          defaut: false,
+          variable: "random"
+        }
+      ]
+    };
+  }
+
   static get LoseOnRepetition() {
     return true;
   }
   static get LoseOnRepetition() {
     return true;
   }
@@ -28,8 +40,8 @@ export class SynochessRules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (!options.random)
       return "rneakenr/8/1c4c1/1ss2ss1/8/8/PPPPPPPP/RNBQKBNR w 0 ah - 2";
 
     // Mapping kingdom --> dynasty:
       return "rneakenr/8/1c4c1/1ss2ss1/8/8/PPPPPPPP/RNBQKBNR w 0 ah - 2";
 
     // Mapping kingdom --> dynasty:
@@ -42,7 +54,7 @@ export class SynochessRules extends ChessRules {
     };
 
     // Always symmetric (randomness = 1), because open files.
     };
 
     // Always symmetric (randomness = 1), because open files.
-    const baseFen = ChessRules.GenRandInitFen(1);
+    const baseFen = ChessRules.GenRandInitFen({ randomness: 1 });
     return (
       baseFen.substr(0, 8).split("").map(p => piecesMap[p]).join("") +
       "/8/1c4c1/1ss2ss1/" + baseFen.substr(22, 28) + " - 2"
     return (
       baseFen.substr(0, 8).split("").map(p => piecesMap[p]).join("") +
       "/8/1c4c1/1ss2ss1/" + baseFen.substr(22, 28) + " - 2"
@@ -305,17 +317,14 @@ export class SynochessRules extends ChessRules {
 
   getPotentialAdvisorMoves(sq) {
     return super.getSlideNJumpMoves(
 
   getPotentialAdvisorMoves(sq) {
     return super.getSlideNJumpMoves(
-      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), "oneStep");
+      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   getPotentialKingMoves([x, y]) {
     if (this.getColor(x, y) == 'w') return super.getPotentialKingMoves([x, y]);
     // Dynasty doesn't castle:
     return super.getSlideNJumpMoves(
   }
 
   getPotentialKingMoves([x, y]) {
     if (this.getColor(x, y) == 'w') return super.getPotentialKingMoves([x, y]);
     // Dynasty doesn't castle:
     return super.getSlideNJumpMoves(
-      [x, y],
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   getPotentialSoldierMoves([x, y]) {
   }
 
   getPotentialSoldierMoves([x, y]) {
@@ -326,11 +335,11 @@ export class SynochessRules extends ChessRules {
     if (!lastRank) steps.push([shiftX, 0]);
     if (y > 0) steps.push([0, -1]);
     if (y < 9) steps.push([0, 1]);
     if (!lastRank) steps.push([shiftX, 0]);
     if (y > 0) steps.push([0, -1]);
     if (y < 9) steps.push([0, 1]);
-    return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+    return super.getSlideNJumpMoves([x, y], steps, 1);
   }
 
   getPotentialElephantMoves([x, y]) {
   }
 
   getPotentialElephantMoves([x, y]) {
-    return this.getSlideNJumpMoves([x, y], V.steps[V.ELEPHANT], "oneStep");
+    return this.getSlideNJumpMoves([x, y], V.steps[V.ELEPHANT], 1);
   }
 
   // NOTE: (mostly) duplicated from Shako (TODO?)
   }
 
   // NOTE: (mostly) duplicated from Shako (TODO?)
@@ -417,26 +426,19 @@ export class SynochessRules extends ChessRules {
   }
 
   isAttackedByAdvisor(sq, color) {
   }
 
   isAttackedByAdvisor(sq, color) {
-    return (
-      super.isAttackedBySlideNJump(
-        sq, color, V.ADVISOR,
-        V.steps[V.ROOK].concat(V.steps[V.BISHOP]), "oneStep"
-      )
-    );
+    return super.isAttackedBySlideNJump(
+      sq, color, V.ADVISOR, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   isAttackedByElephant(sq, color) {
   }
 
   isAttackedByElephant(sq, color) {
-    return (
-      this.isAttackedBySlideNJump(
-        sq, color, V.ELEPHANT, V.steps[V.ELEPHANT], "oneStep"
-      )
-    );
+    return this.isAttackedBySlideNJump(
+      sq, color, V.ELEPHANT, V.steps[V.ELEPHANT], 1);
   }
 
   isAttackedBySoldier([x, y], color) {
     const shiftX = (color == 'w' ? 1 : -1); //shift from king
     return super.isAttackedBySlideNJump(
   }
 
   isAttackedBySoldier([x, y], color) {
     const shiftX = (color == 'w' ? 1 : -1); //shift from king
     return super.isAttackedBySlideNJump(
-      [x, y], color, V.SOLDIER, [[shiftX, 0], [0, 1], [0, -1]], "oneStep");
+      [x, y], color, V.SOLDIER, [[shiftX, 0], [0, 1], [0, -1]], 1);
   }
 
   getAllValidMoves() {
   }
 
   getAllValidMoves() {
index af48977..11270b2 100644 (file)
@@ -60,8 +60,6 @@ export class TencubedRules extends ChessRules {
 
   static get steps() {
     return Object.assign(
 
   static get steps() {
     return Object.assign(
-      {},
-      ChessRules.steps,
       {
         w: [
           [-3, -1],
       {
         w: [
           [-3, -1],
@@ -91,12 +89,13 @@ export class TencubedRules extends ChessRules {
           [2, 0],
           [0, 2]
         ]
           [2, 0],
           [0, 2]
         ]
-      }
+      },
+      ChessRules.steps,
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0) {
+  static GenRandInitFen(options) {
+    if (options.randomness == 0) {
       return (
         "2cwamwc2/1rnbqkbnr1/pppppppppp/91/91/" +
         "91/91/PPPPPPPPPP/1RNBQKBNR1/2CWAMWC2/ " +
       return (
         "2cwamwc2/1rnbqkbnr1/pppppppppp/91/91/" +
         "91/91/PPPPPPPPPP/1RNBQKBNR1/2CWAMWC2/ " +
@@ -104,7 +103,7 @@ export class TencubedRules extends ChessRules {
       );
     }
 
       );
     }
 
-    const baseFen = V.ParseFen(ChessRules.GenRandInitFen(randomness));
+    const baseFen = V.ParseFen(ChessRules.GenRandInitFen(options));
     const positionParts = baseFen.position.split("/");
     const bFen = (
       "1" + positionParts[0] +
     const positionParts = baseFen.position.split("/");
     const bFen = (
       "1" + positionParts[0] +
@@ -164,22 +163,22 @@ export class TencubedRules extends ChessRules {
 
   getPotentialMarshallMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat(
 
   getPotentialMarshallMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")
+      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)
     );
   }
 
   getPotentialArchbishopMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat(
     );
   }
 
   getPotentialArchbishopMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat(
-      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")
+      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)
     );
   }
 
   getPotentialChampionMoves(sq) {
     );
   }
 
   getPotentialChampionMoves(sq) {
-    return this.getSlideNJumpMoves(sq, V.steps[V.CHAMPION], "oneStep");
+    return this.getSlideNJumpMoves(sq, V.steps[V.CHAMPION], 1);
   }
 
   getPotentialWizardMoves(sq) {
   }
 
   getPotentialWizardMoves(sq) {
-    return this.getSlideNJumpMoves(sq, V.steps[V.WIZARD], "oneStep");
+    return this.getSlideNJumpMoves(sq, V.steps[V.WIZARD], 1);
   }
 
   isAttacked(sq, color) {
   }
 
   isAttacked(sq, color) {
@@ -195,41 +194,28 @@ export class TencubedRules extends ChessRules {
   isAttackedByMarshall(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.MARSHALL, V.steps[V.ROOK]) ||
   isAttackedByMarshall(sq, color) {
     return (
       this.isAttackedBySlideNJump(sq, color, V.MARSHALL, V.steps[V.ROOK]) ||
-      this.isAttackedBySlideNJump(
-        sq,
-        color,
-        V.MARSHALL,
-        V.steps[V.KNIGHT],
-        "oneStep"
-      )
+      this.isAttackedBySlideNJump(sq, color, V.MARSHALL, V.steps[V.KNIGHT], 1)
     );
   }
 
   isAttackedByArchbishop(sq, color) {
     return (
     );
   }
 
   isAttackedByArchbishop(sq, color) {
     return (
-      this.isAttackedBySlideNJump(sq, color, V.ARCHBISHOP, V.steps[V.BISHOP]) ||
       this.isAttackedBySlideNJump(
       this.isAttackedBySlideNJump(
-        sq,
-        color,
-        V.ARCHBISHOP,
-        V.steps[V.KNIGHT],
-        "oneStep"
-      )
+        sq, color, V.ARCHBISHOP, V.steps[V.BISHOP])
+      ||
+      this.isAttackedBySlideNJump(
+        sq, color, V.ARCHBISHOP, V.steps[V.KNIGHT], 1)
     );
   }
 
   isAttackedByWizard(sq, color) {
     );
   }
 
   isAttackedByWizard(sq, color) {
-    return (
-      this.isAttackedBySlideNJump(
-        sq, color, V.WIZARD, V.steps[V.WIZARD], "oneStep")
-    );
+    return this.isAttackedBySlideNJump(
+      sq, color, V.WIZARD, V.steps[V.WIZARD], 1);
   }
 
   isAttackedByChampion(sq, color) {
   }
 
   isAttackedByChampion(sq, color) {
-    return (
-      this.isAttackedBySlideNJump(
-        sq, color, V.CHAMPION, V.steps[V.CHAMPION], "oneStep")
-    );
+    return this.isAttackedBySlideNJump(
+      sq, color, V.CHAMPION, V.steps[V.CHAMPION], 1);
   }
 
   static get SEARCH_DEPTH() {
   }
 
   static get SEARCH_DEPTH() {
@@ -238,9 +224,13 @@ export class TencubedRules extends ChessRules {
 
   static get VALUES() {
     return Object.assign(
 
   static get VALUES() {
     return Object.assign(
-      {},
-      ChessRules.VALUES,
-      { c: 4, w: 3, a: 6, m: 8 }
+      {
+        c: 4,
+        w: 3,
+        a: 6,
+        m: 8
+      },
+      ChessRules.VALUES
     );
   }
 
     );
   }
 
index c297d0a..038d223 100644 (file)
@@ -48,9 +48,9 @@ export class ThreechecksRules extends ChessRules {
     return super.getCurrentScore();
   }
 
     return super.getCurrentScore();
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     // Add check flags (at 0)
     // Add check flags (at 0)
-    return ChessRules.GenRandInitFen(randomness).slice(0, -2) + "00";
+    return ChessRules.GenRandInitFen(options).slice(0, -2) + "00";
   }
 
   getFlagsFen() {
   }
 
   getFlagsFen() {
index 4d71b85..425e08d 100644 (file)
@@ -154,6 +154,8 @@ export class TitanRules extends ChessRules {
     const [x, y] = [square[0], square[1]];
     if ((color == 'w' && x != 7) || (color == 'b' && x != 0)) return null;
     const selectedPiece = this.board[x][y][1];
     const [x, y] = [square[0], square[1]];
     if ((color == 'w' && x != 7) || (color == 'b' && x != 0)) return null;
     const selectedPiece = this.board[x][y][1];
+    // Prevent re-augmenting a chosen piece:
+    if (!ChessRules.PIECES.includes(selectedPiece)) return null;
     return new Move({
       appear: [
         new PiPo({
     return new Move({
       appear: [
         new PiPo({
index 6606da5..b5f2b05 100644 (file)
@@ -55,8 +55,8 @@ export class TwokingsRules extends CoregalRules {
     return squares;
   }
 
     return squares;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "rnqkkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNQKKBNR w 0 adehadeh -";
 
     const replaceBishop = (fen, first, ch1, ch2) => {
       return "rnqkkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNQKKBNR w 0 adehadeh -";
 
     const replaceBishop = (fen, first, ch1, ch2) => {
@@ -84,7 +84,7 @@ export class TwokingsRules extends CoregalRules {
     };
 
     const fen =
     };
 
     const fen =
-      CoregalRules.GenRandInitFen(randomness)
+      CoregalRules.GenRandInitFen(options)
       .replace("q", "k").replace("Q", "K");
     // Now replace a bishop by the queen,
     // so that bishops are of different colors:
       .replace("q", "k").replace("Q", "K");
     // Now replace a bishop by the queen,
     // so that bishops are of different colors:
index 43f3825..3149dae 100644 (file)
@@ -12,13 +12,13 @@ export class UpsidedownRules extends ChessRules {
     return false;
   }
 
     return false;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "RNBQKBNR/PPPPPPPP/8/8/8/8/pppppppp/rnbqkbnr w 0";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     for (let c of ["w", "b"]) {
       return "RNBQKBNR/PPPPPPPP/8/8/8/8/pppppppp/rnbqkbnr w 0";
 
     let pieces = { w: new Array(8), b: new Array(8) };
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
         pieces['b'] = pieces['w'];
         break;
       }
index c12435c..fc43372 100644 (file)
@@ -12,12 +12,7 @@ export class VchessRules extends ChessRules {
 
   isAttackedByPawn(sq, color) {
     return this.isAttackedBySlideNJump(
 
   isAttackedByPawn(sq, color) {
     return this.isAttackedBySlideNJump(
-      sq,
-      color,
-      V.PAWN,
-      V.steps[V.BISHOP],
-      "oneStep"
-    );
+      sq, color, V.PAWN, V.steps[V.BISHOP], 1);
   }
 
   getNotation(move) {
   }
 
   getNotation(move) {
index 93353f9..647a234 100644 (file)
@@ -181,15 +181,12 @@ export class WildebeestRules extends ChessRules {
   }
 
   getPotentialCamelMoves(sq) {
   }
 
   getPotentialCamelMoves(sq) {
-    return this.getSlideNJumpMoves(sq, V.steps[V.CAMEL], "oneStep");
+    return this.getSlideNJumpMoves(sq, V.steps[V.CAMEL], 1);
   }
 
   getPotentialWildebeestMoves(sq) {
     return this.getSlideNJumpMoves(
   }
 
   getPotentialWildebeestMoves(sq) {
     return this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.KNIGHT].concat(V.steps[V.CAMEL]),
-      "oneStep"
-    );
+      sq, V.steps[V.KNIGHT].concat(V.steps[V.CAMEL]), 1);
   }
 
   getPPpath(m) {
   }
 
   getPPpath(m) {
@@ -276,22 +273,12 @@ export class WildebeestRules extends ChessRules {
 
   isAttackedByCamel(sq, color) {
     return this.isAttackedBySlideNJump(
 
   isAttackedByCamel(sq, color) {
     return this.isAttackedBySlideNJump(
-      sq,
-      color,
-      V.CAMEL,
-      V.steps[V.CAMEL],
-      "oneStep"
-    );
+      sq, color, V.CAMEL, V.steps[V.CAMEL], 1);
   }
 
   isAttackedByWildebeest(sq, color) {
     return this.isAttackedBySlideNJump(
   }
 
   isAttackedByWildebeest(sq, color) {
     return this.isAttackedBySlideNJump(
-      sq,
-      color,
-      V.WILDEBEEST,
-      V.steps[V.KNIGHT].concat(V.steps[V.CAMEL]),
-      "oneStep"
-    );
+      sq, color, V.WILDEBEEST, V.steps[V.KNIGHT].concat(V.steps[V.CAMEL]), 1);
   }
 
   getCurrentScore() {
   }
 
   getCurrentScore() {
@@ -311,8 +298,8 @@ export class WildebeestRules extends ChessRules {
     return 2;
   }
 
     return 2;
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0) {
+  static GenRandInitFen(options) {
+    if (options.randomness == 0) {
       return (
         "rnccwkqbbnr/ppppppppppp/92/92/92/92/92/92/PPPPPPPPPPP/RNBBQKWCCNR " +
         "w 0 akak -"
       return (
         "rnccwkqbbnr/ppppppppppp/92/92/92/92/92/92/PPPPPPPPPPP/RNBBQKWCCNR " +
         "w 0 akak -"
@@ -322,7 +309,7 @@ export class WildebeestRules extends ChessRules {
     let pieces = { w: new Array(11), b: new Array(11) };
     let flags = "";
     for (let c of ["w", "b"]) {
     let pieces = { w: new Array(11), b: new Array(11) };
     let flags = "";
     for (let c of ["w", "b"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         flags += flags;
         break;
         pieces['b'] = pieces['w'];
         flags += flags;
         break;
index 1190111..5d838b4 100644 (file)
@@ -73,8 +73,8 @@ export class Wormhole1Rules extends Wormhole2Rules {
     };
   }
 
     };
   }
 
-  static GenRandInitFen(randomness) {
-    if (randomness == 0)
+  static GenRandInitFen(options) {
+    if (options.randomness == 0)
       return "cnwmkwnc/pppppppp/8/8/8/8/PPPPPPPP/CNWMKWNC w 0";
 
     // Mapping new --> standard:
       return "cnwmkwnc/pppppppp/8/8/8/8/PPPPPPPP/CNWMKWNC w 0";
 
     // Mapping new --> standard:
@@ -86,7 +86,7 @@ export class Wormhole1Rules extends Wormhole2Rules {
       'k': 'k'
     };
 
       'k': 'k'
     };
 
-    const baseFen = ChessRules.GenRandInitFen(randomness);
+    const baseFen = ChessRules.GenRandInitFen(options);
     return (
       baseFen.substr(0, 8).split('').map(p => piecesMap[p]).join('') +
       baseFen.substr(8, 27) +
     return (
       baseFen.substr(0, 8).split('').map(p => piecesMap[p]).join('') +
       baseFen.substr(8, 27) +
index 6215ea9..4fef565 100644 (file)
@@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules";
 
 export class XiangqiRules extends ChessRules {
 
 
 export class XiangqiRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   // NOTE (TODO?) scanKings() could be more efficient (in Jangqi too)
 
   static get Monochrome() {
   // NOTE (TODO?) scanKings() could be more efficient (in Jangqi too)
 
   static get Monochrome() {
@@ -154,7 +158,7 @@ export class XiangqiRules extends ChessRules {
       if (y > 0) steps.push([0, -1]);
       if (y < 9) steps.push([0, 1]);
     }
       if (y > 0) steps.push([0, -1]);
       if (y < 9) steps.push([0, 1]);
     }
-    return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+    return super.getSlideNJumpMoves([x, y], steps, 1);
   }
 
   knightStepsFromRookStep(step) {
   }
 
   knightStepsFromRookStep(step) {
@@ -172,7 +176,7 @@ export class XiangqiRules extends ChessRules {
           this.knightStepsFromRookStep(rookStep));
       }
     }
           this.knightStepsFromRookStep(rookStep));
       }
     }
-    return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+    return super.getSlideNJumpMoves([x, y], steps, 1);
   }
 
   getPotentialElephantMoves([x, y]) {
   }
 
   getPotentialElephantMoves([x, y]) {
@@ -188,7 +192,7 @@ export class XiangqiRules extends ChessRules {
           // "out of board" checks delayed to next method
       }
     }
           // "out of board" checks delayed to next method
       }
     }
-    return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+    return super.getSlideNJumpMoves([x, y], steps, 1);
   }
 
   getPotentialAdvisorMoves([x, y]) {
   }
 
   getPotentialAdvisorMoves([x, y]) {
@@ -212,11 +216,11 @@ export class XiangqiRules extends ChessRules {
         if (y == 3) step = [-direction, 1];
         else step = [-direction, -1];
       }
         if (y == 3) step = [-direction, 1];
         else step = [-direction, -1];
       }
-      return super.getSlideNJumpMoves([x, y], [step], "oneStep");
+      return super.getSlideNJumpMoves([x, y], [step], 1);
     }
     // In the middle of the palace:
     return (
     }
     // In the middle of the palace:
     return (
-      super.getSlideNJumpMoves([x, y], ChessRules.steps[V.BISHOP], "oneStep")
+      super.getSlideNJumpMoves([x, y], ChessRules.steps[V.BISHOP], 1)
     );
   }
 
     );
   }
 
@@ -234,11 +238,11 @@ export class XiangqiRules extends ChessRules {
       if (x > (c == 'w' ? V.size.x - 3 : 0)) steps.push([-1, 0]);
       if (y > 3) steps.push([0, -1]);
       if (y < 5) steps.push([0, 1]);
       if (x > (c == 'w' ? V.size.x - 3 : 0)) steps.push([-1, 0]);
       if (y > 3) steps.push([0, -1]);
       if (y < 5) steps.push([0, 1]);
-      return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+      return super.getSlideNJumpMoves([x, y], steps, 1);
     }
     // In the middle of the palace:
     return (
     }
     // In the middle of the palace:
     return (
-      super.getSlideNJumpMoves([x, y], ChessRules.steps[V.ROOK], "oneStep")
+      super.getSlideNJumpMoves([x, y], ChessRules.steps[V.ROOK], 1)
     );
   }
 
     );
   }
 
@@ -283,7 +287,7 @@ export class XiangqiRules extends ChessRules {
     // The pawn necessarily crossed the river (attack on king)
     const shiftX = (color == 'w' ? 1 : -1); //shift from king
     return super.isAttackedBySlideNJump(
     // The pawn necessarily crossed the river (attack on king)
     const shiftX = (color == 'w' ? 1 : -1); //shift from king
     return super.isAttackedBySlideNJump(
-      [x, y], color, V.PAWN, [[shiftX, 0], [0, 1], [0, -1]], "oneStep");
+      [x, y], color, V.PAWN, [[shiftX, 0], [0, 1], [0, -1]], 1);
   }
 
   knightStepsFromBishopStep(step) {
   }
 
   knightStepsFromBishopStep(step) {
@@ -303,7 +307,7 @@ export class XiangqiRules extends ChessRules {
       }
     }
     return (
       }
     }
     return (
-      super.isAttackedBySlideNJump([x, y], color, V.KNIGHT, steps, "oneStep")
+      super.isAttackedBySlideNJump([x, y], color, V.KNIGHT, steps, 1)
     );
   }
 
     );
   }
 
index 4e53fe9..6863026 100644 (file)
@@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea";
 
 export class YoteRules extends ChessRules {
 
 
 export class YoteRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
   static get HasFlags() {
     return false;
   }
@@ -72,7 +76,7 @@ export class YoteRules extends ChessRules {
     );
   }
 
     );
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen() {
     return "6/6/6/6/6 w 0 12,12 -,-";
   }
 
     return "6/6/6/6/6 w 0 12,12 -,-";
   }
 
index 7edbe40..bfbc7e2 100644 (file)
@@ -27,24 +27,6 @@ export class ZenRules extends ChessRules {
     return undefined;
   }
 
     return undefined;
   }
 
-  // TODO(?): some duplicated code in 2 next functions
-  getSlideNJumpMoves([x, y], steps, oneStep) {
-    let moves = [];
-    outerLoop: for (let loop = 0; loop < steps.length; loop++) {
-      const step = steps[loop];
-      let i = x + step[0];
-      let j = y + step[1];
-      while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
-        moves.push(this.getBasicMove([x, y], [i, j]));
-        if (oneStep) continue outerLoop;
-        i += step[0];
-        j += step[1];
-      }
-      // No capture check: handled elsewhere (next method)
-    }
-    return moves;
-  }
-
   // follow steps from x,y until something is met.
   // if met piece is opponent and same movement (asA): eat it!
   findCaptures_aux([x, y], asA) {
   // follow steps from x,y until something is met.
   // if met piece is opponent and same movement (asA): eat it!
   findCaptures_aux([x, y], asA) {
@@ -110,7 +92,7 @@ export class ZenRules extends ChessRules {
     return moves;
   }
 
     return moves;
   }
 
-  canTake(sq1, sq2) {
+  canTake() {
     return false; //captures handled separately
   }
 
     return false; //captures handled separately
   }
 
index a2afb09..bbc6484 100644 (file)
@@ -333,6 +333,29 @@ export default {
         )
       );
     },
         )
       );
     },
+    requestLastate: function(sid) {
+      // TODO: maybe also find opponent SID ?
+      //const oppSid =
+      //  this.game.players.find(p => p.sid != this.st.user.sid).sid;
+      this.send("asklastate", { target: sid });
+      let counter = 1;
+      this.askLastate = setInterval(
+        () => {
+          // Ask at most 3 times:
+          // if no reply after that there should be a network issue.
+          if (
+            counter < 3 &&
+            !this.gotLastate &&
+            !!this.people[sid]
+          ) {
+            this.send("asklastate", { target: sid });
+            counter++;
+          }
+          else clearInterval(this.askLastate);
+        },
+        1500
+      );
+    },
     atCreation: function() {
       document.addEventListener('visibilitychange', this.visibilityChange);
       window.addEventListener('focus', this.onFocus);
     atCreation: function() {
       document.addEventListener('visibilitychange', this.visibilityChange);
       window.addEventListener('focus', this.onFocus);
@@ -395,6 +418,8 @@ export default {
               "message", this.socketMessageListener);
             this.conn = new WebSocket(this.connexionString);
             this.conn.addEventListener("message", this.socketMessageListener);
               "message", this.socketMessageListener);
             this.conn = new WebSocket(this.connexionString);
             this.conn.addEventListener("message", this.socketMessageListener);
+            const oppSid = this.getOppsid();
+            if (!!oppSid) this.requestLaststate(oppSid); //in case of
           }
         },
         1000
           }
         },
         1000
@@ -672,24 +697,7 @@ export default {
             this.game.type == "live" &&
             this.game.players.some(p => p.sid == user.sid)
           ) {
             this.game.type == "live" &&
             this.game.players.some(p => p.sid == user.sid)
           ) {
-            this.send("asklastate", { target: user.sid });
-            let counter = 1;
-            this.askLastate = setInterval(
-              () => {
-                // Ask at most 3 times:
-                // if no reply after that there should be a network issue.
-                if (
-                  counter < 3 &&
-                  !this.gotLastate &&
-                  !!this.people[user.sid]
-                ) {
-                  this.send("asklastate", { target: user.sid });
-                  counter++;
-                }
-                else clearInterval(this.askLastate);
-              },
-              1500
-            );
+            this.requestLaststate(user.sid);
           }
           break;
         }
           }
           break;
         }
index 05ee05b..224d5d2 100644 (file)
@@ -52,8 +52,8 @@ main
             )
               | {{ v.display }}
         // Variant-specific options (often at least randomness)
             )
               | {{ v.display }}
         // Variant-specific options (often at least randomness)
-        fieldset(v-if="!!newchallenge.V")
-          div(v-for="select of newchallenge.V.Options.select")
+        fieldset(v-if="!!newchallenge.V && newchallenge.V.Options")
+          div(v-for="select of newchallenge.V.Options.select || []")
             label(:for="select.variable + '_opt'") {{ st.tr[select.label] }} *
             select(:id="select.variable + '_opt'")
               option(
             label(:for="select.variable + '_opt'") {{ st.tr[select.label] }} *
             select(:id="select.variable + '_opt'")
               option(
@@ -62,7 +62,7 @@ main
                 :selected="o.value == select.defaut"
               )
                 | {{ st.tr[o.label] }}
                 :selected="o.value == select.defaut"
               )
                 | {{ st.tr[o.label] }}
-          div(v-for="check of newchallenge.V.Options.check")
+          div(v-for="check of newchallenge.V.Options.check || []")
             label(:for="check.variable + '_opt'") {{ st.tr[check.label] }} *
             input(
               :id="check.variable + '_opt'"
             label(:for="check.variable + '_opt'") {{ st.tr[check.label] }} *
             input(
               :id="check.variable + '_opt'"
@@ -300,10 +300,6 @@ export default {
     }
   },
   created: function() {
     }
   },
   created: function() {
-    // TODO: remove this patch soon:
-    this.presetChalls.forEach(pc => {
-      if (!pc.options) pc.options = { randomness: pc.randomness };
-    });
     document.addEventListener('visibilitychange', this.visibilityChange);
     window.addEventListener('focus', this.onFocus);
     window.addEventListener('blur', this.onBlur);
     document.addEventListener('visibilitychange', this.visibilityChange);
     window.addEventListener('focus', this.onFocus);
     window.addEventListener('blur', this.onBlur);
@@ -479,16 +475,12 @@ export default {
       this.conn = null;
     },
     getRandomnessClass: function(pc) {
       this.conn = null;
     },
     getRandomnessClass: function(pc) {
-      if (
-        // TODO: one extra test here
-        !Number.isInteger(pc.options.randomness) &&
-        !parseInt(pc.options.randomness, 10)
-      ) {
+      const opts = pc.options;
+      if (opts.randomness === undefined && opts.random === undefined)
         return {};
         return {};
-      }
-      return {
-        ["random-" + pc.options.randomness]: true
-      };
+      if (opts.randomness !== undefined)
+        return { ["random-" + opts.randomness]: true };
+      return { ["random-" + (opts.random ? 2 : 0)]: true };
     },
     anonymousCount: function() {
       let count = 0;
     },
     anonymousCount: function() {
       let count = 0;
@@ -1090,30 +1082,29 @@ export default {
           error = this.st.tr["Wrong color"];
         }
       }
           error = this.st.tr["Wrong color"];
         }
       }
-      if (!!error) {
-        alert(error);
-        return;
-      }
-      window.V = this.newchallenge.V;
-      error = checkChallenge(this.newchallenge);
       if (error) {
         alert(error);
         return;
       }
       if (error) {
         alert(error);
         return;
       }
-      // NOTE: "from" information is not required here
-      let chall = Object.assign({}, this.newchallenge);
-      chall.options = {};
+      window.V = this.newchallenge.V;
+      let chall = Object.assign({ options: {} }, this.newchallenge);
       // Get/set options variables (if any) / TODO: v-model?!
       // Get/set options variables (if any) / TODO: v-model?!
-      for (const check of this.newchallenge.V.Options.check) {
+      for (const check of this.newchallenge.V.Options.check || []) {
         const elt = document.getElementById(check.variable + "_opt");
         if (elt.checked) chall.options[check.variable] = true;
       }
         const elt = document.getElementById(check.variable + "_opt");
         if (elt.checked) chall.options[check.variable] = true;
       }
-      for (const select of this.newchallenge.V.Options.select) {
+      for (const select of this.newchallenge.V.Options.select || []) {
         const elt = document.getElementById(select.variable + "_opt");
         const elt = document.getElementById(select.variable + "_opt");
-        chall.options[select.variable] = elt.value;
+        chall.options[select.variable] = parseInt(elt.value, 10) || elt.value;
+      }
+      error = checkChallenge(chall);
+      if (error) {
+        alert(this.st.tr[error]);
+        return;
       }
       chall.options.abridged = V.AbbreviateOptions(chall.options);
       // Add only if not already issued (not counting FEN):
       }
       chall.options.abridged = V.AbbreviateOptions(chall.options);
       // Add only if not already issued (not counting FEN):
+      // NOTE: "from" information is not required here
       if (this.challenges.some(c =>
         (
           c.from.sid == this.st.user.sid ||
       if (this.challenges.some(c =>
         (
           c.from.sid == this.st.user.sid ||
index fc3a0cd..d668eba 100644 (file)
@@ -8,9 +8,9 @@ main
     .card
       label.modal-close(for="modalOptions")
       h3 {{ st.tr["Options"] }}
     .card
       label.modal-close(for="modalOptions")
       h3 {{ st.tr["Options"] }}
-      fieldset(v-if="!!V")
-        div(v-for="select of V.Options.select")
-          label(:for="select.variable + '_opt'") {{ st.tr[select.label] }} *
+      fieldset(v-if="!!V && V.Options")
+        div(v-for="select of V.Options.select || []")
+          label(:for="select.variable + '_opt'") {{ st.tr[select.label] }}
           select(:id="select.variable + '_opt'")
             option(
               v-for="o of select.options"
           select(:id="select.variable + '_opt'")
             option(
               v-for="o of select.options"
@@ -18,8 +18,8 @@ main
               :selected="o.value == select.defaut"
             )
               | {{ st.tr[o.label] }}
               :selected="o.value == select.defaut"
             )
               | {{ st.tr[o.label] }}
-        div(v-for="check of V.Options.check")
-          label(:for="check.variable + '_opt'") {{ st.tr[check.label] }} *
+        div(v-for="check of V.Options.check || []")
+          label(:for="check.variable + '_opt'") {{ st.tr[check.label] }}
           input(
             :id="check.variable + '_opt'"
             type="checkbox"
           input(
             :id="check.variable + '_opt'"
             type="checkbox"
@@ -150,13 +150,17 @@ export default {
     setOptions: function() {
       let options = {};
       // Get/set options variables / TODO: v-model?!
     setOptions: function() {
       let options = {};
       // Get/set options variables / TODO: v-model?!
-      for (const check of this.V.Options.check) {
+      for (const check of this.V.Options.check || []) {
         const elt = document.getElementById(check.variable + "_opt");
         if (elt.checked) options[check.variable] = true;
       }
         const elt = document.getElementById(check.variable + "_opt");
         if (elt.checked) options[check.variable] = true;
       }
-      for (const select of this.V.Options.select) {
+      for (const select of this.V.Options.select || []) {
         const elt = document.getElementById(select.variable + "_opt");
         const elt = document.getElementById(select.variable + "_opt");
-        options[select.variable] = elt.value;
+        options[select.variable] = parseInt(elt.value, 10) || elt.value;
+      }
+      if (!V.IsValidOptions(options)) {
+        alert(this.st.tr["Invalid options"]);
+        return;
       }
       document.getElementById("modalOptions").checked = false;
       if (this.whatNext == "analyze") this.gotoAnalyze(options);
       }
       document.getElementById("modalOptions").checked = false;
       if (this.whatNext == "analyze") this.gotoAnalyze(options);
@@ -186,12 +190,12 @@ export default {
             CompgameStorage.remove(game.vname);
             game = null;
           }
             CompgameStorage.remove(game.vname);
             game = null;
           }
-          if (!!game || Object.keys(V.Options).length == 0) next(game);
+          if (!!game || !V.Options) next(game);
           else askOptions();
         });
       }
       else {
           else askOptions();
         });
       }
       else {
-        if (Object.keys(V.Options).length == 0) next();
+        if (!V.Options) next();
         else askOptions();
       }
     },
         else askOptions();
       }
     },
@@ -206,7 +210,7 @@ export default {
         CompgameStorage.remove(this.gameInfo.vname);
     },
     gotoAnalyze: function(options) {
         CompgameStorage.remove(this.gameInfo.vname);
     },
     gotoAnalyze: function(options) {
-      if (!options && Object.keys(V.Options).length > 0) {
+      if (!options && V.Options) {
         this.whatNext = "analyze";
         doClick("modalOptions");
       }
         this.whatNext = "analyze";
         doClick("modalOptions");
       }
index f60e5f1..8de335e 100644 (file)
@@ -16,7 +16,7 @@ main
         h3 {{ st.tr["vt" + g] }}
         p {{ st.tr["vg" + g] }}
         ul
         h3 {{ st.tr["vt" + g] }}
         p {{ st.tr["vg" + g] }}
         ul
-          li(v-for="v of variantGroup.get(g)")
+          li(v-for="v of sortVariants(variantGroup.get(g))")
             a(:href="getLink(v)") {{ v.display }}
             | &nbsp&ndash;&nbsp;
             | {{ st.tr[v.description] }}
             a(:href="getLink(v)") {{ v.display }}
             | &nbsp&ndash;&nbsp;
             | {{ st.tr[v.description] }}
@@ -59,6 +59,9 @@ export default {
     }
   },
   methods: {
     }
   },
   methods: {
+    sortVariants: function(group) {
+      return group.sort( (v1, v2) => v1.name.localeCompare(v2.name) );
+    },
     // oninput listener, required for smartphones:
     setCurPrefix: function(e) {
       this.curPrefix = e.target.value;
     // oninput listener, required for smartphones:
     setCurPrefix: function(e) {
       this.curPrefix = e.target.value;