Add Orda variant. Some advances in Dynamo draft. Display error message when loading...
authorBenjamin Auder <benjamin.auder@somewhere>
Thu, 26 Mar 2020 11:23:40 +0000 (12:23 +0100)
committerBenjamin Auder <benjamin.auder@somewhere>
Thu, 26 Mar 2020 11:23:40 +0000 (12:23 +0100)
35 files changed:
TODO
client/download_objects.sh
client/public/images/pieces/Dynamo/empty.svg [new file with mode: 0644]
client/public/images/pieces/Orda/ba.svg [new file with mode: 0644]
client/public/images/pieces/Orda/bh.svg [new file with mode: 0644]
client/public/images/pieces/Orda/bk.svg [new file with mode: 0644]
client/public/images/pieces/Orda/bl.svg [new file with mode: 0644]
client/public/images/pieces/Orda/bp.svg [new file with mode: 0644]
client/public/images/pieces/Orda/bq.svg [new file with mode: 0644]
client/public/images/pieces/Orda/by.svg [new file with mode: 0644]
client/public/images/pieces/Orda/wh.svg [new file with mode: 0644]
client/public/images/variants/Orda/Archer.png [new file with mode: 0644]
client/public/images/variants/Orda/Kheshig.png [new file with mode: 0644]
client/public/images/variants/Orda/Lancer.png [new file with mode: 0644]
client/public/images/variants/Orda/Orda.png [new file with mode: 0644]
client/public/images/variants/Orda/Yurt.png [new file with mode: 0644]
client/public/images/variants/README [new file with mode: 0644]
client/src/base_rules.js
client/src/components/Board.vue
client/src/translations/en.js
client/src/translations/es.js
client/src/translations/fr.js
client/src/translations/rules/Dynamo/en.pug [new file with mode: 0644]
client/src/translations/rules/Dynamo/es.pug [new file with mode: 0644]
client/src/translations/rules/Dynamo/fr.pug [new file with mode: 0644]
client/src/translations/rules/Orda/en.pug [new file with mode: 0644]
client/src/translations/rules/Orda/es.pug [new file with mode: 0644]
client/src/translations/rules/Orda/fr.pug [new file with mode: 0644]
client/src/variants/Dynamo.js
client/src/variants/Eightpieces.js
client/src/variants/Orda.js [new file with mode: 0644]
client/src/views/Game.vue
client/src/views/Rules.vue
server/db/populate.sql
server/sockets.js

diff --git a/TODO b/TODO
index 8e81cc7..df4231a 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,7 +1,28 @@
+# Enhancements:
+Desktop notifications
+Do not remove other challenges when one is accepted?
+
 # New variants
+Finish first https://www.chessvariants.com/mvopponent.dir/dynamo.html
+https://echekk.fr/spip.php?page=article&id_article=599
+
+Monster, Horde, Colorbound
+https://www.chessvariants.com/d.betza/chessvar/dan/colclob.html
+https://lichess.org/analysis/horde#0
+https://greenchess.net/rules.php?v=monster
+https://en.wikipedia.org/wiki/Monster_chess
+https://en.wikipedia.org/wiki/Grotesque_(chess) (fun)
+
 Maxima, Interweave, Roccoco
+https://www.chessvariants.com/other.dir/rococo.html
+https://www.chessvariants.com/dpieces.dir/maxima/maxima.html
+https://www.chessvariants.com/other.dir/interweave.html
 
 Take(a)n(d)make : if capture a piece, take its power for the last of the turn and make a move like it.
 If a pawn taken: direction of the capturer, can capture enemy.
+http://www.strategems.net/sections/fairy_defs.html
+Having captured, a unit must immediately, as part of its move, play a non-capturing move, using ONLY the powers of movement of the captured unit from the capture-square. If no such move is available, the capture is illegal. Promotion by capture occurs only when a pawn arrives on the promotion rank as the result of a Take & Make move. Checks are as in normal chess: after the notional capture of the checked King, the checking unit does not move away from the King’s square.
+
+Chakart :)
 
-Dynamo chess --> dur...
+https://en.wikipedia.org/wiki/Fairy_chess_piece
index a59fe32..3cb2577 100755 (executable)
@@ -3,11 +3,15 @@
 # Restore binary files (temporary fix - should use git-fat instead)
 for color in "w" "b"; do
   for piece in "b" "c" "d" "e" "f" "g" "h" "j" "k" "m" "n" "o" "p" "q" "r" "s"; do
-    rm public/images/pieces/Eightpieces/tmp_png/"$color$piece".png
+    rm -f public/images/pieces/Eightpieces/tmp_png/"$color$piece".png
     wget -q -O public/images/pieces/Eightpieces/tmp_png/"$color$piece".png https://vchess.club/images/pieces/Eightpieces/tmp_png/"$color$piece".png
   done
 done
-rm public/sounds/newgame.flac
+for image in "Orda" "Archer" "Lancer" "Kheshig" "Yurt"; do
+  rm -f /public/images/variants/Orda/"$image".png
+  wget -q -O public/images/variants/Orda/"$image".png https://vchess.club/images/variants/Orda/"$image".png
+done
+rm -f public/sounds/newgame.flac
 wget -q -O public/sounds/newgame.flac https://vchess.club/sounds/newgame.flac
-rm public/favicon.ico
+rm -f public/favicon.ico
 wget -q -O public/favicon.ico https://vchess.club/favicon.ico
