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)
 
-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
@@ -16,7 +25,6 @@ Tablut
 
 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)
 
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: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"
+   height="100%"
+   width="100%"
    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
-     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" />
-        <dc:title />
       </cc:Work>
     </rdf:RDF>
   </metadata>
+  <defs
+     id="defs20" />
   <sodipodi:namedview
      pagecolor="#ffffff"
      bordercolor="#666666"
      guidetolerance="10"
      inkscape:pageopacity="0"
      inkscape:pageshadow="2"
-     inkscape:window-width="1920"
+     inkscape:window-width="960"
      inkscape:window-height="1060"
-     id="namedview976"
+     id="namedview18"
      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: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
-     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
-       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
-       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
-     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>
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"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <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"
-   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
-     id="metadata3133">
+     id="metadata22">
     <rdf:RDF>
       <cc:Work
          rdf:about="">
       </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
-     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
-       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
-       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
-       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
-       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
-     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>
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: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"
+   height="100%"
+   width="100%"
    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
-     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" />
-        <dc:title />
       </cc:Work>
     </rdf:RDF>
   </metadata>
+  <defs
+     id="defs22" />
   <sodipodi:namedview
      pagecolor="#ffffff"
      bordercolor="#666666"
      guidetolerance="10"
      inkscape:pageopacity="0"
      inkscape:pageshadow="2"
-     inkscape:window-width="1920"
+     inkscape:window-width="960"
      inkscape:window-height="1060"
-     id="namedview976"
+     id="namedview20"
      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: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
-     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
-     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
-       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
-     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
-     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
-     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>
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"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
 <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"
-   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
-     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" />
-        <dc:title />
       </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
-     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
-       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
-       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
-       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
-     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>
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",
-          defaut: 2,
+          defaut: 0,
           options: [
             { label: "Deterministic", value: 0 },
             { label: "Symmetric random", value: 1 },
@@ -58,6 +58,10 @@ export const ChessRules = class ChessRules {
     //return "R" + opts.randomness;
   }
 
+  static IsValidOptions(opts) {
+    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) {
-    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 -";
 
@@ -746,14 +749,15 @@ export const ChessRules = class ChessRules {
 
   // 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 stepCounter = 0;
       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];
       }
@@ -895,7 +899,7 @@ export const ChessRules = class ChessRules {
 
   // 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 ?
@@ -906,19 +910,14 @@ export const ChessRules = class ChessRules {
   // 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(
-      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;
@@ -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 ?
-  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];
-      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];
+        stepCounter++;
       }
       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.addEventListener("wheel", this.handleScroll);
+      if (this.st.settings.scrollmove)
+        baseGameDiv.addEventListener("wheel", this.handleScroll);
     }
     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 += '[Options "' + JSON.stringify(this.game.options) + '"]\n';
       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";
     },
