From c7550017d88ff6eb32e2c76a271a7f9edc4a3bf6 Mon Sep 17 00:00:00 2001 From: Benjamin Auder <benjamin.auder@somewhere> Date: Thu, 26 Mar 2020 12:23:40 +0100 Subject: [PATCH] Add Orda variant. Some advances in Dynamo draft. Display error message when loading an observed game from another tab --- TODO | 23 +- client/download_objects.sh | 10 +- client/public/images/pieces/Dynamo/empty.svg | 1 + client/public/images/pieces/Orda/ba.svg | 137 ++++++++ client/public/images/pieces/Orda/bh.svg | 197 +++++++++++ client/public/images/pieces/Orda/bk.svg | 215 ++++++++++++ client/public/images/pieces/Orda/bl.svg | 124 +++++++ client/public/images/pieces/Orda/bp.svg | 116 +++++++ client/public/images/pieces/Orda/bq.svg | 101 ++++++ client/public/images/pieces/Orda/by.svg | 241 +++++++++++++ client/public/images/pieces/Orda/wh.svg | 202 +++++++++++ client/public/images/variants/Orda/Archer.png | 1 + .../public/images/variants/Orda/Kheshig.png | 1 + client/public/images/variants/Orda/Lancer.png | 1 + client/public/images/variants/Orda/Orda.png | 1 + client/public/images/variants/Orda/Yurt.png | 1 + client/public/images/variants/README | 2 + client/src/base_rules.js | 6 +- client/src/components/Board.vue | 6 +- client/src/translations/en.js | 3 + client/src/translations/es.js | 3 + client/src/translations/fr.js | 3 + client/src/translations/rules/Dynamo/en.pug | 2 + client/src/translations/rules/Dynamo/es.pug | 2 + client/src/translations/rules/Dynamo/fr.pug | 2 + client/src/translations/rules/Orda/en.pug | 263 ++++++++++++++ client/src/translations/rules/Orda/es.pug | 264 ++++++++++++++ client/src/translations/rules/Orda/fr.pug | 266 +++++++++++++++ client/src/variants/Dynamo.js | 94 ++++- client/src/variants/Eightpieces.js | 11 +- client/src/variants/Orda.js | 323 ++++++++++++++++++ client/src/views/Game.vue | 9 +- client/src/views/Rules.vue | 15 + server/db/populate.sql | 2 + server/sockets.js | 3 + 35 files changed, 2635 insertions(+), 16 deletions(-) create mode 100644 client/public/images/pieces/Dynamo/empty.svg create mode 100644 client/public/images/pieces/Orda/ba.svg create mode 100644 client/public/images/pieces/Orda/bh.svg create mode 100644 client/public/images/pieces/Orda/bk.svg create mode 100644 client/public/images/pieces/Orda/bl.svg create mode 100644 client/public/images/pieces/Orda/bp.svg create mode 100644 client/public/images/pieces/Orda/bq.svg create mode 100644 client/public/images/pieces/Orda/by.svg create mode 100644 client/public/images/pieces/Orda/wh.svg create mode 100644 client/public/images/variants/Orda/Archer.png create mode 100644 client/public/images/variants/Orda/Kheshig.png create mode 100644 client/public/images/variants/Orda/Lancer.png create mode 100644 client/public/images/variants/Orda/Orda.png create mode 100644 client/public/images/variants/Orda/Yurt.png create mode 100644 client/public/images/variants/README create mode 100644 client/src/translations/rules/Dynamo/en.pug create mode 100644 client/src/translations/rules/Dynamo/es.pug create mode 100644 client/src/translations/rules/Dynamo/fr.pug create mode 100644 client/src/translations/rules/Orda/en.pug create mode 100644 client/src/translations/rules/Orda/es.pug create mode 100644 client/src/translations/rules/Orda/fr.pug create mode 100644 client/src/variants/Orda.js diff --git a/TODO b/TODO index 8e81cc7a..df4231ac 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,28 @@ +# Enhancements: +Desktop notifications +Do not remove other challenges when one is accepted? + # New variants +Finish first https://www.chessvariants.com/mvopponent.dir/dynamo.html +https://echekk.fr/spip.php?page=article&id_article=599 + +Monster, Horde, Colorbound +https://www.chessvariants.com/d.betza/chessvar/dan/colclob.html +https://lichess.org/analysis/horde#0 +https://greenchess.net/rules.php?v=monster +https://en.wikipedia.org/wiki/Monster_chess +https://en.wikipedia.org/wiki/Grotesque_(chess) (fun) + Maxima, Interweave, Roccoco +https://www.chessvariants.com/other.dir/rococo.html +https://www.chessvariants.com/dpieces.dir/maxima/maxima.html +https://www.chessvariants.com/other.dir/interweave.html Take(a)n(d)make : if capture a piece, take its power for the last of the turn and make a move like it. If a pawn taken: direction of the capturer, can capture enemy. +http://www.strategems.net/sections/fairy_defs.html +Having captured, a unit must immediately, as part of its move, play a non-capturing move, using ONLY the powers of movement of the captured unit from the capture-square. If no such move is available, the capture is illegal. Promotion by capture occurs only when a pawn arrives on the promotion rank as the result of a Take & Make move. Checks are as in normal chess: after the notional capture of the checked King, the checking unit does not move away from the Kingâs square. + +Chakart :) -Dynamo chess --> dur... +https://en.wikipedia.org/wiki/Fairy_chess_piece diff --git a/client/download_objects.sh b/client/download_objects.sh index a59fe324..3cb25775 100755 --- a/client/download_objects.sh +++ b/client/download_objects.sh @@ -3,11 +3,15 @@ # Restore binary files (temporary fix - should use git-fat instead) for color in "w" "b"; do for piece in "b" "c" "d" "e" "f" "g" "h" "j" "k" "m" "n" "o" "p" "q" "r" "s"; do - rm public/images/pieces/Eightpieces/tmp_png/"$color$piece".png + rm -f public/images/pieces/Eightpieces/tmp_png/"$color$piece".png wget -q -O public/images/pieces/Eightpieces/tmp_png/"$color$piece".png https://vchess.club/images/pieces/Eightpieces/tmp_png/"$color$piece".png done done -rm public/sounds/newgame.flac +for image in "Orda" "Archer" "Lancer" "Kheshig" "Yurt"; do + rm -f /public/images/variants/Orda/"$image".png + wget -q -O public/images/variants/Orda/"$image".png https://vchess.club/images/variants/Orda/"$image".png +done +rm -f public/sounds/newgame.flac wget -q -O public/sounds/newgame.flac https://vchess.club/sounds/newgame.flac -rm public/favicon.ico +rm -f public/favicon.ico wget -q -O public/favicon.ico https://vchess.club/favicon.ico diff --git a/client/public/images/pieces/Dynamo/empty.svg b/client/public/images/pieces/Dynamo/empty.svg new file mode 100644 index 00000000..08ec9068 --- /dev/null +++ b/client/public/images/pieces/Dynamo/empty.svg @@ -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 index 00000000..87fa4d42 --- /dev/null +++ b/client/public/images/pieces/Orda/ba.svg @@ -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 index 00000000..ecf598cb --- /dev/null +++ b/client/public/images/pieces/Orda/bh.svg @@ -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 index 00000000..7ce96e4a --- /dev/null +++ b/client/public/images/pieces/Orda/bk.svg @@ -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 index 00000000..c7622c3a --- /dev/null +++ b/client/public/images/pieces/Orda/bl.svg @@ -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 index 00000000..4041c5a1 --- /dev/null +++ b/client/public/images/pieces/Orda/bp.svg @@ -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 index 00000000..a37c1f0c --- /dev/null +++ b/client/public/images/pieces/Orda/bq.svg @@ -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 index 00000000..92c27605 --- /dev/null +++ b/client/public/images/pieces/Orda/by.svg @@ -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 index 00000000..22a0409d --- /dev/null +++ b/client/public/images/pieces/Orda/wh.svg @@ -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 index 00000000..f2d63e92 --- /dev/null +++ b/client/public/images/variants/Orda/Archer.png @@ -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 index 00000000..1f005fa2 --- /dev/null +++ b/client/public/images/variants/Orda/Kheshig.png @@ -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 index 00000000..f0ae73ef --- /dev/null +++ b/client/public/images/variants/Orda/Lancer.png @@ -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 index 00000000..69a74fc4 --- /dev/null +++ b/client/public/images/variants/Orda/Orda.png @@ -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 index 00000000..82b130bc --- /dev/null +++ b/client/public/images/variants/Orda/Yurt.png @@ -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 index 00000000..c6a3a75f --- /dev/null +++ b/client/public/images/variants/README @@ -0,0 +1,2 @@ +Here are some binary images used for some variants. +Currently only Orda. diff --git a/client/src/base_rules.js b/client/src/base_rules.js index 37e756e9..177fc9b6 100644 --- a/client/src/base_rules.js +++ b/client/src/base_rules.js @@ -197,8 +197,8 @@ export const ChessRules = class ChessRules { } // Path to promotion pieces (usually the same) - getPPpath(b) { - return this.getPpath(b); + getPPpath(m) { + return this.getPpath(m.appear[0].c + m.appear[0].p); } // Aggregates flags into one object @@ -1094,7 +1094,7 @@ export const ChessRules = class ChessRules { const c = V.GetOppCol(this.turn); const firstRank = (c == "w" ? V.size.x - 1 : 0); // Update castling flags if rooks are moved - const oppCol = V.GetOppCol(c); + const oppCol = this.turn; const oppFirstRank = V.size.x - 1 - firstRank; if (piece == V.KING && move.appear.length > 0) this.castleFlags[c] = [V.size.y, V.size.y]; diff --git a/client/src/components/Board.vue b/client/src/components/Board.vue index d89ee404..0856096a 100644 --- a/client/src/components/Board.vue +++ b/client/src/components/Board.vue @@ -345,10 +345,8 @@ export default { attrs: { src: "/images/pieces/" + - this.vr.getPPpath( - m.appear[0].c + m.appear[0].p, - // Extra arg useful for some variants: - this.orientation) + + // orientation: extra arg useful for some variants: + this.vr.getPPpath(m, this.orientation) + V.IMAGE_EXTENSION }, class: { "choice-piece": true }, diff --git a/client/src/translations/en.js b/client/src/translations/en.js index 7ce045ff..13798874 100644 --- a/client/src/translations/en.js +++ b/client/src/translations/en.js @@ -132,6 +132,7 @@ export const translations = { Subject: "Subject", "Symmetric random": "Symmetric random", "Terminate game?": "Terminate game?", + "The game should be in another tab": "The game should be in another tab", "Three repetitions": "Three repetitions", Time: "Time", "Undetermined result": "Undetermined result", @@ -186,6 +187,7 @@ export const translations = { "Mate any piece (v2)": "Mate any piece (v2)", "Mate the knight": "Mate the knight", "Middle battle": "Middle battle", + "Mongolian Horde": "Mongolian Horde", "Move like a knight (v1)": "Move like a knight (v1)", "Move like a knight (v2)": "Move like a knight (v2)", "Move twice": "Move twice", @@ -194,6 +196,7 @@ export const translations = { "Pawns move diagonally": "Pawns move diagonally", "Play at the same time": "Play at the same time", "Powerful pieces": "Powerful pieces", + "Push and pull": "Push and pull", "Queen disguised as a pawn": "Queen disguised as a pawn", "Reuse pieces": "Reuse pieces", "Reverse captures": "Reverse captures", diff --git a/client/src/translations/es.js b/client/src/translations/es.js index 40ba5c87..72c68dd6 100644 --- a/client/src/translations/es.js +++ b/client/src/translations/es.js @@ -132,6 +132,7 @@ export const translations = { Subject: "Asunto", "Symmetric random": "Aleatorio simétrico", "Terminate game?": "¿Terminar la partida?", + "The game should be in another tab": "la partida deberÃa estar en otra pestaña", "Three repetitions": "Tres repeticiones", Time: "Tiempo", "Undetermined result": "Resultado indeterminado", @@ -186,6 +187,7 @@ export const translations = { "Mate any piece (v2)": "Matar cualquier pieza (v2)", "Mate the knight": "Matar el caballo", "Middle battle": "Batalla media", + "Mongolian Horde": "Horda mongol", "Move like a knight (v1)": "Moverse como un caballo (v1)", "Move like a knight (v2)": "Moverse como un caballo (v2)", "Move twice": "Mover dos veces", @@ -194,6 +196,7 @@ export const translations = { "Pawns move diagonally": "Peones se mueven en diagonal", "Play at the same time": "Jugar al mismo tiempo", "Powerful pieces": "Piezas poderosas", + "Push and pull": "Empujar y tirar", "Queen disguised as a pawn": "Reina disfrazada de peón", "Reuse pieces": "Reutilizar piezas", "Reverse captures": "Capturas invertidas", diff --git a/client/src/translations/fr.js b/client/src/translations/fr.js index 8954f7b1..e0da2f36 100644 --- a/client/src/translations/fr.js +++ b/client/src/translations/fr.js @@ -132,6 +132,7 @@ export const translations = { Subject: "Sujet", "Symmetric random": "Aléatoire symétrique", "Terminate game?": "Stopper la partie ?", + "The game should be in another tab": "La partie devrait être dans un autre onglet", "Three repetitions": "Triple répétition", Time: "Temps", "Undetermined result": "Résultat indéterminé", @@ -186,6 +187,7 @@ export const translations = { "Mate any piece (v2)": "Matez n'importe quelle pièce (v2)", "Mate the knight": "Matez le cavalier", "Middle battle": "Bataille du milieu", + "Mongolian Horde": "Horde mongole", "Move like a knight (v1)": "Bouger comme un cavalier (v1)", "Move like a knight (v2)": "Bouger comme un cavalier (v2)", "Move twice": "Jouer deux coups", @@ -194,6 +196,7 @@ export const translations = { "Pawns move diagonally": "Les pions vont en diagonale", "Play at the same time": "Jouer en même temps", "Powerful pieces": "Pièces puissantes", + "Push and pull": "Pousser et tirer", "Queen disguised as a pawn": "Reine déguisée en pion", "Reuse pieces": "Réutiliser les pièces", "Reverse captures": "Captures inversées", diff --git a/client/src/translations/rules/Dynamo/en.pug b/client/src/translations/rules/Dynamo/en.pug new file mode 100644 index 00000000..2662cdd2 --- /dev/null +++ b/client/src/translations/rules/Dynamo/en.pug @@ -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 index 00000000..6fbe3756 --- /dev/null +++ b/client/src/translations/rules/Dynamo/es.pug @@ -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 index 00000000..d16e4b4c --- /dev/null +++ b/client/src/translations/rules/Dynamo/fr.pug @@ -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 index 00000000..2ccd5092 --- /dev/null +++ b/client/src/translations/rules/Orda/en.pug @@ -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) — 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 + — 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 index 00000000..a6f2d1bf --- /dev/null +++ b/client/src/translations/rules/Orda/es.pug @@ -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) — 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 index 00000000..742bf7ac --- /dev/null +++ b/client/src/translations/rules/Orda/fr.pug @@ -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) — 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. diff --git a/client/src/variants/Dynamo.js b/client/src/variants/Dynamo.js index c76c040b..4ec1927c 100644 --- a/client/src/variants/Dynamo.js +++ b/client/src/variants/Dynamo.js @@ -1,5 +1,97 @@ import { ChessRules } from "@/base_rules"; export class DynamoRules extends ChessRules { - // TODO + canIplay(side, [x, y]) { + // Sometimes opponent's pieces can be moved directly + return true; + } + + // NOTE: to push a piece out of the board, make it slide until our piece + // (doing the action, moving or not) + getPotentialMovesFrom([x, y]) { + const color = this.turn; + let moves = []; + if (this.getColor(x, y) != color) { + // Push or pull something: freely only if subTurn == 1 + if (this.subTurn == 2) { + // I know that someone is pushing/pulling: find out who, + // and deduce my possible squares (or exit). + // TODO + } else { + // Look in every direction for a friendly pusher/puller. + // This means that the action is done without moving. + // TODO + } + } else { + // My piece: fill first with normal moves (if any), + // and add pushes/pulls (if any). + // TODO + } + } + + getPPpath(m) { + let imgName = ""; + if (m.vanish.length == 1) imgName = "empty"; + else { + // Something is pushed or pull: count by how many squares + if (m.appear.length == 1) + // It just exit the board + imgName = "raus"; + else { + const deltaX = Math.abs(m.appear[1].x - m.vanish[1].x); + const deltaY = Math.abs(m.appear[1].y - m.vanish[1].y); + if (deltaX == 0) imgName = "shift" + deltaY; + else if (deltaY == 0) imgName = "shift" + deltaX; + else + // Special knight push/pull: just print "P" + imgName = "pstep"; + } + } + return "Dynamo/" + imgName; + } + + isAttackedBySlideNJump([x, y], color, piece, steps, oneStep) { + for (let step of steps) { + let rx = x + step[0], + ry = y + step[1]; + while (V.OnBoard(rx, ry) && this.board[rx][ry] == V.EMPTY && !oneStep) { + rx += step[0]; + ry += step[1]; + } + if ( + V.OnBoard(rx, ry) && + this.getPiece(rx, ry) == piece && + this.getColor(rx, ry) == color + ) { + // Now step in the other direction: if end of the world, then attacked + rx = x - step[0]; + ry = y - step[1]; + while (V.OnBoard(rx, ry) && this.board[rx][ry] == V.EMPTY && !oneStep) { + rx -= step[0]; + ry -= step[1]; + } + if (!V.OnBoard(rx, ry)) return true; + } + } + return false; + } + + isAttackedByPawn([x, y], color) { + const lastRank = (color == 'w' ? 0 : 7); + if (y != lastRank) + // The king can be pushed out by a pawn only on last rank + return false; + const pawnShift = (color == "w" ? 1 : -1); + for (let i of [-1, 1]) { + if ( + y + i >= 0 && + y + i < V.size.y && + this.getPiece(x + pawnShift, y + i) == V.PAWN && + this.getColor(x + pawnShift, y + i) == color + ) { + return true; + } + } + return false; + } }; diff --git a/client/src/variants/Eightpieces.js b/client/src/variants/Eightpieces.js index fa80824b..0f335184 100644 --- a/client/src/variants/Eightpieces.js +++ b/client/src/variants/Eightpieces.js @@ -83,8 +83,15 @@ export class EightpiecesRules extends ChessRules { return "Eightpieces/tmp_png/" + b; } - getPPpath(b, orientation) { - return this.getPpath(b, null, null, orientation); + getPPpath(m, orientation) { + return ( + this.getPpath( + m.appear[0].c + m.appear[0].p, + null, + null, + orientation + ) + ); } static ParseFen(fen) { diff --git a/client/src/variants/Orda.js b/client/src/variants/Orda.js new file mode 100644 index 00000000..4d911f40 --- /dev/null +++ b/client/src/variants/Orda.js @@ -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 + } + ); + } +}; diff --git a/client/src/views/Game.vue b/client/src/views/Game.vue index e5b45ecd..f9bc8430 100644 --- a/client/src/views/Game.vue +++ b/client/src/views/Game.vue @@ -629,8 +629,13 @@ export default { this.send("fullgame", { data: gameToSend, target: data.from }); break; case "fullgame": - // Callback "roomInit" to poll clients only after game is loaded - this.loadVariantThenGame(data.data, this.roomInit); + if (!!data.data.empty) { + alert(this.st.tr["The game should be in another tab"]); + this.$router.go(-1); + } + else + // Callback "roomInit" to poll clients only after game is loaded + this.loadVariantThenGame(data.data, this.roomInit); break; case "asklastate": // Sending informative last state if I played a move or score != "*" diff --git a/client/src/views/Rules.vue b/client/src/views/Rules.vue index 48a9e935..127d1db7 100644 --- a/client/src/views/Rules.vue +++ b/client/src/views/Rules.vue @@ -26,6 +26,7 @@ main | {{ st.tr["Analysis mode"] }} .row .col-sm-12.col-md-8.col-md-offset-2.col-lg-6.col-lg-offset-3 + h4#variantName {{ gameInfo.vname }} div( v-show="display=='rules'" v-html="content" @@ -169,6 +170,10 @@ export default { background-color: lightgrey font-weight: bold +h4#variantName + text-align: center + font-weight: bold + figure.diagram-container margin: 15px 0 15px 0 text-align: center @@ -235,4 +240,14 @@ ul:not(.browser-default) ul:not(.browser-default) > li list-style-type: disc + +table + margin: 15px auto + +.italic + font-style: italic + +img.img-center + display: block + margin: 0 auto 15px auto </style> diff --git a/server/db/populate.sql b/server/db/populate.sql index 18957773..52c043cb 100644 --- a/server/db/populate.sql +++ b/server/db/populate.sql @@ -24,6 +24,7 @@ insert or ignore into Variants (name,description) values ('Cylinder', 'Neverending rows'), ('Dark', 'In the shadow'), ('Doublearmy', '64 pieces on the board'), + ('Dynamo', 'Push and pull'), ('Eightpieces', 'Each piece is unique'), ('Enpassant', 'Capture en passant'), ('Extinction', 'Capture all of a kind'), @@ -37,6 +38,7 @@ insert or ignore into Variants (name,description) values ('Losers', 'Get strong at self-mate'), ('Magnetic', 'Laws of attraction'), ('Marseille', 'Move twice'), + ('Orda', 'Mongolian Horde'), ('Parachute', 'Landing on the board'), ('Perfect', 'Powerful pieces'), ('Racingkings', 'Kings cross the 8x8 board'), diff --git a/server/sockets.js b/server/sockets.js index 25abadb7..d00b3c89 100644 --- a/server/sockets.js +++ b/server/sockets.js @@ -209,6 +209,9 @@ module.exports = function(wss) { clients[page][rid][rtmpId].socket, { code: "askfullgame", from: [sid,tmpId] } ); + } else { + // I'm the only person who have the game for the moment: + send(socket, { code: "fullgame", data: { empty: true } }); } } break; -- 2.44.0