diff --git a/client/public/images/pieces/Dynamo/empty.svg b/client/public/images/pieces/Dynamo/empty.svg
new file mode 100644 (file)
index 0000000..08ec906
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="1" height="1"/>
\ No newline at end of file
diff --git a/client/public/images/pieces/Orda/ba.svg b/client/public/images/pieces/Orda/ba.svg
new file mode 100644 (file)
index 0000000..87fa4d4
--- /dev/null
@@ -0,0 +1,137 @@
+<?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="svg1163"
+   sodipodi:docname="Archer.svg"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+  <metadata
+     id="metadata1167">
+    <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>
+  <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="1017"
+     id="namedview1165"
+     showgrid="false"
+     inkscape:zoom="0.43153989"
+     inkscape:cx="-488.60694"
+     inkscape:cy="152.93221"
+     inkscape:window-x="1912"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg1163"
+     showguides="false" />
+  <defs
+     id="defs1157">
+    <inkscape:path-effect
+       effect="mirror_symmetry"
+       start_point="-80.438505,2.5870606"
+       end_point="-37.112887,28.418936"
+       center_point="-58.775696,15.502998"
+       id="path-effect7013"
+       is_visible="true"
+       mode="free"
+       discard_orig_path="false"
+       fuse_paths="true"
+       oposite_fuse="true" />
+    <linearGradient
+       id="linearGradient6441"
+       inkscape:collect="always">
+      <stop
+         id="stop6437"
+         offset="0"
+         style="stop-color:#ffd42a;stop-opacity:1" />
+      <stop
+         id="stop6439"
+         offset="1"
+         style="stop-color:#806600;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       id="0"
+       x1="21.19"
+       y1="37.552"
+       x2="77.74"
+       y2="37.429"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         stop-color="#fff"
+         id="stop1152" />
+      <stop
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop1154" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6441"
+       id="linearGradient7051"
+       x1="-24.988083"
+       y1="37.56702"
+       x2="-77.532143"
+       y2="4.3375702"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <g
+     id="g7037">
+    <g
+       id="g7043"
+       transform="matrix(-0.60837538,-0.14918007,0.14918007,-0.60837538,-12.414484,26.315252)"
+       style="stroke-width:2.70321298;stroke-miterlimit:4;stroke-dasharray:none">
+      <path
+         style="fill:url(#linearGradient7051);fill-opacity:1;stroke:#1f1a17;stroke-width:2.70321298;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m -43.123605,24.607785 6.969175,-4.632689 c 4.132406,-8.680508 0.279219,-12.4367641 -2.433189,-16.2987855 -2.040264,-2.90499868 -3.444397,-4.33752222 -4.411012,-3.54164417 -0.103485,-3.72116613 -2.314112,-3.51386873 -2.973508,-6.01304743 -1.433446,-5.4329069 1.273826,-11.7459989 6.979084,-14.2191979 0,0 -1.512311,3.882956 -0.572227,5.190899 -0.610593,0.370364 -2.184878,1.657205 -2.329773,3.024618 0.130947,4.2573156 12.03911,14.993948 13.774277,26.077117 -1.458322,2.514982 -2.007543,1.98287 -2.784837,6.17596 -1.643076,3.646914 -2.068558,5.33563 -3.300614,6.832798 -0.488806,0.593988 -1.647773,0.683554 -2.451786,1.48633 -0.323924,1.089018 0.148354,2.151176 -0.14177,2.863622 -0.731269,1.795751 -2.014562,2.973018 -4.441578,6.152526 -3.319168,2.677558 -2.58991,2.907709 -4.108987,5.386467 -10.575171,3.743421 -25.682599,-1.627355 -29.490123,0.281741 -1.13405,0.777652 -1.517564,2.774462 -1.553054,3.487718 -1.597625,-0.205106 -4.29447,2.9716 -4.29447,2.9716 -0.537037,-6.19502 3.253074,-11.989514 8.714113,-13.311748 2.512119,-0.608237 3.857271,1.846129 7.180074,0.167806 -0.240541,1.228782 1.210934,1.371828 4.736646,1.785411 4.687222,0.549833 10.500269,2.229056 16.171816,-5.533776 z"
+         id="path7011"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccscscccccccscccccscscc" />
+      <path
+         style="fill:none;stroke:#1f1a17;stroke-width:2.70321298;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m -45.996129,-10.153971 -41.387752,8.0912848 12.128797,39.9457572"
+         id="path7026"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccc" />
+      <path
+         style="fill:none;stroke:#1f1a17;stroke-width:2.70321298;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M -87.383881,-2.0626862 -33.757224,30.115606"
+         id="path7028"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:#1f1a17;fill-opacity:1;stroke:#1f1a17;stroke-width:2.70321298;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m -33.757224,30.115606 -0.152441,3.622242 9.95057,2.6798 -6.489361,-7.775959 -3.308768,1.473917"
+         id="path7030"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc" />
+    </g>
+  </g>
+</svg>
diff --git a/client/public/images/pieces/Orda/bh.svg b/client/public/images/pieces/Orda/bh.svg
new file mode 100644 (file)
index 0000000..ecf598c
--- /dev/null
@@ -0,0 +1,197 @@
+<?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="svg1163"
+   sodipodi:docname="Kheshig.svg"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+  <metadata
+     id="metadata1167">
+    <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="1017"
+     id="namedview1165"
+     showgrid="false"
+     inkscape:zoom="0.86307976"
+     inkscape:cx="-485.97102"
+     inkscape:cy="175.29981"
+     inkscape:window-x="1912"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg1163"
+     showguides="false" />
+  <defs
+     id="defs1157">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient9464">
+      <stop
+         id="stop9462"
+         offset="0"
+         style="stop-color:#806600;stop-opacity:1" />
+      <stop
+         id="stop9460"
+         offset="1"
+         style="stop-color:#ffd42a;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient9456">
+      <stop
+         id="stop9454"
+         offset="0"
+         style="stop-color:#806600;stop-opacity:1" />
+      <stop
+         id="stop9452"
+         offset="1"
+         style="stop-color:#ffd42a;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="37.469002"
+       x2="77.760002"
+       y1="37.220001"
+       x1="21.129999"
+       id="linearGradient9444"
+       gradientTransform="translate(-91.535601,53.38202)">
+      <stop
+         style="stop-color:#a8a6a5;stop-opacity:1"
+         offset="0"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop9442" />
+      <stop
+         stop-color="#fff"
+         id="stop9440"
+         offset="1" />
+    </linearGradient>
+    <inkscape:path-effect
+       effect="mirror_symmetry"
+       start_point="-80.438505,2.5870606"
+       end_point="-37.112887,28.418936"
+       center_point="-58.775696,15.502998"
+       id="path-effect7013"
+       is_visible="true"
+       mode="free"
+       discard_orig_path="false"
+       fuse_paths="true"
+       oposite_fuse="true" />
+    <linearGradient
+       id="0"
+       x1="21.19"
+       y1="37.552"
+       x2="77.74"
+       y2="37.429"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         stop-color="#fff"
+         id="stop1152" />
+      <stop
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop1154" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9464"
+       id="linearGradient8253"
+       x1="-26.933693"
+       y1="21.96928"
+       x2="-2.0408218"
+       y2="21.96928"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.227182,0,0,1,6.2396816,0)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9456"
+       id="linearGradient8255"
+       x1="-28.773029"
+       y1="38.406345"
+       x2="-8.9171944"
+       y2="38.406345"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.227182,0,0,1,6.2396816,0)" />
+    <linearGradient
+       gradientTransform="translate(-91.535601,53.38202)"
+       id="0-4"
+       x1="21.129999"
+       y1="37.220001"
+       x2="77.760002"
+       y2="37.469002"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         stop-color="#fff"
+         id="stop8835" />
+      <stop
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop8837" />
+    </linearGradient>
+  </defs>
+  <g
+     id="g7037"
+     transform="translate(2.6788462)">
+    <g
+       id="g9450"
+       transform="matrix(-0.96182046,0,0,0.96182046,5.57492,0.66751941)">
+      <path
+         sodipodi:nodetypes="csscsccccsc"
+         inkscape:connector-curvature="0"
+         id="path8237"
+         d="m -31.592124,6.3457679 c -1.458538,0.1022853 -5.016639,0.5371741 -5.761496,5.9565311 -1.199278,8.725573 4.610808,17.002034 4.781394,19.877106 0.139634,2.353402 -1.928348,3.32362 -3.085272,4.592079 1.560799,0.348934 3.647075,-0.262081 4.682444,-1.732724 3.351425,-4.760378 -2.196524,-17.962753 2.93099,-22.368193 3.181729,-2.142439 5.851793,1.826897 8.039693,3.517832 1.19366,-0.906392 1.937638,-1.364382 4.181322,-2.476553 0.111803,-1.388371 -0.367275,-4.2808097 -0.805516,-5.6691807 -1.090544,-2.4425791 -1.643949,-5.736564 -6.951213,-6.4245228 -3.332662,-0.4319993 -6.254338,1.1989283 -8.012346,4.7276254 z"
+         style="fill:#1f1a17;fill-opacity:1;stroke:#1f1a17;stroke-width:1.76050425;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="cccccccsc"
+         inkscape:connector-curvature="0"
+         id="path8239"
+         d="m -15.823049,13.711846 c -8.997651,4.748722 -10.294025,10.611865 -9.891404,15.850565 3.314919,-1.802247 7.136138,-3.309793 12.210443,-4.087981 3.849297,-0.421056 7.6985789,0.138342 11.5478747,1.774029 1.4513528,0.08704 2.66609372,-0.02612 4.1174608,-0.347092 0.5935041,-0.385658 0.5320641,-0.462791 0.5206033,-0.848449 L 0.50488539,24.934509 C 0.02873203,24.586776 -0.92900336,24.231338 -1.4994567,23.259303 -3.789054,19.358041 -8.3796513,13.434099 -15.823049,13.711846 Z"
+         style="fill:url(#linearGradient8253);fill-opacity:1;stroke:#1f1a17;stroke-width:1.76050425;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="ccccccc"
+         inkscape:connector-curvature="0"
+         id="path8241"
+         d="m -5.862521,28.66832 c -6.453398,-1.095624 -11.717056,-1.134415 -19.142026,3.323739 -0.607376,5.658152 0.503341,12.783015 -2.46102,16.429054 8.149139,2.316799 10.952144,-5.291775 13.177184,-9.468747 -0.366601,1.801082 0.03781,6.276083 -0.888673,7.894674 4.88054,-2.125081 6.5576477,-3.338155 9.434731,-5.714874 z"
+         style="fill:url(#linearGradient8255);fill-opacity:1;stroke:#1f1a17;stroke-width:1.76050425;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="ccccccccccc"
+         inkscape:connector-curvature="0"
+         id="path8243"
+         d="m -23.280969,20.567084 c 1.960068,-0.03261 2.474093,-0.223384 4.338377,1.196086 1.120815,-1.850733 2.040864,-3.279017 5.087595,-3.8089 2.413606,0.143974 4.5851943,0.659885 6.2322653,2.25651 0.4650694,-0.372054 0.5230481,-0.621188 1.7555839,-1.785889 0.4002731,0.347093 1.1222808,1.061443 1.3356333,1.408535 -1.2872137,1.279277 -1.4176759,1.630791 -2.4933347,2.902828 -2.1180703,-1.10937 -2.8238985,-2.32558 -6.5631338,-3.046883 -2.515982,0.882429 -3.36337,2.798476 -4.731566,4.550953 -2.430959,-1.320888 -4.274488,-2.621436 -6.080721,-1.5812 0.239846,-0.730923 0.753728,-1.497291 1.119301,-2.09204 z"
+         style="fill:#1f1a17;fill-opacity:1;stroke:none;stroke-width:1.94487047;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/client/public/images/pieces/Orda/bk.svg b/client/public/images/pieces/Orda/bk.svg
new file mode 100644 (file)
index 0000000..7ce96e4
--- /dev/null
@@ -0,0 +1,215 @@
+<?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="svg1163"
+   sodipodi:docname="Khan.svg"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+  <metadata
+     id="metadata1167">
+    <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></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="1017"
+     id="namedview1165"
+     showgrid="false"
+     inkscape:zoom="0.86307977"
+     inkscape:cx="-290.36924"
+     inkscape:cy="164.27838"
+     inkscape:window-x="1912"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg1163"
+     showguides="false" />
+  <defs
+     id="defs1157">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient15731">
+      <stop
+         style="stop-color:#ffd42a;stop-opacity:1"
+         offset="0"
+         id="stop15729" />
+      <stop
+         style="stop-color:#806600;stop-opacity:1"
+         offset="1"
+         id="stop15727" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="37.469002"
+       x2="77.760002"
+       y1="37.220001"
+       x1="21.129999"
+       id="linearGradient9444"
+       gradientTransform="translate(-91.535601,53.38202)">
+      <stop
+         style="stop-color:#a8a6a5;stop-opacity:1"
+         offset="0"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop9442" />
+      <stop
+         stop-color="#fff"
+         id="stop9440"
+         offset="1" />
+    </linearGradient>
+    <inkscape:path-effect
+       effect="mirror_symmetry"
+       start_point="-80.438505,2.5870606"
+       end_point="-37.112887,28.418936"
+       center_point="-58.775696,15.502998"
+       id="path-effect7013"
+       is_visible="true"
+       mode="free"
+       discard_orig_path="false"
+       fuse_paths="true"
+       oposite_fuse="true" />
+    <linearGradient
+       id="0"
+       x1="21.19"
+       y1="37.552"
+       x2="77.74"
+       y2="37.429"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         stop-color="#fff"
+         id="stop1152" />
+      <stop
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop1154" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(-91.535601,53.38202)"
+       id="0-4"
+       x1="21.129999"
+       y1="37.220001"
+       x2="77.760002"
+       y2="37.469002"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         stop-color="#fff"
+         id="stop8835" />
+      <stop
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop8837" />
+    </linearGradient>
+    <inkscape:path-effect
+       effect="mirror_symmetry"
+       start_point="274.21267,350.55066"
+       end_point="273.50284,477.30227"
+       center_point="273.85776,413.92646"
+       id="path-effect4557-0-4"
+       is_visible="true"
+       mode="free"
+       discard_orig_path="false"
+       fuse_paths="true"
+       oposite_fuse="false" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15731"
+       id="linearGradient17505"
+       x1="-49.645481"
+       y1="29.826591"
+       x2="-24.59959"
+       y2="29.826591"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1955304,0,0,1.1955304,69.381107,-16.275137)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15731"
+       id="linearGradient17513"
+       x1="293.16513"
+       y1="92.385574"
+       x2="338.07141"
+       y2="92.385574"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15731"
+       id="linearGradient17515"
+       gradientUnits="userSpaceOnUse"
+       x1="293.16513"
+       y1="92.385574"
+       x2="338.07141"
+       y2="92.385574" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15731"
+       id="linearGradient17517"
+       gradientUnits="userSpaceOnUse"
+       x1="293.16513"
+       y1="92.385574"
+       x2="338.07141"
+       y2="92.385574" />
+  </defs>
+  <g
+     style="fill:url(#linearGradient17513);fill-opacity:1;stroke:#1f1a17;stroke-width:1.5631523;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     transform="matrix(1.0832527,0,0,1.0832527,-316.89434,-75.076923)"
+     id="g4698-2">
+    <path
+       style="fill:#1f1a17;fill-opacity:1;stroke:#1f1a17;stroke-width:1.5631523;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 303.60166,106.86928 c 7.66719,2.10131 16.51137,1.72857 23.51399,-0.35626 l -4.92817,-18.880256 c -4.60008,0.196956 -9.92512,0.484373 -13.3113,0.03659 z"
+       id="path4559-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       transform="matrix(0.06852995,0,0,0.08094496,296.89962,61.263195)"
+       style="fill:url(#linearGradient17515);fill-opacity:1;stroke:#1f1a17;stroke-width:20.98776438;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 275.1413,184.72989 c -31.24732,1.17794 -103.11613,38.83736 -112.63042,62.19185 -42.3113,103.86038 -85.58046,199.79956 -199.829859,294.42238 11.908253,16.00162 83.420666,6.52866 141.407899,62.88268 17.88418,-18.602 69.1607,-234.69942 84.21766,-286.09297 0.25562,-0.8725 75.1013,17.56897 85.99866,15.88871 10.87785,1.8022 85.92538,-15.79984 86.17121,-14.92453 14.48041,51.55896 63.33343,268.21713 81.00814,287.01826 C 500.09935,550.41524 571.50118,560.68855 583.58791,544.8213 470.40545,448.92483 428.21352,352.50705 387.06811,248.1793 377.81598,224.71971 306.37346,186.25772 275.1413,184.72989 Z"
+       id="path4555-2"
+       inkscape:connector-curvature="0"
+       inkscape:path-effect="#path-effect4557-0-4"
+       inkscape:original-d="m 275.61681,184.7147 c -30.98719,0.80813 -103.54305,38.73329 -113.10593,62.20704 -42.3113,103.86038 -85.58046,199.79956 -199.829859,294.42238 11.908253,16.00162 83.420666,6.52866 141.407899,62.88268 17.88418,-18.602 69.1607,-234.69942 84.21766,-286.09297 0.27569,-0.94101 87.31577,20.5843 87.31577,15.10156"
+       sodipodi:nodetypes="csccsc" />
+    <path
+       sodipodi:nodetypes="csccc"
+       inkscape:connector-curvature="0"
+       id="path4543-7-7"
+       d="m 313.70114,76.659247 c 0.72602,-1.679766 1.16307,-2.973341 2.14455,-2.989719 1.017,-0.01697 1.58408,1.476492 2.11082,3.021922 -0.83846,0.823049 -3.69262,0.786403 -4.25537,-0.0322 z"
+       style="fill:url(#linearGradient17517);fill-opacity:1;stroke:#1f1a17;stroke-width:1.56315231;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+  </g>
+  <rect
+     style="opacity:1;fill:url(#linearGradient17505);fill-opacity:1;stroke:#1f1a17;stroke-width:1.69328895;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+     id="rect17497"
+     width="27.918745"
+     height="14.235797"
+     x="11.040617"
+     y="12.265562"
+     ry="5.8048873" />
+</svg>
diff --git a/client/public/images/pieces/Orda/bl.svg b/client/public/images/pieces/Orda/bl.svg
new file mode 100644 (file)
index 0000000..c7622c3
--- /dev/null
@@ -0,0 +1,124 @@
+<?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="svg1163"
+   sodipodi:docname="Lancer.svg"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+  <metadata
+     id="metadata1167">
+    <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>
+  <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="1017"
+     id="namedview1165"
+     showgrid="false"
+     inkscape:zoom="1.7261595"
+     inkscape:cx="-100.07003"
+     inkscape:cy="172.96195"
+     inkscape:window-x="1912"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg1163" />
+  <defs
+     id="defs1157">
+    <linearGradient
+       id="linearGradient6441"
+       inkscape:collect="always">
+      <stop
+         id="stop6437"
+         offset="0"
+         style="stop-color:#ffd42a;stop-opacity:1" />
+      <stop
+         id="stop6439"
+         offset="1"
+         style="stop-color:#806600;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       id="0"
+       x1="21.19"
+       y1="37.552"
+       x2="77.74"
+       y2="37.429"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         stop-color="#fff"
+         id="stop1152" />
+      <stop
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop1154" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6441"
+       id="linearGradient6427"
+       x1="54.37993"
+       y1="27.899749"
+       x2="92.036465"
+       y2="27.899749"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6441"
+       id="linearGradient6435"
+       x1="5.4108348"
+       y1="18.40962"
+       x2="45.079731"
+       y2="18.40962"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <g
+     id="g6417"
+     transform="matrix(0.87446347,0,0,1.0645027,-38.025884,-8.5072976)">
+    <path
+       sodipodi:nodetypes="ccccc"
+       id="path3973"
+       d="m 75.119024,43.874689 13.822887,0.589734 C 81.427711,39.083746 72.886976,23.620424 73.246263,10.293252 72.951274,23.647412 65.324765,39.18622 57.621403,44.429572 l 13.769501,-0.600428"
+       style="fill:url(#linearGradient6427);fill-opacity:1;stroke:#1f1a17;stroke-width:1.86823937;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       inkscape:connector-curvature="0" />
+    <path
+       id="path10325"
+       d="m 71.390926,43.829113 -0.01045,8.207759 c 0.915096,-0.03656 2.830209,-0.01266 3.671608,0.0038 l 0.06694,-8.165983 c -1.206008,-0.09054 -2.434451,-0.135014 -3.728098,-0.04558 z"
+       style="fill:#1f1a17;fill-opacity:1;stroke:#1f1a17;stroke-width:1.82060385;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+  </g>
+  <path
+     style="fill:url(#linearGradient6435);fill-opacity:1;stroke:#1f1a17;stroke-width:1.20167375;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     d="M 26.025297,3.3747524 C 22.079635,9.011651 15.019756,13.407269 16.093167,20.95623 19.579066,32.277372 34.070023,30.953274 42.78623,33.207337 l -3.433417,-2.439104 3.956282,-0.139806 C 37.958313,26.760195 25.468994,30.180937 20.535525,19.649065 18.399613,13.309671 24.076279,8.737338 26.025297,3.3747524 Z"
+     id="path6419"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="ccccccc" />
+</svg>
diff --git a/client/public/images/pieces/Orda/bp.svg b/client/public/images/pieces/Orda/bp.svg
new file mode 100644 (file)
index 0000000..4041c5a
--- /dev/null
@@ -0,0 +1,116 @@
+<?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="svg17620"
+   sodipodi:docname="hP.svg"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+  <metadata
+     id="metadata17624">
+    <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></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="1017"
+     id="namedview17622"
+     showgrid="false"
+     inkscape:zoom="1.332054"
+     inkscape:cx="88.584999"
+     inkscape:cy="-31.530254"
+     inkscape:window-x="1912"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg17620" />
+  <defs
+     id="defs17614">
+    <linearGradient
+       id="0"
+       gradientUnits="userSpaceOnUse"
+       x1="21.129999"
+       y1="37.349998"
+       x2="77.760002"
+       y2="37.469002"
+       gradientTransform="matrix(1,0,0,0.97324,0,1.243)"
+       xlink:href="#linearGradient15731">
+      <stop
+         stop-color="#fff"
+         id="stop17609" />
+      <stop
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop17611" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient15731">
+      <stop
+         style="stop-color:#ffd42a;stop-opacity:1"
+         offset="0"
+         id="stop15729" />
+      <stop
+         style="stop-color:#806600;stop-opacity:1"
+         offset="1"
+         id="stop15727" />
+    </linearGradient>
+    <inkscape:path-effect
+       effect="mirror_symmetry"
+       start_point="274.21267,350.55066"
+       end_point="273.50284,477.30227"
+       center_point="273.85776,413.92646"
+       id="path-effect4557-0-4"
+       is_visible="true"
+       mode="free"
+       discard_orig_path="false"
+       fuse_paths="true"
+       oposite_fuse="false" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15731"
+       id="linearGradient18255"
+       x1="12.299"
+       y1="26.6915"
+       x2="37.700001"
+       y2="26.6915"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <path
+     d="m25 46.45h-13.394c-.66-1.607-.991-3.288-.991-5.04 0-2.975.864-5.644 2.599-8.02 1.736-2.365 3.971-4.054 6.697-5.068-1.168-.527-2.125-1.327-2.862-2.398-.737-1.071-1.101-2.283-1.101-3.634 0-1.689.576-3.156 1.736-4.392 1.152-1.244 2.574-1.961 4.267-2.151-1.346-.981-2.02-2.282-2.02-3.889 0-1.351.491-2.513 1.482-3.477.982-.964 2.176-1.442 3.581-1.442 1.389 0 2.582.478 3.573 1.442.991.964 1.49 2.126 1.49 3.477 0 1.607-.669 2.909-2.02 3.889 1.693.19 3.116.906 4.267 2.151 1.16 1.236 1.736 2.703 1.736 4.392 0 1.351-.373 2.563-1.126 3.634-.753 1.071-1.71 1.87-2.862 2.398 2.726 1.014 4.961 2.703 6.697 5.068 1.736 2.373 2.599 5.04 2.599 8.02 0 1.739-.322 3.42-.965 5.04h-13.394"
+     fill="#1f1a17"
+     id="path17616" />
+  <path
+     d="m25 44.808h12.175c.347-1.154.525-2.291.525-3.403 0-2.513-.711-4.787-2.142-6.831-1.431-2.044-3.277-3.552-5.52-4.516-1.584-.62-1.643-.659-1.643-1.739 0-.849.559-1.475 1.668-1.879 1.532-1.047 2.303-2.431 2.303-4.153 0-1.244-.432-2.324-1.287-3.263-.864-.931-1.905-1.467-3.124-1.615-.999-.082-1.49-.626-1.49-1.64 0-.453.178-.873.542-1.261.898-.676 1.346-1.557 1.346-2.653 0-.898-.339-1.673-.999-2.316-.66-.643-1.448-.964-2.354-.964-.94 0-1.744.321-2.396.964-.652.643-.974 1.417-.974 2.316 0 1.079.44 1.961 1.338 2.653.364.354.542.775.542 1.261 0 1.014-.483 1.557-1.465 1.64-1.236.148-2.286.684-3.133 1.615-.855.939-1.279 2.02-1.279 3.263 0 1.722.77 3.106 2.303 4.153 1.109.412 1.668 1.046 1.668 1.879 0 1.079-.067 1.118-1.668 1.739-2.244.964-4.081 2.472-5.503 4.516-1.422 2.044-2.134 4.318-2.134 6.831 0 1.195.178 2.324.525 3.403h12.175"
+     fill="url(#0)"
+     id="path17618"
+     style="fill-opacity:1.0;fill:url(#linearGradient18255)" />
+</svg>
diff --git a/client/public/images/pieces/Orda/bq.svg b/client/public/images/pieces/Orda/bq.svg
new file mode 100644 (file)
index 0000000..a37c1f0
--- /dev/null
@@ -0,0 +1,101 @@
+<?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="svg7747"
+   sodipodi:docname="hQ.svg"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+  <metadata
+     id="metadata7751">
+    <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></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="1017"
+     id="namedview7749"
+     showgrid="false"
+     inkscape:zoom="1.8838088"
+     inkscape:cx="123.18947"
+     inkscape:cy="44.319176"
+     inkscape:window-x="1912"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg7747" />
+  <defs
+     id="defs7739">
+    <linearGradient
+       id="0"
+       x1="21.253"
+       y1="37.220001"
+       x2="77.639999"
+       y2="37.349998"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient9464">
+      <stop
+         stop-color="#fff"
+         id="stop7734"
+         style="stop-color:#f3c926;stop-opacity:1" />
+      <stop
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop7736" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient9464">
+      <stop
+         id="stop9462"
+         offset="0"
+         style="stop-color:#806600;stop-opacity:1" />
+      <stop
+         id="stop9460"
+         offset="1"
+         style="stop-color:#ffd42a;stop-opacity:1" />
+    </linearGradient>
+  </defs>
+  <g
+     stroke="#1f1a17"
+     stroke-width=".076"
+     id="g7745">
+    <path
+       fill="#1f1a17"
+       d="m44.541 14.723c-.94 0-1.744-.33-2.405-.982-.66-.652-.991-1.448-.991-2.396 0-.923.33-1.719.991-2.388.66-.677 1.465-1.01 2.405-1.01.931 0 1.727.33 2.388 1.01.66.669.991 1.465.991 2.388 0 .948-.33 1.744-.991 2.396-.66.652-1.456.982-2.388.982zm-4.31 29.22c-.813.711-2.633 1.304-5.461 1.786-2.828.474-6.087.72-9.77.72-3.751 0-7.05-.254-9.898-.745-2.845-.499-4.64-1.118-5.385-1.863l1.566-5.952-.694-3.895-2.184-3.793-2.108-15.426 1.211-.474 6.799 11.455.152-13.64 1.685-.296 5.182 13.716 2.777-14.757h1.719l2.777 14.707 5.131-13.665 1.71.296.152 13.64 6.824-11.481 1.16.542-2.057 15.359-2.21 3.793-.694 3.946 1.617 6.03zm-25.696-31.953c-.948 0-1.753-.322-2.413-.974-.66-.652-.991-1.456-.991-2.396 0-.923.33-1.719.991-2.379.66-.66 1.465-.991 2.413-.991.923 0 1.719.33 2.379.991.66.66.991 1.456.991 2.379 0 .94-.33 1.744-.991 2.396-.66.652-1.456.974-2.379.974zm-9.136 2.735c-.94 0-1.736-.33-2.388-.982-.652-.652-.982-1.448-.982-2.396 0-.923.33-1.719.982-2.388.652-.677 1.448-1.01 2.388-1.01.948 0 1.744.33 2.413 1.01.66.669.991 1.465.991 2.388 0 .948-.33 1.744-.991 2.396-.669.652-1.465.982-2.413.982zm19.55-3.971c-.94 0-1.744-.33-2.396-.991-.652-.66-.974-1.465-.974-2.405 0-.931.322-1.727.974-2.388.652-.66 1.456-.991 2.396-.991.923 0 1.727.33 2.396.991.669.66.999 1.456.999 2.388 0 .94-.33 1.744-.999 2.405-.669.66-1.473.991-2.396.991zm10.414 1.236c-.94 0-1.736-.322-2.388-.974-.652-.652-.982-1.456-.982-2.396 0-.923.33-1.719.982-2.379.652-.66 1.448-.991 2.388-.991.948 0 1.753.33 2.413.991.66.66.991 1.456.991 2.379 0 .94-.33 1.744-.991 2.396-.66.652-1.465.974-2.413.974z"
+       id="path7741" />
+    <path
+       fill="url(#0)"
+       d="m38.22 43.04c-3.02-1.253-7.417-1.88-13.166-1.88-5.876 0-10.312.643-13.327 1.93 2.896 1.143 7.315 1.71 13.25 1.71 2.845 0 5.444-.152 7.798-.466 2.362-.313 4.174-.745 5.444-1.295zm-13.267-34.03c1.109 0 1.66-.559 1.66-1.659 0-1.092-.55-1.643-1.66-1.643-1.092 0-1.634.55-1.634 1.643 0 1.101.542 1.659 1.634 1.659zm12.624 24.977c-3.192-.813-7.366-1.211-12.522-1.211-5.292 0-9.517.406-12.675 1.236l.373 2.379c3.217-.762 7.324-1.143 12.302-1.143 4.944 0 8.975.373 12.1 1.118l.423-2.379zm.618-1.49l1.617-2.853c-.796.322-1.609.474-2.43.474-2.218 0-3.988-.897-5.309-2.701-.991.821-2.1 1.236-3.327 1.236-1.583 0-2.853-.618-3.793-1.863-1.058 1.16-2.32 1.744-3.793 1.744-1.194 0-2.286-.406-3.277-1.219-1.389 1.77-3.183 2.65-5.385 2.65-.838 0-1.676-.152-2.506-.466l1.736 2.972c3.209-.923 7.62-1.389 13.225-1.389 5.706 0 10.118.474 13.242 1.414zm-11.11-5.927l-2.108-12.133-2.108 11.989c.051-.034.161-.119.347-.254.381-.745.957-1.118 1.736-1.118.847 0 1.389.372 1.634 1.118.102.102.271.237.5.398zm6.867.474v-11.489l-4.089 11.261c.313-.11.576-.262.796-.44.33-.415.779-.627 1.338-.627.66 0 1.194.296 1.592.872.042.068.102.136.169.212.068.076.136.144.195.212zm-13.936-.347l-4.064-11.142v11.337c.042-.068.119-.144.22-.245.33-.694.872-1.041 1.634-1.041.627 0 1.143.262 1.541.796.449.195.669.296.669.296zm-6.299 1.389l-5.334-9.203 1.363 8.382c.94.66 1.863.991 2.752.991.347 0 .754-.059 1.219-.169zm22.394.119c.381.119.804.178 1.27.178 1.01 0 1.947-.313 2.828-.94l1.363-8.585-5.461 9.347zm1.49 12.556l-.745-2.802c-3.243-.711-7.205-1.067-11.904-1.067-4.648 0-8.611.356-11.879 1.067l-.771 2.828c3.073-.931 7.298-1.389 12.675-1.389 5.241 0 9.449.449 12.624 1.363zm-23.06-30.514c1.084 0 1.634-.542 1.634-1.634 0-1.092-.55-1.634-1.634-1.634-1.109 0-1.668.542-1.668 1.634 0 1.092.559 1.634 1.668 1.634zm20.828 0c1.109 0 1.668-.542 1.668-1.634 0-1.092-.559-1.634-1.668-1.634-1.084 0-1.634.542-1.634 1.634 0 1.092.55 1.634 1.634 1.634zm-29.964 2.735c1.109 0 1.668-.55 1.668-1.643 0-1.109-.559-1.659-1.668-1.659-1.084 0-1.634.55-1.634 1.659 0 1.092.55 1.643 1.634 1.643zm39.14 0c1.092 0 1.642-.55 1.642-1.643 0-1.109-.55-1.659-1.642-1.659-1.101 0-1.66.55-1.66 1.659 0 1.092.559 1.643 1.66 1.643z"
+       id="path7743"
+       style="fill-opacity:1.0" />
+  </g>
+</svg>
diff --git a/client/public/images/pieces/Orda/by.svg b/client/public/images/pieces/Orda/by.svg
new file mode 100644 (file)
index 0000000..92c2760
--- /dev/null
@@ -0,0 +1,241 @@
+<?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="svg1163"
+   sodipodi:docname="Yurt.svg"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+  <metadata
+     id="metadata1167">
+    <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></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="1017"
+     id="namedview1165"
+     showgrid="false"
+     inkscape:zoom="1.2205791"
+     inkscape:cx="-338.20187"
+     inkscape:cy="102.28191"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg1163"
+     showguides="false" />
+  <defs
+     id="defs1157">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient15731">
+      <stop
+         style="stop-color:#ffd42a;stop-opacity:1"
+         offset="0"
+         id="stop15729" />
+      <stop
+         style="stop-color:#806600;stop-opacity:1"
+         offset="1"
+         id="stop15727" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="37.469002"
+       x2="77.760002"
+       y1="37.220001"
+       x1="21.129999"
+       id="linearGradient9444"
+       gradientTransform="translate(-91.535601,53.38202)">
+      <stop
+         style="stop-color:#a8a6a5;stop-opacity:1"
+         offset="0"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop9442" />
+      <stop
+         stop-color="#fff"
+         id="stop9440"
+         offset="1" />
+    </linearGradient>
+    <inkscape:path-effect
+       effect="mirror_symmetry"
+       start_point="-80.438505,2.5870606"
+       end_point="-37.112887,28.418936"
+       center_point="-58.775696,15.502998"
+       id="path-effect7013"
+       is_visible="true"
+       mode="free"
+       discard_orig_path="false"
+       fuse_paths="true"
+       oposite_fuse="true" />
+    <linearGradient
+       id="0"
+       x1="21.19"
+       y1="37.552"
+       x2="77.74"
+       y2="37.429"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         stop-color="#fff"
+         id="stop1152" />
+      <stop
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop1154" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(-91.535601,53.38202)"
+       id="0-4"
+       x1="21.129999"
+       y1="37.220001"
+       x2="77.760002"
+       y2="37.469002"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         stop-color="#fff"
+         id="stop8835" />
+      <stop
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop8837" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15731"
+       id="linearGradient15725"
+       x1="55.863873"
+       y1="27.1091"
+       x2="105.88728"
+       y2="27.1091"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-55.875578,-2.1090998)" />
+  </defs>
+  <g
+     id="g15751"
+     transform="matrix(0.87253523,0,0,0.87253523,3.1866192,8.0275132)">
+    <path
+       style="fill:url(#linearGradient15725);fill-opacity:1;stroke:#1f1a17;stroke-width:1.94065392;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 0.887186,42.611739 H 49.165062 V 26.82446 c 0,-8.076737 -16.73686,-18.5353648 -18.075555,-18.9937143 C 27.94641,7.3249167 23.197216,7.2322127 19.477184,7.6758487 17.367375,7.9225282 0.834938,18.745988 0.834938,26.781028 c 0,8.398128 0.05225,5.248532 0.05225,15.830711 z"
+       id="path15599"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccsccsc" />
+    <path
+       sodipodi:nodetypes="cc"
+       style="fill:none;stroke:#1f1a17;stroke-width:1.94065392;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 1.176444,26.503616 47.687858,-0.17341"
+       id="path15601"
+       inkscape:connector-curvature="0" />
+    <g
+       transform="translate(-55.875578,-2.1090998)"
+       style="stroke:#1f1a17;stroke-opacity:1"
+       id="g15703">
+      <path
+         style="fill:none;stroke:#1f1a17;stroke-width:0.84664446;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 56.763004,36.242774 8.583815,8.641619"
+         id="path15628"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#1f1a17;stroke-width:0.84664446;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 58.554911,28.901733 74.450866,44.739884"
+         id="path15632"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path15636"
+         d="m 66.878611,28.265895 16.6474,16.416186"
+         style="fill:none;stroke:#1f1a17;stroke-width:0.84664446;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="cc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path15640"
+         d="M 76.936414,28.728322 93.005779,44.739884"
+         style="fill:none;stroke:#1f1a17;stroke-width:0.84664446;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#1f1a17;stroke-width:0.84664446;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 85.838148,28.554912 102.08092,44.682081"
+         id="path15644"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cc" />
+      <path
+         style="fill:none;stroke:#1f1a17;stroke-width:0.84664446;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 94.789569,28.084367 105.39475,38.886904"
+         id="path15648"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cc" />
+    </g>
+    <g
+       style="stroke:#1f1a17;stroke-opacity:1"
+       transform="matrix(-1,0,0,1,106.28392,-2.1090998)"
+       id="g15717">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path15705"
+         d="m 56.763004,36.242774 8.583815,8.641619"
+         style="fill:none;stroke:#1f1a17;stroke-width:0.84664446;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path15707"
+         d="M 58.554911,28.901733 74.450866,44.739884"
+         style="fill:none;stroke:#1f1a17;stroke-width:0.84664446;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="cc"
+         style="fill:none;stroke:#1f1a17;stroke-width:0.84664446;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="m 66.878611,28.265895 16.6474,16.416186"
+         id="path15709"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="cc"
+         style="fill:none;stroke:#1f1a17;stroke-width:0.84664446;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         d="M 76.936414,28.728322 93.005779,44.739884"
+         id="path15711"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path15713"
+         d="M 85.838148,28.554912 102.08092,44.682081"
+         style="fill:none;stroke:#1f1a17;stroke-width:0.84664446;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path15715"
+         d="M 94.789569,28.084367 105.39475,38.886904"
+         style="fill:none;stroke:#1f1a17;stroke-width:0.84664446;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/client/public/images/pieces/Orda/wh.svg b/client/public/images/pieces/Orda/wh.svg
new file mode 100644 (file)
index 0000000..22a0409
--- /dev/null
@@ -0,0 +1,202 @@
+<?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="svg1163"
+   sodipodi:docname="wH.svg"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
+  <metadata
+     id="metadata1167">
+    <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></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="1017"
+     id="namedview1165"
+     showgrid="false"
+     inkscape:zoom="1.7261595"
+     inkscape:cx="-29.651529"
+     inkscape:cy="88.302288"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg1163"
+     showguides="false" />
+  <defs
+     id="defs1157">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient9464">
+      <stop
+         id="stop9462"
+         offset="0"
+         style="stop-color:#806600;stop-opacity:1" />
+      <stop
+         id="stop9460"
+         offset="1"
+         style="stop-color:#ffd42a;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="37.469002"
+       x2="77.760002"
+       y1="37.220001"
+       x1="21.129999"
+       id="linearGradient9444"
+       gradientTransform="translate(-91.535601,53.38202)">
+      <stop
+         style="stop-color:#a8a6a5;stop-opacity:1"
+         offset="0"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop9442" />
+      <stop
+         stop-color="#fff"
+         id="stop9440"
+         offset="1" />
+    </linearGradient>
+    <inkscape:path-effect
+       effect="mirror_symmetry"
+       start_point="-80.438505,2.5870606"
+       end_point="-37.112887,28.418936"
+       center_point="-58.775696,15.502998"
+       id="path-effect7013"
+       is_visible="true"
+       mode="free"
+       discard_orig_path="false"
+       fuse_paths="true"
+       oposite_fuse="true" />
+    <linearGradient
+       id="0"
+       x1="21.19"
+       y1="37.552"
+       x2="77.74"
+       y2="37.429"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         stop-color="#fff"
+         id="stop1152" />
+      <stop
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop1154" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9444"
+       id="linearGradient8253"
+       x1="-26.933693"
+       y1="21.96928"
+       x2="-2.0408218"
+       y2="21.96928"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.227182,0,0,1,6.2396816,0)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9444"
+       id="linearGradient8255"
+       x1="-28.773029"
+       y1="38.406345"
+       x2="-8.9171944"
+       y2="38.406345"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.227182,0,0,1,6.2396816,0)" />
+    <linearGradient
+       gradientTransform="translate(-91.535601,53.38202)"
+       id="0-4"
+       x1="21.129999"
+       y1="37.220001"
+       x2="77.760002"
+       y2="37.469002"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         stop-color="#fff"
+         id="stop8835" />
+      <stop
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop8837" />
+    </linearGradient>
+    <linearGradient
+       id="0-5"
+       x1="21.253"
+       y1="37.220001"
+       x2="77.639999"
+       y2="37.349998"
+       gradientUnits="userSpaceOnUse"
+       xlink:href="#linearGradient9464">
+      <stop
+         stop-color="#fff"
+         id="stop7734" />
+      <stop
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0"
+         id="stop7736" />
+    </linearGradient>
+  </defs>
+  <g
+     id="g7037"
+     transform="translate(2.6788462)">
+    <g
+       id="g9450"
+       transform="matrix(-0.96182046,0,0,0.96182046,5.57492,0.66751941)">
+      <path
+         sodipodi:nodetypes="csscsccccsc"
+         inkscape:connector-curvature="0"
+         id="path8237"
+         d="m -31.592124,6.3457679 c -1.458538,0.1022853 -5.016639,0.5371741 -5.761496,5.9565311 -1.199278,8.725573 4.610808,17.002034 4.781394,19.877106 0.139634,2.353402 -1.928348,3.32362 -3.085272,4.592079 1.560799,0.348934 3.647075,-0.262081 4.682444,-1.732724 3.351425,-4.760378 -2.196524,-17.962753 2.93099,-22.368193 3.181729,-2.142439 5.851793,1.826897 8.039693,3.517832 1.19366,-0.906392 1.937638,-1.364382 4.181322,-2.476553 0.111803,-1.388371 -0.367275,-4.2808097 -0.805516,-5.6691807 -1.090544,-2.4425791 -1.643949,-5.736564 -6.951213,-6.4245228 -3.332662,-0.4319993 -6.254338,1.1989283 -8.012346,4.7276254 z"
+         style="fill:#1f1a17;fill-opacity:1;stroke:#1f1a17;stroke-width:1.76050425;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="cccccccsc"
+         inkscape:connector-curvature="0"
+         id="path8239"
+         d="m -15.823049,13.711846 c -8.997651,4.748722 -10.294025,10.611865 -9.891404,15.850565 3.314919,-1.802247 7.136138,-3.309793 12.210443,-4.087981 3.849297,-0.421056 7.6985789,0.138342 11.5478747,1.774029 1.4513528,0.08704 2.66609372,-0.02612 4.1174608,-0.347092 0.5935041,-0.385658 0.5320641,-0.462791 0.5206033,-0.848449 L 0.50488539,24.934509 C 0.02873203,24.586776 -0.92900336,24.231338 -1.4994567,23.259303 -3.789054,19.358041 -8.3796513,13.434099 -15.823049,13.711846 Z"
+         style="fill:url(#linearGradient8253);fill-opacity:1.0;stroke:#1f1a17;stroke-width:1.76050425;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="ccccccc"
+         inkscape:connector-curvature="0"
+         id="path8241"
+         d="m -5.862521,28.66832 c -6.453398,-1.095624 -11.717056,-1.134415 -19.142026,3.323739 -0.607376,5.658152 0.503341,12.783015 -2.46102,16.429054 8.149139,2.316799 10.952144,-5.291775 13.177184,-9.468747 -0.366601,1.801082 0.03781,6.276083 -0.888673,7.894674 4.88054,-2.125081 6.5576477,-3.338155 9.434731,-5.714874 z"
+         style="fill:url(#linearGradient8255);fill-opacity:1.0;stroke:#1f1a17;stroke-width:1.76050425;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="ccccccccccc"
+         inkscape:connector-curvature="0"
+         id="path8243"
+         d="m -23.280969,20.567084 c 1.960068,-0.03261 2.474093,-0.223384 4.338377,1.196086 1.120815,-1.850733 2.040864,-3.279017 5.087595,-3.8089 2.413606,0.143974 4.5851943,0.659885 6.2322653,2.25651 0.4650694,-0.372054 0.5230481,-0.621188 1.7555839,-1.785889 0.4002731,0.347093 1.1222808,1.061443 1.3356333,1.408535 -1.2872137,1.279277 -1.4176759,1.630791 -2.4933347,2.902828 -2.1180703,-1.10937 -2.8238985,-2.32558 -6.5631338,-3.046883 -2.515982,0.882429 -3.36337,2.798476 -4.731566,4.550953 -2.430959,-1.320888 -4.274488,-2.621436 -6.080721,-1.5812 0.239846,-0.730923 0.753728,-1.497291 1.119301,-2.09204 z"
+         style="fill:#1f1a17;fill-opacity:1;stroke:none;stroke-width:1.94487047;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/client/public/images/variants/Orda/Archer.png b/client/public/images/variants/Orda/Archer.png
new file mode 100644 (file)
index 0000000..f2d63e9
--- /dev/null
@@ -0,0 +1 @@
+#$# git-fat 95df899f13b1adefad85a23ce0f0acd17396b4b4                14751
diff --git a/client/public/images/variants/Orda/Kheshig.png b/client/public/images/variants/Orda/Kheshig.png
new file mode 100644 (file)
index 0000000..1f005fa
--- /dev/null
@@ -0,0 +1 @@
+#$# git-fat b608821fb2bf1200c83124776a0d027e6cbc3172                 8879
diff --git a/client/public/images/variants/Orda/Lancer.png b/client/public/images/variants/Orda/Lancer.png
new file mode 100644 (file)
index 0000000..f0ae73e
--- /dev/null
@@ -0,0 +1 @@
+#$# git-fat 0aae5c4c8931f94b873015655f24cb9e4c9a0b04                13796
diff --git a/client/public/images/variants/Orda/Orda.png b/client/public/images/variants/Orda/Orda.png
new file mode 100644 (file)
index 0000000..69a74fc
--- /dev/null
@@ -0,0 +1 @@
+#$# git-fat 9f7c4f64cccdb2c7556cdff2c79a1ad81530e48c               390147
diff --git a/client/public/images/variants/Orda/Yurt.png b/client/public/images/variants/Orda/Yurt.png
new file mode 100644 (file)
index 0000000..82b130b
--- /dev/null
@@ -0,0 +1 @@
+#$# git-fat cc8411397ba9c18c7615b626c1789ec98083259f                 6547
diff --git a/client/public/images/variants/README b/client/public/images/variants/README
new file mode 100644 (file)
index 0000000..c6a3a75
--- /dev/null
@@ -0,0 +1,2 @@
+Here are some binary images used for some variants.
+Currently only Orda.
index 37e756e..177fc9b 100644 (file)
@@ -197,8 +197,8 @@ export const ChessRules = class ChessRules {
   }
 
   // Path to promotion pieces (usually the same)