+    // TODO: duplicated from Hall
     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 {
-        ["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"
           )
+        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>
@@ -83,6 +90,9 @@ export default {
   computed: {
     flagImage: function() {
       return `/images/flags/${this.st.lang}.svg`;
+    },
+    desktopBrowser: function() {
+      return !("ontouchstart" in window);
     }
   },
   methods: {
index ea85ea7..b57a23e 100644 (file)
@@ -64,6 +64,9 @@ export default {
           case "Cadence":
             game.cadence = value;
             break;
+          case "Options":
+            game.options = value;
+            break;
         }
         idx++;
       }
index 7665f6f..554dfdf 100644 (file)
@@ -19,5 +19,7 @@ export function checkChallenge(c) {
   }
   else c.fen = "";
 
+  if (!V.IsValidOptions(c.options)) return "Invalid options";
+
   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
-    const getItemDefaultTrue = (item) => {
+    const getItemDefault = (item, defaut) => {
       const value = localStorage.getItem(item);
-      if (!value) return true;
+      if (!value) return defaut;
       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);
index 82fabd0..5ab686b 100644 (file)
@@ -14,9 +14,8 @@ h3 Notes
 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
 
index 95f69c0..ffbc5c3 100644 (file)
@@ -13,9 +13,8 @@ h3 Notas
 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
 
index eb47ccd..c6d076e 100644 (file)
@@ -14,9 +14,8 @@ h3 Notes
 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
 
index 832bcb9..cdcb7ea 100644 (file)
@@ -11,6 +11,8 @@ export const translations = {
   "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",
@@ -31,6 +33,7 @@ export const translations = {
   "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",
@@ -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",
+  Fide: "Fide",
+  Four: "Four",
   Go: "Go",
   green: "green",
   Hall: "Hall",
@@ -56,6 +61,7 @@ export const translations = {
   "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",
@@ -73,6 +79,7 @@ export const translations = {
   "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",
@@ -91,9 +98,12 @@ export const translations = {
   "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",
+  Options: "Options",
   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",
+  Random: "Random",
+  Randomness: "Randomness",
   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?",
@@ -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",
+  Six: "Six",
   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",
+  Two: "Two",
   "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",
+  "With switch": "With switch",
   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.",
-
-  // 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?",
+  "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",
@@ -31,6 +33,7 @@ export const translations = {
   "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",
@@ -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",
+  Fide: "Fide",
+  Four: "Cuatro",
   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",
+  "Invalid options": "Optiones inválidas",
   "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!",
+  "Mouse scroll to replay moves": "Pergamino mouse para repetir las jugadas",
   "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",
+  "Number of pawns": "Número de peones",
+  "Nutty Knights": "Caballeros Locos",
   "Offer draw?": "¿Ofrecer tablas?",
   Observe: "Observar",
   "Opponent action": "Acción del adversario",
+  Options: "Optiones",
   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",
+  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",
+  "Remarkable Rookies": "Reclutas Notables",
   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",
+  Six: "Seis",
   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",
+  Two: "Dos",
   "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",
+  "With switch": "Con switch",
   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.",
-
-  // 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.
 
-.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
index 8a8f464..23f12c3 100644 (file)
@@ -9,15 +9,6 @@
   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
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.
 
-.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
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",
-  "Authentication successful!": "Authentification réussie !",
   "Are you sure?": "Étes vous sûr?",
+  "Army 1": "Armée 1",
+  "Army 2": "Armée 2",
   "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",
@@ -31,6 +33,7 @@ export const translations = {
   "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",
@@ -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",
+  Fide: "Fide",
+  Four: "Quatre",
   Go: "Go",
   green: "vert",
   Hall: "Salon",
@@ -56,6 +61,7 @@ export const translations = {
   "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",
@@ -73,6 +79,7 @@ export const translations = {
   "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",
@@ -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",
+  "Number of pawns": "Nombre de pions",
+  "Nutty Knights": "Chevaliers Fous",
   "Offer draw?": "Proposer nulle ?",
   Observe: "Observer",
   "Opponent action": "Action de l'adversaire",
+  Options: "Options",
   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",
+  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",
+  "Remarkable Rookies": "Recrues Remarquables",
   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",
+  Six: "Six",
   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",
+  Two: "Deux",
   "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",
+  "With switch": "Avec switch",
   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.",
-
-  // 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
-  | 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
   | .
index 7cd1882..a38b8ca 100644 (file)
@@ -18,8 +18,7 @@ figure.diagram-container
 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
   | .
index e956d8a..b04fd91 100644 (file)
@@ -18,8 +18,7 @@ figure.diagram-container
 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
   | .
index 603c8d7..30c016d 100644 (file)
 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
-  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.
-  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
-    | 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
-    | 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.
-    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
-    | 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
-    | 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.
-    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
-  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)
index bb3cf20..a5b5ac8 100644 (file)
 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.
-  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
-  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.
-  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
-    | 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
-    | 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.
-    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
-    | 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
-    | 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.
-    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
-  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)
index 4d5a82b..53e51d8 100644 (file)
 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.
-  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
-  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.
-  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
-    | 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
-    | 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
-    | 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
-    | 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
-  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)
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(
-        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(
-        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(
-        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) {
-    return super.getSlideNJumpMoves(sq, V.steps[V.ROOK], "oneStep");
+    return super.getSlideNJumpMoves(sq, V.steps[V.ROOK], 1);
   }
   getPotentialMinibishopMoves(sq) {
-    return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], "oneStep");
+    return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1);
   }
   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) {
@@ -68,8 +66,8 @@ export class AlapoRules extends ChessRules {
     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 = {
@@ -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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         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 {
 
-  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) + " -";
   }
 
@@ -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(
-      [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() {
index 86409c2..9c43a46 100644 (file)
@@ -11,8 +11,8 @@ export class AllmateRules extends ChessRules {
     return [];
   }
 
-  static GenRandInitFen(randomness) {
-    return ChessRules.GenRandInitFen(randomness).slice(0, -2);
+  static GenRandInitFen(options) {
+    return ChessRules.GenRandInitFen(options).slice(0, -2);
   }
 
   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(
-                    [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) {
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];
   }
 
-  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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
index 92034a3..781984f 100644 (file)
@@ -5,6 +5,10 @@ import { randInt } from "@/utils/alea";
 
 export class Antiking1Rules extends BerolinaRules {
 
+  static get Options() {
+    return null;
+  }
+
   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(
-      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) {
@@ -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(
-      [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(
-      [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) {
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(
-      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) {
@@ -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(
-      [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) {
@@ -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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         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 {
 
+  static get Options() {
+    return null;
+  }
+
   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 {
 
+  static get Lines() {
+    return [
+      [[2, 0], [2, 8]],
+      [[6, 0], [6, 8]]
+    ];
+  }
+
   static get HasFlags() {
     return false;
   }
@@ -45,8 +52,8 @@ export class ArenaRules extends ChessRules {
 
   scanKings() {}
 
-  static GenRandInitFen(randomness) {
-    return ChessRules.GenRandInitFen(randomness).slice(0, -6) + "-";
+  static GenRandInitFen(options) {
+    return ChessRules.GenRandInitFen(options).slice(0, -6) + "-";
   }
 
   static InArena(x) {
@@ -69,27 +76,13 @@ export class ArenaRules extends ChessRules {
   }
 
   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) {
-    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() {
index f2c84a8..07e9e67 100644 (file)
@@ -4,6 +4,10 @@ import { ArrayFun } from "@/utils/array";
 
 export class AtarigoRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get Monochrome() {
     return true;
   }
index 6c39e94..c05b4d9 100644 (file)
@@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea";
 
 export class Avalam2Rules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   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]);
+      if (Array.isArray(res)) return [moves[3]].concat(res);
       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 (
-      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) {
-    return this.getSlideNJumpMoves(sq, V.steps[V.MAMMOTH], "oneStep");
+    return this.getSlideNJumpMoves(sq, V.steps[V.MAMMOTH], 1);
   }
 
   isAttacked(sq, color) {
@@ -101,10 +100,8 @@ export class BalaklavaRules extends ChessRules {
   }
 
   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() {
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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
@@ -411,28 +411,13 @@ export class BallRules extends ChessRules {
     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) {
-    return this.getSlideNJumpMoves(sq, V.steps[V.PHOENIX], "oneStep");
+    return super.getSlideNJumpMoves(sq, V.steps[V.PHOENIX], 1);
   }
 
   getPmove(move) {
index 3564e74..3e07665 100644 (file)
@@ -4,6 +4,10 @@ import { randInt } from "@/utils/alea";
 
 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() {
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
@@ -531,15 +519,15 @@ export class BaroqueRules extends ChessRules {
     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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         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
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.
@@ -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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
index feecd45..57a6051 100644 (file)
@@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules";
 
 export class BishopawnsRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   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(
-      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(
-      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]) ||
-      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]) ||
-      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;
   }
 
-  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 -"
       );
@@ -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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         flags += flags;
         break;
index ad584e3..0042bf1 100644 (file)
@@ -1149,9 +1149,9 @@ export class ChakartRules extends ChessRules {
     return "*";
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     return (
-      SuicideRules.GenRandInitFen(randomness).slice(0, -1) +
+      SuicideRules.GenRandInitFen(options).slice(0, -1) +
       // 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 {
 
+  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",
@@ -41,26 +61,6 @@ export class CheckeredRules extends ChessRules {
     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:
@@ -433,12 +433,7 @@ export class CheckeredRules extends ChessRules {
 
   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) {
@@ -448,20 +443,13 @@ export class CheckeredRules extends ChessRules {
 
   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(
-      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 }
           ]
         }
-      ],
-      check: []
+      ]
     };
   }
 
index 4775844..333ad32 100644 (file)
@@ -35,8 +35,8 @@ export class CircularRules extends ChessRules {
     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";
     }
@@ -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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         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]));
-        if (oneStep !== undefined) continue outerLoop;
+        if (oneStep) continue outerLoop;
         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:
-    return ChessRules.GenRandInitFen(randomness) + " 00000000000000000000";
+    return ChessRules.GenRandInitFen(options) + " 00000000000000000000";
   }
 
   getFen() {
@@ -195,22 +195,11 @@ export class ClorangeRules extends ChessRules {
     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() {
index 1180e37..c501c02 100644 (file)
@@ -13,10 +13,8 @@ export class ConvertRules extends ChessRules {
     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/" +
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 oneStep = (piece == V.PAWN);
     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)
       ) {
+        const nbSteps = (type == V.KNIGHT ? 1 : undefined);
         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;
index cf83f1f..aa023c1 100644 (file)
@@ -78,15 +78,15 @@ export class CoregalRules extends ChessRules {
     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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         flags += flags;
         break;
@@ -186,10 +186,7 @@ export class CoregalRules extends ChessRules {
 
   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]));
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() {
@@ -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 (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 {
 
-  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) {
-    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 (
-      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() {
-    return 'h';
+    return 'w';
   }
   static get C_BISHOP() {
-    return 'a';
+    return 'f';
   }
   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';
   }
+  static get R_KNIGHT() {
+    return 'y';
+  }
+  static get R_BISHOP() {
+    return 'h';
+  }
+  static get R_QUEEN() {
+    return 'o';
+  }
 
   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(
-      {},
-      ChessRules.steps,
       {
         // Dabbabah
         'd': [
@@ -97,106 +236,301 @@ export class CwdaRules extends ChessRules {
           [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 (
-      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 (
-      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 (
-      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 (
-      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);
-    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.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 (
-      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 (
-      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 (
-      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 (
-      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(
-      {},
-      ChessRules.VALUES,
       {
         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]));
-        if (oneStep !== undefined) continue outerLoop;
+        if (oneStep) continue outerLoop;
         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;
   }
 
-  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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         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] : "-");
   }
 
-  static GenRandInitFen(randomness) {
-    return ChessRules.GenRandInitFen(randomness) + " -";
+  static GenRandInitFen(options) {
+    return ChessRules.GenRandInitFen(options) + " -";
   }
 
   canMove(piece, color, [x, y]) {
index f573570..635e6db 100644 (file)
@@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules";
 
 export class DiscoduelRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   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 {
 
+  static get Options() {
+    return null;
+  }
+
   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]]);
-    return super.getSlideNJumpMoves(sq, steps, "oneStep");
+    return super.getSlideNJumpMoves(sq, steps, 1);
   }
 
   getPotentialElephantMoves(sq) {
-    return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], "oneStep");
+    return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1);
   }
 
   getPotentialGiraffeMoves(sq) {
-    return super.getSlideNJumpMoves(sq, V.steps[V.ROOK], "oneStep");
+    return super.getSlideNJumpMoves(sq, V.steps[V.ROOK], 1);
   }
 
   getAllValidMoves() {
index 8a6c806..87d262a 100644 (file)
@@ -19,8 +19,8 @@ export class DoublearmyRules extends ChessRules {
     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] + "/" +
@@ -45,10 +45,7 @@ export class DoublearmyRules extends ChessRules {
 
   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) {
@@ -60,19 +57,13 @@ export class DoublearmyRules extends ChessRules {
 
   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(
-      {},
-      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 - -";
 
-    const baseFen = ChessRules.GenRandInitFen(randomness);
+    const baseFen = ChessRules.GenRandInitFen(options);
     const fenParts = baseFen.split(' ');
     const posParts = fenParts[0].split('/');
 
@@ -671,10 +671,7 @@ export class EightpiecesRules extends ChessRules {
 
   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))
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)
 
+  static get Options() {
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
@@ -105,7 +109,7 @@ export class EmergoRules extends ChessRules {
     return { x: 9, y: 9 };
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen() {
     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;
   }
 
-  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:
@@ -36,7 +36,7 @@ export class EmpireRules extends ChessRules {
       '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('') +
@@ -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) {
@@ -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 (!!oneStep || !!step.onlyTake) continue outerLoop;
+        if (oneStep || step.onlyTake) continue outerLoop;
         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(
-      [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]) {
@@ -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]);
-    return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+    return super.getSlideNJumpMoves([x, y], steps, 1);
   }
 
   isAttacked(sq, color) {
@@ -356,7 +354,7 @@ export class EmpireRules extends ChessRules {
 
   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) {
@@ -368,7 +366,7 @@ export class EmpireRules extends ChessRules {
     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(
-      [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) {
index 4593e6b..e1e653a 100644 (file)
@@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea";
 
 export class FanoronaRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
@@ -314,22 +314,8 @@ export class FootballRules extends ChessRules {
     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:
index c29324a..2c83fb2 100644 (file)
@@ -122,7 +122,11 @@ export class FugueRules extends ChessRules {
   }
 
   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]) {
@@ -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;
@@ -228,7 +208,7 @@ export class FugueRules extends ChessRules {
 
   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
@@ -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"
       );
@@ -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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         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 -";
 
-    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'),
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];
       }
@@ -326,32 +326,29 @@ export class FusionRules extends ChessRules {
   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]) ||
-      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 (
-      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 (
-      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])
     );
   }
@@ -359,7 +356,7 @@ export class FusionRules extends ChessRules {
   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])
     );
   }
index 51d0bed..621f6e6 100644 (file)
@@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea";
 
 export class GomokuRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   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(
-      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(
-      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]) ||
-      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]) ||
-      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;
   }
 
-  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 -"
@@ -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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
index 90411d1..fcc6bb1 100644 (file)
@@ -101,8 +101,8 @@ export class GrasshopperRules extends ChessRules {
     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/",
index 856725c..8738b28 100644 (file)
@@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea";
 
 export class HamiltonRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
index 280062c..24b8dd0 100644 (file)
@@ -4,6 +4,11 @@ import { randInt } from "@/utils/alea";
 
 export class HiddenRules extends ChessRules {
 
+  static get Options() {
+    // TODO: later, option "free placement"
+    return null;
+  }
+
   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));
   }
 
-  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("");
index 59c20bb..59574f8 100644 (file)
@@ -2,6 +2,7 @@ import { ChessRules } from "@/base_rules";
 
 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 = [];
@@ -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]));
-        if (!!oneStep) continue outerLoop;
+        if (oneStep) continue outerLoop;
         i += step[0];
         j += step[1];
       }
@@ -44,21 +45,12 @@ export class HoppelpoppelRules extends ChessRules {
 
   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(
-      [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 {
 
+  static get Options() {
+    return {
+      check: [
+        {
+          label: "Random",
+          defaut: false,
+          variable: "random"
+        }
+      ]
+    };
+  }
+
   static get HasFlags() {
     return false;
   }
@@ -36,9 +48,9 @@ export class HordeRules extends ChessRules {
     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)
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) {
@@ -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(
-          [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;
   }
index 01f82d8..a9c9fba 100644 (file)
@@ -47,8 +47,8 @@ export class IceageRules extends ChessRules {
     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) {
index 1a9cd94..3277c74 100644 (file)
@@ -8,13 +8,13 @@ export class InterweaveRules extends ChessRules {
     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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
index aecc8fe..8ede111 100644 (file)
@@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea";
 
 export class JanggiRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   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]);
     }
-    return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+    return super.getSlideNJumpMoves([x, y], steps, 1);
   }
 
   knightStepsFromRookStep(step) {
@@ -211,7 +215,7 @@ export class JanggiRules extends ChessRules {
           this.knightStepsFromRookStep(rookStep));
       }
     }
-    return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+    return super.getSlideNJumpMoves([x, y], steps, 1);
   }
 
   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]) {
@@ -278,7 +282,7 @@ export class JanggiRules extends ChessRules {
       // 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) {
@@ -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,
-        super.getSlideNJumpMoves([x, y],
-                                 ChessRules.steps[V.BISHOP],
-                                 "oneStep")
+        super.getSlideNJumpMoves([x, y], ChessRules.steps[V.BISHOP], 1)
       );
     }
     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(
-      [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;
     }
@@ -428,7 +430,7 @@ export class JanggiRules extends ChessRules {
       }
     }
     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 (
-      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');
   }
 
@@ -48,7 +48,7 @@ export class JokerRules extends ChessRules {
 
   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 = [];
index 80e7005..7946d6a 100644 (file)
@@ -14,8 +14,8 @@ export class Knightmate1Rules extends ChessRules {
     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');
   }
 
@@ -30,10 +30,7 @@ export class Knightmate1Rules extends ChessRules {
 
   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) {
@@ -53,22 +50,12 @@ export class Knightmate1Rules extends ChessRules {
 
   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(
-      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() {
index 3630b5c..bbdd12d 100644 (file)
@@ -43,9 +43,9 @@ export class Knightmate2Rules extends ChessRules {
 
   scanKings() {}
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     return (
-      ChessRules.GenRandInitFen(randomness)
+      ChessRules.GenRandInitFen(options)
       .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(
-      sq,
-      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
-      "oneStep"
-    );
+      sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1);
   }
 
   getPotentialKingMoves(sq) {
@@ -85,22 +82,12 @@ export class Knightmate2Rules extends ChessRules {
 
   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(
-      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() {}
index c8c1cea..bf3e773 100644 (file)
@@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules";
 
 export class KnightpawnsRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   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 {
 
+  static get Options() {
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
index a624eeb..38b3e88 100644 (file)
@@ -216,9 +216,7 @@ export class KoopaRules extends ChessRules {
   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']))
     );
   }
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;
     }
-    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]) {
index a49828b..65523e7 100644 (file)
@@ -2,6 +2,18 @@ import { ChessRules } from "@/base_rules";
 
 export class MaharajahRules extends ChessRules {
 
+  static get Options() {
+    return {
+      check: [
+        {
+          label: "Random",
+          defaut: false,
+          variable: "random"
+        }
+      ]
+    };
+  }
+
   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() {
@@ -108,7 +121,7 @@ export class MaharajahRules extends ChessRules {
     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);
index 75fb1da..b721273 100644 (file)
@@ -36,13 +36,13 @@ export class MakrukRules extends ChessRules {
     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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         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(
-      sq,
-      V.steps[V.BISHOP].concat([ [forward, 0] ]),
-      "oneStep"
-    );
+      sq, V.steps[V.BISHOP].concat([ [forward, 0] ]), 1);
   }
 
   getPotentialQueenMoves(sq) {
-    return this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.BISHOP],
-      "oneStep"
-    );
+    return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1);
   }
 
   isAttacked(sq, color) {
@@ -118,32 +111,17 @@ export class MakrukRules extends ChessRules {
   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(
-      sq,
-      color,
-      V.QUEEN,
-      V.steps[V.BISHOP],
-      "oneStep"
-    );
+      sq, color, V.QUEEN, V.steps[V.BISHOP], 1);
   }
 
   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() {
index 05df0bd..df781b9 100644 (file)
@@ -4,6 +4,10 @@ import { shuffle } from "@/utils/alea";
 
 export class MaximaRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   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 (!!oneStep) continue outerLoop;
+        if (oneStep) continue outerLoop;
         i += step[0];
         j += step[1];
       }
@@ -450,14 +454,8 @@ export class MaximaRules extends ChessRules {
   }
 
   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) {
@@ -679,15 +677,8 @@ export class MaximaRules extends ChessRules {
   }
 
   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) {
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') + " -";
   }
 
@@ -113,7 +113,7 @@ export class MesmerRules extends ChessRules {
       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;
   }
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]);
-    return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+    return super.getSlideNJumpMoves([x, y], steps, 1);
   }
 
   insidePalace(x, y, c) {
index 1e26369..1478f48 100644 (file)
@@ -156,9 +156,9 @@ export class MonocolorRules extends ChessRules {
     return "1/2";
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     // 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:
index cb29ada..bbba319 100644 (file)
@@ -3,21 +3,53 @@ import { randInt } from "@/utils/alea";
 
 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 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
-      fen.substr(0, 26)
+      baseFen.substr(0, 26) + pawnsLine + "/4K3 w 0 " +
       // 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(
-      [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() {
index 14ba919..e10457f 100644 (file)
@@ -323,31 +323,6 @@ export class MusketeerRules extends ChessRules {
     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] ];
@@ -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);
-    return super.getSlideNJumpMoves(sq, steps, "oneStep");
+    return super.getSlideNJumpMoves(sq, steps, 1);
   }
 
   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);
-    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);
-    return super.getSlideNJumpMoves(sq, steps, "oneStep");
+    return super.getSlideNJumpMoves(sq, steps, 1);
   }
 
   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))
     );
   }
@@ -421,7 +396,7 @@ export class MusketeerRules extends ChessRules {
   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))
     );
   }
@@ -496,37 +471,10 @@ export class MusketeerRules extends ChessRules {
     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(
-        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)
     );
   }
@@ -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);
-    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 (
-      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 (
-      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);
-    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 (
-      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)
     );
   }
@@ -573,7 +521,7 @@ export class MusketeerRules extends ChessRules {
   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)
     );
   }
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 {
 
+  // TODO: merge with base_rules.js
   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]));
-        if (!!oneStep) continue outerLoop;
+        if (oneStep) continue outerLoop;
         i += step[0];
         j += step[1];
       }
@@ -45,21 +46,12 @@ export class NewzealandRules extends ChessRules {
 
   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(
-      [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 " +
@@ -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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         flags += flags;
         break;
@@ -320,11 +320,11 @@ export class OmegaRules extends ChessRules {
   }
 
   getPotentialChampionMoves(sq) {
-    return this.getSlideNJumpMoves(sq, V.steps[V.CHAMPION], "oneStep");
+    return this.getSlideNJumpMoves(sq, V.steps[V.CHAMPION], 1);
   }
 
   getPotentialWizardMoves(sq) {
-    return this.getSlideNJumpMoves(sq, V.steps[V.WIZARD], "oneStep");
+    return this.getSlideNJumpMoves(sq, V.steps[V.WIZARD], 1);
   }
 
   getCastleMoves([x, y]) {
@@ -346,14 +346,14 @@ export class OmegaRules extends ChessRules {
   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(
-        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;
   }
 
-  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:
@@ -37,7 +37,7 @@ export class OrdaRules extends ChessRules {
       '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
@@ -89,6 +89,7 @@ export class OrdaRules extends ChessRules {
     return [];
   }
 
+  // TODO: merge this extension into base_rules.js
   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]));
-        if (!!oneStep) continue outerLoop;
+        if (oneStep) continue outerLoop;
         i += step[0];
         j += step[1];
       }
@@ -109,60 +110,36 @@ export class OrdaRules extends ChessRules {
 
   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(
-      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(
-      sq,
-      V.steps[V.KNIGHT],
-      "oneStep",
-      { onlyMove: true }
-    );
+      sq, V.steps[V.KNIGHT], "oneStep", { onlyMove: true });
     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 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(
-      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(
-      [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) {
@@ -193,23 +170,14 @@ export class OrdaRules extends ChessRules {
   }
 
   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(
-      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) {
index 8176b95..21aebaa 100644 (file)
@@ -25,14 +25,14 @@ export class OrdamirrorRules extends OrdaRules {
     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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
@@ -106,17 +106,9 @@ export class OrdamirrorRules extends OrdaRules {
 
   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(
-      sq,
-      V.steps[V.KNIGHT],
-      "oneStep",
-      { onlyTake: true }
-    );
+      sq, V.steps[V.KNIGHT], "oneStep", { onlyTake: true });
     return onlyMoves.concat(onlyTakes);
   }
 
@@ -133,7 +125,7 @@ export class OrdamirrorRules extends OrdaRules {
 
   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() {
index 7915715..caf55c9 100644 (file)
@@ -197,9 +197,9 @@ export class OtageRules extends ChessRules {
     this.pawnFlags = flags[1];
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     // Add 16 pawns flags:
-    return ChessRules.GenRandInitFen(randomness)
+    return ChessRules.GenRandInitFen(options)
       .slice(0, -2) + "1111111111111111 -";
   }
 
@@ -390,10 +390,7 @@ export class OtageRules extends ChessRules {
         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;
index 37d0521..e595b0d 100644 (file)
@@ -154,21 +154,9 @@ export class Pacifist1Rules extends ChessRules {
     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) {
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:
-    return ChessRules.GenRandInitFen(randomness)
+    return ChessRules.GenRandInitFen(options)
       .slice(0, -2) + "1111111111111111 - -";
   }
 
index 579ee9c..aef9c06 100644 (file)
@@ -25,8 +25,8 @@ export class Pandemonium1Rules extends Pandemonium2Rules {
     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);
   }
 
index 7951608..4a98083 100644 (file)
@@ -139,8 +139,8 @@ export class Pandemonium2Rules extends ChessRules {
     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"
@@ -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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         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(
-      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(
-      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]);
-    return this.getSlideNJumpMoves(sq, steps, "oneStep");
+    return this.getSlideNJumpMoves(sq, steps, 1);
   }
 
   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(
-      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(
-      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 ||
@@ -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 (
-      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(
-        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(
-        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(
-        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(
-        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 {
 
+  static get Options() {
+    // TODO: later, allow variant, placing piece giving check maybe...
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
index 1fe61cb..c08b585 100644 (file)
@@ -10,9 +10,9 @@ export class PawnmassacreRules extends ChessRules {
     return true;
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     const bFen =
-      ChessRules.GenRandInitFen(randomness)
+      ChessRules.GenRandInitFen(options)
       // 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 {
 
+  static get Options() {
+    return null;
+  }
+
   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 {
 
+  static get Options() {
+    return null;
+  }
+
   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(
-      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(
-      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(
-      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]) ||
-      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]) ||
-      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]) ||
-      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;
   }
 
-  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 -";
 
-    const baseFen = ChessRules.GenRandInitFen(randomness);
+    const baseFen = ChessRules.GenRandInitFen(options);
     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;
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     // Add 2 knight flags
-    return ChessRules.GenRandInitFen(randomness)
-      .slice(0, -2) + "11 -";
+    return ChessRules.GenRandInitFen(options).slice(0, -2) + "11 -";
   }
 
   getFlagsFen() {
index 0ea2e45..1b02dcf 100644 (file)
@@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules";
 
 export class QueenpawnsRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   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 {
 
+  static get Options() {
+    return null;
+  }
+
   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() {
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 (...)
 
-  static GenRandInitFen(randomness) {
-    return ChessRules.GenRandInitFen(randomness).slice(0, -6)  + "- null";
+  static GenRandInitFen(options) {
+    return ChessRules.GenRandInitFen(options).slice(0, -6)  + "- null";
   }
 
   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(
-          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) &&
index 6af29c0..3101a7c 100644 (file)
@@ -205,23 +205,11 @@ export class RococoRules extends ChessRules {
     // 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"
@@ -632,8 +620,8 @@ export class RococoRules extends ChessRules {
     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 -"
       );
@@ -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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         pieces['b'] = pieces['w'];
         break;
       }
index 36373b2..c39339e 100644 (file)
@@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules";
 
 export class RollerballRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   static get HasEnpassant() {
     return false;
   }
@@ -121,14 +125,14 @@ export class RollerballRules extends ChessRules {
       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(
-          [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 => {
@@ -154,13 +158,13 @@ export class RollerballRules extends ChessRules {
       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(
-        [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;
-    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) {
@@ -248,7 +252,7 @@ export class RollerballRules extends ChessRules {
       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) {
@@ -345,7 +349,7 @@ export class RollerballRules extends ChessRules {
           ? [ [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
@@ -359,7 +363,7 @@ export class RollerballRules extends ChessRules {
       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 (
-      super.isAttackedBySlideNJump([x, y], color, V.ROOK, oneStep, "oneStep")
+      super.isAttackedBySlideNJump([x, y], color, V.ROOK, oneStep, 1)
     ) {
       return true;
     }
@@ -444,7 +448,7 @@ export class RollerballRules extends ChessRules {
       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;
     }
index 1daae90..3ffa6fc 100644 (file)
@@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules";
 
 export class RookpawnsRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   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;
   }
 
-  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"]) {
-      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(
@@ -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 =
@@ -153,30 +154,13 @@ export class RoyalraceRules extends ChessRules {
 
   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(
-      sq,
-      color,
-      V.KNIGHT,
-      V.steps[V.KNIGHT]
-    );
+      sq, color, V.KNIGHT, V.steps[V.KNIGHT]);
   }
 
   getCurrentScore() {
index d802ca1..64c9942 100644 (file)
@@ -3,6 +3,10 @@ import { ArrayFun } from "@/utils/array";
 
 export class RugbyRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   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] ];
-    let addMoves = this.getSlideNJumpMoves(sq, steps, "oneStep");
+    let addMoves = this.getSlideNJumpMoves(sq, steps, 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 (
-      ChessRules.GenRandInitFen(randomness).slice(0, -2) +
+      ChessRules.GenRandInitFen(options).slice(0, -2) +
       // 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(
-      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(
-      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]) ||
-      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]) ||
-      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(
-      {},
-      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 {
 
+  static get Options() {
+    return null;
+  }
+
   static get HasFlags() {
     return false;
   }
index c3db279..2701f1e 100644 (file)
@@ -68,7 +68,7 @@ export class ShakoRules extends ChessRules {
   }
 
   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]) {
@@ -115,7 +115,7 @@ export class ShakoRules extends ChessRules {
   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;
   }
 
-  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 -"
@@ -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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         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
-    return ChessRules.GenRandInitFen(randomness).slice(0, -7);
+    return ChessRules.GenRandInitFen(options).slice(0, -7);
   }
 
   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
-    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
-    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
-      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(
-      sq,
-      color,
-      V.BISHOP,
-      V.ElephantSteps,
-      "oneStep"
-    );
+      sq, color, V.BISHOP, V.ElephantSteps, 1);
   }
 
   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() {
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(
-      [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]);
-    return super.getSlideNJumpMoves(sq, steps, "oneStep");
+    return super.getSlideNJumpMoves(sq, steps, 1);
   }
 
   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])
-      .concat(super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], "oneStep"))
+      .concat(super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1))
     );
   }
 
   getPotentialMonkMoves(sq) {
-    return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], "oneStep");
+    return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1);
   }
 
   getPotentialHorseMoves(sq) {
-    return super.getSlideNJumpMoves(sq, [ [-2, 1], [-2, -1] ], "oneStep");
+    return super.getSlideNJumpMoves(sq, [ [-2, 1], [-2, -1] ], 1);
   }
 
   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 (
-      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(
-        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(
-        sq, color, V.DRAGON, V.steps[V.BISHOP], "oneStep")
+        sq, color, V.DRAGON, V.steps[V.BISHOP], 1)
     );
   }
 
   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(
-        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"
@@ -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"]) {
-      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()
@@ -426,7 +426,7 @@ export class ShogiRules extends ChessRules {
     const forward = (this.turn == 'w' ? -1 : 1);
     return this.getSlideNJumpMoves(
       sq,
-      [[forward, 0]],
+      [ [forward, 0] ],
       {
         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);
-    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);
-    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(
-      sq, color, V.KNIGHT, [[forward, 1], [forward, -1]], "oneStep");
+      sq, color, V.KNIGHT, [ [forward, 1], [forward, -1] ], 1);
   }
 
   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]) ||
-      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]) ||
-      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() {
@@ -257,31 +257,31 @@ export class ShogunRules extends ChessRules {
   }
 
   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]);
-    return super.getSlideNJumpMoves(sq, steps, "oneStep");
+    return super.getSlideNJumpMoves(sq, steps, 1);
   }
 
   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]);
-    return super.getSlideNJumpMoves(sq, steps, "oneStep");
+    return super.getSlideNJumpMoves(sq, steps, 1);
   }
 
   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(
-        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 (
-      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(
-        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 (
-      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(
-        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 {
 
+  static get Options() {
+    return null;
+  }
+
   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(
-      sq,
-      V.steps[V.BISHOP].concat([ [forward, 0] ]),
-      "oneStep"
-    );
+      sq, V.steps[V.BISHOP].concat([ [forward, 0] ]), 1);
   }
 
   getPotentialQueenMoves(sq) {
-    return this.getSlideNJumpMoves(
-      sq,
-      V.steps[V.BISHOP],
-      "oneStep"
-    );
+    return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1);
   }
 
   getAllValidMoves() {
@@ -289,22 +286,12 @@ export class SittuyinRules extends ChessRules {
   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(
-      sq,
-      color,
-      V.QUEEN,
-      V.steps[V.BISHOP],
-      "oneStep"
-    );
+      sq, color, V.QUEEN, V.steps[V.BISHOP], 1);
   }
 
   underCheck(color) {
index 2400e04..20919ea 100644 (file)
@@ -16,8 +16,8 @@ export class SpartanRules extends ChessRules {
     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):
@@ -30,7 +30,7 @@ export class SpartanRules extends ChessRules {
       '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)
@@ -154,7 +154,7 @@ export class SpartanRules extends ChessRules {
   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]) {
@@ -212,26 +212,26 @@ export class SpartanRules extends ChessRules {
     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 super.getSlideNJumpMoves([x, y], steps, "oneStep")
+    return super.getSlideNJumpMoves([x, y], steps, 1)
   }
 
   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 (
-      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]))
     );
   }
@@ -249,25 +249,25 @@ export class SpartanRules extends ChessRules {
   }
 
   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 (
-      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']);
-    return super.isAttackedBySlideNJump(sq, 'b', V.CAPTAIN, steps, "oneStep");
+    return super.isAttackedBySlideNJump(sq, 'b', V.CAPTAIN, steps, 1);
   }
 
   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])
     );
   }
@@ -275,7 +275,7 @@ export class SpartanRules extends ChessRules {
   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])
     );
   }
index 15caaf5..54c54c4 100644 (file)
@@ -81,8 +81,8 @@ export class Squatter2Rules extends ChessRules {
     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",
-      o: "n",
-      l: "k"
+      o: "n"
     };
   }
   static get BOMB_CODE() {
@@ -26,8 +25,7 @@ export class Stealthbomb1Rules extends ChessRules {
       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 (
@@ -91,6 +89,7 @@ export class Stealthbomb1Rules extends ChessRules {
     }
     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 }) ],
index 613a5c2..648ee29 100644 (file)
@@ -3,7 +3,7 @@ import { Stealthbomb1Rules } from "@/variants/Stealthbomb1";
 
 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 (
index 2bf3ecf..77aef39 100644 (file)
@@ -149,9 +149,9 @@ export class SuctionRules extends ChessRules {
     });
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     // Add empty cmove:
-    return SuicideRules.GenRandInitFen(randomness) + " -";
+    return SuicideRules.GenRandInitFen(options) + " -";
   }
 
   getCmoveFen() {
index 13aaa6b..3b3c03c 100644 (file)
@@ -135,13 +135,13 @@ export class SuicideRules extends ChessRules {
     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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         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:
-    return ChessRules.GenRandInitFen(randomness) + " -";
+    return ChessRules.GenRandInitFen(options) + " -";
   }
 
   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() {
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] + " -";
   }
index f5ee12a..74eecac 100644 (file)
@@ -2,6 +2,18 @@ import { ChessRules, Move, PiPo } from "@/base_rules";
 
 export class SynochessRules extends ChessRules {
 
+  static get Options() {
+    return {
+      check: [
+        {
+          label: "Random",
+          defaut: false,
+          variable: "random"
+        }
+      ]
+    };
+  }
+
   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:
@@ -42,7 +54,7 @@ export class SynochessRules extends ChessRules {
     };
 
     // 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"
@@ -305,17 +317,14 @@ export class SynochessRules extends ChessRules {
 
   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(
-      [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]) {
@@ -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]);
-    return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+    return super.getSlideNJumpMoves([x, y], steps, 1);
   }
 
   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?)
@@ -417,26 +426,19 @@ export class SynochessRules extends ChessRules {
   }
 
   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) {
-    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(
-      [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() {
index af48977..11270b2 100644 (file)
@@ -60,8 +60,6 @@ export class TencubedRules extends ChessRules {
 
   static get steps() {
     return Object.assign(
-      {},
-      ChessRules.steps,
       {
         w: [
           [-3, -1],
@@ -91,12 +89,13 @@ export class TencubedRules extends ChessRules {
           [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/ " +
@@ -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] +
@@ -164,22 +163,22 @@ export class TencubedRules extends ChessRules {
 
   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(
-      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")
+      this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)
     );
   }
 
   getPotentialChampionMoves(sq) {
-    return this.getSlideNJumpMoves(sq, V.steps[V.CHAMPION], "oneStep");
+    return this.getSlideNJumpMoves(sq, V.steps[V.CHAMPION], 1);
   }
 
   getPotentialWizardMoves(sq) {
-    return this.getSlideNJumpMoves(sq, V.steps[V.WIZARD], "oneStep");
+    return this.getSlideNJumpMoves(sq, V.steps[V.WIZARD], 1);
   }
 
   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]) ||
-      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 (
-      this.isAttackedBySlideNJump(sq, color, V.ARCHBISHOP, V.steps[V.BISHOP]) ||
       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) {
-    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) {
-    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() {
@@ -238,9 +224,13 @@ export class TencubedRules extends ChessRules {
 
   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();
   }
 
-  static GenRandInitFen(randomness) {
+  static GenRandInitFen(options) {
     // Add check flags (at 0)
-    return ChessRules.GenRandInitFen(randomness).slice(0, -2) + "00";
+    return ChessRules.GenRandInitFen(options).slice(0, -2) + "00";
   }
 
   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];
+    // Prevent re-augmenting a chosen piece:
+    if (!ChessRules.PIECES.includes(selectedPiece)) return null;
     return new Move({
       appear: [
         new PiPo({
index 6606da5..b5f2b05 100644 (file)
@@ -55,8 +55,8 @@ export class TwokingsRules extends CoregalRules {
     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) => {
@@ -84,7 +84,7 @@ export class TwokingsRules extends CoregalRules {
     };
 
     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:
index 43f3825..3149dae 100644 (file)
@@ -12,13 +12,13 @@ export class UpsidedownRules extends ChessRules {
     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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         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(
-      sq,
-      color,
-      V.PAWN,
-      V.steps[V.BISHOP],
-      "oneStep"
-    );
+      sq, color, V.PAWN, V.steps[V.BISHOP], 1);
   }
 
   getNotation(move) {
index 93353f9..647a234 100644 (file)
@@ -181,15 +181,12 @@ export class WildebeestRules extends ChessRules {
   }
 
   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(
-      sq,
-      V.steps[V.KNIGHT].concat(V.steps[V.CAMEL]),
-      "oneStep"
-    );
+      sq, V.steps[V.KNIGHT].concat(V.steps[V.CAMEL]), 1);
   }
 
   getPPpath(m) {
@@ -276,22 +273,12 @@ export class WildebeestRules extends ChessRules {
 
   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(
-      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() {
@@ -311,8 +298,8 @@ export class WildebeestRules extends ChessRules {
     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 -"
@@ -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"]) {
-      if (c == 'b' && randomness == 1) {
+      if (c == 'b' && options.randomness == 1) {
         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:
@@ -86,7 +86,7 @@ export class Wormhole1Rules extends Wormhole2Rules {
       '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) +
index 6215ea9..4fef565 100644 (file)
@@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules";
 
 export class XiangqiRules extends ChessRules {
 
+  static get Options() {
+    return null;
+  }
+
   // 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]);
     }
-    return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+    return super.getSlideNJumpMoves([x, y], steps, 1);
   }
 
   knightStepsFromRookStep(step) {
@@ -172,7 +176,7 @@ export class XiangqiRules extends ChessRules {
           this.knightStepsFromRookStep(rookStep));
       }
     }
-    return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+    return super.getSlideNJumpMoves([x, y], steps, 1);
   }
 
   getPotentialElephantMoves([x, y]) {
@@ -188,7 +192,7 @@ export class XiangqiRules extends ChessRules {
           // "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]) {
@@ -212,11 +216,11 @@ export class XiangqiRules extends ChessRules {
         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 (
-      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]);
-      return super.getSlideNJumpMoves([x, y], steps, "oneStep");
+      return super.getSlideNJumpMoves([x, y], steps, 1);
     }
     // 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(
-      [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) {
@@ -303,7 +307,7 @@ export class XiangqiRules extends ChessRules {
       }
     }
     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 {
 
+  static get Options() {
+    return null;
+  }
+
   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 -,-";
   }
 
index 7edbe40..bfbc7e2 100644 (file)
@@ -27,24 +27,6 @@ export class ZenRules extends ChessRules {
     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) {
@@ -110,7 +92,7 @@ export class ZenRules extends ChessRules {
     return moves;
   }
 
-  canTake(sq1, sq2) {
+  canTake() {
     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);
@@ -395,6 +418,8 @@ export default {
               "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
@@ -672,24 +697,7 @@ export default {
             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;
         }
index 05ee05b..224d5d2 100644 (file)
@@ -52,8 +52,8 @@ main
             )
               | {{ 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(
@@ -62,7 +62,7 @@ main
                 :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'"
@@ -300,10 +300,6 @@ export default {
     }
   },
   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);
@@ -479,16 +475,12 @@ export default {
       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 {
-        ["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;
@@ -1090,30 +1082,29 @@ export default {
           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;
       }
-      // 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?!
-      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;
       }
-      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");
-        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):
+      // NOTE: "from" information is not required here
       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"] }}
-      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"
@@ -18,8 +18,8 @@ main
               :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"
@@ -150,13 +150,17 @@ export default {
     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;
       }
-      for (const select of this.V.Options.select) {
+      for (const select of this.V.Options.select || []) {
         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);
@@ -186,12 +190,12 @@ export default {
             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 {
-        if (Object.keys(V.Options).length == 0) next();
+        if (!V.Options) next();
         else askOptions();
       }
     },
@@ -206,7 +210,7 @@ export default {
         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");
       }
index f60e5f1..8de335e 100644 (file)
@@ -16,7 +16,7 @@ main
         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] }}
@@ -59,6 +59,9 @@ export default {
     }
   },
   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;