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
 # 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
 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.
 
 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
 # 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
     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
 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
 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)
   }
 
   // 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
   }
 
   // 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 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];
     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/" +
                   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 },
                       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?",
   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",
   "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",
   "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",
   "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",
   "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",
   "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?",
   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",
   "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",
   "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",
   "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",
   "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",
   "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 ?",
   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Ă©",
   "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",
   "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",
   "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",
   "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",
   "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 {
 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;
   }
 
     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) {
   }
 
   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":
           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 != "*"
           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
           | {{ 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"
       div(
         v-show="display=='rules'"
         v-html="content"
@@ -169,6 +170,10 @@ export default {
   background-color: lightgrey
   font-weight: bold
 
   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
 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
 
 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>
 </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'),
   ('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'),
   ('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'),
   ('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'),
   ('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] }
               );
                 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;
             }
           }
           break;