-  getPPpath(b) {
-    return this.getPpath(b);
+  getPPpath(m) {
+    return this.getPpath(m.appear[0].c + m.appear[0].p);
   }
 
   // Aggregates flags into one object
@@ -1094,7 +1094,7 @@ export const ChessRules = class ChessRules {
     const c = V.GetOppCol(this.turn);
     const firstRank = (c == "w" ? V.size.x - 1 : 0);
     // Update castling flags if rooks are moved
-    const oppCol = V.GetOppCol(c);
+    const oppCol = this.turn;
     const oppFirstRank = V.size.x - 1 - firstRank;
     if (piece == V.KING && move.appear.length > 0)
       this.castleFlags[c] = [V.size.y, V.size.y];
index d89ee40..0856096 100644 (file)
@@ -345,10 +345,8 @@ export default {
                   attrs: {
                     src:
                       "/images/pieces/" +
-                      this.vr.getPPpath(
-                        m.appear[0].c + m.appear[0].p,
-                        // Extra arg useful for some variants:
-                        this.orientation) +
+                      // orientation: extra arg useful for some variants:
+                      this.vr.getPPpath(m, this.orientation) +
                       V.IMAGE_EXTENSION
                   },
                   class: { "choice-piece": true },
index 7ce045f..1379887 100644 (file)
@@ -132,6 +132,7 @@ export const translations = {
   Subject: "Subject",
   "Symmetric random": "Symmetric random",
   "Terminate game?": "Terminate game?",
+  "The game should be in another tab": "The game should be in another tab",
   "Three repetitions": "Three repetitions",
   Time: "Time",
   "Undetermined result": "Undetermined result",
@@ -186,6 +187,7 @@ export const translations = {
   "Mate any piece (v2)": "Mate any piece (v2)",
   "Mate the knight": "Mate the knight",
   "Middle battle": "Middle battle",
+  "Mongolian Horde": "Mongolian Horde",
   "Move like a knight (v1)": "Move like a knight (v1)",
   "Move like a knight (v2)": "Move like a knight (v2)",
   "Move twice": "Move twice",
@@ -194,6 +196,7 @@ export const translations = {
   "Pawns move diagonally": "Pawns move diagonally",
   "Play at the same time": "Play at the same time",
   "Powerful pieces": "Powerful pieces",
+  "Push and pull": "Push and pull",
   "Queen disguised as a pawn": "Queen disguised as a pawn",
   "Reuse pieces": "Reuse pieces",
   "Reverse captures": "Reverse captures",
index 40ba5c8..72c68dd 100644 (file)
@@ -132,6 +132,7 @@ export const translations = {
   Subject: "Asunto",
   "Symmetric random": "Aleatorio simétrico",
   "Terminate game?": "¿Terminar la partida?",
+  "The game should be in another tab": "la partida debería estar en otra pestaña",
   "Three repetitions": "Tres repeticiones",
   Time: "Tiempo",
   "Undetermined result": "Resultado indeterminado",
@@ -186,6 +187,7 @@ export const translations = {
   "Mate any piece (v2)": "Matar cualquier pieza (v2)",
   "Mate the knight": "Matar el caballo",
   "Middle battle": "Batalla media",
+  "Mongolian Horde": "Horda mongol",
   "Move like a knight (v1)": "Moverse como un caballo (v1)",
   "Move like a knight (v2)": "Moverse como un caballo (v2)",
   "Move twice": "Mover dos veces",
@@ -194,6 +196,7 @@ export const translations = {
   "Pawns move diagonally": "Peones se mueven en diagonal",
   "Play at the same time": "Jugar al mismo tiempo",
   "Powerful pieces": "Piezas poderosas",
+  "Push and pull": "Empujar y tirar",
   "Queen disguised as a pawn": "Reina disfrazada de peón",
   "Reuse pieces": "Reutilizar piezas",
   "Reverse captures": "Capturas invertidas",
index 8954f7b..e0da2f3 100644 (file)
@@ -132,6 +132,7 @@ export const translations = {
   Subject: "Sujet",
   "Symmetric random": "Aléatoire symétrique",
   "Terminate game?": "Stopper la partie ?",
+  "The game should be in another tab": "La partie devrait être dans un autre onglet",
   "Three repetitions": "Triple répétition",
   Time: "Temps",
   "Undetermined result": "Résultat indéterminé",
@@ -186,6 +187,7 @@ export const translations = {
   "Mate any piece (v2)": "Matez n'importe quelle pièce (v2)",
   "Mate the knight": "Matez le cavalier",
   "Middle battle": "Bataille du milieu",
+  "Mongolian Horde": "Horde mongole",
   "Move like a knight (v1)": "Bouger comme un cavalier (v1)",
   "Move like a knight (v2)": "Bouger comme un cavalier (v2)",
   "Move twice": "Jouer deux coups",
@@ -194,6 +196,7 @@ export const translations = {
   "Pawns move diagonally": "Les pions vont en diagonale",
   "Play at the same time": "Jouer en même temps",
   "Powerful pieces": "Pièces puissantes",
+  "Push and pull": "Pousser et tirer",
   "Queen disguised as a pawn": "Reine déguisée en pion",
   "Reuse pieces": "Réutiliser les pièces",
   "Reverse captures": "Captures inversées",
diff --git a/client/src/translations/rules/Dynamo/en.pug b/client/src/translations/rules/Dynamo/en.pug
new file mode 100644 (file)
index 0000000..2662cdd
--- /dev/null
@@ -0,0 +1,2 @@
+p.boxed
+  | TODO: not playable yet!
diff --git a/client/src/translations/rules/Dynamo/es.pug b/client/src/translations/rules/Dynamo/es.pug
new file mode 100644 (file)
index 0000000..6fbe375
--- /dev/null
@@ -0,0 +1,2 @@
+p.boxed
+  | TODO: no jugable en este momento!
diff --git a/client/src/translations/rules/Dynamo/fr.pug b/client/src/translations/rules/Dynamo/fr.pug
new file mode 100644 (file)
index 0000000..d16e4b4
--- /dev/null
@@ -0,0 +1,2 @@
+p.boxed
+  | TODO: pas jouable pour le moment !
diff --git a/client/src/translations/rules/Orda/en.pug b/client/src/translations/rules/Orda/en.pug
new file mode 100644 (file)
index 0000000..2ccd509
--- /dev/null
@@ -0,0 +1,263 @@
+p.boxed
+  | The player in second has a different set of pieces,
+  | moving roughly like "augmented knights".
+
+img.img-center(src="/images/variants/Orda/Orda.png")
+
+p
+  | Orda Chess is a chess variant designed in 2020 by Couch Tomato.
+  span.italic
+    | Note: he'd rather remain anonymous :)
+    | Anyway this text and all the images are from him.
+  | The idea of the game was to create a true asymmetric chess with
+  | two different armies. Ralph Betza's
+  a(href="https://www.chessvariants.com/unequal.dir/cwda.html")
+    | Chess with Different Armies
+  | was an inspiration, but the goal was to be a little more streamlined
+  | with the theme here.
+  | In this case, the theme of the new army is knight-based movement,
+  | where most pieces have an element of knight movement.
+  | Given the knight (or horse) theme, this was modeled after the
+  | Mongol army and named the Horde. An "orda" was a military structure
+  | for the people of the Steppes, which also gave rise to the English word
+  | "horde." The original chess army is named the Kingdom for contrast.
+  | The game itself is incredibly balanced by engine evaluation (even more
+  | than standard chess), with a near 50-50 win ratio for
+  | the Kingdom and Horde.
+
+h3 General Rules
+
+ol
+  li.
+    Setup is as above. Despite new pieces, the placement of the Horde pieces
+    mirror their chess counterparts.
+  li The Kingdom always moves first.
+  li The Horde cannot castle.
+  li.
+    As Horde pawns start on the third rank, they do not have the option to
+    move two spaces or be captured by en passant. Kingdom pawns retain the
+    ability to move two spaces initially and to be captured via en passant.
+  li Pawns can only promote to a queen or kheshig.
+  li.
+    An additional method of victory is available: called campmate. Campmate is
+    achieved by moving one's king into the final rank without being check.
+  li Other rules, including stalemate and repetition are as in chess.
+
+h3 Horde Pieces
+
+p.
+  There are four new units unique* to the Horde: 2 Lancers, 2 Horse Archers,
+  2 Kheshigs, and 1 Yurt (* exception being that the Kingdom can still obtain
+  a Kheshig by promotion). The Kheshigs are the strongest piece
+  (knight + king movement) and lead each flank, while the Yurt is a fairly
+  weak piece unlike the Queen. The Horde's king is called the Khan and looks
+  different, but is essentially the same as the Kingdom's King, also using
+  the same abbreviation (K) &mdash; the change is purely aesthetic and
+  thematic.
+
+p.
+  The Horde Lancer and Horse Archer are unique in that they capture
+  differently than movement. Remember that the Horde is horse-based, so the
+  Lancer and Horse Archer both move like knights. They capture like rooks
+  and bishops, respectively. The Kheshig is more traditional in that it
+  captures where it moves; it combines the movements of the knight and king.
+  Similarly, the Yurt also captures the same way it moves; it moves as the
+  silver general in Shogi.
+
+table
+  tr
+    th Horde piece
+    th Kingdom "counterpart"
+    th Movement
+    th Capture
+  tr
+    td Yurt
+    td Queen
+    td "Silver"
+    td "Silver"
+  tr
+    td Horse Archer
+    td Bishop
+    td Knight
+    td Bishop
+  tr
+    td Kheshig
+    td Knight
+    td Knight+King
+    td Knight+King
+  tr
+    td Lancer
+    td Rook
+    td Knight
+    td Rook
+
+p.
+  Details and diagrams of each piece are below. Green dots represent movement,
+  red dots represent capture, and yellow represents both.
+
+h4 Yurt (Y)
+
+img.img-center(src="/images/variants/Orda/Yurt.png")
+
+p.
+  The Yurt moves and captures one space diagonally or one space forward.
+  This is the same as a silver general from Shogi or the bishop/khon
+  from Makruk. There is only one yurt, starting in the queen's spot,
+  but unlike the queen, it is very much a minor piece, the weakest piece
+  in the game aside from a pawn. It should not be underestimated though,
+  because it is one of the few Horde pieces that can move and capture
+  the same way. The other two are the Khan and Kheshig, which are the two
+  most valuable pieces. Therefore the yurt has the unique role of reliably
+  supporting pawns and other pieces without fear of retaliation.
+
+p.
+  A yurt is a mobile home for Mongol and Turkic people in the steppes of
+  Asia. Their limited mobility but importance for supporting the army is
+  reflected in this piece.
+
+h4 Kheshig (H)
+
+img.img-center(src="/images/variants/Orda/Kheshig.png")
+
+p.
+  The Kheshig is a hybrid piece that moves and captures as a knight and
+  king combined. This piece type is also generically called the centaur.
+  The kheshig starts in the knight's spot, but unlike the knight,
+  is the strongest Horde piece. It can be thought of the general that leads
+  its own troop on each flank. It is generally preferred to keep the kheshigs
+  safely behind during early to mid game because of their extreme importance
+  to the Horde in the endgame.
+
+p.
+  The kheshigs were the elite imperial guard for the Mongol royalty.
+  Appropriately, it is incredibly difficult for the Kingdom to checkmate
+  the khan without at least eliminating one of his kheshigs first.
+
+h4 Horse Archer (A)
+
+img.img-center(src="/images/variants/Orda/Archer.png")
+
+p.
+  The Horse Archer, or simply abbreviated Archer, is a unique "pseudohybrid"
+  piece that moves and attacks differently. The archer moves as a knight but
+  captures as a bishop. Because the archer is not colorbound,
+  its value is greater than its bishop counterpart.
+
+p.
+  Horse Archers were one of the two core components of the Mongol cavalry,
+  functioning as the light cavalry. Their speed and prowess as mounted
+  archers made them a unique threat. Their ability to quickly position
+  themselves for a deadly skewer or fork make them a dangerous threat
+  for the Kingdom.
+
+h4 Lancer (L)
+
+img.img-center(src="/images/variants/Orda/Lancer.png")
+
+p.
+  The Lancer is a unique "pseudohybrid" piece that moves and attacks
+  differently. The lancer moves as a knight but captures as a rook.
+  Because the lancer is not as mobile as the rook, it is generally
+  weaker than the rook, and this becomes more pronounced in the endgame,
+  as it cannot move across the board as quickly as a rook can.
+  Its value is still comparable to the horse archer.
+
+p.
+  Lancers were one of the two core components of the Mongol cavalry,
+  functioning as the heavy cavalry. Despite being weaker than the rook,
+  their ability to come into play much earlier in the game is an advantage
+  that the Horde player should utilize.
+
+h4 Piece valuation
+
+p.
+  Accurate piece values are unknown. However, these are the values used by
+  Fairy Stockfish, noting that they are generic values,
+  not necessarily specific to Orda chess.
+
+table
+  tr
+    th Kingdom piece
+    th Value (Early / Late)
+    th Horde piece
+    th Value (Early / Late)
+  tr
+    td Pawn
+    td 120 / 213
+    td Pawn
+    td 120 / 213
+  tr
+    td Queen
+    td 2538 / 2682
+    td Yurt
+    td 630 / 630
+  tr
+    td Bishop
+    td 825 / 915
+    td Horse Archer
+    td 1100 / 1200
+  tr
+    td Knight
+    td 781 / 854
+    td Kheshig
+    td 1600 / 1700
+  tr
+    td Rook
+    td 1276 / 1380
+    td Lancer
+    td 1050 / 1250
+
+p
+  | For those who want a more simplified approach, this table may be
+  | an approximation.
+  span.italic Note: this simplification is used by the weak bot here.
+
+table
+  tr
+    th Kingdom piece
+    th Value
+    th Horde piece
+    th Value
+  tr
+    td Pawn
+    td 1
+    td Pawn
+    td 1
+  tr
+    td Queen
+    td 9
+    td Yurt
+    td 2
+  tr
+    td Bishop
+    td 3
+    td Horse Archer
+    td 4
+  tr
+    td Knight
+    td 3
+    td Kheshig
+    td 7
+  tr
+    td Rook
+    td 5
+    td Lancer
+    td 4
+
+p.
+  As a whole, the Horde army is weaker than the Kingdom in value
+  (based on Stockfish valuation).
+  However, the Horde also starts with pawns in the third rank,
+  which balances the game.
+
+h3 Strategy
+
+p.
+  The game is still young, so strategy is still being developed!
+  Much of the data is currently based on Engine play.
+  The Horde cannot castle. However, a very fundamental component of a
+  majority Horde openings is to move the Khan to f7.
+  Reaching this spot in within the first four moves is ideal
+  &mdash; in fact, Fairy Stockfish opened up with Kf7 in 56% of its games.
+  The rest is variable.
+  For the Kingdom, d4, g3 and b3 are the most common openings in that order.
diff --git a/client/src/translations/rules/Orda/es.pug b/client/src/translations/rules/Orda/es.pug
new file mode 100644 (file)
index 0000000..a6f2d1b
--- /dev/null
@@ -0,0 +1,264 @@
+p.boxed
+  | El segundo jugador tiene un conjunto diferente de piezas,
+  | moviéndose aproximadamente como "caballos aumentados".
+
+img.img-center(src="/images/variantes/Orda/Orda.png")
+
+p
+  | Orda Chess es una variante inventada en 2020 por Couch Tomato
+  span.italic
+     | Nota: él prefiere permanecer en el anonimato :) En cualquier caso,
+    | la versión Inglés de este texto y todas las imágenes son de él.
+  | La idea de este juego era conseguir una pelea asimétrica real con
+  | diferentes ejércitos Las variaciones de Ralph Betza
+  a(href="https://www.chessvariants.com/unequal.dir/cwda.html")
+     | con diferentes ejércitos
+   | fueron una inspiración pero el objetivo era estar en
+  | adecuación con el tema actual. En nuestro caso, el tema de
+  | nuevo ejército es como se mueve el caballo: la mayoría de las piezas
+  | tener un elemento que evoca el movimiento del caballo.
+  | Dado este "tema del caballo", esta variante fue construida
+  | después del ejército mongol y llamó a la Horda. Una "orda" era un
+  | estructura militar para el pueblo de las estepas, y la palabra española
+  | "horda" viene de ahi. El ejército original se llama "el Reino", para el
+  | contraste El juego en sí está increíblemente equilibrado según
+  | evaluación del módulo (en realidad más que para ajedrez estándar),
+  | con una proporción de ganancias cercana a 50-50 para el Reino y la Horda.
+
+h3 Reglas generales
+
+ol
+  li.
+    El diseño de las habitaciones se da arriba. Las piezas de la Horda son
+    partes estándar espejadas, aunque desplazamiento son diferentes
+  li El Reino siempre hace el primer movimiento.
+  li La Horda no puede enroquar.
+  li.
+    Los peones de la Horda que comienzan en la tercera fila, tampoco pueden
+    avanzar dos espacios o ser capturado en passant. Peones del Reino
+    en cuanto a ellos, mantenga estas dos opciones.
+  li Las únicas promociones posibles son en dama o kheshig.
+  li.
+    Es posible una nueva forma de ganar: la "mate de campamento".
+    Esta "mate" obtenido jugando el rey (sin ser en jaque) en la última fila.
+  li Las otras reglas se aplican, como el empate o las tablas por repetición.
+
+h3 Piezas de la Horda
+
+p.
+  Hay cuatro nuevas unidades únicas* en la Horda: 2 Lanceros, 2 Arqueros
+  a caballo, 2 Kheshigs y 1 Yurt (* excepto el kheshig que el
+  Reino puede obtener por promoción). Los kheshigs son los más
+  poderoso (desplazamiento de caballo + rey) y lidera cada flanco, mientras
+  que la yurta es una habitación bastante débil a diferencia de la dama.
+  El Rey de la Horda se llama Khan y tiene una apariencia diferente, pero es
+  muévete y captura como el Rey del Reino; se nota por el mismo
+  abreviatura (K) &mdash; el cambio es puramente estético y temática
+
+p.
+  Los Lanceros y el Arquero a caballo de la Horda son únicos en el sentido
+  de que no capturar mientras se mueven. Recuerda que la Horda es
+  inspirado en una caballería (militar), y por lo tanto los Lanceros y
+  Arqueros en ambos caballos se mueven como jinetes. Capturan como
+  la torre y el alfil, respectivamente. El Kheshig es más tradicional porque
+  captura mientras se mueve; combina los movimientos del rey y el
+  caballo. La yurta también captura a medida que se mueve: como un
+  general de plata en el Shogi.
+
+table
+  tr
+    th Pieza de la Horda
+    th "Contraparte" del Reino
+    th Desplazamiento
+    th Captura
+  tr
+    td Yurta
+    td Dama
+    td "Plata"
+    td "Plata"
+  tr
+    td Arquero
+    td Alfil
+    td Caballo
+    td Alfil
+  tr
+    td Kheshig
+    td Caballo
+    td Caballo+Rey
+    td Caballo+Rey
+  tr
+    td Lancero
+    td Torre
+    td Caballo
+    td Torre
+
+p.
+  Los detalles y diagramas de cada parte se pueden encontrar a continuación.
+  Los puntos verdes representan los movimientos, el rojo las capturas,
+  y los amarillos representan ambos.
+
+h4 Yurta (Y)
+
+img.img-center(src="/images/variantes/Orda/Yurt.png")
+
+p.
+  La yurta se mueve y captura una casilla diagonal o un cuadrado hacia
+  el frente. Esto corresponde a un general de plata en el Shogi o un
+  alfil/khon en Makruk. Solo hay una yurta, comenzando en el sitio de la dama,
+  pero a diferencia de este último corresponde a una pieza (muy) menor:
+  el más débil en el juego después del peón. Dicho esto, no debería
+  para ser subestimado, porque es una de las piezas raras de la Horda que
+  captura a medida que se mueve Los otros dos son el khan y el kheshig: los
+  dos piezas más preciosas. Entonces la yurta tiene el papel único de
+  apoyar peones y otras partes sin temor a la rebelión.
+
+p.
+  Una yurta es un hábitat móvil para las poblaciones de las estepas
+  asiáticos. Su movilidad limitada contrasta con su importancia para
+  apoyar a los militares se refleja en esta pieza.
+
+h4 Kheshig (H)
+
+img.img-center(src="/images/variantes/Orda/Kheshig.png")
+
+p.
+  El kheshig es una pieza híbrida que se mueve y captura como un rey y un
+  caballo combinado. Este tipo de pieza también se llama centauro,
+  genéricamente. El kheshig comienza en la ubicación del jinete, pero a
+  diferencia de esto la última es la pieza más poderosa de la Horda.
+  Puedes imaginar como un general que lideraría sus propias tropas en cada
+  flanco. En general, es preferible mantener a los kheshigs en el refugio
+  detrás de la apertura hasta la mitad del juego, debido a su extrema
+  importancia para la Horda en la final.
+
+p.
+  Los kheshigs eran la guardia imperial de élite en el reino mongol.
+  Entonces es apropiado que sea increíblemente difícil para el Reino
+  matar un khan sin eliminar al menos uno de los kheshigs.
+
+h4 Arquero a caballo (A)
+
+img.img-center(src="/images/variantes/Orda/Archer.png")
+
+p.
+  El arquero (a caballo) es una pieza única "pseudo-híbrida" que se mueve
+  y capturar de manera diferente. El arquero tiene los movimientos del
+  caballo pero captura como alfil. El arquero jugando tanto en casillas
+  negras como en blancas, es más fuerte que el alfil del Reino.
+
+p.
+  Uno de los dos componentes principales de la caballería mongol,
+  que funciona como una caballería ligera. Su velocidad
+  y su habilidad los convirtió en una amenaza única. Su capacidad para
+  posicionarse rápidamente para un hilo o tenedor mortal
+  los convierte en una amenaza peligrosa para el Reino.
+
+h4 Lancero (L)
+
+img.img-center(src="/images/variantes/Orda/Lancer.png")
+
+p.
+  El lancero es una pieza única "pseudo-híbrida" que se mueve y ataca
+  diferente. Se mueve como un caballo pero captura como una torre.
+  El lancero no es tan móvil como la torre, generalmente es más débil
+  que este último, especialmente en la final porque no puede cruzar
+  el tablero muy rápido. Su valor es comparable al del arquero.
+
+p.
+  Los lanceros eran uno de los dos componentes principales de la caballería
+  mongol, que opera como una caballería pesada. Aunque siendo más débil
+  que una torre, tienen la ventaja de poder ingresar al juego más rápido.
+
+h4 Evaluación de las piezas
+
+p.
+  Los valores precisos de las piezas son desconocidos. Sin embargo, aquí
+  están los valores utilizados por Fairy Stockfish. Estos son valores
+  genérico, no necesariamente específico del ajedrez Orda.
+
+table
+  tr
+    th Pieza del Reino
+    th Valor (inicio / fin)
+    th Pieza de la Horda
+    th Valor (inicio / fin)
+  tr
+    td Peón
+    td 120 / 213
+    td Peón
+    td 120 / 213
+  tr
+    td Dama
+    td 2538 / 2682
+    td Yurta
+    td 630 / 630
+  tr
+    td Alfil
+    td 825 / 915
+    td Arquero
+    td 1100 / 1200
+  tr
+    td Caballo
+    td 781 / 854
+    td Kheshig
+    td 1600 / 1700
+  tr
+    td Torre
+    td 1276 / 1380
+    td Lancero
+    td 1050 / 1250
+
+p
+  | Para aquellos que desean un enfoque simplificado, esta tabla puede ser
+  | usado como una aproximación.
+  span.italic Nota: esta simplificación es utilizada por el bot equivocada aquí.
+
+table
+  tr
+    th Pieza del Reino
+    th Valor
+    th Pieza de la Horda
+    th Valor
+  tr
+    td Peón
+    td 1
+    td Peón
+    td 1
+  tr
+    td Dama
+    td 9
+    td Yurta
+    td 2
+  tr
+    td Alfil
+    td 3
+    td Arcquero
+    td 4
+  tr
+    td Caballo
+    td 3
+    td Kheshig
+    td 7
+  tr
+    td Torre
+    td 5
+    td Lancero
+    td 4
+
+p.
+  En general, el ejército de la Horda es más débil que el Reino (en
+  basado solo en la evaluación de las piezas por Stockfish).
+  Sin embargo, la Horda comienza con peones en la tercera fila, que
+  debe equilibrar el juego.
+
+h3 Estrategia
+
+p.
+  La variante aún es joven, por lo que la estrategia aún no se ha escrito.
+  Gran parte de los datos actuales provienen de partes de la computadora.
+  La Horda no puede enrocarse, pero observamos que colocar el khan en f7
+  en los primeros cuatro movimientos asegura igualmente al rey.
+  De hecho, Fairy Stockfish comienza con esta jugada en el 56% de los casos.
+  El resto es variable.
+  En cuanto al Reino, d4, g3 y b3 son las aperturas más frecuentes
+  en ese orden.
diff --git a/client/src/translations/rules/Orda/fr.pug b/client/src/translations/rules/Orda/fr.pug
new file mode 100644 (file)
index 0000000..742bf7a
--- /dev/null
@@ -0,0 +1,266 @@
+p.boxed
+  | Le joueur en second dispose d'un jeu de pièces différent,
+  | se déplaçant en gros comme des "cavaliers augmentés".
+
+img.img-center(src="/images/variants/Orda/Orda.png")
+
+p
+  | Orda Chess est une variante inventée en 2020 par Couch Tomato
+  span.italic
+    | Note : il préfère rester anonyme :) En tout cas la version
+    | anglaise de ce texte et toutes les images sont de lui.
+  | L'idée pour ce jeu était d'obtenir un vrai combat asymétrique avec
+  | des armées différentes. Les variantes de Ralph Betza
+  a(href="https://www.chessvariants.com/unequal.dir/cwda.html")
+    | avec des armées différentes
+  | ont été une source d'inspiration, mais l'objectif était d'être en
+  | adéquation avec le thème présent. Dans notre cas, le thème de la
+  | nouvelle armée est le déplacement de cavalier : la plupart des pièces
+  | ont un élément évoquant le mouvement du cavalier.
+  | Étant donné ce "thème cavalier", cette variante a été construite
+  | d'après l'armée mongole et appelé la Horde. Une "orda" était une
+  | structure militaire pour les gens des steppes, et le mot français "horde"
+  | vient de là. L'armée originelle est appelée "le Royaume", pour le
+  | contraste. Le jeu en lui-même est incroyablement équilibré selon
+  | l'évaluation du module (en fait plus que pour les échecs standards),
+  | avec un ratio de gains proche de 50-50 pour le Royaume et la Horde.
+
+h3 Règles générales
+
+ol
+  li.
+    L'agencement des pièces est donné ci-dessus. Les pièces de la Horde sont
+    affichées en miroir des pièces standards, bien que les déplacements
+    soient différents.
+  li Le Royaume joue toujours le premier coup.
+  li La Horde ne peut pas roquer.
+  li.
+    Les pions de la Horde démarrant sur la troisième rangée, ils ne peuvent ni
+    avancer de deux cases ni être capturés en passant. Les pions du Royaume
+    quant à eux conservent ces deux options.
+  li Les seules promotions possibles sont en dame ou kheshig.
+  li.
+    Une nouvelle façon de gagner est possible : le "mat de camp". Ce "mat"
+    s'obtient en jouant le roi (sans être échec) sur la dernière rangée.
+  li Les autres règles s'appliquent, comme le pat ou la nulle par répétition.
+
+h3 Pièces de la Horde
+
+p.
+  Il y a quatre nouvelles unités uniques* à la Horde : 2 Lanciers, 2 Archers
+  à cheval, 2 Kheshigs et 1 Yourte (* à l'exception du kheshig que le
+  Royaume peut obtenir par promotion). Les kheshigs sont la pièce la plus
+  puissante (déplacement de cavalier + roi) et mènent chaque flanc, tandis
+  que la yourte est une pièce plutôt faible contrairement à la dame.
+  Le roi de la Horde est appelée Khan et a une allure différente, mais se
+  déplace et capture comme le roi du Royaume ; il est noté par la même
+  abbréviation (K) &mdash; le changement est purement esthétique et
+  thématique.
+
+p.
+  Le Lancier et l'Archer à cheval de la Horde sont uniques en le sens qu'ils
+  ne capturent pas comme ils se déplacent. Rappelez-vous que la Horde est
+  inspirée d'une cavalerie (militaire), et donc les Lanciers et Archers à
+  cheval se déplacent tous deux comme des cavaliers. Ils capturent comme
+  la tour et le fou, respectivement. Le Kheshig est plus traditionnel car il
+  capture comme il se déplace ; il combine les mouvements du roi et du
+  cavalier. La yourte capture également comme elle se déplace : comme un
+  général d'argent au Shogi.
+
+table
+  tr
+    th Pièce de la Horde
+    th "Contrepartie" du Royaume
+    th Déplacement
+    th Capture
+  tr
+    td Yourte
+    td Dame
+    td "Silver"
+    td "Silver"
+  tr
+    td Archer
+    td Fou
+    td Cavalier
+    td Fou
+  tr
+    td Kheshig
+    td Cavalier
+    td Cavalier+Roi
+    td Cavalier+Roi
+  tr
+    td Lancier
+    td Tour
+    td Cavalier
+    td Tour
+
+p.
+  Les détails et diagrammes de chaque pièce se trouvent ci-dessous.
+  Les points verts représentent les déplacements, les rouges les captures,
+  et les jaunes représentent les deux.
+
+h4 Yourte (Y)
+
+img.img-center(src="/images/variants/Orda/Yurt.png")
+
+p.
+  La yourte se déplace et capture d'une case en diagonale ou une case vers
+  l'avant. Cela correspond à un général d'argent au Shogi ou à un fou/khon
+  au Makruk. Il n'y a qu'une yourte, démarrant à l'emplacement de la dame,
+  mais contrairement à cette dernière elle correspond à une pièce (très)
+  mineure : la plus faible du jeu après le pion. Ceci dit, elle ne doit pas
+  être sous-estimée, car c'est une des rares pièces de la Horde qui capture
+  comme elle se déplace. Les deux autres sont le khan et le kheshig : les
+  deux pièces les plus précieuses. Ainsi la yourte a le rôle unique de
+  soutenir les pions et les autres pièces sans crainte de rebellion.
+
+p.
+  Une yourte est un habitat mobile pour les populations des steppes
+  asiatiques. Leur mobilité limitée contrastant avec leur importance pour
+  soutenir l'armée se reflète dans cette pièce.
+
+h4 Kheshig (H)
+
+img.img-center(src="/images/variants/Orda/Kheshig.png")
+
+p.
+  Le kheshig est une pièce hybride qui bouge et capture comme roi et cavalier
+  combinés. Ce type de pièce est aussi appelée centaure, de façon générique.
+  Le kheshig démarre à l'emplacmeent du cavalier, mais contrairement à ce
+  dernier c'est la pièce la plus puissante de la Horde. On peut l'imaginer
+  comme un général qui mènerait ses propres troupes sur chaque flanc.
+  On préfère généralement garder les kheshigs à l'abri en retrait pendant
+  l'ouverture jusqu'au milieu de jeu, à cause de leur extrême importance
+  pour la Horde en finale.
+
+p.
+  Les kheshigs étaient la garde impérial d'élite dans le royaume mongol.
+  Il est donc approprié qu'il soit incroyablement difficile pour le Royaume
+  de mater un khan sans éliminer au moins un des kheshigs.
+
+h4 Archer à cheval (A)
+
+img.img-center(src="/images/variants/Orda/Archer.png")
+
+p.
+  L'archer (à cheval) est une pièce unique "pseudo-hybride" qui se déplace
+  et capture différemment. L'archer dispose des mouvements du cavalier mais
+  capture comme un fou. L'archer évoluant à la fois sur cases noires et
+  blanches, il est plus fort que le fou du Royaume.
+
+p.
+  Les archers à cheval étaient l'une des deux composantes principales de la
+  cavalerie mongole, fonctionnant comme une cavalerie légère. Leur vitesse
+  et leur habileté faisaient d'eux une menace unique. Leur capacité à
+  se positionner rapidement pour une enfilade mortelle ou une fourchette
+  fait d'eux une dangeureuse menace pour le Royaume.
+
+h4 Lancier (L)
+
+img.img-center(src="/images/variants/Orda/Lancer.png")
+
+p.
+  Le lancier est une pièce unique "pseudo-hybride" qui se déplace et attaque
+  différemment. Il bouge comme un cavalier mais capture comme une tour.
+  Le lancier n'étant pas aussi mobile que la tour, il est généralement plus
+  faible que cette dernière, surtout en finale car il ne peut pas traverser
+  l'échiquier très vite. Sa valeur est comparable à celle de l'archer.
+
+p.
+  Les lanciers étaient l'une des deux composantes principales de la cavalerie
+  mongole, fonctionnant comme une cavalerie lourde. Bien qu'étant plus faibles
+  qu'une tour, ils ont l'avantage de pouvoir entrer dans le jeu plus vite.
+
+h4 Évaluation des pièces
+
+p.
+  Les valeurs précises des pièces sont inconnues. Cependant, voici les
+  valeurs utilisées par Fairy Stockfish. Celles-ci sont des valeurs
+  génériques, pas nécessairement spécifiques aux échecs Orda.
+
+table
+  tr
+    th Pièce du royaume
+    th Valeur (Début / Fin)
+    th Pièce de la Horde
+    th Value (Début / Fin)
+  tr
+    td Pion
+    td 120 / 213
+    td Pion
+    td 120 / 213
+  tr
+    td Dame
+    td 2538 / 2682
+    td Yourte
+    td 630 / 630
+  tr
+    td Fou
+    td 825 / 915
+    td Archer
+    td 1100 / 1200
+  tr
+    td Cavalier
+    td 781 / 854
+    td Kheshig
+    td 1600 / 1700
+  tr
+    td Tour
+    td 1276 / 1380
+    td Lancier
+    td 1050 / 1250
+
+p
+  | Pour ceux souhaitant une approche simplifiée, cette table peut être
+  | utilisée comme approximation.
+  span.note Note : cette simplification est utilisée par le mauvais bot ici.
+
+table
+  tr
+    th Pièce du Royaume
+    th Valeur
+    th Pièce de la Horde
+    th Valeur
+  tr
+    td Pion
+    td 1
+    td Pion
+    td 1
+  tr
+    td Dame
+    td 9
+    td Yourte
+    td 2
+  tr
+    td Fou
+    td 3
+    td Archer
+    td 4
+  tr
+    td Cavalier
+    td 3
+    td Kheshig
+    td 7
+  tr
+    td Tour
+    td 5
+    td Lancier
+    td 4
+
+p.
+  Globalement, l'armée de la Horde est plus faible que le Royaume (en se
+  basant sur la seule évaluation des pièces par Stockfish).
+  La Horde démarre cependant avec des pions sur la troisème rangée, ce qui
+  devrait équilibrer le jeu.
+
+h3 Stratégie
+
+p.
+  La variante est encore jeune, donc la stratégie reste à écrire !
+  Beaucoup des données actuelles proviennent de parties de l'ordinateur.
+  La Horde ne peut pas roquer, mais on observe que placer le khan en f7
+  dans les quatre premiers coups met le roi en sécurité de manière similaire.
+  En fait, Fairy Stockfish commence par ce coup dans 56% des cas.
+  Le reste est variable.
+  Concernant le Royaume, d4, g3 et b3 sont les ouvertures les plus fréquentes
+  dans cet ordre.
index c76c040..4ec1927 100644 (file)
@@ -1,5 +1,97 @@
 import { ChessRules } from "@/base_rules";
 
 export class DynamoRules extends ChessRules {
-  // TODO
+  canIplay(side, [x, y]) {
+    // Sometimes opponent's pieces can be moved directly
+    return true;
+  }
+
+  // NOTE: to push a piece out of the board, make it slide until our piece
+  // (doing the action, moving or not)
+  getPotentialMovesFrom([x, y]) {
+    const color = this.turn;
+    let moves = [];
+    if (this.getColor(x, y) != color) {
+      // Push or pull something: freely only if subTurn == 1
+      if (this.subTurn == 2) {
+        // I know that someone is pushing/pulling: find out who,
+        // and deduce my possible squares (or exit).
+        // TODO
+      } else {
+        // Look in every direction for a friendly pusher/puller.
+        // This means that the action is done without moving.
+        // TODO
+      }
+    } else {
+      // My piece: fill first with normal moves (if any),
+      // and add pushes/pulls (if any).
+      // TODO
+    }
+  }
+
+  getPPpath(m) {
+    let imgName = "";
+    if (m.vanish.length == 1) imgName = "empty";
+    else {
+      // Something is pushed or pull: count by how many squares
+      if (m.appear.length == 1)
+        // It just exit the board
+        imgName = "raus";
+      else {
+        const deltaX = Math.abs(m.appear[1].x - m.vanish[1].x);
+        const deltaY = Math.abs(m.appear[1].y - m.vanish[1].y);
+        if (deltaX == 0) imgName = "shift" + deltaY;
+        else if (deltaY == 0) imgName = "shift" + deltaX;
+        else
+          // Special knight push/pull: just print "P"
+          imgName = "pstep";
+      }
+    }
+    return "Dynamo/" + imgName;
+  }
+
+  isAttackedBySlideNJump([x, y], color, piece, steps, oneStep) {
+    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) {
+        rx += step[0];
+        ry += step[1];
+      }
+      if (
+        V.OnBoard(rx, ry) &&
+        this.getPiece(rx, ry) == piece &&
+        this.getColor(rx, ry) == color
+      ) {
+        // Now step in the other direction: if end of the world, then attacked
+        rx = x - step[0];
+        ry = y - step[1];
+        while (V.OnBoard(rx, ry) && this.board[rx][ry] == V.EMPTY && !oneStep) {
+          rx -= step[0];
+          ry -= step[1];
+        }
+        if (!V.OnBoard(rx, ry)) return true;
+      }
+    }
+    return false;
+  }
+
+  isAttackedByPawn([x, y], color) {
+    const lastRank = (color == 'w' ? 0 : 7);
+    if (y != lastRank)
+      // The king can be pushed out by a pawn only on last rank
+      return false;
+    const pawnShift = (color == "w" ? 1 : -1);
+    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;
+  }
 };
index fa80824..0f33518 100644 (file)
@@ -83,8 +83,15 @@ export class EightpiecesRules extends ChessRules {
     return "Eightpieces/tmp_png/" + b;
   }
 
-  getPPpath(b, orientation) {
-    return this.getPpath(b, null, null, orientation);
+  getPPpath(m, orientation) {
+    return (
+      this.getPpath(
+        m.appear[0].c + m.appear[0].p,
+        null,
+        null,
+        orientation
+      )
+    );
   }
 
   static ParseFen(fen) {
diff --git a/client/src/variants/Orda.js b/client/src/variants/Orda.js
new file mode 100644 (file)
index 0000000..4d911f4
--- /dev/null
@@ -0,0 +1,323 @@
+import { ChessRules } from "@/base_rules";
+import { ArrayFun } from "@/utils/array";
+import { randInt } from "@/utils/alea";
+
+export class OrdaRules extends ChessRules {
+  static get PawnSpecs() {
+    return Object.assign(
+      {},
+      ChessRules.PawnSpecs,
+      { promotions: [V.QUEEN, V.KHESHIG] }
+    );
+  }
+
+  static IsGoodFlags(flags) {
+    // Only white can castle
+    return !!flags.match(/^[a-z]{2,2}$/);
+  }
+
+  getPpath(b) {
+    if (b[0] == 'b' || b[1] == 'h')
+      // Horde piece or white promoted pawn in kheshig
+      return "Orda/" + b;
+    return b;
+  }
+
+  static GenRandInitFen(randomness) {
+    if (randomness == 0)
+      return "lhaykahl/8/pppppppp/8/8/8/PPPPPPPP/RNBQKBNR w 0 ah -";
+
+    // Mapping kingdom --> horde:
+    const piecesMap = {
+      'r': 'l',
+      'n': 'h',
+      'b': 'a',
+      'q': 'y',
+      'k': 'k'
+    };
+
+    let pieces = { w: new Array(8), b: new Array(8) };
+    let flags = "";
+    // Shuffle pieces on first (and last rank if randomness == 2)
+    for (let c of ["w", "b"]) {
+      if (c == 'b' && randomness == 1) {
+        pieces['b'] = pieces['w'].map(p => piecesMap[p]);
+        break;
+      }
+
+      // TODO: same code as in base_rules. Should extract and factorize?
+
+      let positions = ArrayFun.range(8);
+
+      let randIndex = 2 * randInt(4);
+      const bishop1Pos = positions[randIndex];
+      let randIndex_tmp = 2 * randInt(4) + 1;
+      const bishop2Pos = positions[randIndex_tmp];
+      positions.splice(Math.max(randIndex, randIndex_tmp), 1);
+      positions.splice(Math.min(randIndex, randIndex_tmp), 1);
+
+      randIndex = randInt(6);
+      const knight1Pos = positions[randIndex];
+      positions.splice(randIndex, 1);
+      randIndex = randInt(5);
+      const knight2Pos = positions[randIndex];
+      positions.splice(randIndex, 1);
+
+      randIndex = randInt(4);
+      const queenPos = positions[randIndex];
+      positions.splice(randIndex, 1);
+
+      const rook1Pos = positions[0];
+      const kingPos = positions[1];
+      const rook2Pos = positions[2];
+
+      pieces[c][rook1Pos] = "r";
+      pieces[c][knight1Pos] = "n";
+      pieces[c][bishop1Pos] = "b";
+      pieces[c][queenPos] = "q";
+      pieces[c][kingPos] = "k";
+      pieces[c][bishop2Pos] = "b";
+      pieces[c][knight2Pos] = "n";
+      pieces[c][rook2Pos] = "r";
+      if (c == 'b') pieces[c] = pieces[c].map(p => piecesMap[p]);
+      else flags = V.CoordToColumn(rook1Pos) + V.CoordToColumn(rook2Pos);
+    }
+    // Add turn + flags + enpassant
+    return (
+      pieces["b"].join("") +
+      "/8/pppppppp/8/8/8/PPPPPPPP/" +
+      pieces["w"].join("").toUpperCase() +
+      " w 0 " + flags + " -"
+    );
+  }
+
+  getFlagsFen() {
+    return this.castleFlags['w'].map(V.CoordToColumn).join("");
+  }
+
+  setFlags(fenflags) {
+    this.castleFlags = { 'w': [-1, -1] };
+    for (let i = 0; i < 2; i++)
+      this.castleFlags['w'][i] = V.ColumnToCoord(fenflags.charAt(i));
+  }
+
+  static get LANCER() {
+    return 'l';
+  }
+  static get ARCHER() {
+    return 'a';
+  }
+  static get KHESHIG() {
+    return 'h';
+  }
+  static get YURT() {
+    return 'y';
+  }
+  // Khan is technically a King, so let's keep things simple.
+
+  static get PIECES() {
+    return ChessRules.PIECES.concat([V.LANCER, V.ARCHER, V.KHESHIG, V.YURT]);
+  }
+
+  getPotentialMovesFrom([x, y]) {
+    switch (this.getPiece(x, y)) {
+      case V.LANCER:
+        return this.getPotentialLancerMoves([x, y]);
+      case V.ARCHER:
+        return this.getPotentialArcherMoves([x, y]);
+      case V.KHESHIG:
+        return this.getPotentialKheshigMoves([x, y]);
+      case V.YURT:
+        return this.getPotentialYurtMoves([x, y]);
+      default:
+        return super.getPotentialMovesFrom([x, y]);
+    }
+    return [];
+  }
+
+  getSlideNJumpMoves([x, y], steps, oneStep, options) {
+    options = options || {};
+    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) {
+        if (!options.onlyTake) moves.push(this.getBasicMove([x, y], [i, j]));
+        if (oneStep) continue outerLoop;
+        i += step[0];
+        j += step[1];
+      }
+      if (V.OnBoard(i, j) && this.canTake([x, y], [i, j]) && !options.onlyMove)
+        moves.push(this.getBasicMove([x, y], [i, j]));
+    }
+    return moves;
+  }
+
+  getPotentialLancerMoves(sq) {
+    const onlyMoves = this.getSlideNJumpMoves(
+      sq,
+      V.steps[V.KNIGHT],
+      "oneStep",
+      { onlyMove: true }
+    );
+    const onlyTakes = this.getSlideNJumpMoves(
+      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 }
+    );
+    const onlyTakes = this.getSlideNJumpMoves(
+      sq,
+      V.steps[V.BISHOP],
+      null,
+      { onlyTake: true }
+    );
+    return onlyMoves.concat(onlyTakes);
+  }
+
+  getPotentialLancerMoves(sq) {
+    const onlyMoves = this.getSlideNJumpMoves(
+      sq,
+      V.steps[V.KNIGHT],
+      "oneStep",
+      { onlyMove: true }
+    );
+    const onlyTakes = this.getSlideNJumpMoves(
+      sq,
+      V.steps[V.ROOK],
+      null,
+      { onlyTake: true }
+    );
+    return onlyMoves.concat(onlyTakes);
+  }
+
+  getPotentialKheshigMoves(sq) {
+    return this.getSlideNJumpMoves(
+      sq,
+      V.steps[V.KNIGHT].concat(V.steps[V.ROOK]).concat(V.steps[V.BISHOP]),
+      "oneStep"
+    );
+  }
+
+  getPotentialYurtMoves(sq) {
+    return this.getSlideNJumpMoves(
+      sq,
+      V.steps[V.BISHOP].concat([1, 0]),
+      "oneSTep"
+    );
+  }
+
+  getPotentialKingMoves([x, y]) {
+    if (this.getColor(x, y) == 'w') return super.getPotentialKingMoves([x, y]);
+    // Horde doesn't castle:
+    return this.getSlideNJumpMoves(
+      [x, y],
+      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
+      "oneStep"
+    );
+  }
+
+  isAttacked(sq, color) {
+    if (color == 'w') {
+      return (
+        super.isAttacked(sq, color) ||
+        this.isAttackedByKheshig(sq, color)
+      );
+    }
+    // Horde: only pawn and queen (if promotions) in common:
+    return (
+      super.isAttackedByPawn(sq, color) ||
+      this.isAttackedByLancer(sq, color) ||
+      this.isAttackedByKheshig(sq, color) ||
+      this.isAttackedByArcher(sq, color) ||
+      this.isAttackedByYurt(sq, color) ||
+      super.isAttackedByQueen(sq, color)
+    );
+  }
+
+  isAttackedByLancer(sq, color) {
+    return this.isAttackedBySlideNJump(sq, color, V.LANCER, V.steps[V.ROOK]);
+  }
+
+  isAttackedByArcher(sq, color) {
+    return this.isAttackedBySlideNJump(sq, color, V.ARCHER, V.steps[V.BISHOP]);
+  }
+
+  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"
+    );
+  }
+
+  isAttackedByYurt(sq, color) {
+    return super.isAttackedBySlideNJump(
+      sq,
+      color,
+      V.YURT,
+      V.steps[V.BISHOP].concat([1, 0]),
+      "oneStep"
+    );
+  }
+
+  updateCastleFlags(move, piece) {
+    // Only white can castle:
+    const firstRank = 7;
+    if (piece == V.KING && move.appear[0].c == 'w')
+      this.castleFlags['w'] = [8, 8];
+    else if (
+      move.start.x == firstRank &&
+      this.castleFlags['w'].includes(move.start.y)
+    ) {
+      const flagIdx = (move.start.y == this.castleFlags['w'][0] ? 0 : 1);
+      this.castleFlags['w'][flagIdx] = 8;
+    }
+    else if (
+      move.end.x == firstRank &&
+      this.castleFlags['w'].includes(move.end.y)
+    ) {
+      const flagIdx = (move.end.y == this.castleFlags['w'][0] ? 0 : 1);
+      this.castleFlags['w'][flagIdx] = 8;
+    }
+  }
+
+  getCurrentScore() {
+    // Turn has changed:
+    const color = V.GetOppCol(this.turn);
+    const lastRank = (color == 'w' ? 0 : 7);
+    if (this.kingPos[color][0] == lastRank)
+      // The opposing edge is reached!
+      return color == "w" ? "1-0" : "0-1";
+    if (this.atLeastOneMove()) return "*";
+    // Game over
+    const oppCol = this.turn;
+    if (!this.underCheck(oppCol)) return "1/2";
+    return (oppCol == "w" ? "0-1" : "1-0");
+  }
+
+  static get VALUES() {
+    return Object.assign(
+      {},
+      ChessRules.VALUES,
+      {
+        y: 2,
+        a: 4,
+        h: 7,
+        l: 4
+      }
+    );
+  }
+};
index e5b45ec..f9bc843 100644 (file)
@@ -629,8 +629,13 @@ export default {
           this.send("fullgame", { data: gameToSend, target: data.from });
           break;
         case "fullgame":
-          // Callback "roomInit" to poll clients only after game is loaded
-          this.loadVariantThenGame(data.data, this.roomInit);
+          if (!!data.data.empty) {
+            alert(this.st.tr["The game should be in another tab"]);
+            this.$router.go(-1);
+          }
+          else
+            // Callback "roomInit" to poll clients only after game is loaded
+            this.loadVariantThenGame(data.data, this.roomInit);
           break;
         case "asklastate":
           // Sending informative last state if I played a move or score != "*"
index 48a9e93..127d1db 100644 (file)
@@ -26,6 +26,7 @@ main
           | {{ st.tr["Analysis mode"] }}
   .row
     .col-sm-12.col-md-8.col-md-offset-2.col-lg-6.col-lg-offset-3
+      h4#variantName {{ gameInfo.vname }}
       div(
         v-show="display=='rules'"
         v-html="content"
@@ -169,6 +170,10 @@ export default {
   background-color: lightgrey
   font-weight: bold
 
+h4#variantName
+  text-align: center
+  font-weight: bold
+
 figure.diagram-container
   margin: 15px 0 15px 0
   text-align: center
@@ -235,4 +240,14 @@ ul:not(.browser-default)
 
 ul:not(.browser-default) > li
   list-style-type: disc
+
+table
+  margin: 15px auto
+
+.italic
+  font-style: italic
+
+img.img-center
+  display: block
+  margin: 0 auto 15px auto
 </style>
index 1895777..52c043c 100644 (file)
@@ -24,6 +24,7 @@ insert or ignore into Variants (name,description) values
   ('Cylinder', 'Neverending rows'),
   ('Dark', 'In the shadow'),
   ('Doublearmy', '64 pieces on the board'),
+  ('Dynamo', 'Push and pull'),
   ('Eightpieces', 'Each piece is unique'),
   ('Enpassant', 'Capture en passant'),
   ('Extinction', 'Capture all of a kind'),
@@ -37,6 +38,7 @@ insert or ignore into Variants (name,description) values
   ('Losers', 'Get strong at self-mate'),
   ('Magnetic', 'Laws of attraction'),
   ('Marseille', 'Move twice'),
+  ('Orda', 'Mongolian Horde'),
   ('Parachute', 'Landing on the board'),
   ('Perfect', 'Powerful pieces'),
   ('Racingkings', 'Kings cross the 8x8 board'),
index 25abadb..d00b3c8 100644 (file)
@@ -209,6 +209,9 @@ module.exports = function(wss) {
                 clients[page][rid][rtmpId].socket,
                 { code: "askfullgame", from: [sid,tmpId] }
               );
+            } else {
+              // I'm the only person who have the game for the moment:
+              send(socket, { code: "fullgame", data: { empty: true } });
             }
           }
           break;