From: Benjamin Auder <benjamin.auder@somewhere> Date: Mon, 12 Apr 2021 15:54:42 +0000 (+0200) Subject: Several small improvements + integrate options + first working draft of Cwda X-Git-Url: https://git.auder.net/doc/html/assets/pieces/app_dev.php/%24%7BgetWhatsApp%28link%29%7D?a=commitdiff_plain;h=4313762da3237b04f204e121a20cab3ba7bb5dd2;p=vchess.git Several small improvements + integrate options + first working draft of Cwda --- diff --git a/TODO b/TODO index 924b6d0e..473ea2d0 100644 --- a/TODO +++ b/TODO @@ -6,9 +6,18 @@ If new live game starts in background, "new game" notify OK but not first move. Will be used for variants with custom non-rectangular board (Hex, at least) Or, with other board shapes (see greenchess.net for example) -Merge variants 1, 2 (3) into one with sub-variant selection when starting a game (New Game + vs engine + analyse) -E.g. Checkered 1 & 2 into one, and so on. -Need additional field in variant code... in a generic way (radiobutton or select or checkbox?) +debug import game + load + +TODEBUG: Avalanche computer play from here +game.fen = "r2q1bnr/3pp3/n3k1p1/6Pp/3p1B1P/p5R1/1p6/4K1NR w 26 ihii 0"; +game.fenStart = "r2q1bnr/3pp3/n3k1p1/6Pp/3p1B1P/p5R1/1p6/4K1NR w 26 ihii 0"; +game.mycolor = 'w'; +Bd6,b1 then black promotes and win, but UI freezes. + +Merge Orda + Empire + Hoppelpoppel + Newzealand getSlideNJumpMoves() into base_rules.js +=> allow to simplify getPawnMoves in RoyalRace (and some getXMoves in Shatranj) + +Option "free placement" in Hidden #New variants: Chessplode @@ -16,7 +25,6 @@ Tablut https://brainking.com/fr/GameRules?tp=128 Massacre Chess -CWDA : need game options (also useful at least for Monster) PizzaKings https://www.chessvariants.com/unequal.dir/pizza-kings.html https://en.m.wikipedia.org/wiki/Chess_with_different_armies#Pizza_Kings%5B11%5D_(John_Lawson) diff --git a/client/public/images/pieces/Cwda/bc.svg b/client/public/images/pieces/Cwda/bc.svg new file mode 100644 index 00000000..c34593d7 --- /dev/null +++ b/client/public/images/pieces/Cwda/bc.svg @@ -0,0 +1,158 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="45" + height="45" + id="svg3128" + sodipodi:version="0.32" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + version="1.0" + sodipodi:docname="bc.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape"> + <defs + id="defs3130"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 22.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="45 : 22.5 : 1" + inkscape:persp3d-origin="22.5 : 15 : 1" + id="perspective15" /> + <inkscape:perspective + id="perspective12" + inkscape:persp3d-origin="22.5 : 15 : 1" + inkscape:vp_z="45 : 22.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 22.5 : 1" + sodipodi:type="inkscape:persp3d" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="11.313709" + inkscape:cx="21.843794" + inkscape:cy="17.466685" + inkscape:document-units="px" + inkscape:current-layer="layer1" + height="45px" + width="45px" + inkscape:grid-points="true" + showgrid="true" + inkscape:window-width="960" + inkscape:window-height="1060" + inkscape:window-x="0" + inkscape:window-y="20" + inkscape:window-maximized="0"> + <inkscape:grid + id="GridFromPre046Settings" + type="xygrid" + originx="0" + originy="0" + spacingx="0.5" + spacingy="0.5" + color="#0000ff" + empcolor="#0000ff" + opacity="0.2" + empopacity="0.4" + empspacing="5" /> + </sodipodi:namedview> + <metadata + id="metadata3133"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + style="display:inline"> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 37.5,37.5 c -3.723781,-1.069562 -11.126219,0.473903 -14.85,-2.2 -3.723782,2.673903 -11.12622,1.130438 -14.8500002,2.2 0,0 -1.8104878,0.595658 -3.3,2.2 0.7447561,1.069561 1.8104878,1.08478 3.3,0.55 C 11.52378,39.180439 18.926218,40.754342 22.65,39.15 c 3.723781,1.604342 11.126219,0.03044 14.85,1.1 1.489512,0.53478 2.555244,0.519561 3.3,-0.55 -1.489512,-2.139123 -3.3,-2.2 -3.3,-2.2 z" + id="path4582" + sodipodi:nodetypes="ccccccccc" + inkscape:connector-curvature="0" /> + <path + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 30.9,33.1 c -2.75,2.75 -13.75,2.75 -16.5,0 -0.55,-1.65 0,-2.2 0,-2.2 h 16.5 c 0,0 0.55,0.55 0,2.2 z" + id="path4584" + sodipodi:nodetypes="ccccc" + inkscape:connector-curvature="0" /> + <path + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 30.9,30.9 H 14.4" + id="path4590" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <g + id="g3323" + inkscape:label="Layer 1" + transform="matrix(-0.84196464,0,0,-0.84196464,38.826174,36.60001)" + style="fill:#000000;fill-opacity:1"> + <path + sodipodi:nodetypes="cccc" + id="path3491" + d="M 22.028958,36 C 11.528958,35 5.5289585,28 6.0289585,7 H 29.028958 c 0,9 -10,6.5 -8,21" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <path + sodipodi:nodetypes="csccccccccccc" + id="path3495" + d="m 20.028958,28 c -0.384461,-2.911278 5.552936,-7.368624 8,-9 3,-2 2.819198,-4.342892 5,-4 1.04172,0.944016 -1.413429,3.037549 0,3 1,0 -0.187332,-1.231727 1,-2 1,0 4.003161,-0.999999 4,4 0,2 -6,12 -6,12 0,0 -1.885866,1.902129 -2,3.5 0.726047,0.994369 0.5,2 0.5,3 -1,1 -3,-2.5 -3,-2.5 h -2 c 0,0 -0.781781,1.991926 -2.5,3 -1,0 -1,-3 -1,-3" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <circle + transform="rotate(180,21.764479,22)" + id="path3499" + style="opacity:1;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + cx="8.5" + cy="23.5" + r="0.5" /> + <ellipse + transform="rotate(-149.99999,24.024104,20.986505)" + id="path3501" + style="opacity:1;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1.50000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + cx="14.5" + cy="15.5" + rx="0.5" + ry="1.5" /> + <path + sodipodi:nodetypes="cc" + id="path8049" + d="m 7.0289585,7 c -1,20 5.4999995,27.5 11.9999995,28.5" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + inkscape:connector-curvature="0" /> + </g> + <path + style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.64999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="M 14.4,30.9 H 30.9" + id="path3369" + inkscape:connector-curvature="0" /> + </g> + <g + inkscape:groupmode="layer" + id="layer2" + inkscape:label="Layer 1#1" + style="display:inline" /> +</svg> diff --git a/client/public/images/pieces/Cwda/bf.svg b/client/public/images/pieces/Cwda/bf.svg new file mode 100644 index 00000000..9d51bfc9 --- /dev/null +++ b/client/public/images/pieces/Cwda/bf.svg @@ -0,0 +1,247 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="177.17" + height="177.17" + shape-rendering="geometricPrecision" + image-rendering="optimizeQuality" + fill-rule="evenodd" + clip-rule="evenodd" + viewBox="0 0 50 50" + version="1.1" + id="svg974" + sodipodi:docname="ba.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> + <metadata + id="metadata978"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1060" + id="namedview976" + showgrid="false" + inkscape:zoom="2.3931818" + inkscape:cx="11.490991" + inkscape:cy="50.539966" + inkscape:window-x="0" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:current-layer="svg974" + showguides="false" + inkscape:snap-nodes="false" /> + <defs + id="defs968"> + <linearGradient + inkscape:collect="always" + id="linearGradient1002"> + <stop + style="stop-color:#ffffff;stop-opacity:1" + offset="0" + id="stop998" /> + <stop + style="stop-color:#dcdbdb;stop-opacity:1" + offset="1" + id="stop1000" /> + </linearGradient> + <linearGradient + id="0" + x1="21.376" + x2="77.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#fff" + id="stop963" /> + <stop + offset="1" + stop-color="#fff" + stop-opacity="0" + id="stop965" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient1002" + id="linearGradient1004" + x1="-41.790333" + y1="22.581646" + x2="-15.82877" + y2="22.581646" + gradientUnits="userSpaceOnUse" /> + <linearGradient + id="linearGradient5398" + x1="0" + y1="0" + x2="0" + y2="1"> + <stop + offset="20%" + style="stop-color:#000000;stop-opacity:1" + id="stop5394" /> + <stop + offset="100%" + style="stop-color:#4d4d4d;stop-opacity:1" + id="stop5396" /> + </linearGradient> + <linearGradient + gradientTransform="translate(0.47111842,-0.19973575)" + id="0-1" + x1="21.253" + y1="37.591999" + x2="77.639999" + y2="37.469002" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#fff" + id="stop3285" /> + <stop + offset="1" + stop-color="#fff" + stop-opacity="0" + id="stop3287" /> + </linearGradient> + </defs> + <g + id="g5357" + style="opacity:1;fill:#1f1a17;fill-opacity:1" + transform="matrix(0.84130849,0,0,0.84130849,-76.526422,18.776438)"> + <path + sodipodi:nodetypes="cccccccccccccccsccsc" + inkscape:connector-curvature="0" + id="path5349" + d="m 119.66608,20.578823 c 0.12511,0.773672 0.40427,1.44388 1.3,1.7 11.23011,-0.424319 16.82956,-5.233235 20.30001,-11.7 l 0.2,-2.099999 c -2.10707,-8.89280401 -8.15113,-13.4502442 -16.2,-15.8 -4.40015,-0.5317426 -7.59668,1.3815851 -10.20001,4.5 -2.59354,2.64077835 -4.39616,5.9439949 -5.3,10 -0.9084,3.60641 -5.79067,1.6990508 -4.9,-0.6 2.76583,-4.0566968 11.00069,-10.7605086 4.9,-12.3 -8.75831,-2.0518262 -7.05798,4.7061225 -5.2,6.20000004 1.23982,-0.5457366 2.00197,-1.22280981 2.4,-2.00000004 -0.25951,-0.4357328 -0.98217,-0.8162564 0,-1.4 0.5387,0.045976 0.81918,0.2856122 1,0.6 0,1 0.50403,1.1455069 -3.6,4 -7.640521,5.2325602 -3.73403,16.328533 2.94302,17.405035 2.93812,0.458135 3.4042,1.08673 5.28907,0.933469 0.49515,-0.04026 1.25166,0.522864 1.96791,0.561495 0.84449,-0.337075 4.5865,-0.641651 3.83596,-0.600198 0.37015,0.007 0.83701,-0.226033 1.09094,-0.03707 0.11828,0.08802 0.12726,0.435864 0.1731,0.637268 z" + style="fill:#1f1a17;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + <path + sodipodi:nodetypes="ccccc" + inkscape:connector-curvature="0" + id="path5353" + d="m 109.56608,17.578823 c -1.32838,4.066443 -4.04985,6.321863 -6.6,8.8 -0.20576,0.304421 0.14574,0.397532 1,0.3 3.90473,-1.863513 6.85963,-4.360243 8.1,-8 -0.78642,-0.41302 -1.31194,-1.08384 -2.5,-1.1 z" + style="fill:#1f1a17;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + </g> + <g + id="g14577" + transform="matrix(0.95,0,0,0.95,1.3708726,1.7010613)"> + <rect + y="4.245285" + x="23.113207" + height="40.212261" + width="3.7735846" + id="rect14571" + style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + <rect + transform="rotate(90)" + style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.84308159;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" + id="rect14573" + width="3.7735846" + height="47.641506" + x="23.231133" + y="-48.820751" /> + </g> + <path + sodipodi:type="star" + style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" + id="path14587" + sodipodi:sides="64" + sodipodi:cx="25" + sodipodi:cy="44.457546" + sodipodi:r1="3.9412203" + sodipodi:r2="3.9364729" + sodipodi:arg1="0.78539816" + sodipodi:arg2="0.83448555" + inkscape:flatsided="true" + inkscape:rounded="0" + inkscape:randomized="0" + d="m 27.786864,47.24441 -0.28658,0.259741 -0.310659,0.2304 -0.331747,0.198841 -0.349638,0.165367 -0.364164,0.1303 -0.375182,0.09398 -0.382587,0.05675 L 25,48.398767 l -0.386307,-0.01898 -0.382587,-0.05675 -0.375182,-0.09398 -0.364164,-0.1303 -0.349638,-0.165367 -0.331747,-0.198841 -0.310659,-0.2304 -0.28658,-0.259741 -0.25974,-0.28658 -0.230401,-0.310659 -0.198841,-0.331746 -0.165367,-0.349639 -0.1303,-0.364164 -0.09398,-0.375182 -0.05675,-0.382587 -0.01898,-0.386307 0.01898,-0.386307 0.05675,-0.382587 0.09398,-0.375182 0.1303,-0.364163 0.165367,-0.349639 0.198841,-0.331746 0.230401,-0.310659 0.25974,-0.28658 0.28658,-0.259741 0.310659,-0.230401 0.331747,-0.198841 0.349638,-0.165367 0.364164,-0.130299 0.375182,-0.09398 0.382587,-0.05675 L 25,40.516326 l 0.386307,0.01898 0.382587,0.05675 0.375182,0.09398 0.364164,0.130299 0.349638,0.165367 0.331747,0.198841 0.310659,0.230401 0.28658,0.259741 0.25974,0.28658 0.230401,0.310659 0.198841,0.331746 0.165367,0.349639 0.1303,0.364163 0.09398,0.375182 0.05675,0.382587 0.01898,0.386307 -0.01898,0.386307 -0.05675,0.382587 -0.09398,0.375182 -0.1303,0.364164 -0.165367,0.349639 -0.198841,0.331746 -0.230401,0.310659 z" + transform="matrix(0,0.95,-0.95,0,47.806603,1.7010613)" /> + <path + style="fill:#ffffff;stroke:none;stroke-width:0.84130847px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 9.0513062,23.758841 c -1.5224694,5.64797 0.8106772,8.495757 4.4978728,9.890942 l 0.420654,-0.673047 C 8.3833763,30.233472 9.3915535,25.423457 9.2978739,24.11563 9.2827431,23.904424 9.150848,23.762548 9.0513062,23.758841 Z" + id="path5359" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccsc" /> + <path + style="fill:#ffffff;stroke-width:0.76650214" + d="m 19.617688,23.128129 c -0.279006,-0.14257 -0.415444,-0.213854 -0.415444,-0.213854 -0.382484,-0.149468 -0.499759,-0.428474 -0.363322,-0.83702 0.149468,-0.376353 0.441505,-0.505892 0.876112,-0.376353 1.492379,0.544983 2.524858,1.548334 3.096668,3.004688 0.09045,0.415444 -0.05825,0.700584 -0.454535,0.85695 -0.395515,0.123407 -0.662258,-0.01303 -0.797928,-0.421577 -0.104246,-0.213853 -0.17553,-0.357189 -0.226886,-0.415443 -0.142569,0.110376 -0.324229,0.187793 -0.551881,0.226883 -0.774167,0.123407 -1.226403,-0.213853 -1.34981,-1.025579 -0.03909,-0.279006 0.02606,-0.544983 0.188559,-0.797929" + id="path3879" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#ffffff;stroke-width:1.29790962;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 24.329544,34.771886 c 1.291628,-3.108895 2.461658,-6.045308 2.10449,-9.095101 -0.177235,-1.513395 -0.549622,-2.056607 -0.199499,-3.345737 0.44569,-1.640989 1.539073,-3.115915 2.735886,-4.344174" + id="path7508" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cssc" /> + <path + style="fill:none;stroke:#ffffff;stroke-width:1.29790962;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 18.525608,34.64224 c 0.830395,-0.939643 0.643587,-0.695011 1.204359,-1.891915" + id="path7512" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + <path + sodipodi:type="star" + style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60862446;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" + id="path14581" + sodipodi:sides="64" + sodipodi:cx="25.120873" + sodipodi:cy="6.1821945" + sodipodi:r1="3.7441592" + sodipodi:r2="3.7396493" + sodipodi:arg1="0.78539816" + sodipodi:arg2="0.83448555" + inkscape:flatsided="true" + inkscape:rounded="0" + inkscape:randomized="0" + d="M 27.768393,8.8297151 27.496142,9.0764689 27.201016,9.2953493 26.885857,9.4842483 26.5537,9.6413468 26.207745,9.7651317 25.851322,9.854411 25.487864,9.9083248 25.120873,9.9263539 24.753881,9.9083248 24.390423,9.854411 24.034,9.7651317 23.688045,9.6413468 23.355888,9.4842484 23.040729,9.2953493 22.745603,9.0764689 22.473352,8.8297151 22.226598,8.5574642 22.007718,8.2623381 21.818819,7.9471792 21.66172,7.6150224 21.537936,7.2690668 21.448656,6.912644 l -0.05391,-0.3634575 -0.01803,-0.3669918 0.01803,-0.3669918 0.05391,-0.3634574 0.08928,-0.3564228 0.123784,-0.3459557 0.157099,-0.3321567 0.188899,-0.315159 0.21888,-0.295126 0.246754,-0.272251 0.272251,-0.2467538 0.295126,-0.2188804 0.315159,-0.188899 0.332157,-0.1570985 0.345955,-0.1237849 0.356423,-0.089279 0.363458,-0.053914 0.366991,-0.018029 0.366992,0.018029 0.363458,0.053914 0.356423,0.089279 0.345955,0.1237849 0.332157,0.1570985 0.315159,0.188899 0.295126,0.2188804 0.272251,0.2467538 0.246754,0.2722509 0.21888,0.2951261 0.188899,0.315159 0.157099,0.3321567 0.123784,0.3459556 0.08928,0.3564229 0.05391,0.3634574 0.01803,0.3669918 -0.01803,0.3669918 -0.05391,0.3634574 -0.08928,0.3564228 -0.123784,0.3459557 -0.157099,0.3321567 -0.188899,0.315159 -0.21888,0.2951261 z" /> + <path + d="m 27.768393,46.58325 -0.272251,0.246754 -0.295126,0.218881 -0.315159,0.188899 -0.332157,0.157098 -0.345955,0.123785 -0.356423,0.08928 -0.363458,0.05391 -0.366991,0.01803 -0.366992,-0.01803 -0.363458,-0.05391 -0.356423,-0.08928 -0.345955,-0.123785 -0.332157,-0.157098 -0.315159,-0.188899 -0.295126,-0.218881 -0.272251,-0.246754 -0.246754,-0.272251 -0.21888,-0.295126 -0.188899,-0.315159 -0.157099,-0.332156 -0.123784,-0.345956 -0.08928,-0.356423 -0.05391,-0.363457 -0.01803,-0.366992 0.01803,-0.366992 0.05391,-0.363457 0.08928,-0.356423 0.123784,-0.345956 0.157099,-0.332156 0.188899,-0.315159 0.21888,-0.295126 0.246754,-0.272251 0.272251,-0.246754 0.295126,-0.218881 0.315159,-0.188899 0.332157,-0.157098 0.345955,-0.123785 0.356423,-0.08928 0.363458,-0.05391 0.366991,-0.01803 0.366992,0.01803 0.363458,0.05391 0.356423,0.08928 0.345955,0.123785 0.332157,0.157098 0.315159,0.188899 0.295126,0.218881 0.272251,0.246754 0.246754,0.272251 0.21888,0.295126 0.188899,0.315159 0.157099,0.332156 0.123784,0.345956 0.08928,0.356423 0.05391,0.363457 0.01803,0.366992 -0.01803,0.366992 -0.05391,0.363457 -0.08928,0.356423 -0.123784,0.345956 -0.157099,0.332156 -0.188899,0.315159 -0.21888,0.295126 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="true" + sodipodi:arg2="0.83448555" + sodipodi:arg1="0.78539816" + sodipodi:r2="3.7396493" + sodipodi:r1="3.7441592" + sodipodi:cy="43.935729" + sodipodi:cx="25.120873" + sodipodi:sides="64" + id="path14583" + style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60862446;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" + sodipodi:type="star" /> + <path + d="M 27.786864,7.5038459 27.500284,7.7635868 27.189625,7.9939873 26.857878,8.1928283 26.50824,8.3581951 26.144076,8.488495 25.768894,8.5824732 25.386307,8.6392246 25,8.6582026 24.613693,8.6392246 24.231106,8.5824732 23.855924,8.488495 23.49176,8.3581951 23.142122,8.1928283 22.810375,7.9939873 22.499716,7.7635869 22.213136,7.503846 21.953396,7.2172661 21.722995,6.906607 21.524154,6.5748608 21.358787,6.2252221 l -0.1303,-0.3641639 -0.09398,-0.3751819 -0.05675,-0.3825868 -0.01898,-0.3863071 0.01898,-0.3863072 0.05675,-0.3825868 0.09398,-0.3751819 0.1303,-0.3641638 0.165367,-0.3496387 0.198841,-0.3317463 0.230401,-0.310659 0.25974,-0.2865799 0.28658,-0.2597409 0.310659,-0.2304004 0.331747,-0.1988411 0.349638,-0.1653668 0.364164,-0.13029989 0.375182,-0.0939782 0.382587,-0.0567514 L 25,0.77576208 l 0.386307,0.018978 0.382587,0.0567514 0.375182,0.0939782 0.364164,0.1302999 0.349638,0.1653668 0.331747,0.1988411 0.310659,0.2304004 0.28658,0.2597409 0.25974,0.2865799 0.230401,0.310659 0.198841,0.3317463 0.165367,0.3496386 0.1303,0.3641639 0.09398,0.3751819 0.05675,0.3825868 0.01898,0.3863072 -0.01898,0.3863071 -0.05675,0.3825868 -0.09398,0.3751819 -0.1303,0.3641639 -0.165367,0.3496386 -0.198841,0.3317463 -0.230401,0.310659 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="true" + sodipodi:arg2="0.83448555" + sodipodi:arg1="0.78539816" + sodipodi:r2="3.9364729" + sodipodi:r1="3.9412203" + sodipodi:cy="4.7169824" + sodipodi:cx="25" + sodipodi:sides="64" + id="path14585" + style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" + sodipodi:type="star" + transform="matrix(0,0.95,-0.95,0,49.262972,1.7010613)" /> +</svg> diff --git a/client/public/images/pieces/Cwda/bg.svg b/client/public/images/pieces/Cwda/bg.svg new file mode 100644 index 00000000..899f4809 --- /dev/null +++ b/client/public/images/pieces/Cwda/bg.svg @@ -0,0 +1,88 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="100%" + width="100%" + version="1.1" + viewBox="0 0 2048 2048" + id="svg16" + sodipodi:docname="br.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <metadata + id="metadata22"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs20" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="960" + inkscape:window-height="1060" + id="namedview18" + showgrid="false" + inkscape:zoom="0.43115234" + inkscape:cx="1024" + inkscape:cy="1024" + inkscape:window-x="0" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:current-layer="svg16" /> + <path + style="color:#000000" + d="m 1161,1706 h 170 v 137 h 274 V 1468 L 1383,1297 V 819 L 1553,649 V 444 h 153 V 205 H 341 v 239 h 153 v 205 l 171,170 v 478 l -222,171 v 375 h 273 v -137 h 171 v 137 h 274 z M 564,460 V 358 h 920 v 102 z m 460,1092 H 512 v -46 l 73,-55 h 879 l 71,55 v 46 z m 0,-169 H 674 l 60,-47 v -57 h 580 v 57 l 60,47 z m 0,-546 H 734 v -46 l -60,-58 h 700 l -60,58 v 46 z m 0,-172 H 610 l -46,-43 v -58 h 920 v 58 l -46,43 z" + fill-rule="nonzero" + display="block" + fill="#000000" + id="path2" /> + <g + fill-rule="nonzero" + fill="#ffffff" + id="g14" + transform="matrix(1,0,0,-1,0,2048)"> + <path + style="color:#000000" + d="m 564,1588 v 102 h 920 v -102 z" + display="block" + id="path4" /> + <path + style="color:#000000" + d="M 1024,496 H 512 v 46 l 73,55 h 879 l 71,-55 v -46 z" + display="block" + id="path6" /> + <path + style="color:#000000" + d="M 1024,665 H 674 l 60,47 v 57 h 580 v -57 l 60,-47 z" + display="block" + id="path8" /> + <path + style="color:#000000" + d="M 1024,1211 H 734 v 46 l -60,58 h 700 l -60,-58 v -46 z" + display="block" + id="path10" /> + <path + style="color:#000000" + d="M 1024,1383 H 610 l -46,43 v 58 h 920 v -58 l -46,-43 z" + display="block" + id="path12" /> + </g> +</svg> diff --git a/client/public/images/pieces/Cwda/bh.svg b/client/public/images/pieces/Cwda/bh.svg index 9d51bfc9..1b096435 100644 --- a/client/public/images/pieces/Cwda/bh.svg +++ b/client/public/images/pieces/Cwda/bh.svg @@ -5,32 +5,28 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="177.17" - height="177.17" - shape-rendering="geometricPrecision" - image-rendering="optimizeQuality" - fill-rule="evenodd" - clip-rule="evenodd" - viewBox="0 0 50 50" + height="100%" + width="100%" version="1.1" - id="svg974" - sodipodi:docname="ba.svg" - inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> + viewBox="0 0 2048 2048" + id="svg16" + sodipodi:docname="bh.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> <metadata - id="metadata978"> + id="metadata22"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> </cc:Work> </rdf:RDF> </metadata> + <defs + id="defs20" /> <sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" @@ -40,208 +36,58 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="1920" + inkscape:window-width="960" inkscape:window-height="1060" - id="namedview976" + id="namedview18" showgrid="false" - inkscape:zoom="2.3931818" - inkscape:cx="11.490991" - inkscape:cy="50.539966" + inkscape:zoom="0.43115234" + inkscape:cx="1024" + inkscape:cy="1024" inkscape:window-x="0" inkscape:window-y="20" inkscape:window-maximized="0" - inkscape:current-layer="svg974" - showguides="false" - inkscape:snap-nodes="false" /> - <defs - id="defs968"> - <linearGradient - inkscape:collect="always" - id="linearGradient1002"> - <stop - style="stop-color:#ffffff;stop-opacity:1" - offset="0" - id="stop998" /> - <stop - style="stop-color:#dcdbdb;stop-opacity:1" - offset="1" - id="stop1000" /> - </linearGradient> - <linearGradient - id="0" - x1="21.376" - x2="77.64" - gradientUnits="userSpaceOnUse"> - <stop - stop-color="#fff" - id="stop963" /> - <stop - offset="1" - stop-color="#fff" - stop-opacity="0" - id="stop965" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient1002" - id="linearGradient1004" - x1="-41.790333" - y1="22.581646" - x2="-15.82877" - y2="22.581646" - gradientUnits="userSpaceOnUse" /> - <linearGradient - id="linearGradient5398" - x1="0" - y1="0" - x2="0" - y2="1"> - <stop - offset="20%" - style="stop-color:#000000;stop-opacity:1" - id="stop5394" /> - <stop - offset="100%" - style="stop-color:#4d4d4d;stop-opacity:1" - id="stop5396" /> - </linearGradient> - <linearGradient - gradientTransform="translate(0.47111842,-0.19973575)" - id="0-1" - x1="21.253" - y1="37.591999" - x2="77.639999" - y2="37.469002" - gradientUnits="userSpaceOnUse"> - <stop - stop-color="#fff" - id="stop3285" /> - <stop - offset="1" - stop-color="#fff" - stop-opacity="0" - id="stop3287" /> - </linearGradient> - </defs> + inkscape:current-layer="svg16" + inkscape:document-rotation="0" /> + <path + style="color:#000000" + d="m 1290,564.11538 -42,102 q -102,22 -224,22 -121,0 -222,-22 l -42,-101 q 124,31 264,31 138,0 266,-32 z m -84,206 -29,70 v 27 q -76,11 -153,11 -75,0 -152,-11 l -1,-27 -27,-70 q 85,15 180,15 96,0 182,-15 z m -35,-378 q -40,30 -80,95 h -32 q 0,-49 23,-95 z m -206,0 q 23,49 23,95 h -32 q -39,-64 -81,-95 z m 59,-18 q -14,-57 -34,-79 -20,-22 -53,-46 -36,-25 -85,-42 -49,-17 -109,-9 l -281,39 q -17,2 -30,0 -13,-2 -26,-2 -21,0 -53,-9 -32,-9 -51,-28 l -97,159 q 18,20 32,28 14,8 33,17 58,27 124,33 28,2 55,1 27,-1 56,2 54,-9 108,-16 54,-7 110,-16 60,0 81,12 11,6 35,22 24,16 48,47 -53,6 -108,20 -55,14 -97,31 l 104,258 q -78,45 -109,72 -31,27 -49,64 -26,46 -33,89.00002 -7,43 -7,77 1,60 28,132 27,72 104,130 63,48 123,99 60,51 119,119 -74,38 -74,121 0,56 39,96 39,40 97,40 56,0 96,-40 40,-40 40,-96 0,-82 -74,-121 58,-68 117,-119 59,-51 125,-99 75,-57 102,-129 27,-72 29,-133 0,-34 -7,-77 -7,-43.00002 -32,-89.00002 -20,-36 -50,-63 -30,-27 -108,-73 l 104,-258 q -44,-16 -99,-30 -55,-14 -106,-21 23,-31 47,-47 24,-16 36,-22 21,-12 81,-12 54,8 108,15 54,7 110,17 27,-3 54,-2 27,1 57,-1 64,-6 124,-33 18,-9 32,-17 14,-8 33,-28 l -98,-159 q -18,18 -50,27 -32,9 -53,10 -13,0 -26,2 -13,2 -31,0 l -280,-39 q -60,-9 -111,8 -51,17 -85,45 -33,27 -52,46 -19,19 -33,77 z m -37,744.00002 v -85 q 0,-37.00002 37,-37.00002 37,0 37,37.00002 v 86 h 90 q 35,0 35,36 0,36 -35,36 h -90 v 90 q 0,37 -37,37 -37,0 -37,-37 v -90 h -88 q -35,0 -35,-36 0,-36 35,-36 z" + fill-rule="nonzero" + display="block" + fill="#000000" + id="path2" /> <g - id="g5357" - style="opacity:1;fill:#1f1a17;fill-opacity:1" - transform="matrix(0.84130849,0,0,0.84130849,-76.526422,18.776438)"> + fill-rule="nonzero" + fill="#ffffff" + id="g14" + transform="matrix(1,0,0,-1,0,2030.1154)"> <path - sodipodi:nodetypes="cccccccccccccccsccsc" - inkscape:connector-curvature="0" - id="path5349" - d="m 119.66608,20.578823 c 0.12511,0.773672 0.40427,1.44388 1.3,1.7 11.23011,-0.424319 16.82956,-5.233235 20.30001,-11.7 l 0.2,-2.099999 c -2.10707,-8.89280401 -8.15113,-13.4502442 -16.2,-15.8 -4.40015,-0.5317426 -7.59668,1.3815851 -10.20001,4.5 -2.59354,2.64077835 -4.39616,5.9439949 -5.3,10 -0.9084,3.60641 -5.79067,1.6990508 -4.9,-0.6 2.76583,-4.0566968 11.00069,-10.7605086 4.9,-12.3 -8.75831,-2.0518262 -7.05798,4.7061225 -5.2,6.20000004 1.23982,-0.5457366 2.00197,-1.22280981 2.4,-2.00000004 -0.25951,-0.4357328 -0.98217,-0.8162564 0,-1.4 0.5387,0.045976 0.81918,0.2856122 1,0.6 0,1 0.50403,1.1455069 -3.6,4 -7.640521,5.2325602 -3.73403,16.328533 2.94302,17.405035 2.93812,0.458135 3.4042,1.08673 5.28907,0.933469 0.49515,-0.04026 1.25166,0.522864 1.96791,0.561495 0.84449,-0.337075 4.5865,-0.641651 3.83596,-0.600198 0.37015,0.007 0.83701,-0.226033 1.09094,-0.03707 0.11828,0.08802 0.12726,0.435864 0.1731,0.637268 z" - style="fill:#1f1a17;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> + style="color:#000000" + d="m 1290,1466 -42,-102 q -102,-22 -224,-22 -121,0 -222,22 l -42,101 q 124,-31 264,-31 138,0 266,32 z" + display="block" + id="path4" /> <path - sodipodi:nodetypes="ccccc" - inkscape:connector-curvature="0" - id="path5353" - d="m 109.56608,17.578823 c -1.32838,4.066443 -4.04985,6.321863 -6.6,8.8 -0.20576,0.304421 0.14574,0.397532 1,0.3 3.90473,-1.863513 6.85963,-4.360243 8.1,-8 -0.78642,-0.41302 -1.31194,-1.08384 -2.5,-1.1 z" - style="fill:#1f1a17;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> - </g> - <g - id="g14577" - transform="matrix(0.95,0,0,0.95,1.3708726,1.7010613)"> - <rect - y="4.245285" - x="23.113207" - height="40.212261" - width="3.7735846" - id="rect14571" - style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> - <rect - transform="rotate(90)" - style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.84308159;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" - id="rect14573" - width="3.7735846" - height="47.641506" - x="23.231133" - y="-48.820751" /> + style="color:#000000" + d="m 1206,1260 -29,-70 v -27 q -76,-11 -153,-11 -75,0 -152,11 l -1,27 -27,70 q 85,-15 180,-15 96,0 182,15 z" + display="block" + id="path6" /> + <path + style="color:#000000" + d="m 1171,1638 q -40,-30 -80,-95 h -32 q 0,49 23,95 z" + display="block" + id="path8" /> + <path + style="color:#000000" + d="m 965,1638 q 23,-49 23,-95 h -32 q -39,64 -81,95 z" + display="block" + id="path10" /> + <path + style="color:#000000" + d="m 987,912 v 85 q 0,37 37,37 37,0 37,-37 v -86 h 90 q 35,0 35,-36 0,-36 -35,-36 h -90 v -90 q 0,-37 -37,-37 -37,0 -37,37 v 90 h -88 q -35,0 -35,36 0,36 35,36 z" + display="block" + id="path12" /> </g> <path - sodipodi:type="star" - style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" - id="path14587" - sodipodi:sides="64" - sodipodi:cx="25" - sodipodi:cy="44.457546" - sodipodi:r1="3.9412203" - sodipodi:r2="3.9364729" - sodipodi:arg1="0.78539816" - sodipodi:arg2="0.83448555" - inkscape:flatsided="true" - inkscape:rounded="0" - inkscape:randomized="0" - d="m 27.786864,47.24441 -0.28658,0.259741 -0.310659,0.2304 -0.331747,0.198841 -0.349638,0.165367 -0.364164,0.1303 -0.375182,0.09398 -0.382587,0.05675 L 25,48.398767 l -0.386307,-0.01898 -0.382587,-0.05675 -0.375182,-0.09398 -0.364164,-0.1303 -0.349638,-0.165367 -0.331747,-0.198841 -0.310659,-0.2304 -0.28658,-0.259741 -0.25974,-0.28658 -0.230401,-0.310659 -0.198841,-0.331746 -0.165367,-0.349639 -0.1303,-0.364164 -0.09398,-0.375182 -0.05675,-0.382587 -0.01898,-0.386307 0.01898,-0.386307 0.05675,-0.382587 0.09398,-0.375182 0.1303,-0.364163 0.165367,-0.349639 0.198841,-0.331746 0.230401,-0.310659 0.25974,-0.28658 0.28658,-0.259741 0.310659,-0.230401 0.331747,-0.198841 0.349638,-0.165367 0.364164,-0.130299 0.375182,-0.09398 0.382587,-0.05675 L 25,40.516326 l 0.386307,0.01898 0.382587,0.05675 0.375182,0.09398 0.364164,0.130299 0.349638,0.165367 0.331747,0.198841 0.310659,0.230401 0.28658,0.259741 0.25974,0.28658 0.230401,0.310659 0.198841,0.331746 0.165367,0.349639 0.1303,0.364163 0.09398,0.375182 0.05675,0.382587 0.01898,0.386307 -0.01898,0.386307 -0.05675,0.382587 -0.09398,0.375182 -0.1303,0.364164 -0.165367,0.349639 -0.198841,0.331746 -0.230401,0.310659 z" - transform="matrix(0,0.95,-0.95,0,47.806603,1.7010613)" /> - <path - style="fill:#ffffff;stroke:none;stroke-width:0.84130847px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 9.0513062,23.758841 c -1.5224694,5.64797 0.8106772,8.495757 4.4978728,9.890942 l 0.420654,-0.673047 C 8.3833763,30.233472 9.3915535,25.423457 9.2978739,24.11563 9.2827431,23.904424 9.150848,23.762548 9.0513062,23.758841 Z" - id="path5359" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cccsc" /> - <path - style="fill:#ffffff;stroke-width:0.76650214" - d="m 19.617688,23.128129 c -0.279006,-0.14257 -0.415444,-0.213854 -0.415444,-0.213854 -0.382484,-0.149468 -0.499759,-0.428474 -0.363322,-0.83702 0.149468,-0.376353 0.441505,-0.505892 0.876112,-0.376353 1.492379,0.544983 2.524858,1.548334 3.096668,3.004688 0.09045,0.415444 -0.05825,0.700584 -0.454535,0.85695 -0.395515,0.123407 -0.662258,-0.01303 -0.797928,-0.421577 -0.104246,-0.213853 -0.17553,-0.357189 -0.226886,-0.415443 -0.142569,0.110376 -0.324229,0.187793 -0.551881,0.226883 -0.774167,0.123407 -1.226403,-0.213853 -1.34981,-1.025579 -0.03909,-0.279006 0.02606,-0.544983 0.188559,-0.797929" - id="path3879" - inkscape:connector-curvature="0" /> - <path - style="fill:none;stroke:#ffffff;stroke-width:1.29790962;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 24.329544,34.771886 c 1.291628,-3.108895 2.461658,-6.045308 2.10449,-9.095101 -0.177235,-1.513395 -0.549622,-2.056607 -0.199499,-3.345737 0.44569,-1.640989 1.539073,-3.115915 2.735886,-4.344174" - id="path7508" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cssc" /> - <path - style="fill:none;stroke:#ffffff;stroke-width:1.29790962;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 18.525608,34.64224 c 0.830395,-0.939643 0.643587,-0.695011 1.204359,-1.891915" - id="path7512" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cc" /> - <path - sodipodi:type="star" - style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60862446;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" - id="path14581" - sodipodi:sides="64" - sodipodi:cx="25.120873" - sodipodi:cy="6.1821945" - sodipodi:r1="3.7441592" - sodipodi:r2="3.7396493" - sodipodi:arg1="0.78539816" - sodipodi:arg2="0.83448555" - inkscape:flatsided="true" - inkscape:rounded="0" - inkscape:randomized="0" - d="M 27.768393,8.8297151 27.496142,9.0764689 27.201016,9.2953493 26.885857,9.4842483 26.5537,9.6413468 26.207745,9.7651317 25.851322,9.854411 25.487864,9.9083248 25.120873,9.9263539 24.753881,9.9083248 24.390423,9.854411 24.034,9.7651317 23.688045,9.6413468 23.355888,9.4842484 23.040729,9.2953493 22.745603,9.0764689 22.473352,8.8297151 22.226598,8.5574642 22.007718,8.2623381 21.818819,7.9471792 21.66172,7.6150224 21.537936,7.2690668 21.448656,6.912644 l -0.05391,-0.3634575 -0.01803,-0.3669918 0.01803,-0.3669918 0.05391,-0.3634574 0.08928,-0.3564228 0.123784,-0.3459557 0.157099,-0.3321567 0.188899,-0.315159 0.21888,-0.295126 0.246754,-0.272251 0.272251,-0.2467538 0.295126,-0.2188804 0.315159,-0.188899 0.332157,-0.1570985 0.345955,-0.1237849 0.356423,-0.089279 0.363458,-0.053914 0.366991,-0.018029 0.366992,0.018029 0.363458,0.053914 0.356423,0.089279 0.345955,0.1237849 0.332157,0.1570985 0.315159,0.188899 0.295126,0.2188804 0.272251,0.2467538 0.246754,0.2722509 0.21888,0.2951261 0.188899,0.315159 0.157099,0.3321567 0.123784,0.3459556 0.08928,0.3564229 0.05391,0.3634574 0.01803,0.3669918 -0.01803,0.3669918 -0.05391,0.3634574 -0.08928,0.3564228 -0.123784,0.3459557 -0.157099,0.3321567 -0.188899,0.315159 -0.21888,0.2951261 z" /> - <path - d="m 27.768393,46.58325 -0.272251,0.246754 -0.295126,0.218881 -0.315159,0.188899 -0.332157,0.157098 -0.345955,0.123785 -0.356423,0.08928 -0.363458,0.05391 -0.366991,0.01803 -0.366992,-0.01803 -0.363458,-0.05391 -0.356423,-0.08928 -0.345955,-0.123785 -0.332157,-0.157098 -0.315159,-0.188899 -0.295126,-0.218881 -0.272251,-0.246754 -0.246754,-0.272251 -0.21888,-0.295126 -0.188899,-0.315159 -0.157099,-0.332156 -0.123784,-0.345956 -0.08928,-0.356423 -0.05391,-0.363457 -0.01803,-0.366992 0.01803,-0.366992 0.05391,-0.363457 0.08928,-0.356423 0.123784,-0.345956 0.157099,-0.332156 0.188899,-0.315159 0.21888,-0.295126 0.246754,-0.272251 0.272251,-0.246754 0.295126,-0.218881 0.315159,-0.188899 0.332157,-0.157098 0.345955,-0.123785 0.356423,-0.08928 0.363458,-0.05391 0.366991,-0.01803 0.366992,0.01803 0.363458,0.05391 0.356423,0.08928 0.345955,0.123785 0.332157,0.157098 0.315159,0.188899 0.295126,0.218881 0.272251,0.246754 0.246754,0.272251 0.21888,0.295126 0.188899,0.315159 0.157099,0.332156 0.123784,0.345956 0.08928,0.356423 0.05391,0.363457 0.01803,0.366992 -0.01803,0.366992 -0.05391,0.363457 -0.08928,0.356423 -0.123784,0.345956 -0.157099,0.332156 -0.188899,0.315159 -0.21888,0.295126 z" - inkscape:randomized="0" - inkscape:rounded="0" - inkscape:flatsided="true" - sodipodi:arg2="0.83448555" - sodipodi:arg1="0.78539816" - sodipodi:r2="3.7396493" - sodipodi:r1="3.7441592" - sodipodi:cy="43.935729" - sodipodi:cx="25.120873" - sodipodi:sides="64" - id="path14583" - style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60862446;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" - sodipodi:type="star" /> - <path - d="M 27.786864,7.5038459 27.500284,7.7635868 27.189625,7.9939873 26.857878,8.1928283 26.50824,8.3581951 26.144076,8.488495 25.768894,8.5824732 25.386307,8.6392246 25,8.6582026 24.613693,8.6392246 24.231106,8.5824732 23.855924,8.488495 23.49176,8.3581951 23.142122,8.1928283 22.810375,7.9939873 22.499716,7.7635869 22.213136,7.503846 21.953396,7.2172661 21.722995,6.906607 21.524154,6.5748608 21.358787,6.2252221 l -0.1303,-0.3641639 -0.09398,-0.3751819 -0.05675,-0.3825868 -0.01898,-0.3863071 0.01898,-0.3863072 0.05675,-0.3825868 0.09398,-0.3751819 0.1303,-0.3641638 0.165367,-0.3496387 0.198841,-0.3317463 0.230401,-0.310659 0.25974,-0.2865799 0.28658,-0.2597409 0.310659,-0.2304004 0.331747,-0.1988411 0.349638,-0.1653668 0.364164,-0.13029989 0.375182,-0.0939782 0.382587,-0.0567514 L 25,0.77576208 l 0.386307,0.018978 0.382587,0.0567514 0.375182,0.0939782 0.364164,0.1302999 0.349638,0.1653668 0.331747,0.1988411 0.310659,0.2304004 0.28658,0.2597409 0.25974,0.2865799 0.230401,0.310659 0.198841,0.3317463 0.165367,0.3496386 0.1303,0.3641639 0.09398,0.3751819 0.05675,0.3825868 0.01898,0.3863072 -0.01898,0.3863071 -0.05675,0.3825868 -0.09398,0.3751819 -0.1303,0.3641639 -0.165367,0.3496386 -0.198841,0.3317463 -0.230401,0.310659 z" - inkscape:randomized="0" - inkscape:rounded="0" - inkscape:flatsided="true" - sodipodi:arg2="0.83448555" - sodipodi:arg1="0.78539816" - sodipodi:r2="3.9364729" - sodipodi:r1="3.9412203" - sodipodi:cy="4.7169824" - sodipodi:cx="25" - sodipodi:sides="64" - id="path14585" - style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" - sodipodi:type="star" - transform="matrix(0,0.95,-0.95,0,49.262972,1.7010613)" /> + style="fill:#b22222;stroke:#000000;stroke-width:2.31937" + d="m 1001.38,1832.1886 c -39.68505,-7.0772 -75.02345,-32.2286 -95.45407,-67.9376 -21.25638,-37.1523 -21.37604,-95.589 -0.27125,-132.4764 10.89005,-19.0338 28.95274,-35.9683 54.63044,-51.2181 3.55589,-2.1118 1.04506,-5.7062 -20.2524,-28.9921 -50.29807,-54.9942 -97.8562,-97.4176 -195.5163,-174.4069 -87.07894,-68.6477 -111.49189,-99.4061 -134.423,-169.3621 -16.51279,-50.3757 -18.66368,-63.721 -18.59505,-115.3741 0.0893,-67.2689 7.39393,-100.6648 32.85312,-150.20221 16.66889,-32.43355 29.18938,-49.76489 49.60848,-68.66983 16.97168,-15.7132 59.87612,-45.4002 94.37803,-65.30335 14.17854,-8.1792 18.85707,-12.03593 17.9341,-14.78394 -0.68681,-2.04487 -24.01181,-60.07851 -51.83335,-128.96367 l -50.5846,-125.24576 16.41494,-6.45924 c 39.09328,-15.38313 130.21966,-37.87882 171.23265,-42.27093 9.6404,-1.0324 15.65568,-2.7395 15.65568,-4.443 0,-1.52153 -7.56693,-10.6712 -16.81541,-20.33259 -19.1029,-19.9558 -61.04944,-48.64292 -79.43827,-54.32763 -6.66732,-2.06114 -24.41356,-4.0735 -41.74859,-4.73415 -28.19458,-1.07451 -36.55024,-0.20503 -128.7248,13.39503 -93.59186,13.80918 -101.09295,14.57798 -148.43941,15.21422 -98.33847,1.32144 -147.21685,-7.96129 -212.72091,-40.39887 -23.00263,-11.39089 -51.6868,-32.1845 -51.6868,-37.46858 0,-1.49762 91.60139,-152.92249 93.89453,-155.21563 0.49214,-0.49214 4.39946,1.77833 8.68293,5.04549 22.28363,16.99655 56.26452,26.27892 108.48483,29.63419 l 38.26954,2.45891 142.641,-20.12454 c 78.45254,-11.06849 154.24877,-20.70398 168.43603,-21.4122 46.32015,-2.31227 77.51576,5.06583 129.60247,30.65239 32.09237,15.76473 69.95855,43.51679 89.19581,65.37148 11.95072,13.57673 23.72853,37.63867 30.73723,62.79563 2.922,10.48828 5.8346,19.0696 6.4724,19.0696 0.6378,0 3.5449,-8.60275 6.4601,-19.1172 7.0485,-25.42218 16.5664,-45.32961 27.4913,-57.49997 14.8169,-16.5062 58.7505,-52.93964 78.4984,-65.09752 22.2312,-13.68671 58.3527,-28.14897 82.859,-33.17492 35.1123,-7.20112 57.7897,-5.40822 220.995,17.47216 l 150.7811,21.13857 35.9502,-2.44678 c 50.8848,-3.46323 89.8636,-14.2889 111.0223,-30.83448 3.0202,-2.36168 6.2932,-3.79831 7.2734,-3.19251 2.0752,1.28251 91.876,146.89376 93.9911,152.40582 3.4151,8.89962 -46.0577,40.38553 -88.6416,56.41408 -44.685,16.81937 -78.6753,22.07964 -150.827,23.34172 -53.2544,0.93153 -64.2086,0.48997 -88.1359,-3.55273 -15.0278,-2.53906 -62.2877,-9.44518 -105.022,-15.34693 -69.0316,-9.53349 -81.0622,-10.6087 -107.8506,-9.63896 -36.1015,1.30687 -47.646,4.70954 -76.7848,22.63183 -20.8229,12.80749 -61.2174,50.03607 -61.2174,56.41945 0,2.19345 4.274,3.75304 13.3363,4.86642 36.1666,4.44335 98.9431,19.40032 152.7622,36.3967 l 37.3736,11.80281 -51.878,128.80464 c -28.5329,70.84254 -51.6134,129.03578 -51.2899,129.3183 0.3235,0.2825 16.2751,10.318 35.4481,22.30112 74.2055,46.37853 101.6667,73.47477 128.4234,126.71691 21.9093,43.59628 31.3835,87.89135 31.3542,146.59065 -0.021,40.3905 -3.1992,60.6357 -16.3442,104.085 -23.24,76.8169 -55.4753,119.547 -135.385,179.4618 -77.8737,58.3883 -137.634,110.836 -184.6502,162.0553 -40.2461,43.844 -38.1758,39.2708 -22.2329,49.1113 76.8351,47.4253 81.6693,160.2541 9.3166,217.4456 -29.577,23.3793 -70.0827,33.9595 -105.6968,27.6083 z m 45.7354,-518.2274 c 12.6126,-6.5222 13.9945,-13.504 13.9945,-70.7066 v -51.1006 h 49.9408 c 55.9386,0 62.6909,-1.3729 70.6067,-14.3564 3.4274,-5.6216 4.6809,-11.7147 4.6809,-22.7534 0,-11.0387 -1.2535,-17.1319 -4.6809,-22.7534 -7.9158,-12.9835 -14.6681,-14.3565 -70.6067,-14.3565 h -49.9408 v -50.683 c 0,-48.9419 -0.1821,-50.9538 -5.2989,-58.564 -12.3193,-18.32216 -51.3027,-18.32216 -63.62196,0 -5.11685,7.6102 -5.29889,9.6221 -5.29889,58.564 v 50.683 h -48.78118 c -51.87795,0 -59.17071,1.2293 -68.3468,11.5202 -3.89236,4.3653 -4.63873,8.4827 -4.63873,25.5897 0,17.1069 0.74637,21.2243 4.63873,25.5896 9.17609,10.291 16.46885,11.5202 68.3468,11.5202 h 48.78118 v 52.3009 c 0,63.2867 0.83963,65.9522 23.05825,73.2001 8.5007,2.7729 28.5065,0.7847 37.167,-3.6938 z m 49.0048,-437.40333 c 19.6517,-1.36497 45.6456,-3.71333 57.7643,-5.21857 l 22.034,-2.73681 1.4307,-15.07588 c 1.0504,-11.06845 5.1957,-23.98043 15.5944,-48.57466 7.7901,-18.42432 13.6923,-33.97027 13.116,-34.54654 -0.5763,-0.57627 -13.3342,0.67406 -28.351,2.77849 -57.619,8.07466 -77.8861,9.33354 -151.3892,9.40352 -74.58956,0.071 -100.46218,-1.51696 -154.81578,-9.50196 -14.35003,-2.10812 -26.63998,-3.28394 -27.31102,-2.6129 -0.67104,0.67104 4.68538,16.24064 11.90313,34.59911 8.97766,22.83483 13.57532,38.14144 14.55451,48.45494 l 1.4313,15.07588 24.35334,2.85716 c 63.6325,7.46543 138.19612,9.36915 199.68532,5.09822 z m 50.6165,-193.30316 c 37.4044,-4.04651 100.2599,-14.54013 102.3934,-17.0944 2.8078,-3.36162 41.8406,-100.76455 40.7978,-101.80738 -0.5934,-0.59332 -12.9199,1.55622 -27.3924,4.77678 -151.8852,33.79898 -335.38904,33.56934 -482.04212,-0.60324 -10.82831,-2.52317 -20.12444,-4.151 -20.65808,-3.61736 -0.53362,0.53364 8.46032,23.68138 19.98657,51.43941 l 20.9568,50.46914 19.41587,4.02016 c 25.04472,5.18562 81.6526,12.77725 115.66956,15.51234 39.25656,3.15638 170.953,1.22316 210.8726,-3.09545 z M 988.30167,469.98768 c -1.72408,-19.02583 -9.69945,-50.1926 -17.14436,-66.99788 l -4.88062,-11.01699 h -46.70553 -46.70551 l 13.52413,11.50307 c 16.9296,14.3996 36.36791,37.02786 54.37347,63.29648 l 13.9106,20.29445 h 17.58773 17.58775 z m 110.14763,8.38151 c 12.0271,-19.93759 37.6167,-51.694 55.1667,-68.46114 l 18.7726,-17.93524 h -45.9896 -45.9896 l -2.9633,6.37826 c -10.2625,22.08988 -18.6556,56.33199 -18.6556,76.11087 v 12.60487 h 17.2061 17.206 z" + id="path194" /> </svg> diff --git a/client/public/images/pieces/Cwda/bi.svg b/client/public/images/pieces/Cwda/bi.svg new file mode 100644 index 00000000..b31c14ed --- /dev/null +++ b/client/public/images/pieces/Cwda/bi.svg @@ -0,0 +1,93 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="100%" + width="100%" + version="1.1" + viewBox="0 0 2048 2048" + id="svg18" + sodipodi:docname="bi.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <metadata + id="metadata24"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs22" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="960" + inkscape:window-height="1060" + id="namedview20" + showgrid="false" + inkscape:zoom="0.43115234" + inkscape:cx="1024" + inkscape:cy="1024" + inkscape:window-x="0" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:current-layer="svg18" /> + <path + style="color:#000000" + d="m 490,643 q 4,9 13,27 17,42 17,50 -2,28 -29,28 -20,0 -47,-57 -4,-8 -12,-14 -27,-28 8,-47 32,-19 50,13 z m 590,371 q 70,92 69,205 -4,33 -38,33 -46,0 -36,-34 3,-55 -11,-91 -23,-57 -51,-85 -15,-30 18,-44 32,-15 49,16 z m -261,488 q -5,36 2,78 -60,-12 -113,-56 -32,-17 -15,-47 17,-31 47,-10 21,11 38,20 17,9 41,15 z M 1756,234 q -1,0 2,54 3,54 3,118 1,125 0,258 -1,133 -36,267 -34,128 -75,218 -41,90 -89,157 -72,108 -196,183 -124,75 -259,98 4,-23 3,-47 -1,-24 0,-46 97,-33 183,-82 86,-49 126,-106 48,-66 89,-156 41,-90 75,-219 34,-133 35,-266 1,-133 1,-259 0,-63 -3,-117 -3,-54 0,-55 z m -677,1423 q 157,-10 291,-81 134,-71 228,-182 66,-78 124,-188 58,-110 94,-233 40,-143 50,-300 10,-157 11,-292 V 163 q 0,0 -155,0 -155,0 -404,0 H 647 q -9,0 -9,49 0,49 7,79 4,24 19,68 15,44 50,107 16,32 76,93 60,61 138,143 45,46 70,116 25,70 22,127 -37,-30 -81,-49 -212,-76 -307,-220 -7,-9 -45,-81 -20,-38 -34,-52 -19,-19 -55,-21 -56,-3 -87,54 -42,-12 -75,-10 -56,21 -81,45 -51,51 -66,102 -15,51 -16,110 0,84 104,222 122,159 130,242 0,36 7,81 6,31 25,60 13,20 17,27 4,7 17,23 9,12 15,18 6,6 15,18 11,13 28,30 -53,146 -43,301 199,-71 334,-223 33,113 130,183 80,-56 127,-148 z M 404,821 q 29,20 6,48 -24,23 -53,4 -61,-40 -65,-105 1,-33 39,-31 36,3 35,37 8,32 38,47 z m 252,498 q 22,11 22,11 30,12 19,44 -12,30 -46,20 -118,-43 -163,-158 -7,-33 24,-45 31,-10 42,22 8,17 12,22 11,-9 29,-12 61,-10 71,54 3,22 -10,42 z" + fill-rule="nonzero" + display="block" + fill="#000000" + id="path2" /> + <g + fill-rule="nonzero" + fill="#ffffff" + id="g16" + transform="matrix(1,0,0,-1,0,2008)"> + <path + style="color:#000000" + d="m 490,1365 q 4,-9 13,-27 17,-42 17,-50 -2,-28 -29,-28 -20,0 -47,57 -4,8 -12,14 -27,28 8,47 32,19 50,-13 z" + display="block" + id="path4" /> + <path + style="color:#000000" + d="m 1080,994 q 70,-92 69,-205 -4,-33 -38,-33 -46,0 -36,34 3,55 -11,91 -23,57 -51,85 -15,30 18,44 32,15 49,-16 z" + display="block" + id="path6" /> + <path + style="color:#000000" + d="m 819,506 q -5,-36 2,-78 -60,12 -113,56 -32,17 -15,47 17,31 47,10 21,-11 38,-20 17,-9 41,-15 z" + display="block" + id="path8" /> + <path + style="color:#000000" + d="m 1756,1774 q -1,0 2,-54 3,-54 3,-118 1,-125 0,-258 -1,-133 -36,-267 -34,-128 -75,-218 -41,-90 -89,-157 -72,-108 -196,-183 -124,-75 -259,-98 4,23 3,47 -1,24 0,46 97,33 183,82 86,49 126,106 48,66 89,156 41,90 75,219 34,133 35,266 1,133 1,259 0,63 -3,117 -3,54 0,55 z" + display="block" + id="path10" /> + <path + style="color:#000000" + d="m 404,1187 q 29,-20 6,-48 -24,-23 -53,-4 -61,40 -65,105 1,33 39,31 36,-3 35,-37 8,-32 38,-47 z" + display="block" + id="path12" /> + <path + style="color:#000000" + d="m 656,689 q 22,-11 22,-11 30,-12 19,-44 -12,-30 -46,-20 -118,43 -163,158 -7,33 24,45 31,10 42,-22 8,-17 12,-22 11,9 29,12 61,10 71,-54 3,-22 -10,-42 z" + display="block" + id="path14" /> + </g> +</svg> diff --git a/client/public/images/pieces/Cwda/bl.svg b/client/public/images/pieces/Cwda/bl.svg new file mode 100644 index 00000000..1e669b49 --- /dev/null +++ b/client/public/images/pieces/Cwda/bl.svg @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="100%" + width="100%" + version="1.1" + viewBox="0 0 2048 2048" + id="svg12" + sodipodi:docname="bl.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <metadata + id="metadata18"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs16" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="960" + inkscape:window-height="1060" + id="namedview14" + showgrid="false" + inkscape:zoom="0.43115234" + inkscape:cx="1024" + inkscape:cy="1024" + inkscape:window-x="0" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:current-layer="svg12" /> + <path + style="color:#000000" + d="m 1588,765 q -83,30 -233,49 -150,19 -333,20 -178,0 -326,-18 -148,-18 -233,-49 l 50,-91 q 84,25 218,36 134,11 293,11 159,0 294,-11 135,-11 219,-37 z m 226,668 q -57,0 -97,39 -40,39 -40,97 0,56 40,96 40,40 97,41 56,0 96,-40 40,-40 40,-97 0,-57 -40,-96 -40,-39 -96,-40 z m -1578,0 q -57,0 -96,39 -39,39 -40,97 0,56 39,96 39,40 97,41 57,0 97,-40 40,-40 40,-97 0,-57 -40,-96 -40,-39 -97,-40 z m 1208,110 q -57,0 -96,39 -39,39 -40,97 0,56 39,96 39,40 97,40 57,0 97,-40 40,-40 40,-96 0,-57 -40,-96 -40,-39 -97,-40 z m -840,0 q -57,0 -97,39 -40,39 -40,97 0,56 40,96 40,40 97,40 56,0 96,-40 40,-40 40,-96 0,-57 -40,-96 -40,-39 -96,-40 z M 1640,255 q -49,-43 -220,-72 -171,-29 -394,-29 -227,0 -399,30 -172,30 -217,75 l 63,240 -28,157 -88,153 -85,622 49,19 274,-462 6,550 68,12 209,-553 112,595 h 69 l 112,-593 207,551 69,-12 6,-550 275,463 47,-22 -83,-619 -89,-153 -28,-159 z m -96,32 -30,118 q -195,45 -490,45 -292,0 -488,-45 L 504,286 q 190,58 521,58 159,0 295,-16 136,-16 224,-41 z m -26,299 q -184,51 -490,51 -308,0 -496,-52 l 15,-101 q 189,49 481,49 291,0 474,-48 z m -494,1007 q -57,0 -96,40 -39,40 -40,97 0,56 39,96 39,40 97,40 56,0 96,-40 40,-40 41,-96 0,-57 -40,-97 -40,-40 -97,-40 z" + fill-rule="nonzero" + display="block" + fill="#000000" + id="path2" /> + <g + fill-rule="nonzero" + fill="#ffffff" + id="g10" + transform="matrix(1,0,0,-1,0,2020)"> + <path + style="color:#000000" + d="m 1588,1255 q -83,-30 -233,-49 -150,-19 -333,-20 -178,0 -326,18 -148,18 -233,49 l 50,91 q 84,-25 218,-36 134,-11 293,-11 159,0 294,11 135,11 219,37 z" + display="block" + id="path4" /> + <path + style="color:#000000" + d="m 1544,1733 -30,-118 q -195,-45 -490,-45 -292,0 -488,45 l -32,119 q 190,-58 521,-58 159,0 295,16 136,16 224,41 z" + display="block" + id="path6" /> + <path + style="color:#000000" + d="m 1518,1434 q -184,-51 -490,-51 -308,0 -496,52 l 15,101 q 189,-49 481,-49 291,0 474,48 z" + display="block" + id="path8" /> + </g> +</svg> diff --git a/client/public/images/pieces/Cwda/bo.svg b/client/public/images/pieces/Cwda/bo.svg new file mode 100644 index 00000000..282d9217 --- /dev/null +++ b/client/public/images/pieces/Cwda/bo.svg @@ -0,0 +1,103 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="100%" + width="100%" + version="1.1" + viewBox="0 0 2048 2048" + id="svg12" + sodipodi:docname="bo.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <metadata + id="metadata18"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs16" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="960" + inkscape:window-height="1060" + id="namedview14" + showgrid="false" + inkscape:zoom="0.43115234" + inkscape:cx="1024" + inkscape:cy="1024" + inkscape:window-x="0" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:current-layer="svg12" + inkscape:document-rotation="0" /> + <path + style="color:#000000" + d="m 1588,765 q -83,30 -233,49 -150,19 -333,20 -178,0 -326,-18 -148,-18 -233,-49 l 50,-91 q 84,25 218,36 134,11 293,11 159,0 294,-11 135,-11 219,-37 z m 226,668 q -57,0 -97,39 -40,39 -40,97 0,56 40,96 40,40 97,41 56,0 96,-40 40,-40 40,-97 0,-57 -40,-96 -40,-39 -96,-40 z m -1578,0 q -57,0 -96,39 -39,39 -40,97 0,56 39,96 39,40 97,41 57,0 97,-40 40,-40 40,-97 0,-57 -40,-96 -40,-39 -97,-40 z m 1208,110 q -57,0 -96,39 -39,39 -40,97 0,56 39,96 39,40 97,40 57,0 97,-40 40,-40 40,-96 0,-57 -40,-96 -40,-39 -97,-40 z m -840,0 q -57,0 -97,39 -40,39 -40,97 0,56 40,96 40,40 97,40 56,0 96,-40 40,-40 40,-96 0,-57 -40,-96 -40,-39 -96,-40 z M 1640,255 q -49,-43 -220,-72 -171,-29 -394,-29 -227,0 -399,30 -172,30 -217,75 l 63,240 -28,157 -88,153 -85,622 49,19 274,-462 6,550 68,12 209,-553 112,595 h 69 l 112,-593 207,551 69,-12 6,-550 275,463 47,-22 -83,-619 -89,-153 -28,-159 z m -96,32 -30,118 q -195,45 -490,45 -292,0 -488,-45 L 504,286 q 190,58 521,58 159,0 295,-16 136,-16 224,-41 z m -26,299 q -184,51 -490,51 -308,0 -496,-52 l 15,-101 q 189,49 481,49 291,0 474,-48 z m -494,1007 q -57,0 -96,40 -39,40 -40,97 0,56 39,96 39,40 97,40 56,0 96,-40 40,-40 41,-96 0,-57 -40,-97 -40,-40 -97,-40 z" + fill-rule="nonzero" + display="block" + fill="#000000" + id="path2" /> + <g + fill-rule="nonzero" + fill="#ffffff" + id="g10" + transform="matrix(1,0,0,-1,0,2020)"> + <path + style="color:#000000" + d="m 1588,1255 q -83,-30 -233,-49 -150,-19 -333,-20 -178,0 -326,18 -148,18 -233,49 l 50,91 q 84,-25 218,-36 134,-11 293,-11 159,0 294,11 135,11 219,37 z" + display="block" + id="path4" /> + <path + style="color:#000000" + d="m 1544,1733 -30,-118 q -195,-45 -490,-45 -292,0 -488,45 l -32,119 q 190,-58 521,-58 159,0 295,16 136,16 224,41 z" + display="block" + id="path6" /> + <path + style="color:#000000" + d="m 1518,1434 q -184,-51 -490,-51 -308,0 -496,52 l 15,101 q 189,-49 481,-49 291,0 474,48 z" + display="block" + id="path8" /> + </g> + <path + style="fill:#b22222;stroke:#000000;stroke-width:2.31937" + d="m 990.63576,1587.0261 c -1.5896,-5.3512 -110.43644,-584.203 -110.43644,-587.30536 0,-1.3164 -0.8462,-2.39345 -1.88045,-2.39345 -1.03425,0 -48.74402,124.01991 -106.02169,275.59971 l -104.14124,275.5997 -32.56042,-5.6873 c -17.90822,-3.128 -32.71901,-5.8161 -32.91287,-5.9734 -0.67271,-0.5461 -5.47764,-432.0051 -5.46185,-490.4455 0.009,-37.9684 -0.80094,-58.48369 -2.29276,-57.9841 -1.26978,0.42521 -62.94003,103.0571 -137.04501,228.071 -74.10499,125.0138 -135.61488,228.2153 -136.68866,229.3366 -1.10856,1.1576 -11.87421,-1.8495 -24.91029,-6.9581 l -22.95798,-8.9969 42.39325,-310.0446 42.39325,-310.04454 43.89892,-76.18875 43.89892,-76.18876 14.20485,-79.28631 14.20485,-79.28632 -31.42828,-119.65781 -31.42829,-119.65781 5.3305,-4.52944 c 51.45416,-43.72167 205.12172,-78.05612 421.65666,-94.21214 77.94429,-5.81555 297.79297,-5.81555 375.73727,0 154.5719,11.53286 277.9724,32.20091 356.0227,59.62934 22.9502,8.06519 52.1299,22.48687 61.9913,30.63844 l 6.3266,5.22961 -32.3908,120.60703 -32.3909,120.60702 14.0146,80.01812 14.0145,80.01812 44.1964,76.1054 c 24.308,41.85794 44.6061,77.86609 45.1069,80.01812 1.0163,4.36695 82.0759,609.23218 82.0759,612.44878 0,2.2786 -38.2075,21.1718 -42.8155,21.1718 -1.6175,0 -64.2874,-103.3278 -139.2664,-229.6173 -74.9791,-126.2894 -137.0559,-229.61717 -137.9484,-229.61717 -0.8925,0 -2.3172,76.45207 -3.1661,169.89357 -0.8488,93.4414 -2.2224,216.9801 -3.0522,274.5304 l -1.5088,104.637 -32.6876,5.7309 -32.6875,5.731 -3.7723,-8.3158 c -2.0748,-4.5737 -48.9352,-128.6237 -104.1343,-275.6666 -55.1991,-147.043 -100.8315,-266.88131 -101.4054,-266.30743 -1.0856,1.08563 -111.7829,584.80223 -111.8704,589.90283 -0.038,2.1832 -8.3175,2.8992 -33.5243,2.8992 -29.87493,0 -33.60419,-0.4364 -34.68024,-4.0588 z M 1131.8505,832.67036 c 134.0802,-5.47702 245.2875,-17.4699 344.4258,-37.14371 40.2293,-7.98342 88.9165,-20.50535 107.4526,-27.63587 l 6.5602,-2.52356 -4.5377,-7.52621 c -2.4957,-4.13939 -14.1187,-24.48654 -25.8288,-45.21587 -11.7102,-20.72933 -22.7212,-37.6897 -24.469,-37.6897 -1.7477,0 -12.9074,2.61333 -24.7993,5.80739 -100.6107,27.02335 -263.0027,40.55474 -486.6543,40.55066 -162.82711,-0.002 -295.31158,-7.43739 -395.45187,-22.19097 -28.27908,-4.16633 -86.29041,-15.95538 -101.84087,-20.69608 -6.26208,-1.90904 -12.17542,-3.471 -13.14076,-3.471 -3.14998,0 -51.53898,90.70268 -49.42306,92.64095 3.24039,2.9683 36.609,13.31427 66.99132,20.77069 96.01038,23.56285 232.15372,39.64556 381.53568,45.07112 46.73281,1.69733 169.58256,1.27818 219.18006,-0.74784 z m 25.513,-197.18399 c 125.5572,-5.64749 232.6364,-18.01713 309.6354,-35.76861 46.2573,-10.66426 49.2066,-11.52238 50.4138,-14.66822 0.6666,-1.73712 -2.248,-25.01571 -6.4769,-51.73024 -5.7588,-36.37962 -8.5025,-48.57185 -10.9304,-48.57185 -1.7829,0 -11.2433,2.02068 -21.0233,4.49041 -73.4766,18.55504 -193.9285,33.8093 -312.2342,39.54194 -62.5147,3.02923 -216.6094,3.03085 -277.51092,0.002 -120.12046,-5.9722 -220.04315,-18.37399 -310.24867,-38.50618 -14.50139,-3.23644 -27.70967,-6.39998 -29.35169,-7.03009 -3.63667,-1.39554 -4.05418,0.50247 -11.55427,52.52703 -3.2183,22.32389 -6.33994,42.78202 -6.93696,45.46249 -0.99086,4.44864 1.08483,5.40716 23.80527,10.99296 98.63593,24.2495 218.79436,38.94969 360.03915,44.04715 47.73823,1.72287 197.35109,1.23538 242.37369,-0.78972 z m 82.3375,-191.0884 c 83.6212,-6.47782 140.8414,-13.16794 200.4465,-23.43587 34.3455,-5.91658 72.8761,-13.91723 74.3565,-15.43969 1.0899,-1.12093 31.3132,-118.73431 30.6752,-119.37226 -0.2886,-0.28858 -10.4303,2.00509 -22.5371,5.09705 -148.5852,37.94708 -370.9623,56.93092 -587.36888,50.1424 -174.3584,-5.46951 -295.66816,-20.10664 -400.21474,-48.28956 -16.97671,-4.57646 -31.20396,-7.94678 -31.61609,-7.48961 -0.90367,1.00247 30.42113,117.98206 32.02191,119.58282 1.88718,1.88719 38.68044,9.5931 74.93574,15.6944 83.87231,14.11462 144.87678,20.28692 273.27833,27.64967 7.65391,0.4389 80.19207,0.51583 161.19593,0.17094 107.9142,-0.45942 159.9883,-1.6115 194.8267,-4.31031 z" + id="path254" /> + <path + style="fill:#b22222;stroke:#000000;stroke-width:2.31937" + d="m 211.06228,1702.3635 c -40.19618,-8.0682 -77.21899,-36.4428 -95.26113,-73.009 -19.222869,-38.9592 -19.222869,-81.6479 0,-120.607 35.35448,-71.6533 125.71589,-96.2252 193.01271,-52.4858 73.64181,47.8633 84.60195,146.5692 23.07511,207.8121 -32.72531,32.5743 -77.93061,46.8997 -120.82669,38.2897 z" + id="path256" /> + <path + style="fill:#b22222;stroke:#000000;stroke-width:2.31937" + d="m 575.3614,1811.0409 c -31.01786,-5.9234 -64.95729,-29.5146 -84.50304,-58.738 -16.19805,-24.2181 -21.59757,-42.3652 -21.74497,-73.0821 -0.0983,-20.4875 0.86416,-27.2353 6.06328,-42.5089 7.76499,-22.8115 17.88033,-38.5781 35.32897,-55.0668 25.28745,-23.8962 49.38911,-34.2328 84.41168,-36.202 39.16039,-2.2018 71.1528,9.2226 99.61183,35.5713 28.12836,26.0426 41.35164,53.4444 43.47407,90.0887 2.35815,40.7137 -9.92257,72.1979 -39.82546,102.1007 -33.8572,33.8572 -75.87378,46.8017 -122.81636,37.8371 z" + id="path258" /> + <path + style="fill:#b22222;stroke:#000000;stroke-width:2.31937" + d="m 995.00793,1862.0717 c -20.59625,-3.871 -48.05656,-18.9318 -64.24114,-35.2336 -26.19284,-26.3825 -38.55801,-53.2916 -40.65729,-88.4785 -2.37601,-39.8254 12.07207,-77.0793 40.92585,-105.5261 26.45983,-26.0866 55.43969,-37.9016 92.96465,-37.9016 36.8754,0 65.5048,11.3374 92.1774,36.5027 28.1356,26.5457 42.4131,58.0565 42.7759,94.4066 0.3935,39.4434 -11.6724,69.0896 -39.5196,97.1007 -9.7542,9.8117 -23.6292,21.1647 -30.8332,25.2291 -25.3581,14.3063 -62.2673,19.7882 -93.59257,13.9007 z" + id="path260" /> + <path + style="fill:#b22222;stroke:#000000;stroke-width:2.31937" + d="m 1414.8131,1811.0457 c -30.9757,-5.8218 -65.4095,-30.4265 -85.0001,-60.737 -37.3987,-57.863 -20.9334,-141.0418 35.79,-180.8029 27.2093,-19.0727 53.44,-26.3528 87.0587,-24.1622 35.0115,2.2814 63.4058,15.399 88.5569,40.9116 26.5722,26.9541 38.0652,55.6325 37.7212,94.1253 -0.2637,29.5108 -5.9249,48.1899 -21.7982,71.9224 -31.479,47.065 -85.6041,69.4039 -142.3285,58.7428 z" + id="path262" /> + <path + style="fill:#b22222;stroke:#000000;stroke-width:2.31937" + d="m 1784.752,1701.1003 c -37.4639,-8.1129 -74.7598,-37.5935 -93.1408,-73.6232 -6.8569,-13.4406 -13.5551,-42.3052 -13.5098,-58.2173 0.1051,-36.8676 13.0288,-67.8094 39.4013,-94.3351 54.6279,-54.945 139.4617,-54.0241 193.5594,2.1012 26.1486,27.1288 37.0562,54.2562 37.0018,92.0251 -0.056,39.05 -12.5551,68.9908 -40.1827,96.2562 -33.314,32.8772 -77.4062,45.6946 -123.1292,35.7931 z" + id="path264" /> +</svg> diff --git a/client/public/images/pieces/Cwda/bs.svg b/client/public/images/pieces/Cwda/bs.svg index c34593d7..a4aadfe8 100644 --- a/client/public/images/pieces/Cwda/bs.svg +++ b/client/public/images/pieces/Cwda/bs.svg @@ -1,6 +1,4 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" @@ -9,70 +7,15 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="45" - height="45" - id="svg3128" - sodipodi:version="0.32" - inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" - version="1.0" - sodipodi:docname="bc.svg" - inkscape:output_extension="org.inkscape.output.svg.inkscape"> - <defs - id="defs3130"> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 22.5 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="45 : 22.5 : 1" - inkscape:persp3d-origin="22.5 : 15 : 1" - id="perspective15" /> - <inkscape:perspective - id="perspective12" - inkscape:persp3d-origin="22.5 : 15 : 1" - inkscape:vp_z="45 : 22.5 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_x="0 : 22.5 : 1" - sodipodi:type="inkscape:persp3d" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - gridtolerance="10000" - guidetolerance="10" - objecttolerance="10" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="11.313709" - inkscape:cx="21.843794" - inkscape:cy="17.466685" - inkscape:document-units="px" - inkscape:current-layer="layer1" - height="45px" - width="45px" - inkscape:grid-points="true" - showgrid="true" - inkscape:window-width="960" - inkscape:window-height="1060" - inkscape:window-x="0" - inkscape:window-y="20" - inkscape:window-maximized="0"> - <inkscape:grid - id="GridFromPre046Settings" - type="xygrid" - originx="0" - originy="0" - spacingx="0.5" - spacingy="0.5" - color="#0000ff" - empcolor="#0000ff" - opacity="0.2" - empopacity="0.4" - empspacing="5" /> - </sodipodi:namedview> + height="100%" + width="100%" + version="1.1" + viewBox="0 0 2048 2048" + id="svg16" + sodipodi:docname="bs.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> <metadata - id="metadata3133"> + id="metadata22"> <rdf:RDF> <cc:Work rdf:about=""> @@ -82,77 +25,69 @@ </cc:Work> </rdf:RDF> </metadata> + <defs + id="defs20" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="960" + inkscape:window-height="1060" + id="namedview18" + showgrid="false" + inkscape:zoom="0.43115234" + inkscape:cx="1024" + inkscape:cy="1024" + inkscape:window-x="0" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:current-layer="svg16" + inkscape:document-rotation="0" /> + <path + style="color:#000000" + d="m 1161,1706 h 170 v 137 h 274 V 1468 L 1383,1297 V 819 L 1553,649 V 444 h 153 V 205 H 341 v 239 h 153 v 205 l 171,170 v 478 l -222,171 v 375 h 273 v -137 h 171 v 137 h 274 z M 564,460 V 358 h 920 v 102 z m 460,1092 H 512 v -46 l 73,-55 h 879 l 71,55 v 46 z m 0,-169 H 674 l 60,-47 v -57 h 580 v 57 l 60,47 z m 0,-546 H 734 v -46 l -60,-58 h 700 l -60,58 v 46 z m 0,-172 H 610 l -46,-43 v -58 h 920 v 58 l -46,43 z" + fill-rule="nonzero" + display="block" + fill="#000000" + id="path2" /> <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - style="display:inline"> + fill-rule="nonzero" + fill="#ffffff" + id="g14" + transform="matrix(1,0,0,-1,0,2048)"> + <path + style="color:#000000" + d="m 564,1588 v 102 h 920 v -102 z" + display="block" + id="path4" /> <path - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 37.5,37.5 c -3.723781,-1.069562 -11.126219,0.473903 -14.85,-2.2 -3.723782,2.673903 -11.12622,1.130438 -14.8500002,2.2 0,0 -1.8104878,0.595658 -3.3,2.2 0.7447561,1.069561 1.8104878,1.08478 3.3,0.55 C 11.52378,39.180439 18.926218,40.754342 22.65,39.15 c 3.723781,1.604342 11.126219,0.03044 14.85,1.1 1.489512,0.53478 2.555244,0.519561 3.3,-0.55 -1.489512,-2.139123 -3.3,-2.2 -3.3,-2.2 z" - id="path4582" - sodipodi:nodetypes="ccccccccc" - inkscape:connector-curvature="0" /> + style="color:#000000" + d="M 1024,496 H 512 v 46 l 73,55 h 879 l 71,-55 v -46 z" + display="block" + id="path6" /> <path - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 30.9,33.1 c -2.75,2.75 -13.75,2.75 -16.5,0 -0.55,-1.65 0,-2.2 0,-2.2 h 16.5 c 0,0 0.55,0.55 0,2.2 z" - id="path4584" - sodipodi:nodetypes="ccccc" - inkscape:connector-curvature="0" /> + style="color:#000000" + d="M 1024,665 H 674 l 60,47 v 57 h 580 v -57 l 60,-47 z" + display="block" + id="path8" /> <path - style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 30.9,30.9 H 14.4" - id="path4590" - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" /> - <g - id="g3323" - inkscape:label="Layer 1" - transform="matrix(-0.84196464,0,0,-0.84196464,38.826174,36.60001)" - style="fill:#000000;fill-opacity:1"> - <path - sodipodi:nodetypes="cccc" - id="path3491" - d="M 22.028958,36 C 11.528958,35 5.5289585,28 6.0289585,7 H 29.028958 c 0,9 -10,6.5 -8,21" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - inkscape:connector-curvature="0" /> - <path - sodipodi:nodetypes="csccccccccccc" - id="path3495" - d="m 20.028958,28 c -0.384461,-2.911278 5.552936,-7.368624 8,-9 3,-2 2.819198,-4.342892 5,-4 1.04172,0.944016 -1.413429,3.037549 0,3 1,0 -0.187332,-1.231727 1,-2 1,0 4.003161,-0.999999 4,4 0,2 -6,12 -6,12 0,0 -1.885866,1.902129 -2,3.5 0.726047,0.994369 0.5,2 0.5,3 -1,1 -3,-2.5 -3,-2.5 h -2 c 0,0 -0.781781,1.991926 -2.5,3 -1,0 -1,-3 -1,-3" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - inkscape:connector-curvature="0" /> - <circle - transform="rotate(180,21.764479,22)" - id="path3499" - style="opacity:1;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - cx="8.5" - cy="23.5" - r="0.5" /> - <ellipse - transform="rotate(-149.99999,24.024104,20.986505)" - id="path3501" - style="opacity:1;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:1.50000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - cx="14.5" - cy="15.5" - rx="0.5" - ry="1.5" /> - <path - sodipodi:nodetypes="cc" - id="path8049" - d="m 7.0289585,7 c -1,20 5.4999995,27.5 11.9999995,28.5" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - inkscape:connector-curvature="0" /> - </g> + style="color:#000000" + d="M 1024,1211 H 734 v 46 l -60,58 h 700 l -60,-58 v -46 z" + display="block" + id="path10" /> <path - style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.64999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - d="M 14.4,30.9 H 30.9" - id="path3369" - inkscape:connector-curvature="0" /> + style="color:#000000" + d="M 1024,1383 H 610 l -46,43 v 58 h 920 v -58 l -46,-43 z" + display="block" + id="path12" /> </g> - <g - inkscape:groupmode="layer" - id="layer2" - inkscape:label="Layer 1#1" - style="display:inline" /> + <path + style="fill:#b22222;stroke:#000000;stroke-width:2.31937" + d="m 444.15855,1655.2535 v -186.3229 l 111.31279,-85.6227 111.31279,-85.6227 0.0168,-239.0875 0.0168,-239.08758 -85.81653,-85.52471 -85.81654,-85.52474 V 545.72977 442.99886 H 418.64552 342.10645 V 324.71121 206.42355 H 1024 1705.8936 v 118.28766 118.28765 h -76.5391 -76.5391 v 102.6437 102.6437 l -85.8165,85.79301 -85.8166,85.79302 0.048,238.90641 0.048,238.9065 111.2815,85.5664 111.2816,85.5664 v 186.3792 186.3793 h -135.6829 -135.6829 v -68.4213 -68.4213 h -85.8165 -85.8166 v 68.4213 68.4213 H 1024 887.15746 v -68.4213 -68.4213 h -85.81653 -85.81654 v 68.4213 68.4213 h -135.6829 -135.6829 v -186.323 z m 1092.42125,-125.504 v -24.2255 l -35.7866,-27.9602 -35.7866,-27.9602 H 1024.538 584.0693 l -36.19752,27.2526 -36.19753,27.2525 -0.12705,24.9332 -0.12705,24.9332 H 1024 1536.5798 Z m -162.7421,-147.2188 c -0.4252,-1.1719 -13.5586,-12.1936 -29.1854,-24.4926 l -28.4122,-22.3619 v -28.8528 -28.8528 H 1024 731.75991 v 28.8528 28.8528 l -28.41223,22.3619 c -15.62673,12.299 -28.76014,23.3207 -29.18535,24.4926 -0.46761,1.2887 137.77662,2.1307 349.83767,2.1307 212.0611,0 350.3053,-0.842 349.8377,-2.1307 z m -57.5976,-567.82123 v -22.58155 l 29.5384,-29.60418 29.5385,-29.60415 H 1024 672.68302 l 29.53844,29.60415 29.53845,29.60418 v 22.58155 22.58158 H 1024 1316.2401 Z m 146.2939,-170.43138 23.0198,-21.37991 V 593.25204 563.60589 H 1024 562.4462 l -9.7e-4,29.57191 -9.8e-4,29.57191 22.61479,21.33972 22.6148,21.33972 415.92016,0.11435 415.9202,0.11434 23.0198,-21.37989 z m 23.0198,-234.91003 V 357.18233 H 1024 562.4462 v 52.18573 52.18573 H 1024 1485.5538 Z" + id="path13" /> </svg> diff --git a/client/public/images/pieces/Cwda/bt.svg b/client/public/images/pieces/Cwda/bt.svg new file mode 100644 index 00000000..17ba73f9 --- /dev/null +++ b/client/public/images/pieces/Cwda/bt.svg @@ -0,0 +1,88 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="100%" + width="100%" + version="1.1" + viewBox="0 0 2048 2048" + id="svg16" + sodipodi:docname="bb.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <metadata + id="metadata22"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs20" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="960" + inkscape:window-height="1060" + id="namedview18" + showgrid="false" + inkscape:zoom="0.43115234" + inkscape:cx="1024" + inkscape:cy="1024" + inkscape:window-x="0" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:current-layer="svg16" /> + <path + style="color:#000000" + d="m 1290,564.11538 -42,102 q -102,22 -224,22 -121,0 -222,-22 l -42,-101 q 124,31 264,31 138,0 266,-32 z m -84,206 -29,70 v 27 q -76,11 -153,11 -75,0 -152,-11 l -1,-27 -27,-70 q 85,15 180,15 96,0 182,-15 z m -35,-378 q -40,30 -80,95 h -32 q 0,-49 23,-95 z m -206,0 q 23,49 23,95 h -32 q -39,-64 -81,-95 z m 59,-18 q -14,-57 -34,-79 -20,-22 -53,-46 -36,-25 -85,-42 -49,-17 -109,-9 l -281,39 q -17,2 -30,0 -13,-2 -26,-2 -21,0 -53,-9 -32,-9 -51,-28 l -97,159 q 18,20 32,28 14,8 33,17 58,27 124,33 28,2 55,1 27,-1 56,2 54,-9 108,-16 54,-7 110,-16 60,0 81,12 11,6 35,22 24,16 48,47 -53,6 -108,20 -55,14 -97,31 l 104,258 q -78,45 -109,72 -31,27 -49,64 -26,46 -33,89.00002 -7,43 -7,77 1,60 28,132 27,72 104,130 63,48 123,99 60,51 119,119 -74,38 -74,121 0,56 39,96 39,40 97,40 56,0 96,-40 40,-40 40,-96 0,-82 -74,-121 58,-68 117,-119 59,-51 125,-99 75,-57 102,-129 27,-72 29,-133 0,-34 -7,-77 -7,-43.00002 -32,-89.00002 -20,-36 -50,-63 -30,-27 -108,-73 l 104,-258 q -44,-16 -99,-30 -55,-14 -106,-21 23,-31 47,-47 24,-16 36,-22 21,-12 81,-12 54,8 108,15 54,7 110,17 27,-3 54,-2 27,1 57,-1 64,-6 124,-33 18,-9 32,-17 14,-8 33,-28 l -98,-159 q -18,18 -50,27 -32,9 -53,10 -13,0 -26,2 -13,2 -31,0 l -280,-39 q -60,-9 -111,8 -51,17 -85,45 -33,27 -52,46 -19,19 -33,77 z m -37,744.00002 v -85 q 0,-37.00002 37,-37.00002 37,0 37,37.00002 v 86 h 90 q 35,0 35,36 0,36 -35,36 h -90 v 90 q 0,37 -37,37 -37,0 -37,-37 v -90 h -88 q -35,0 -35,-36 0,-36 35,-36 z" + fill-rule="nonzero" + display="block" + fill="#000000" + id="path2" /> + <g + fill-rule="nonzero" + fill="#ffffff" + id="g14" + transform="matrix(1,0,0,-1,0,2030.1154)"> + <path + style="color:#000000" + d="m 1290,1466 -42,-102 q -102,-22 -224,-22 -121,0 -222,22 l -42,101 q 124,-31 264,-31 138,0 266,32 z" + display="block" + id="path4" /> + <path + style="color:#000000" + d="m 1206,1260 -29,-70 v -27 q -76,-11 -153,-11 -75,0 -152,11 l -1,27 -27,70 q 85,-15 180,-15 96,0 182,15 z" + display="block" + id="path6" /> + <path + style="color:#000000" + d="m 1171,1638 q -40,-30 -80,-95 h -32 q 0,49 23,95 z" + display="block" + id="path8" /> + <path + style="color:#000000" + d="m 965,1638 q 23,-49 23,-95 h -32 q -39,64 -81,95 z" + display="block" + id="path10" /> + <path + style="color:#000000" + d="m 987,912 v 85 q 0,37 37,37 37,0 37,-37 v -86 h 90 q 35,0 35,-36 0,-36 -35,-36 h -90 v -90 q 0,-37 -37,-37 -37,0 -37,37 v 90 h -88 q -35,0 -35,36 0,36 35,36 z" + display="block" + id="path12" /> + </g> +</svg> diff --git a/client/public/images/pieces/Cwda/ba.svg b/client/public/images/pieces/Cwda/bw.svg similarity index 100% rename from client/public/images/pieces/Cwda/ba.svg rename to client/public/images/pieces/Cwda/bw.svg diff --git a/client/public/images/pieces/Cwda/by.svg b/client/public/images/pieces/Cwda/by.svg new file mode 100644 index 00000000..b569a989 --- /dev/null +++ b/client/public/images/pieces/Cwda/by.svg @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="100%" + width="100%" + version="1.1" + viewBox="0 0 2048 2048" + id="svg18" + sodipodi:docname="by.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <metadata + id="metadata24"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs22" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="960" + inkscape:window-height="1060" + id="namedview20" + showgrid="false" + inkscape:zoom="0.43115234" + inkscape:cx="1024" + inkscape:cy="467.3522" + inkscape:window-x="0" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:current-layer="svg18" + inkscape:document-rotation="0" /> + <path + style="color:#000000" + d="m 490,643 q 4,9 13,27 17,42 17,50 -2,28 -29,28 -20,0 -47,-57 -4,-8 -12,-14 -27,-28 8,-47 32,-19 50,13 z m 590,371 q 70,92 69,205 -4,33 -38,33 -46,0 -36,-34 3,-55 -11,-91 -23,-57 -51,-85 -15,-30 18,-44 32,-15 49,16 z m -261,488 q -5,36 2,78 -60,-12 -113,-56 -32,-17 -15,-47 17,-31 47,-10 21,11 38,20 17,9 41,15 z M 1756,234 q -1,0 2,54 3,54 3,118 1,125 0,258 -1,133 -36,267 -34,128 -75,218 -41,90 -89,157 -72,108 -196,183 -124,75 -259,98 4,-23 3,-47 -1,-24 0,-46 97,-33 183,-82 86,-49 126,-106 48,-66 89,-156 41,-90 75,-219 34,-133 35,-266 1,-133 1,-259 0,-63 -3,-117 -3,-54 0,-55 z m -677,1423 q 157,-10 291,-81 134,-71 228,-182 66,-78 124,-188 58,-110 94,-233 40,-143 50,-300 10,-157 11,-292 V 163 q 0,0 -155,0 -155,0 -404,0 H 647 q -9,0 -9,49 0,49 7,79 4,24 19,68 15,44 50,107 16,32 76,93 60,61 138,143 45,46 70,116 25,70 22,127 -37,-30 -81,-49 -212,-76 -307,-220 -7,-9 -45,-81 -20,-38 -34,-52 -19,-19 -55,-21 -56,-3 -87,54 -42,-12 -75,-10 -56,21 -81,45 -51,51 -66,102 -15,51 -16,110 0,84 104,222 122,159 130,242 0,36 7,81 6,31 25,60 13,20 17,27 4,7 17,23 9,12 15,18 6,6 15,18 11,13 28,30 -53,146 -43,301 199,-71 334,-223 33,113 130,183 80,-56 127,-148 z M 404,821 q 29,20 6,48 -24,23 -53,4 -61,-40 -65,-105 1,-33 39,-31 36,3 35,37 8,32 38,47 z m 252,498 q 22,11 22,11 30,12 19,44 -12,30 -46,20 -118,-43 -163,-158 -7,-33 24,-45 31,-10 42,22 8,17 12,22 11,-9 29,-12 61,-10 71,54 3,22 -10,42 z" + fill-rule="nonzero" + display="block" + fill="#000000" + id="path2" /> + <g + fill-rule="nonzero" + fill="#ffffff" + id="g16" + transform="matrix(1,0,0,-1,0,2008)"> + <path + style="color:#000000" + d="m 490,1365 q 4,-9 13,-27 17,-42 17,-50 -2,-28 -29,-28 -20,0 -47,57 -4,8 -12,14 -27,28 8,47 32,19 50,-13 z" + display="block" + id="path4" /> + <path + style="color:#000000" + d="m 1080,994 q 70,-92 69,-205 -4,-33 -38,-33 -46,0 -36,34 3,55 -11,91 -23,57 -51,85 -15,30 18,44 32,15 49,-16 z" + display="block" + id="path6" /> + <path + style="color:#000000" + d="m 819,506 q -5,-36 2,-78 -60,12 -113,56 -32,17 -15,47 17,31 47,10 21,-11 38,-20 17,-9 41,-15 z" + display="block" + id="path8" /> + <path + style="color:#000000" + d="m 1756,1774 q -1,0 2,-54 3,-54 3,-118 1,-125 0,-258 -1,-133 -36,-267 -34,-128 -75,-218 -41,-90 -89,-157 -72,-108 -196,-183 -124,-75 -259,-98 4,23 3,47 -1,24 0,46 97,33 183,82 86,49 126,106 48,66 89,156 41,90 75,219 34,133 35,266 1,133 1,259 0,63 -3,117 -3,54 0,55 z" + display="block" + id="path10" /> + <path + style="color:#000000" + d="m 404,1187 q 29,-20 6,-48 -24,-23 -53,-4 -61,40 -65,105 1,33 39,31 36,-3 35,-37 8,-32 38,-47 z" + display="block" + id="path12" /> + <path + style="color:#000000" + d="m 656,689 q 22,-11 22,-11 30,-12 19,-44 -12,-30 -46,-20 -118,43 -163,158 -7,33 24,45 31,10 42,-22 8,-17 12,-22 11,9 29,12 61,10 71,-54 3,-22 -10,-42 z" + display="block" + id="path14" /> + </g> + <path + style="fill:#b22222;stroke:#000000;stroke-width:2.31937" + d="m 488.87142,1784.2552 c 0.91197,-44.0642 2.53785,-68.3539 6.17677,-92.2778 5.5848,-36.7173 19.78055,-96.6332 30.12165,-127.1342 l 6.93115,-20.4434 -25.36948,-28.8543 c -31.8104,-36.1799 -46.57815,-55.8293 -65.66083,-87.3658 -23.12294,-38.2135 -27.40416,-54.2783 -31.68599,-118.8977 -1.34561,-20.3074 -4.18061,-41.5493 -6.8101,-51.0261 -13.81504,-49.7898 -51.8304,-116.8503 -111.75841,-197.146 -70.1169,-93.94758 -100.08176,-148.34791 -112.29242,-203.86358 -8.02004,-36.4631 -0.77459,-108.92027 15.29449,-152.95063 8.98275,-24.61329 21.905,-45.95684 43.1669,-71.29828 23.67791,-28.221 49.83164,-46.12553 91.18962,-62.42733 11.83618,-4.66538 14.2155,-4.83179 34.82529,-2.43577 12.16663,1.41444 27.83761,4.10307 34.82441,5.97473 12.36675,3.31287 12.79544,3.26727 16.18232,-1.72139 23.59996,-34.76126 45.64157,-48.431 78.13206,-48.45591 36.76503,-0.0283 57.49392,11.78041 77.78712,44.31288 4.37653,7.01608 18.68776,32.65913 31.80277,56.98457 31.45779,58.34719 47.95753,81.21716 87.1229,120.75926 60.07668,60.65455 128.38859,103.75776 223.86871,141.25585 41.15738,16.16385 65.07742,28.65931 90.82625,47.44629 8.7523,6.38587 16.572,11.61066 17.3771,11.61066 2.763,0 -1.6128,-52.19003 -6.189,-73.81577 C 1003.9542,821.54061 980.08332,766.12857 953.612,730.60022 945.53312,719.75719 910.3155,681.32936 875.35057,645.20505 737.28907,502.56553 730.40445,494.46376 703.11996,442.52509 c -29.513,-56.18087 -49.3902,-110.71452 -58.58231,-160.72215 -5.28883,-28.77268 -6.23125,-103.47202 -1.41189,-111.9094 l 2.98083,-5.21858 h 614.55031 614.5504 l -0.012,142.06116 c -0.025,321.51381 -13.6167,484.29854 -53.2956,638.29636 -48.531,188.35642 -152.3293,379.21502 -269.5877,495.70422 -108.1591,107.4496 -249.9584,181.2957 -395.1856,205.8043 -22.5484,3.8053 -69.061,9.4862 -77.6687,9.4862 -1.119,0 -4.6173,5.0967 -7.7739,11.3261 -11.8389,23.3628 -39.0232,60.7684 -60.9525,83.8704 -21.245,22.381 -54.10744,50.9235 -58.63095,50.9235 -1.10789,0 -10.95158,-7.3655 -21.87482,-16.3679 -45.28972,-37.3254 -83.59368,-93.1185 -101.38451,-147.6755 -3.0066,-9.22 -6.1704,-16.7869 -7.03065,-16.8154 -0.86025,-0.028 -8.01448,7.2061 -15.89826,16.0768 -7.8838,8.8707 -27.33994,27.9185 -43.23585,42.3284 -76.48028,69.3309 -156.55186,117.9659 -262.56995,159.4836 l -12.47311,4.8846 z M 1127.2118,1584.09 c 131.2364,-25.2329 270.496,-98.3698 363.4054,-190.8548 79.914,-79.549 152.0267,-203.9073 200.2111,-345.2641 35.732,-104.82526 55.6682,-191.50035 66.597,-289.53849 3.4897,-31.30459 4.2932,-429.13083 0.9896,-489.96603 l -1.9837,-36.53001 h -71.9119 -71.9119 l 1.9953,70.16082 c 2.5506,89.68944 1.4075,381.75875 -1.6725,427.34315 -7.6018,112.50508 -35.7937,236.19195 -81.2582,356.50546 -34.913,92.391 -87.9388,188.7798 -132.4478,240.7604 -23.1879,27.0804 -65.8116,59.9005 -111.9762,86.2215 -42.2507,24.0895 -107.7844,54.2113 -155.3975,71.4267 -11.4809,4.1511 -21.555,8.2066 -22.387,9.0121 -0.832,0.8055 -1.9037,22.5962 -2.3815,48.4237 -0.7634,41.2634 -0.4393,46.8388 2.6724,45.9672 1.9476,-0.5456 9.8035,-2.196 17.4574,-3.6676 z m -306.62097,-16.7786 c -1.02008,-7.9728 -1.70541,-26.1428 -1.52292,-40.3778 l 0.33179,-25.8818 -15.56385,-5.0044 c -8.56011,-2.7524 -28.01815,-11.7541 -43.24006,-20.0037 -36.62939,-19.8516 -42.15408,-21.4507 -53.59495,-15.5134 -17.24701,8.9504 -26.89987,38.5711 -16.61819,50.9945 7.73047,9.3407 51.66947,39.2722 72.6887,49.516 18.8954,9.2088 48.4573,19.797 57.51948,20.6019 1.02008,0.091 1.02008,-6.3584 0,-14.3313 z M 684.90348,1392.3705 c 13.60192,-8.4799 20.0642,-31.7604 12.89184,-46.4433 -3.42909,-7.0198 -7.88716,-10.7004 -21.9119,-18.0903 l -17.60698,-9.2774 4.35129,-9.2775 c 5.80164,-12.3698 4.76725,-41.761 -1.99985,-56.8245 -13.30776,-29.6228 -49.49033,-40.5435 -83.98048,-25.3473 -5.58366,2.4602 -10.56793,4.473 -11.07613,4.473 -0.50817,0 -4.76078,-7.9711 -9.45021,-17.7137 -9.45051,-19.6338 -17.33067,-26.3646 -30.78471,-26.2946 -10.31867,0.054 -24.99713,6.7879 -32.47112,14.8972 -4.9772,5.4002 -5.79842,8.4833 -5.79842,21.7687 0,13.88 1.15635,17.7765 11.20314,37.7516 27.82038,55.3127 68.61489,94.7912 126.08008,122.0127 30.40955,14.4051 47.15493,16.7185 60.55345,8.3654 z m 447.96372,-144.1511 c 14.4938,-7.7731 16.8959,-15.6846 15.6143,-51.4266 -1.6669,-46.4892 -11.9358,-86.4692 -32.9035,-128.1039 -14.2014,-28.1988 -41.8592,-68.3998 -49.9297,-72.57315 -10.173,-5.26065 -25.1583,-4.2559 -38.9378,2.61072 -13.649,6.80163 -18.9461,14.66393 -18.9461,28.12133 0,9.3315 2.0045,13.0136 17.4802,32.1103 11.2219,13.8477 33.4279,56.3747 40.1061,76.8078 6.6141,20.2369 10.4544,55.9952 8.5928,80.0108 -1.7889,23.0773 0.012,28.4664 11.1225,33.2998 11.0176,4.7925 38.1747,4.3056 47.8012,-0.8571 z M 398.93091,878.42895 c 25.99794,-12.82517 29.41972,-43.50381 6.43448,-57.68945 -22.60666,-13.95201 -35.71601,-32.19711 -38.53157,-53.62682 -2.88685,-21.97231 -13.94417,-30.40731 -40.00358,-30.51639 -18.76357,-0.0786 -26.40212,3.52948 -32.5203,15.36072 -8.55931,16.55188 1.33173,56.55934 20.69009,83.68766 9.9967,14.00911 32.15581,33.98885 45.66135,41.17049 12.15398,6.46296 27.1573,7.09563 38.26953,1.61379 z M 506.85734,745.63683 c 8.00679,-4.14046 13.84028,-14.3058 13.84028,-24.11783 0,-15.43612 -24.87066,-75.14627 -36.92247,-88.64451 -10.51923,-11.78173 -22.26464,-14.05728 -37.5356,-7.27214 -30.79584,13.68307 -34.9755,31.19844 -12.95415,54.28608 4.42343,4.63762 12.58298,17.16219 18.13234,27.83239 5.54936,10.67019 14.86593,24.358 20.7035,30.41734 8.94092,9.28062 11.97855,11.01699 19.27309,11.01699 4.76266,0 11.72101,-1.58324 15.46301,-3.51832 z" + id="path119" /> +</svg> diff --git a/client/public/images/pieces/Cwda/wc.svg b/client/public/images/pieces/Cwda/wc.svg new file mode 100644 index 00000000..ee56aff4 --- /dev/null +++ b/client/public/images/pieces/Cwda/wc.svg @@ -0,0 +1,153 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="45" + height="45" + id="svg3128" + sodipodi:version="0.32" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + version="1.0" + sodipodi:docname="wc.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape"> + <defs + id="defs3130"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 22.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="45 : 22.5 : 1" + inkscape:persp3d-origin="22.5 : 15 : 1" + id="perspective15" /> + <inkscape:perspective + id="perspective12" + inkscape:persp3d-origin="22.5 : 15 : 1" + inkscape:vp_z="45 : 22.5 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_x="0 : 22.5 : 1" + sodipodi:type="inkscape:persp3d" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="10000" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="8.0000004" + inkscape:cx="60.308779" + inkscape:cy="24.511479" + inkscape:document-units="px" + inkscape:current-layer="layer1" + height="45px" + width="45px" + inkscape:grid-points="true" + showgrid="false" + inkscape:window-width="1920" + inkscape:window-height="1060" + inkscape:window-x="0" + inkscape:window-y="20" + inkscape:window-maximized="0"> + <inkscape:grid + id="GridFromPre046Settings" + type="xygrid" + originx="0" + originy="0" + spacingx="0.5" + spacingy="0.5" + color="#0000ff" + empcolor="#0000ff" + opacity="0.2" + empopacity="0.4" + empspacing="5" /> + </sodipodi:namedview> + <metadata + id="metadata3133"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + style="display:inline"> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 37.725,38.008918 c -3.723781,-1.069562 -11.126219,0.473903 -14.85,-2.2 -3.723782,2.673903 -11.12622,1.130438 -14.8500002,2.2 0,0 -1.8104878,0.595658 -3.3,2.2 0.7447561,1.069561 1.8104878,1.08478 3.3,0.55 3.7237802,-1.069561 11.1262182,0.504342 14.8500002,-1.1 3.723781,1.604342 11.126219,0.03044 14.85,1.1 1.489512,0.53478 2.555244,0.519561 3.3,-0.55 -1.489512,-2.139123 -3.3,-2.2 -3.3,-2.2 z" + id="path4582" + sodipodi:nodetypes="ccccccccc" + inkscape:connector-curvature="0" /> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 31.125,33.608918 c -2.75,2.75 -13.75,2.75 -16.5,0 -0.55,-1.65 0,-2.2 0,-2.2 h 16.5 c 0,0 0.55,0.55 0,2.2 z" + id="path4584" + sodipodi:nodetypes="ccccc" + inkscape:connector-curvature="0" /> + <path + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 31.125,31.408918 h -16.5" + id="path4590" + sodipodi:nodetypes="cc" + inkscape:connector-curvature="0" /> + <g + id="g3323" + inkscape:label="Layer 1" + transform="matrix(-0.84196464,0,0,-0.84196464,39.051174,37.108928)"> + <path + sodipodi:nodetypes="cccc" + id="path3491" + d="M 22.028958,36 C 11.528958,35 5.5289585,28 6.0289585,7 H 29.028958 c 0,9 -10,6.5 -8,21" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <path + sodipodi:nodetypes="csccccccccccc" + id="path3495" + d="m 20.028958,28 c -0.384461,-2.911278 5.552936,-7.368624 8,-9 3,-2 2.819198,-4.342892 5,-4 1.04172,0.944016 -1.413429,3.037549 0,3 1,0 -0.187332,-1.231727 1,-2 1,0 4.003161,-0.999999 4,4 0,2 -6,12 -6,12 0,0 -1.885866,1.902129 -2,3.5 0.726047,0.994369 0.5,2 0.5,3 -1,1 -3,-2.5 -3,-2.5 h -2 c 0,0 -0.781781,1.991926 -2.5,3 -1,0 -1,-3 -1,-3" + style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <circle + transform="rotate(180,21.764479,22)" + id="path3499" + style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + cx="8.5" + cy="23.5" + r="0.5" /> + <ellipse + transform="rotate(-149.99999,24.024104,20.986505)" + id="path3501" + style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.50000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + cx="14.5" + cy="15.5" + rx="0.5" + ry="1.5" /> + <path + sodipodi:nodetypes="cc" + id="path8049" + d="m 7.0289585,7 c -1,20 5.4999995,27.5 11.9999995,28.5" + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + inkscape:connector-curvature="0" /> + </g> + </g> + <g + inkscape:groupmode="layer" + id="layer2" + inkscape:label="Layer 1#1" + style="display:inline" /> +</svg> diff --git a/client/public/images/pieces/Cwda/wf.svg b/client/public/images/pieces/Cwda/wf.svg new file mode 100644 index 00000000..0e249758 --- /dev/null +++ b/client/public/images/pieces/Cwda/wf.svg @@ -0,0 +1,285 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="177.17" + height="177.17" + shape-rendering="geometricPrecision" + image-rendering="optimizeQuality" + fill-rule="evenodd" + clip-rule="evenodd" + viewBox="0 0 50 50" + version="1.1" + id="svg974" + sodipodi:docname="wWaffle.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> + <metadata + id="metadata978"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1060" + id="namedview976" + showgrid="false" + inkscape:zoom="2.3931818" + inkscape:cx="8.4123423" + inkscape:cy="122.97195" + inkscape:window-x="0" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:current-layer="svg974" + showguides="false" /> + <defs + id="defs968"> + <linearGradient + inkscape:collect="always" + id="linearGradient4543"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop4539" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop4541" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient1002"> + <stop + style="stop-color:#ffffff;stop-opacity:1" + offset="0" + id="stop998" /> + <stop + style="stop-color:#dcdbdb;stop-opacity:1" + offset="1" + id="stop1000" /> + </linearGradient> + <linearGradient + id="0" + x1="21.376" + x2="77.64" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#fff" + id="stop963" /> + <stop + offset="1" + stop-color="#fff" + stop-opacity="0" + id="stop965" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient1002" + id="linearGradient1004" + x1="-41.790333" + y1="22.581646" + x2="-15.82877" + y2="22.581646" + gradientUnits="userSpaceOnUse" /> + <linearGradient + id="linearGradient5398" + x1="0" + y1="0" + x2="0" + y2="1"> + <stop + offset="20%" + style="stop-color:#000000;stop-opacity:1" + id="stop5394" /> + <stop + offset="100%" + style="stop-color:#4d4d4d;stop-opacity:1" + id="stop5396" /> + </linearGradient> + <linearGradient + gradientTransform="translate(0.47111842,-0.19973575)" + id="0-1" + x1="21.253" + y1="37.591999" + x2="77.639999" + y2="37.469002" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#fff" + id="stop3285" /> + <stop + offset="1" + stop-color="#fff" + stop-opacity="0" + id="stop3287" /> + </linearGradient> + <linearGradient + gradientTransform="translate(50.633198,2.6998865)" + id="0-5" + x1="21.405001" + x2="77.639999" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#fff" + id="stop3911" /> + <stop + offset="1" + stop-color="#fff" + stop-opacity="0" + id="stop3913" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4543" + id="linearGradient4545" + x1="119.21609" + y1="11.441374" + x2="209.83548" + y2="11.441374" + gradientUnits="userSpaceOnUse" /> + </defs> + <g + transform="matrix(0.95,0,0,0.95,1.1939867,1.6421008)" + id="g14577"> + <rect + y="4.245285" + x="23.113207" + height="40.212261" + width="3.7735846" + id="rect14571" + style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> + <rect + transform="rotate(90)" + style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.84308159;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" + id="rect14573" + width="3.7735846" + height="47.641506" + x="23.231133" + y="-48.820751" /> + </g> + <path + sodipodi:type="star" + style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" + id="path14587" + sodipodi:sides="64" + sodipodi:cx="25" + sodipodi:cy="44.457546" + sodipodi:r1="3.9412203" + sodipodi:r2="3.9364729" + sodipodi:arg1="0.78539816" + sodipodi:arg2="0.83448555" + inkscape:flatsided="true" + inkscape:rounded="0" + inkscape:randomized="0" + d="m 27.786864,47.24441 -0.28658,0.259741 -0.310659,0.2304 -0.331747,0.198841 -0.349638,0.165367 -0.364164,0.1303 -0.375182,0.09398 -0.382587,0.05675 L 25,48.398767 l -0.386307,-0.01898 -0.382587,-0.05675 -0.375182,-0.09398 -0.364164,-0.1303 -0.349638,-0.165367 -0.331747,-0.198841 -0.310659,-0.2304 -0.28658,-0.259741 -0.25974,-0.28658 -0.230401,-0.310659 -0.198841,-0.331746 -0.165367,-0.349639 -0.1303,-0.364164 -0.09398,-0.375182 -0.05675,-0.382587 -0.01898,-0.386307 0.01898,-0.386307 0.05675,-0.382587 0.09398,-0.375182 0.1303,-0.364163 0.165367,-0.349639 0.198841,-0.331746 0.230401,-0.310659 0.25974,-0.28658 0.28658,-0.259741 0.310659,-0.230401 0.331747,-0.198841 0.349638,-0.165367 0.364164,-0.130299 0.375182,-0.09398 0.382587,-0.05675 L 25,40.516326 l 0.386307,0.01898 0.382587,0.05675 0.375182,0.09398 0.364164,0.130299 0.349638,0.165367 0.331747,0.198841 0.310659,0.230401 0.28658,0.259741 0.25974,0.28658 0.230401,0.310659 0.198841,0.331746 0.165367,0.349639 0.1303,0.364163 0.09398,0.375182 0.05675,0.382587 0.01898,0.386307 -0.01898,0.386307 -0.05675,0.382587 -0.09398,0.375182 -0.1303,0.364164 -0.165367,0.349639 -0.198841,0.331746 -0.230401,0.310659 z" + transform="matrix(0,0.95,-0.95,0,47.629715,1.6421021)" /> + <g + id="g19380" + transform="matrix(0.77598955,0,0,0.77598955,5.3934327,3.4879779)"> + <g + transform="matrix(1.0975945,0,0,1.0975945,-107.62233,17.126787)" + style="opacity:1;fill:#1f1a17;fill-opacity:1;stroke-width:1.54272723;stroke-miterlimit:4;stroke-dasharray:none" + id="g5357"> + <path + style="fill:#1f1a17;fill-opacity:1;stroke:none;stroke-width:1.54272723;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 119.66608,20.578823 c 0.12511,0.773672 0.40427,1.44388 1.3,1.7 11.23011,-0.424319 16.82956,-5.233235 20.30001,-11.7 l 0.2,-2.099999 c -2.10707,-8.89280401 -8.15113,-13.4502442 -16.2,-15.8 -4.40015,-0.5317426 -7.59668,1.3815851 -10.20001,4.5 -2.59354,2.64077835 -4.39616,5.9439949 -5.3,10 -0.9084,3.60641 -5.79067,1.6990508 -4.9,-0.6 2.76583,-4.0566968 11.00069,-10.7605086 4.9,-12.3 -8.75831,-2.0518262 -7.05798,4.7061225 -5.2,6.20000004 1.23982,-0.5457366 2.00197,-1.22280981 2.4,-2.00000004 -0.25951,-0.4357328 -0.98217,-0.8162564 0,-1.4 0.5387,0.045976 0.81918,0.2856122 1,0.6 0,1 0.50403,1.1455069 -3.6,4 -7.640521,5.2325602 -2.06546,17.121851 4.61159,18.198353 1.32064,-0.324595 1.53284,-0.226663 2.43634,0.347926 l 3.15207,0.35372 c 2.39802,-0.822905 4.4665,-1.650139 5.70313,-3.159477 0.32094,-0.38845 0.4935,-0.247984 -0.60313,3.159477 z" + id="path5349" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccccccccccccc" /> + <path + style="fill:#1f1a17;fill-opacity:1;stroke:none;stroke-width:1.54272723;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 109.56608,17.578823 c -1.32838,4.066443 -4.04985,6.321863 -6.6,8.8 -0.20576,0.304421 0.14574,0.397532 1,0.3 3.90473,-1.863513 7.52129,-4.086217 8.76166,-7.725974 -0.78642,-0.41302 -1.9736,-1.357866 -3.16166,-1.374026 z" + id="path5353" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + </g> + <g + transform="matrix(0.79655895,0,0,0.79655895,-75.421737,16.247409)" + style="opacity:1;fill:#ffff00;fill-opacity:1;stroke-width:1.54272723;stroke-miterlimit:4;stroke-dasharray:none" + id="g5357-2"> + <path + style="fill:url(#linearGradient4545);fill-opacity:1;stroke:none;stroke-width:1.54272723;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 133.58361,1.5558616 c -8.75606,10.1109584 -4.19979,7.5116959 -2.74223,10.1130104 -0.10968,5.65697 -1.90023,10.862018 -3.55112,15.867945 0.12511,0.773672 0.47829,1.517901 1.37402,1.774021 12.03339,-0.558199 18.98339,-7.721951 22.11462,-14.132179 l 0.43477,-2.601728 c -2.89219,-8.7881214 -9.12021,-14.2749978 -15.98474,-18.0311568 -3.95603,-2.012167 -6.44991,-1.8836905 -11.42192,-0.2457 -8.66328,7.0080302 -11.21253,16.0768238 -12.11637,20.1328288 -1.01612,3.667963 -15.446226,0.776698 -6.82456,-7.854079 3.2983,-3.3578275 11.23128,-10.4578594 4.9,-12.3 -8.75831,-2.0518262 -6.68787,4.85416494 -5.71815,5.60783029 0.8142,-0.43470477 0.7066,-0.35306049 1.38221,-0.98220829 -1.17923,-0.8361833 -0.84585,-1.8283785 0.25907,-2.5103183 1.26041,-0.7312468 2.29961,-0.5841371 3.68327,0.3779364 2.30121,3.99968414 -3.10867,6.3374791 -6.06121,8.5893156 -7.571668,6.8550703 0.11863,18.3130553 6.94372,20.6479193 l 0.77482,-1.497349 c 1.024,0.222539 2.43711,0.731241 3.93177,1.474031 0.11862,0.05895 -0.0661,1.049227 -0.0564,1.233499 0.78343,-0.270382 4.65893,-6.09553 4.7812,-6.115529 1.48143,0.230311 1.07354,3.434896 -1.37652,5.984803 4.20113,-1.72865 7.84001,-6.076464 9.2663,-9.632977 2.12212,-5.291587 -0.65644,-3.773127 -1.42504,-5.631192 C 125.75704,7.2456297 128.89,0.31884652 133.58364,1.5558406 Z" + id="path5349-8" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccccccccccccscccsccc" /> + <path + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.54272723;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 111.72715,26.876138 c -1.99457,3.992422 -2.2307,3.850363 -4.55878,6.92067 -0.57956,1.378028 4.89591,-3.943837 5.76902,-6.496225 -1.02889,-0.498698 -0.43741,-0.404465 -1.21024,-0.424445 z" + id="path5353-9" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" /> + </g> + <path + inkscape:connector-curvature="0" + id="path3879" + d="m 17.809955,22.804124 c -0.364,-0.186 -0.542,-0.279 -0.542,-0.279 -0.499,-0.195 -0.652,-0.559 -0.474,-1.092 0.195,-0.491 0.576,-0.66 1.143,-0.491 1.947,0.711 3.294,2.02 4.04,3.92 0.118,0.542 -0.076,0.914 -0.592999,1.118 -0.516001,0.161 -0.864001,-0.017 -1.041001,-0.55 -0.136,-0.279 -0.229,-0.466 -0.296,-0.542 -0.186,0.144 -0.423,0.245 -0.72,0.296 -1.01,0.161 -1.6,-0.279 -1.761,-1.338 -0.051,-0.364 0.034,-0.711 0.246,-1.041" + style="fill:#000000;stroke-width:1" /> + </g> + <path + sodipodi:type="star" + style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60862446;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" + id="path14581" + sodipodi:sides="64" + sodipodi:cx="24.943983" + sodipodi:cy="6.1232343" + sodipodi:r1="3.7441592" + sodipodi:r2="3.7396493" + sodipodi:arg1="0.78539816" + sodipodi:arg2="0.83448555" + inkscape:flatsided="true" + inkscape:rounded="0" + inkscape:randomized="0" + d="m 27.591503,8.7707546 -0.27225,0.2467539 -0.295127,0.2188804 -0.315158,0.188899 -0.332157,0.1570984 -0.345956,0.123785 -0.356423,0.089279 -0.363457,0.053914 -0.366992,0.018029 L 24.576991,9.8493643 24.213534,9.7954505 23.857111,9.7061713 23.511155,9.5823863 23.178999,9.4252879 22.86384,9.2363889 22.568714,9.0175085 22.296463,8.7707547 22.049709,8.4985037 21.830828,8.2033777 21.641929,7.8882187 21.484831,7.556062 21.361046,7.2101063 l -0.08928,-0.3564228 -0.05391,-0.3634574 -0.01803,-0.3669918 0.01803,-0.3669918 0.05391,-0.3634574 0.08928,-0.3564229 0.123785,-0.3459556 0.157098,-0.3321568 0.188899,-0.3151589 0.218881,-0.2951261 0.246754,-0.2722509 0.272251,-0.2467538 0.295126,-0.2188804 0.315159,-0.1888991 0.332156,-0.1570984 0.345956,-0.1237849 0.356423,-0.089279 0.363457,-0.053914 0.366992,-0.018029 0.366992,0.018029 0.363457,0.053914 0.356423,0.089279 0.345956,0.1237849 0.332157,0.1570984 0.315158,0.188899 0.295127,0.2188804 0.27225,0.2467539 0.246754,0.2722509 0.218881,0.2951261 0.188899,0.3151589 0.157098,0.3321568 0.123785,0.3459556 0.08928,0.3564228 0.05391,0.3634575 0.01803,0.3669918 -0.01803,0.3669917 -0.05391,0.3634575 -0.08928,0.3564228 -0.123785,0.3459557 -0.157098,0.3321567 -0.188899,0.315159 -0.218881,0.295126 z" /> + <path + d="m 27.591503,46.524287 -0.27225,0.246753 -0.295127,0.218881 -0.315158,0.188899 -0.332157,0.157098 -0.345956,0.123785 -0.356423,0.08928 -0.363457,0.05391 -0.366992,0.01803 -0.366992,-0.01803 -0.363457,-0.05391 -0.356423,-0.08928 -0.345956,-0.123785 -0.332156,-0.157098 -0.315159,-0.188899 -0.295126,-0.218881 -0.272251,-0.246753 -0.246754,-0.272251 -0.218881,-0.295126 -0.188899,-0.315159 -0.157098,-0.332157 -0.123785,-0.345956 -0.08928,-0.356423 -0.05391,-0.363457 -0.01803,-0.366992 0.01803,-0.366992 0.05391,-0.363457 0.08928,-0.356423 0.123785,-0.345955 0.157098,-0.332157 0.188899,-0.315159 0.218881,-0.295126 0.246754,-0.272251 0.272251,-0.246754 0.295126,-0.21888 0.315159,-0.188899 0.332156,-0.157099 0.345956,-0.123785 0.356423,-0.08928 0.363457,-0.05391 0.366992,-0.01803 0.366992,0.01803 0.363457,0.05391 0.356423,0.08928 0.345956,0.123785 0.332157,0.157099 0.315158,0.188899 0.295127,0.21888 0.27225,0.246754 0.246754,0.272251 0.218881,0.295126 0.188899,0.315159 0.157098,0.332156 0.123785,0.345956 0.08928,0.356423 0.05391,0.363457 0.01803,0.366992 -0.01803,0.366992 -0.05391,0.363457 -0.08928,0.356423 -0.123785,0.345956 -0.157098,0.332157 -0.188899,0.315159 -0.218881,0.295126 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="true" + sodipodi:arg2="0.83448555" + sodipodi:arg1="0.78539816" + sodipodi:r2="3.7396493" + sodipodi:r1="3.7441592" + sodipodi:cy="43.876766" + sodipodi:cx="24.943983" + sodipodi:sides="64" + id="path14583" + style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60862446;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" + sodipodi:type="star" /> + <path + d="M 27.786864,7.5038459 27.500284,7.7635868 27.189625,7.9939873 26.857878,8.1928283 26.50824,8.3581951 26.144076,8.488495 25.768894,8.5824732 25.386307,8.6392246 25,8.6582026 24.613693,8.6392246 24.231106,8.5824732 23.855924,8.488495 23.49176,8.3581951 23.142122,8.1928283 22.810375,7.9939873 22.499716,7.7635869 22.213136,7.503846 21.953396,7.2172661 21.722995,6.906607 21.524154,6.5748608 21.358787,6.2252221 l -0.1303,-0.3641639 -0.09398,-0.3751819 -0.05675,-0.3825868 -0.01898,-0.3863071 0.01898,-0.3863072 0.05675,-0.3825868 0.09398,-0.3751819 0.1303,-0.3641638 0.165367,-0.3496387 0.198841,-0.3317463 0.230401,-0.310659 0.25974,-0.2865799 0.28658,-0.2597409 0.310659,-0.2304004 0.331747,-0.1988411 0.349638,-0.1653668 0.364164,-0.13029989 0.375182,-0.0939782 0.382587,-0.0567514 L 25,0.77576208 l 0.386307,0.018978 0.382587,0.0567514 0.375182,0.0939782 0.364164,0.1302999 0.349638,0.1653668 0.331747,0.1988411 0.310659,0.2304004 0.28658,0.2597409 0.25974,0.2865799 0.230401,0.310659 0.198841,0.3317463 0.165367,0.3496386 0.1303,0.3641639 0.09398,0.3751819 0.05675,0.3825868 0.01898,0.3863072 -0.01898,0.3863071 -0.05675,0.3825868 -0.09398,0.3751819 -0.1303,0.3641639 -0.165367,0.3496386 -0.198841,0.3317463 -0.230401,0.310659 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="true" + sodipodi:arg2="0.83448555" + sodipodi:arg1="0.78539816" + sodipodi:r2="3.9364729" + sodipodi:r1="3.9412203" + sodipodi:cy="4.7169824" + sodipodi:cx="25" + sodipodi:sides="64" + id="path14585" + style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" + sodipodi:type="star" + transform="matrix(0,0.95,-0.95,0,49.086086,1.6421021)" /> +</svg> diff --git a/client/public/images/pieces/Cwda/wg.svg b/client/public/images/pieces/Cwda/wg.svg new file mode 100644 index 00000000..4290d9c3 --- /dev/null +++ b/client/public/images/pieces/Cwda/wg.svg @@ -0,0 +1,97 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="100%" + width="100%" + version="1.1" + viewBox="0 0 2048 2048" + id="svg18" + sodipodi:docname="wg.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <metadata + id="metadata24"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs22" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="960" + inkscape:window-height="1060" + id="namedview20" + showgrid="false" + inkscape:zoom="0.43115234" + inkscape:cx="1024" + inkscape:cy="1024" + inkscape:window-x="0" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:current-layer="svg18" /> + <path + style="color:#000000" + d="m 1161,1706 h 170 v 137 h 274 V 1468 L 1383,1297 V 819 L 1553,649 V 444 h 153 V 205 H 341 v 239 h 153 v 205 l 171,170 v 478 l -222,171 v 375 h 273 v -137 h 171 v 137 h 274 z M 1639,376 H 409 V 273 H 1639 Z M 1484,580 H 564 V 444 h 920 z m -170,717 H 734 V 819 h 580 z m 222,239 v 239 h -137 v -137 h -308 v 137 H 956 V 1638 H 649 v 137 H 512 V 1536 Z M 1459,649 1356,751 H 693 L 588,649 Z m -110,716 127,103 H 572 l 128,-103 z" + fill-rule="nonzero" + display="block" + fill="#000000" + id="path2" /> + <g + fill-rule="nonzero" + fill="#ffffff" + id="g12" + transform="matrix(1,0,0,-1,0,2048)"> + <path + style="color:#000000" + d="M 1639,1672 H 409 v 103 h 1230 z" + display="block" + id="path4" /> + <path + style="color:#000000" + d="M 1484,1468 H 564 v 136 h 920 z" + display="block" + id="path6" /> + <path + style="color:#000000" + d="M 1314,751 H 734 v 478 h 580 z" + display="block" + id="path8" /> + <path + style="color:#000000" + d="M 1536,512 V 273 H 1399 V 410 H 1091 V 273 H 956 V 410 H 649 V 273 H 512 v 239 z" + display="block" + id="path10" /> + </g> + <path + style="color:#000000" + d="M 1459,649 1356,751 H 693 L 588,649 Z" + fill-rule="nonzero" + display="block" + fill="#ffffff" + id="path14" /> + <path + style="color:#000000" + d="m 1349,1365 127,103 H 572 l 128,-103 z" + fill-rule="nonzero" + display="block" + fill="#ffffff" + id="path16" /> +</svg> diff --git a/client/public/images/pieces/Cwda/wh.svg b/client/public/images/pieces/Cwda/wh.svg index 0e249758..96843bf9 100644 --- a/client/public/images/pieces/Cwda/wh.svg +++ b/client/public/images/pieces/Cwda/wh.svg @@ -5,32 +5,28 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="177.17" - height="177.17" - shape-rendering="geometricPrecision" - image-rendering="optimizeQuality" - fill-rule="evenodd" - clip-rule="evenodd" - viewBox="0 0 50 50" + height="100%" + width="100%" version="1.1" - id="svg974" - sodipodi:docname="wWaffle.svg" - inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> + viewBox="0 0 2048 2048" + id="svg18" + sodipodi:docname="wh.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> <metadata - id="metadata978"> + id="metadata24"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> </cc:Work> </rdf:RDF> </metadata> + <defs + id="defs22" /> <sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" @@ -40,246 +36,85 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="1920" + inkscape:window-width="960" inkscape:window-height="1060" - id="namedview976" + id="namedview20" showgrid="false" - inkscape:zoom="2.3931818" - inkscape:cx="8.4123423" - inkscape:cy="122.97195" + inkscape:zoom="0.43115234" + inkscape:cx="1024" + inkscape:cy="1021.6806" inkscape:window-x="0" inkscape:window-y="20" inkscape:window-maximized="0" - inkscape:current-layer="svg974" - showguides="false" /> - <defs - id="defs968"> - <linearGradient - inkscape:collect="always" - id="linearGradient4543"> - <stop - style="stop-color:#ffffff;stop-opacity:1;" - offset="0" - id="stop4539" /> - <stop - style="stop-color:#ffffff;stop-opacity:0;" - offset="1" - id="stop4541" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient1002"> - <stop - style="stop-color:#ffffff;stop-opacity:1" - offset="0" - id="stop998" /> - <stop - style="stop-color:#dcdbdb;stop-opacity:1" - offset="1" - id="stop1000" /> - </linearGradient> - <linearGradient - id="0" - x1="21.376" - x2="77.64" - gradientUnits="userSpaceOnUse"> - <stop - stop-color="#fff" - id="stop963" /> - <stop - offset="1" - stop-color="#fff" - stop-opacity="0" - id="stop965" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient1002" - id="linearGradient1004" - x1="-41.790333" - y1="22.581646" - x2="-15.82877" - y2="22.581646" - gradientUnits="userSpaceOnUse" /> - <linearGradient - id="linearGradient5398" - x1="0" - y1="0" - x2="0" - y2="1"> - <stop - offset="20%" - style="stop-color:#000000;stop-opacity:1" - id="stop5394" /> - <stop - offset="100%" - style="stop-color:#4d4d4d;stop-opacity:1" - id="stop5396" /> - </linearGradient> - <linearGradient - gradientTransform="translate(0.47111842,-0.19973575)" - id="0-1" - x1="21.253" - y1="37.591999" - x2="77.639999" - y2="37.469002" - gradientUnits="userSpaceOnUse"> - <stop - stop-color="#fff" - id="stop3285" /> - <stop - offset="1" - stop-color="#fff" - stop-opacity="0" - id="stop3287" /> - </linearGradient> - <linearGradient - gradientTransform="translate(50.633198,2.6998865)" - id="0-5" - x1="21.405001" - x2="77.639999" - gradientUnits="userSpaceOnUse"> - <stop - stop-color="#fff" - id="stop3911" /> - <stop - offset="1" - stop-color="#fff" - stop-opacity="0" - id="stop3913" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient4543" - id="linearGradient4545" - x1="119.21609" - y1="11.441374" - x2="209.83548" - y2="11.441374" - gradientUnits="userSpaceOnUse" /> - </defs> - <g - transform="matrix(0.95,0,0,0.95,1.1939867,1.6421008)" - id="g14577"> - <rect - y="4.245285" - x="23.113207" - height="40.212261" - width="3.7735846" - id="rect14571" - style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" /> - <rect - transform="rotate(90)" - style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.84308159;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" - id="rect14573" - width="3.7735846" - height="47.641506" - x="23.231133" - y="-48.820751" /> - </g> + inkscape:current-layer="svg18" + inkscape:document-rotation="0" /> + <path + style="color:#000000" + d="m 1024,864.11538 q 97,0 186,-15 98,35 142,109 38,64.00002 38,141.00002 0,46 -23,101 -23,55 -75,101 -59,49 -129,107 -70,58 -139,137 -70,-78 -140,-136 -70,-58 -128,-108 -53,-45 -75,-100 -22,-55 -23,-102 0,-77 37,-141.00002 43,-74 143,-109 88,15 186,15 z" + fill-rule="nonzero" + display="block" + fill="#ffffff" + id="path2" /> <path - sodipodi:type="star" - style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" - id="path14587" - sodipodi:sides="64" - sodipodi:cx="25" - sodipodi:cy="44.457546" - sodipodi:r1="3.9412203" - sodipodi:r2="3.9364729" - sodipodi:arg1="0.78539816" - sodipodi:arg2="0.83448555" - inkscape:flatsided="true" - inkscape:rounded="0" - inkscape:randomized="0" - d="m 27.786864,47.24441 -0.28658,0.259741 -0.310659,0.2304 -0.331747,0.198841 -0.349638,0.165367 -0.364164,0.1303 -0.375182,0.09398 -0.382587,0.05675 L 25,48.398767 l -0.386307,-0.01898 -0.382587,-0.05675 -0.375182,-0.09398 -0.364164,-0.1303 -0.349638,-0.165367 -0.331747,-0.198841 -0.310659,-0.2304 -0.28658,-0.259741 -0.25974,-0.28658 -0.230401,-0.310659 -0.198841,-0.331746 -0.165367,-0.349639 -0.1303,-0.364164 -0.09398,-0.375182 -0.05675,-0.382587 -0.01898,-0.386307 0.01898,-0.386307 0.05675,-0.382587 0.09398,-0.375182 0.1303,-0.364163 0.165367,-0.349639 0.198841,-0.331746 0.230401,-0.310659 0.25974,-0.28658 0.28658,-0.259741 0.310659,-0.230401 0.331747,-0.198841 0.349638,-0.165367 0.364164,-0.130299 0.375182,-0.09398 0.382587,-0.05675 L 25,40.516326 l 0.386307,0.01898 0.382587,0.05675 0.375182,0.09398 0.364164,0.130299 0.349638,0.165367 0.331747,0.198841 0.310659,0.230401 0.28658,0.259741 0.25974,0.28658 0.230401,0.310659 0.198841,0.331746 0.165367,0.349639 0.1303,0.364163 0.09398,0.375182 0.05675,0.382587 0.01898,0.386307 -0.01898,0.386307 -0.05675,0.382587 -0.09398,0.375182 -0.1303,0.364164 -0.165367,0.349639 -0.198841,0.331746 -0.230401,0.310659 z" - transform="matrix(0,0.95,-0.95,0,47.629715,1.6421021)" /> + style="color:#000000" + d="m 988,1120.1154 -83,1 q -34,0 -34,34 0,34 34,34 h 83 v 86 q 0,35 36,35 35,0 35,-35 v -86 h 86 q 33,0 33,-34 0,-34 -33,-34 h -86 v -82 q 0,-36 -35,-36 -36,0 -36,36 z m 36,-578.00002 q 68,0 132,11 64,11 125,28 -117,31 -257,31 -142,0 -257,-31 58,-16 123,-27 65,-11 134,-12 z m 0,1089.00002 q 68,0 68,68 0,68 -68,68 -68,0 -68,-68 0,-68 68,-68 z m 0,-949.00002 q 117,0 225,-23 l -48,123 q -88,14 -177,14 -91,0 -178,-14 l -48,-123 q 107,23 226,23 z m 0,182 q 97,0 186,-15 98,35 142,109 38,64.00002 38,141.00002 0,46 -23,101 -23,55 -75,101 -59,49 -129,107 -70,58 -139,137 -70,-78 -140,-136 -70,-58 -128,-108 -53,-45 -75,-100 -22,-55 -23,-102 0,-77 37,-141.00002 43,-74 143,-109 88,15 186,15 z m -36,-377 h -32 q -56,-90 -107,-113 -24,-12 -53,-22 -29,-10 -67,-10 -7,0 -107,16 -48,7 -76,15 -28,8 -44,10 -57,7 -133,-6 -46,-8 -86,-29 l 48,-78 q 12,12 31,15 19,3 36,8 42,7 80,2 13,-3 51,-7 38,-4 101,-15 75,-11 102,-11 105,0 161,40 34,26 64,72 30,46 31,113 z m 36,-113 q -14,-57 -34,-79 -20,-22 -53,-46 -36,-25 -85,-42 -49,-17 -109,-9 l -281,39 q -17,2 -30,0 -13,-2 -26,-2 -21,0 -53,-9 -32,-9 -51,-28 l -97,159 q 18,20 32,28 14,8 33,17 58,27 124,33 28,2 55,1 27,-1 56,2 54,-9 108,-16 54,-7 110,-16 60,0 81,12 11,6 35,22 24,16 48,47 -53,6 -108,20 -55,14 -97,31 l 104,258 q -78,45 -109,72 -31,27 -49,64 -26,46 -33,89.00002 -7,43 -7,77 1,60 28,132 27,72 104,130 63,48 123,99 60,51 119,119 -74,38 -74,121 0,56 39,96 39,40 97,40 56,0 96,-40 40,-40 40,-96 0,-82 -74,-121 58,-68 117,-119 59,-51 125,-99 75,-57 102,-129 27,-72 29,-133 0,-34 -7,-77 -7,-43.00002 -32,-89.00002 -20,-36 -50,-63 -30,-27 -108,-73 l 104,-258 q -44,-16 -99,-30 -55,-14 -106,-21 23,-31 47,-47 24,-16 36,-22 21,-12 81,-12 54,8 108,15 54,7 110,17 27,-3 54,-2 27,1 57,-1 64,-6 124,-33 18,-9 32,-17 14,-8 33,-28 l -98,-159 q -18,18 -50,27 -32,9 -53,10 -13,0 -26,2 -13,2 -31,0 l -280,-39 q -60,-9 -111,8 -51,17 -85,45 -33,27 -52,46 -19,19 -33,77 z m 35,113 q 0,-66 30,-112 30,-46 66,-73 55,-40 161,-40 26,0 102,11 62,10 100,14 38,4 51,8 38,5 80,-2 16,-4 35,-7 19,-3 33,-16 l 48,78 q -41,21 -87,29 -76,13 -133,6 -17,-2 -44,-10 -27,-8 -75,-15 -101,-16 -107,-16 -39,0 -68,10 -29,10 -52,22 -53,24 -108,113 z" + fill-rule="nonzero" + display="block" + fill="#000000" + id="path4" /> <g - id="g19380" - transform="matrix(0.77598955,0,0,0.77598955,5.3934327,3.4879779)"> - <g - transform="matrix(1.0975945,0,0,1.0975945,-107.62233,17.126787)" - style="opacity:1;fill:#1f1a17;fill-opacity:1;stroke-width:1.54272723;stroke-miterlimit:4;stroke-dasharray:none" - id="g5357"> - <path - style="fill:#1f1a17;fill-opacity:1;stroke:none;stroke-width:1.54272723;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 119.66608,20.578823 c 0.12511,0.773672 0.40427,1.44388 1.3,1.7 11.23011,-0.424319 16.82956,-5.233235 20.30001,-11.7 l 0.2,-2.099999 c -2.10707,-8.89280401 -8.15113,-13.4502442 -16.2,-15.8 -4.40015,-0.5317426 -7.59668,1.3815851 -10.20001,4.5 -2.59354,2.64077835 -4.39616,5.9439949 -5.3,10 -0.9084,3.60641 -5.79067,1.6990508 -4.9,-0.6 2.76583,-4.0566968 11.00069,-10.7605086 4.9,-12.3 -8.75831,-2.0518262 -7.05798,4.7061225 -5.2,6.20000004 1.23982,-0.5457366 2.00197,-1.22280981 2.4,-2.00000004 -0.25951,-0.4357328 -0.98217,-0.8162564 0,-1.4 0.5387,0.045976 0.81918,0.2856122 1,0.6 0,1 0.50403,1.1455069 -3.6,4 -7.640521,5.2325602 -2.06546,17.121851 4.61159,18.198353 1.32064,-0.324595 1.53284,-0.226663 2.43634,0.347926 l 3.15207,0.35372 c 2.39802,-0.822905 4.4665,-1.650139 5.70313,-3.159477 0.32094,-0.38845 0.4935,-0.247984 -0.60313,3.159477 z" - id="path5349" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccccccccccccccccc" /> - <path - style="fill:#1f1a17;fill-opacity:1;stroke:none;stroke-width:1.54272723;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 109.56608,17.578823 c -1.32838,4.066443 -4.04985,6.321863 -6.6,8.8 -0.20576,0.304421 0.14574,0.397532 1,0.3 3.90473,-1.863513 7.52129,-4.086217 8.76166,-7.725974 -0.78642,-0.41302 -1.9736,-1.357866 -3.16166,-1.374026 z" - id="path5353" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccc" /> - </g> - <g - transform="matrix(0.79655895,0,0,0.79655895,-75.421737,16.247409)" - style="opacity:1;fill:#ffff00;fill-opacity:1;stroke-width:1.54272723;stroke-miterlimit:4;stroke-dasharray:none" - id="g5357-2"> - <path - style="fill:url(#linearGradient4545);fill-opacity:1;stroke:none;stroke-width:1.54272723;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 133.58361,1.5558616 c -8.75606,10.1109584 -4.19979,7.5116959 -2.74223,10.1130104 -0.10968,5.65697 -1.90023,10.862018 -3.55112,15.867945 0.12511,0.773672 0.47829,1.517901 1.37402,1.774021 12.03339,-0.558199 18.98339,-7.721951 22.11462,-14.132179 l 0.43477,-2.601728 c -2.89219,-8.7881214 -9.12021,-14.2749978 -15.98474,-18.0311568 -3.95603,-2.012167 -6.44991,-1.8836905 -11.42192,-0.2457 -8.66328,7.0080302 -11.21253,16.0768238 -12.11637,20.1328288 -1.01612,3.667963 -15.446226,0.776698 -6.82456,-7.854079 3.2983,-3.3578275 11.23128,-10.4578594 4.9,-12.3 -8.75831,-2.0518262 -6.68787,4.85416494 -5.71815,5.60783029 0.8142,-0.43470477 0.7066,-0.35306049 1.38221,-0.98220829 -1.17923,-0.8361833 -0.84585,-1.8283785 0.25907,-2.5103183 1.26041,-0.7312468 2.29961,-0.5841371 3.68327,0.3779364 2.30121,3.99968414 -3.10867,6.3374791 -6.06121,8.5893156 -7.571668,6.8550703 0.11863,18.3130553 6.94372,20.6479193 l 0.77482,-1.497349 c 1.024,0.222539 2.43711,0.731241 3.93177,1.474031 0.11862,0.05895 -0.0661,1.049227 -0.0564,1.233499 0.78343,-0.270382 4.65893,-6.09553 4.7812,-6.115529 1.48143,0.230311 1.07354,3.434896 -1.37652,5.984803 4.20113,-1.72865 7.84001,-6.076464 9.2663,-9.632977 2.12212,-5.291587 -0.65644,-3.773127 -1.42504,-5.631192 C 125.75704,7.2456297 128.89,0.31884652 133.58364,1.5558406 Z" - id="path5349-8" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ccccccccccccccccccscccsccc" /> - <path - style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.54272723;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 111.72715,26.876138 c -1.99457,3.992422 -2.2307,3.850363 -4.55878,6.92067 -0.57956,1.378028 4.89591,-3.943837 5.76902,-6.496225 -1.02889,-0.498698 -0.43741,-0.404465 -1.21024,-0.424445 z" - id="path5353-9" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cccc" /> - </g> + fill-rule="nonzero" + fill="#ffffff" + id="g16" + transform="matrix(1,0,0,-1,0,2030.1154)"> + <path + style="color:#000000" + d="m 1024,1488 q 68,0 132,-11 64,-11 125,-28 -117,-31 -257,-31 -142,0 -257,31 58,16 123,27 65,11 134,12 z" + display="block" + id="path6" /> <path - inkscape:connector-curvature="0" - id="path3879" - d="m 17.809955,22.804124 c -0.364,-0.186 -0.542,-0.279 -0.542,-0.279 -0.499,-0.195 -0.652,-0.559 -0.474,-1.092 0.195,-0.491 0.576,-0.66 1.143,-0.491 1.947,0.711 3.294,2.02 4.04,3.92 0.118,0.542 -0.076,0.914 -0.592999,1.118 -0.516001,0.161 -0.864001,-0.017 -1.041001,-0.55 -0.136,-0.279 -0.229,-0.466 -0.296,-0.542 -0.186,0.144 -0.423,0.245 -0.72,0.296 -1.01,0.161 -1.6,-0.279 -1.761,-1.338 -0.051,-0.364 0.034,-0.711 0.246,-1.041" - style="fill:#000000;stroke-width:1" /> + style="color:#000000" + d="m 1024,399 q 68,0 68,-68 0,-68 -68,-68 -68,0 -68,68 0,68 68,68 z" + display="block" + id="path8" /> + <path + style="color:#000000" + d="m 1024,1348 q 117,0 225,23 l -48,-123 q -88,-14 -177,-14 -91,0 -178,14 l -48,123 q 107,-23 226,-23 z" + display="block" + id="path10" /> + <path + style="color:#000000" + d="m 988,1543 h -32 q -56,90 -107,113 -24,12 -53,22 -29,10 -67,10 -7,0 -107,-16 -48,-7 -76,-15 -28,-8 -44,-10 -57,-7 -133,6 -46,8 -86,29 l 48,78 q 12,-12 31,-15 19,-3 36,-8 42,-7 80,-2 13,3 51,7 38,4 101,15 75,11 102,11 105,0 161,-40 34,-26 64,-72 30,-46 31,-113 z" + display="block" + id="path12" /> + <path + style="color:#000000" + d="m 1059,1543 q 0,66 30,112 30,46 66,73 55,40 161,40 26,0 102,-11 62,-10 100,-14 38,-4 51,-8 38,-5 80,2 16,4 35,7 19,3 33,16 l 48,-78 q -41,-21 -87,-29 -76,-13 -133,-6 -17,2 -44,10 -27,8 -75,15 -101,16 -107,16 -39,0 -68,-10 -29,-10 -52,-22 -53,-24 -108,-113 z" + display="block" + id="path14" /> </g> <path - sodipodi:type="star" - style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60862446;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" - id="path14581" - sodipodi:sides="64" - sodipodi:cx="24.943983" - sodipodi:cy="6.1232343" - sodipodi:r1="3.7441592" - sodipodi:r2="3.7396493" - sodipodi:arg1="0.78539816" - sodipodi:arg2="0.83448555" - inkscape:flatsided="true" - inkscape:rounded="0" - inkscape:randomized="0" - d="m 27.591503,8.7707546 -0.27225,0.2467539 -0.295127,0.2188804 -0.315158,0.188899 -0.332157,0.1570984 -0.345956,0.123785 -0.356423,0.089279 -0.363457,0.053914 -0.366992,0.018029 L 24.576991,9.8493643 24.213534,9.7954505 23.857111,9.7061713 23.511155,9.5823863 23.178999,9.4252879 22.86384,9.2363889 22.568714,9.0175085 22.296463,8.7707547 22.049709,8.4985037 21.830828,8.2033777 21.641929,7.8882187 21.484831,7.556062 21.361046,7.2101063 l -0.08928,-0.3564228 -0.05391,-0.3634574 -0.01803,-0.3669918 0.01803,-0.3669918 0.05391,-0.3634574 0.08928,-0.3564229 0.123785,-0.3459556 0.157098,-0.3321568 0.188899,-0.3151589 0.218881,-0.2951261 0.246754,-0.2722509 0.272251,-0.2467538 0.295126,-0.2188804 0.315159,-0.1888991 0.332156,-0.1570984 0.345956,-0.1237849 0.356423,-0.089279 0.363457,-0.053914 0.366992,-0.018029 0.366992,0.018029 0.363457,0.053914 0.356423,0.089279 0.345956,0.1237849 0.332157,0.1570984 0.315158,0.188899 0.295127,0.2188804 0.27225,0.2467539 0.246754,0.2722509 0.218881,0.2951261 0.188899,0.3151589 0.157098,0.3321568 0.123785,0.3459556 0.08928,0.3564228 0.05391,0.3634575 0.01803,0.3669918 -0.01803,0.3669917 -0.05391,0.3634575 -0.08928,0.3564228 -0.123785,0.3459557 -0.157098,0.3321567 -0.188899,0.315159 -0.218881,0.295126 z" /> + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 947.17182,471.41109 c -30.45334,-45.32634 -64.86074,-80.9966 -91.76761,-95.13576 -22.95398,-12.06198 -61.45362,-26.6333 -81.08074,-30.68739 -26.67391,-5.50965 -51.01232,-4.28682 -116.05835,5.8311 -72.89746,11.33921 -76.88494,12.10192 -119.01258,22.76439 -33.45007,8.46618 -33.89255,8.5119 -82.33748,8.50794 -66.52062,-0.005 -108.55722,-7.30624 -155.48269,-27.00384 l -17.29486,-7.25975 5.09615,-8.37924 c 2.80289,-4.60858 13.30666,-21.68954 23.34173,-37.95769 l 18.24557,-29.57846 9.70164,5.52032 c 5.33589,3.03617 22.74806,8.43988 38.6937,12.00823 40.29849,9.0181 76.74353,9.11601 142.641,0.38322 26.78868,-3.55006 60.80841,-8.50481 75.5994,-11.01056 85.2588,-14.44374 136.26154,-18.40583 179.53084,-13.94666 71.73861,7.39311 116.60421,29.22282 153.48533,74.67949 36.13568,44.53787 51.19578,79.03611 55.36431,126.823 l 1.65194,18.9377 h -15.28893 -15.28896 z" + id="path98" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 960.21744,609.71854 c -30.46594,-1.92131 -88.37044,-8.34131 -113.06287,-12.53553 -34.16061,-5.80248 -71.32671,-14.1993 -71.32671,-16.11462 0,-3.20983 87.1612,-22.0073 134.42087,-28.98966 62.98166,-9.30519 159.43327,-10.45377 215.80337,-2.56986 47.4172,6.63175 146.12,27.88938 146.12,31.46988 0,4.28726 -90.4772,20.37707 -143.8006,25.57245 -26.8902,2.61996 -142.34881,4.79472 -168.15406,3.16734 z" + id="path100" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 1061.8034,464.453 c 3.254,-50.76824 23.7655,-92.95822 66.2041,-136.17488 32.4584,-33.05348 60.9141,-48.19648 108.9705,-57.98975 48.4347,-9.87036 92.2077,-8.96955 177.8351,3.6597 21.6861,3.1985 59.2598,8.3515 83.4972,11.45111 24.2374,3.09962 53.8564,7.35888 65.8201,9.46503 39.7549,6.99867 118.5147,-2.11356 143.1736,-16.56469 l 9.875,-5.78713 18.2456,29.57846 c 10.0351,16.26815 20.5389,33.34911 23.3417,37.95769 l 5.0962,8.37924 -17.2949,7.25975 c -46.8542,19.66769 -89.5876,26.97583 -157.802,26.98684 l -48.7067,0.008 -38.2695,-9.86495 c -45.6661,-11.77155 -163.9011,-30.71085 -191.723,-30.71085 -34.8132,0 -72.4411,10.70844 -114.0588,32.45977 -31.5375,16.48291 -63.3679,48.11742 -92.5737,92.00384 l -12.8686,19.33707 h -15.0685 -15.0685 z" + id="path102" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 926.58664,790.93079 c -48.45784,-4.4723 -76.71362,-8.51955 -79.27829,-11.35554 -1.96603,-2.17401 -48.13304,-117.97896 -47.38055,-118.84898 0.13937,-0.16115 13.29983,2.13616 29.24547,5.10512 122.21863,22.7562 264.35173,22.78487 389.07363,0.0785 15.6267,-2.84494 28.4122,-4.79397 28.4122,-4.33117 0,3.21136 -45.0594,115.95904 -47.1855,118.06753 -2.8563,2.83272 -47.2869,8.7649 -93.1361,12.43514 -37.9794,3.04026 -141.52393,2.37747 -179.75086,-1.15058 z" + id="path104" /> <path - d="m 27.591503,46.524287 -0.27225,0.246753 -0.295127,0.218881 -0.315158,0.188899 -0.332157,0.157098 -0.345956,0.123785 -0.356423,0.08928 -0.363457,0.05391 -0.366992,0.01803 -0.366992,-0.01803 -0.363457,-0.05391 -0.356423,-0.08928 -0.345956,-0.123785 -0.332156,-0.157098 -0.315159,-0.188899 -0.295126,-0.218881 -0.272251,-0.246753 -0.246754,-0.272251 -0.218881,-0.295126 -0.188899,-0.315159 -0.157098,-0.332157 -0.123785,-0.345956 -0.08928,-0.356423 -0.05391,-0.363457 -0.01803,-0.366992 0.01803,-0.366992 0.05391,-0.363457 0.08928,-0.356423 0.123785,-0.345955 0.157098,-0.332157 0.188899,-0.315159 0.218881,-0.295126 0.246754,-0.272251 0.272251,-0.246754 0.295126,-0.21888 0.315159,-0.188899 0.332156,-0.157099 0.345956,-0.123785 0.356423,-0.08928 0.363457,-0.05391 0.366992,-0.01803 0.366992,0.01803 0.363457,0.05391 0.356423,0.08928 0.345956,0.123785 0.332157,0.157099 0.315158,0.188899 0.295127,0.21888 0.27225,0.246754 0.246754,0.272251 0.218881,0.295126 0.188899,0.315159 0.157098,0.332156 0.123785,0.345956 0.08928,0.356423 0.05391,0.363457 0.01803,0.366992 -0.01803,0.366992 -0.05391,0.363457 -0.08928,0.356423 -0.123785,0.345956 -0.157098,0.332157 -0.188899,0.315159 -0.218881,0.295126 z" - inkscape:randomized="0" - inkscape:rounded="0" - inkscape:flatsided="true" - sodipodi:arg2="0.83448555" - sodipodi:arg1="0.78539816" - sodipodi:r2="3.7396493" - sodipodi:r1="3.7441592" - sodipodi:cy="43.876766" - sodipodi:cx="24.943983" - sodipodi:sides="64" - id="path14583" - style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.60862446;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" - sodipodi:type="star" /> + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 971.81427,1489.269 c -33.7343,-34.0367 -67.92481,-65.5709 -100.89241,-93.0538 C 727.7932,1276.898 712.94334,1262.0988 689.43513,1215.3477 c -35.64978,-70.8972 -38.89555,-152.0899 -8.95504,-224.01025 17.47633,-41.98002 48.40993,-80.56982 83.42688,-104.0754 20.8143,-13.97185 67.23106,-35.85433 75.65918,-35.66836 3.8513,0.085 19.52694,1.82817 34.83475,3.87375 49.50664,6.61557 86.90237,8.81829 149.5991,8.81183 64.5397,-0.007 103.5443,-2.40639 155.2128,-9.54937 35.4041,-4.89449 34.5399,-5.05898 71.4319,13.59618 49.5753,25.06869 85.7117,60.84318 109.4786,108.38215 49.3986,98.80777 32.1307,215.45167 -44.2309,298.77907 -8.1005,8.8394 -51.2582,46.4757 -95.906,83.6361 -92.232,76.7649 -127.2998,108.6652 -166.9212,151.8437 -15.2675,16.6383 -28.314,30.1466 -28.992,30.0184 -0.6781,-0.1281 -24.1946,-23.4006 -52.25893,-51.7165 z m 74.36703,-183.3493 c 12.8571,-8.4243 13.7046,-12.2248 14.5769,-65.3684 l 0.808,-49.2261 47.8987,-0.7453 c 55.0636,-0.8567 59.784,-2.1479 66.1661,-18.0983 4.7794,-11.9451 4.7794,-22.9297 0,-34.8748 -6.3581,-15.8903 -11.0983,-17.1878 -66.1595,-18.1099 l -47.892,-0.8019 -0.8887,-46.7677 c -0.9815,-51.6509 -2.6343,-58.5058 -15.7406,-65.2833 -10.1912,-5.27 -34.187,-4.6222 -43.7036,1.1799 -12.77518,7.7888 -14.35645,15.0548 -14.35645,65.968 v 45.3021 l -41.16875,0.1009 c -48.20479,0.1183 -59.1611,1.7612 -67.52557,10.1257 -5.64188,5.642 -6.11429,7.6295 -6.11429,25.7236 0,18.0106 0.49019,20.0993 6.013,25.6222 8.62666,8.6266 18.87421,10.2104 66.46718,10.2726 l 42.32843,0.055 v 44.9378 c 0,48.9596 0.71455,55.7952 6.65597,63.6719 8.67818,11.505 39.13738,15.1598 52.63518,6.3157 z" + id="path106" /> <path - d="M 27.786864,7.5038459 27.500284,7.7635868 27.189625,7.9939873 26.857878,8.1928283 26.50824,8.3581951 26.144076,8.488495 25.768894,8.5824732 25.386307,8.6392246 25,8.6582026 24.613693,8.6392246 24.231106,8.5824732 23.855924,8.488495 23.49176,8.3581951 23.142122,8.1928283 22.810375,7.9939873 22.499716,7.7635869 22.213136,7.503846 21.953396,7.2172661 21.722995,6.906607 21.524154,6.5748608 21.358787,6.2252221 l -0.1303,-0.3641639 -0.09398,-0.3751819 -0.05675,-0.3825868 -0.01898,-0.3863071 0.01898,-0.3863072 0.05675,-0.3825868 0.09398,-0.3751819 0.1303,-0.3641638 0.165367,-0.3496387 0.198841,-0.3317463 0.230401,-0.310659 0.25974,-0.2865799 0.28658,-0.2597409 0.310659,-0.2304004 0.331747,-0.1988411 0.349638,-0.1653668 0.364164,-0.13029989 0.375182,-0.0939782 0.382587,-0.0567514 L 25,0.77576208 l 0.386307,0.018978 0.382587,0.0567514 0.375182,0.0939782 0.364164,0.1302999 0.349638,0.1653668 0.331747,0.1988411 0.310659,0.2304004 0.28658,0.2597409 0.25974,0.2865799 0.230401,0.310659 0.198841,0.3317463 0.165367,0.3496386 0.1303,0.3641639 0.09398,0.3751819 0.05675,0.3825868 0.01898,0.3863072 -0.01898,0.3863071 -0.05675,0.3825868 -0.09398,0.3751819 -0.1303,0.3641639 -0.165367,0.3496386 -0.198841,0.3317463 -0.230401,0.310659 z" - inkscape:randomized="0" - inkscape:rounded="0" - inkscape:flatsided="true" - sodipodi:arg2="0.83448555" - sodipodi:arg1="0.78539816" - sodipodi:r2="3.9364729" - sodipodi:r1="3.9412203" - sodipodi:cy="4.7169824" - sodipodi:cx="25" - sodipodi:sides="64" - id="path14585" - style="opacity:1;fill:#1f1a17;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.69328892;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" - sodipodi:type="star" - transform="matrix(0,0.95,-0.95,0,49.086086,1.6421021)" /> + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 997.32729,1762.3466 c -16.51064,-5.022 -26.29282,-13.3548 -33.30723,-28.3726 -5.20533,-11.1445 -6.07755,-16.1561 -6.09806,-35.0385 -0.0216,-19.8695 0.65961,-23.4011 6.93417,-35.9502 5.32746,-10.6549 9.47402,-15.4484 17.69378,-20.4544 22.68075,-13.8128 60.21935,-13.8128 82.90005,0 8.2198,5.006 12.3664,9.7995 17.6938,20.4544 6.2664,12.5327 6.9581,16.1067 6.9581,35.9502 0,19.8434 -0.6917,23.4174 -6.9581,35.9501 -4.307,8.6142 -9.9728,15.9127 -14.8709,19.1563 -17.8607,11.8278 -47.8295,15.3358 -70.94561,8.3047 z" + id="path108" /> </svg> diff --git a/client/public/images/pieces/Cwda/wi.svg b/client/public/images/pieces/Cwda/wi.svg new file mode 100644 index 00000000..38d59912 --- /dev/null +++ b/client/public/images/pieces/Cwda/wi.svg @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="100%" + width="100%" + version="1.1" + viewBox="0 0 2048 2048" + id="svg6" + sodipodi:docname="wi.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <metadata + id="metadata12"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs10" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="960" + inkscape:window-height="1060" + id="namedview8" + showgrid="false" + inkscape:zoom="0.43115234" + inkscape:cx="1024" + inkscape:cy="1024" + inkscape:window-x="0" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:current-layer="svg6" /> + <path + style="color:#000000" + d="m 1756,234 q -1,0 2,54 3,54 3,118 1,125 0,258 -1,133 -36,267 -34,128 -75,218 -41,90 -89,157 -72,108 -196,183 -124,75 -259,98 9,-49 8,-96 -2,-36 -34,-36 -37,0 -33,36 3,132 -94,226 -76,-80 -82,-186 -2,-35 -36,-31 -32,1 -32,37 0,0 2,8 -41,-13 -86,-37 -29,-20 -47,10 -18,30 16,47 43,22 65,33 -86,88 -196,142 12,-139 76,-263 17,-26 -8,-46 -28,-22 -47,7 -7,10 -20,36 -21,-21 -28,-31 -7,-9 -24,-40 -17,-31 -26,-51 -9,-25 -8,-40 1,-15 3,-35 -9,-59 -40,-111 -31,-52 -81,-127 -47,-72 -72,-108 -25,-36 -38,-92 -9,-34 0,-82 9,-48 39,-76 46,-47 89,-43 14,0 37,11 23,11 37,42 26,57 43,57 25,0 27,-28 0,-6 -16,-50 -9,-20 -24,-42 -19,-26 -17,-22 16,-57 53,-20 11,11 25,41 14,30 44,81 35,59 75,96 40,37 71,60 18,13 44,30 26,17 70,35 35,14 77,34 42,20 76,53 46,45 71,111 13,37 10,91 -9,34 34,34 32,0 36,-33 0,-113 -64,-206 21,-64 11,-140 -9,-61 -42,-130 Q 1017,674 914,588 707,416 718,234 q 0,0 170,0 170,0 321,0 z" + fill-rule="nonzero" + display="block" + fill="#ffffff" + id="path2" /> + <path + style="color:#000000" + d="m 697,1319 q 13,-20 10,-42 -10,-64 -71,-54 -18,3 -29,12 -4,-5 -12,-22 -11,-32 -42,-22 -31,12 -24,45 45,115 163,158 34,10 45,-20 12,-32 -18,-44 -6,-3 -11,-5 -5,-2 -11,-6 z M 400,842 q -29,-18 -35,-48 1,-33 -31,-36 -35,-4 -36,30 4,66 59,105 26,21 48,-4 22,-27 -5,-47 z m 679,815 q 157,-10 291,-81 134,-71 228,-182 66,-78 124,-188 58,-110 94,-233 40,-143 50,-300 10,-157 11,-292 V 163 q 0,0 -155,0 -155,0 -404,0 H 647 q -9,0 -9,49 0,49 7,79 4,24 19,68 15,44 50,107 16,32 76,93 60,61 138,143 45,46 70,116 25,70 22,127 -37,-30 -81,-49 -212,-76 -307,-220 -7,-9 -45,-81 -20,-38 -34,-52 -19,-19 -55,-21 -56,-3 -87,54 -42,-12 -75,-10 -56,21 -81,45 -51,51 -66,102 -15,51 -16,110 0,84 104,222 122,159 130,242 0,36 7,81 6,31 25,60 13,20 17,27 4,7 17,23 9,12 15,18 6,6 15,18 11,13 28,30 -53,146 -43,301 199,-71 334,-223 33,113 130,183 80,-56 127,-148 z M 1756,234 q -1,0 2,54 3,54 3,118 1,125 0,258 -1,133 -36,267 -34,128 -75,218 -41,90 -89,157 -72,108 -196,183 -124,75 -259,98 9,-49 8,-96 -2,-36 -34,-36 -37,0 -33,36 3,132 -94,226 -76,-80 -82,-186 -2,-35 -36,-31 -32,1 -32,37 0,0 2,8 -41,-13 -86,-37 -29,-20 -47,10 -18,30 16,47 43,22 65,33 -86,88 -196,142 12,-139 76,-263 17,-26 -8,-46 -28,-22 -47,7 -7,10 -20,36 -21,-21 -28,-31 -7,-9 -24,-40 -17,-31 -26,-51 -9,-25 -8,-40 1,-15 3,-35 -9,-59 -40,-111 -31,-52 -81,-127 -47,-72 -72,-108 -25,-36 -38,-92 -9,-34 0,-82 9,-48 39,-76 46,-47 89,-43 14,0 37,11 23,11 37,42 26,57 43,57 25,0 27,-28 0,-6 -16,-50 -9,-20 -24,-42 -19,-26 -17,-22 16,-57 53,-20 11,11 25,41 14,30 44,81 35,59 75,96 40,37 71,60 18,13 44,30 26,17 70,35 35,14 77,34 42,20 76,53 46,45 71,111 13,37 10,91 -9,34 34,34 32,0 36,-33 0,-113 -64,-206 21,-64 11,-140 -9,-61 -42,-130 Q 1017,674 914,588 707,416 718,234 q 0,0 170,0 170,0 321,0 z" + fill-rule="nonzero" + display="block" + fill="#000000" + id="path4" /> +</svg> diff --git a/client/public/images/pieces/Cwda/wl.svg b/client/public/images/pieces/Cwda/wl.svg new file mode 100644 index 00000000..44814bb1 --- /dev/null +++ b/client/public/images/pieces/Cwda/wl.svg @@ -0,0 +1,133 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="100%" + width="100%" + version="1.1" + viewBox="0 0 2048 2048" + id="svg34" + sodipodi:docname="wl.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <metadata + id="metadata40"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs38" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="960" + inkscape:window-height="1060" + id="namedview36" + showgrid="false" + inkscape:zoom="0.43115234" + inkscape:cx="1024" + inkscape:cy="1024" + inkscape:window-x="0" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:current-layer="svg34" /> + <path + style="color:#000000" + d="m 1024,1593 q -57,0 -96,40 -39,40 -40,97 0,56 39,96 39,40 97,40 56,0 96,-40 40,-40 41,-96 0,-57 -40,-97 -40,-40 -97,-40 z m 0,70 q 67,0 67,67 0,66 -67,66 -66,0 -66,-66 0,-67 66,-67 z M 1533,656 q -193,49 -505,49 -320,0 -511,-50 l 15,-96 q 195,46 496,46 299,0 488,-45 z m 25,60 65,115 q -48,-19 -98,-19 -134,0 -214,109 -60,-50 -134,-50 -96,0 -153,75 -64,-70 -153,-70 -72,0 -132,49 -84,-107 -217,-107 -51,0 -101,19 l 70,-120 q 194,56 533,56 345,0 534,-57 z m -448,239 -85,489 -85,-483 q 3,2 14,10 23,45 70,45 51,0 66,-45 6,-6 20,-16 z m 277,-19 v 463 L 1222,945 q 19,7 32,18 20,25 54,25 40,0 64,-35 3,-4 7,-8 4,-4 8,-9 z M 825,950 661,1399 V 942 q 3,4 9,10 20,42 66,42 38,0 62,-32 27,-12 27,-12 z M 571,894 356,1265 411,927 q 57,-40 111,-40 21,0 49,7 z m 903,-5 q 23,-7 51,-7 61,0 114,38 l 55,346 z m 60,-506 -30,113 q -196,43 -480,43 -281,0 -479,-43 L 514,382 q 186,56 511,56 317,0 509,-55 z m 106,-128 q -49,-43 -220,-72 -171,-29 -394,-29 -227,0 -399,30 -172,30 -217,75 l 63,240 -28,157 -88,153 -85,622 49,19 274,-462 6,550 68,12 209,-553 112,595 h 69 l 112,-593 207,551 69,-12 6,-550 275,463 47,-22 -83,-619 -89,-153 -28,-159 z m -81,36 q -183,76 -531,76 -355,0 -537,-78 175,-69 534,-69 172,0 314,19 142,19 220,52 z M 604,1543 q -57,0 -97,39 -40,39 -40,97 0,56 40,96 40,40 97,40 56,0 96,-40 40,-40 40,-96 0,-57 -40,-96 -40,-39 -96,-40 z m 0,70 q 66,0 66,66 0,66 -66,66 -67,0 -67,-66 0,-66 67,-66 z m 840,0 q 67,0 67,66 0,66 -67,66 -66,0 -66,-66 0,-66 66,-66 z m 0,-70 q -57,0 -96,39 -39,39 -40,97 0,56 39,96 39,40 97,40 57,0 97,-40 40,-40 40,-96 0,-57 -40,-96 -40,-39 -97,-40 z M 236,1433 q -57,0 -96,39 -39,39 -40,97 0,56 39,96 39,40 97,41 57,0 97,-40 40,-40 40,-97 0,-57 -40,-96 -40,-39 -97,-40 z m 0,70 q 67,0 67,66 0,67 -67,67 -66,0 -66,-67 0,-66 66,-66 z m 1578,0 q 66,0 66,66 0,67 -66,67 -67,0 -67,-67 0,-66 67,-66 z m 0,-70 q -57,0 -97,39 -40,39 -40,97 0,56 40,96 40,40 97,41 56,0 96,-40 40,-40 40,-97 0,-57 -40,-96 -40,-39 -96,-40 z" + fill-rule="nonzero" + display="block" + fill="#000000" + id="path2" /> + <g + fill-rule="nonzero" + fill="#ffffff" + id="g32" + transform="matrix(1,0,0,-1,0,2020)"> + <path + style="color:#000000" + d="m 1024,357 q 67,0 67,-67 0,-66 -67,-66 -66,0 -66,66 0,67 66,67 z" + display="block" + id="path4" /> + <path + style="color:#000000" + d="m 1533,1364 q -193,-49 -505,-49 -320,0 -511,50 l 15,96 q 195,-46 496,-46 299,0 488,45 z" + display="block" + id="path6" /> + <path + style="color:#000000" + d="m 1558,1304 65,-115 q -48,19 -98,19 -134,0 -214,-109 -60,50 -134,50 -96,0 -153,-75 -64,70 -153,70 -72,0 -132,-49 -84,107 -217,107 -51,0 -101,-19 l 70,120 q 194,-56 533,-56 345,0 534,57 z" + display="block" + id="path8" /> + <path + style="color:#000000" + d="m 1110,1065 -85,-489 -85,483 q 3,-2 14,-10 23,-45 70,-45 51,0 66,45 6,6 20,16 z" + display="block" + id="path10" /> + <path + style="color:#000000" + d="M 1387,1084 V 621 l -165,454 q 19,-7 32,-18 20,-25 54,-25 40,0 64,35 3,4 7,8 4,4 8,9 z" + display="block" + id="path12" /> + <path + style="color:#000000" + d="M 825,1070 661,621 v 457 q 3,-4 9,-10 20,-42 66,-42 38,0 62,32 27,12 27,12 z" + display="block" + id="path14" /> + <path + style="color:#000000" + d="m 571,1126 -215,-371 55,338 q 57,40 111,40 21,0 49,-7 z" + display="block" + id="path16" /> + <path + style="color:#000000" + d="m 1474,1131 q 23,7 51,7 61,0 114,-38 l 55,-346 z" + display="block" + id="path18" /> + <path + style="color:#000000" + d="m 1534,1637 -30,-113 q -196,-43 -480,-43 -281,0 -479,43 l -31,114 q 186,-56 511,-56 317,0 509,55 z" + display="block" + id="path20" /> + <path + style="color:#000000" + d="m 1559,1729 q -183,-76 -531,-76 -355,0 -537,78 175,69 534,69 172,0 314,-19 142,-19 220,-52 z" + display="block" + id="path22" /> + <path + style="color:#000000" + d="m 604,407 q 66,0 66,-66 0,-66 -66,-66 -67,0 -67,66 0,66 67,66 z" + display="block" + id="path24" /> + <path + style="color:#000000" + d="m 1444,407 q 67,0 67,-66 0,-66 -67,-66 -66,0 -66,66 0,66 66,66 z" + display="block" + id="path26" /> + <path + style="color:#000000" + d="m 236,517 q 67,0 67,-66 0,-67 -67,-67 -66,0 -66,67 0,66 66,66 z" + display="block" + id="path28" /> + <path + style="color:#000000" + d="m 1814,517 q 66,0 66,-66 0,-67 -66,-67 -67,0 -67,67 0,66 67,66 z" + display="block" + id="path30" /> + </g> +</svg> diff --git a/client/public/images/pieces/Cwda/wo.svg b/client/public/images/pieces/Cwda/wo.svg new file mode 100644 index 00000000..2524dba6 --- /dev/null +++ b/client/public/images/pieces/Cwda/wo.svg @@ -0,0 +1,190 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="100%" + width="100%" + version="1.1" + viewBox="0 0 2048 2048" + id="svg34" + sodipodi:docname="wo.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <metadata + id="metadata40"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs38" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="960" + inkscape:window-height="1060" + id="namedview36" + showgrid="false" + inkscape:zoom="0.43115234" + inkscape:cx="1024" + inkscape:cy="1021.6806" + inkscape:window-x="0" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:current-layer="svg34" + inkscape:document-rotation="0" /> + <path + style="color:#000000" + d="m 1024,1593 q -57,0 -96,40 -39,40 -40,97 0,56 39,96 39,40 97,40 56,0 96,-40 40,-40 41,-96 0,-57 -40,-97 -40,-40 -97,-40 z m 0,70 q 67,0 67,67 0,66 -67,66 -66,0 -66,-66 0,-67 66,-67 z M 1533,656 q -193,49 -505,49 -320,0 -511,-50 l 15,-96 q 195,46 496,46 299,0 488,-45 z m 25,60 65,115 q -48,-19 -98,-19 -134,0 -214,109 -60,-50 -134,-50 -96,0 -153,75 -64,-70 -153,-70 -72,0 -132,49 -84,-107 -217,-107 -51,0 -101,19 l 70,-120 q 194,56 533,56 345,0 534,-57 z m -448,239 -85,489 -85,-483 q 3,2 14,10 23,45 70,45 51,0 66,-45 6,-6 20,-16 z m 277,-19 v 463 L 1222,945 q 19,7 32,18 20,25 54,25 40,0 64,-35 3,-4 7,-8 4,-4 8,-9 z M 825,950 661,1399 V 942 q 3,4 9,10 20,42 66,42 38,0 62,-32 27,-12 27,-12 z M 571,894 356,1265 411,927 q 57,-40 111,-40 21,0 49,7 z m 903,-5 q 23,-7 51,-7 61,0 114,38 l 55,346 z m 60,-506 -30,113 q -196,43 -480,43 -281,0 -479,-43 L 514,382 q 186,56 511,56 317,0 509,-55 z m 106,-128 q -49,-43 -220,-72 -171,-29 -394,-29 -227,0 -399,30 -172,30 -217,75 l 63,240 -28,157 -88,153 -85,622 49,19 274,-462 6,550 68,12 209,-553 112,595 h 69 l 112,-593 207,551 69,-12 6,-550 275,463 47,-22 -83,-619 -89,-153 -28,-159 z m -81,36 q -183,76 -531,76 -355,0 -537,-78 175,-69 534,-69 172,0 314,19 142,19 220,52 z M 604,1543 q -57,0 -97,39 -40,39 -40,97 0,56 40,96 40,40 97,40 56,0 96,-40 40,-40 40,-96 0,-57 -40,-96 -40,-39 -96,-40 z m 0,70 q 66,0 66,66 0,66 -66,66 -67,0 -67,-66 0,-66 67,-66 z m 840,0 q 67,0 67,66 0,66 -67,66 -66,0 -66,-66 0,-66 66,-66 z m 0,-70 q -57,0 -96,39 -39,39 -40,97 0,56 39,96 39,40 97,40 57,0 97,-40 40,-40 40,-96 0,-57 -40,-96 -40,-39 -97,-40 z M 236,1433 q -57,0 -96,39 -39,39 -40,97 0,56 39,96 39,40 97,41 57,0 97,-40 40,-40 40,-97 0,-57 -40,-96 -40,-39 -97,-40 z m 0,70 q 67,0 67,66 0,67 -67,67 -66,0 -66,-67 0,-66 66,-66 z m 1578,0 q 66,0 66,66 0,67 -66,67 -67,0 -67,-67 0,-66 67,-66 z m 0,-70 q -57,0 -97,39 -40,39 -40,97 0,56 40,96 40,40 97,41 56,0 96,-40 40,-40 40,-97 0,-57 -40,-96 -40,-39 -96,-40 z" + fill-rule="nonzero" + display="block" + fill="#000000" + id="path2" /> + <g + fill-rule="nonzero" + fill="#ffffff" + id="g32" + transform="matrix(1,0,0,-1,0,2020)"> + <path + style="color:#000000" + d="m 1024,357 q 67,0 67,-67 0,-66 -67,-66 -66,0 -66,66 0,67 66,67 z" + display="block" + id="path4" /> + <path + style="color:#000000" + d="m 1533,1364 q -193,-49 -505,-49 -320,0 -511,50 l 15,96 q 195,-46 496,-46 299,0 488,45 z" + display="block" + id="path6" /> + <path + style="color:#000000" + d="m 1558,1304 65,-115 q -48,19 -98,19 -134,0 -214,-109 -60,50 -134,50 -96,0 -153,-75 -64,70 -153,70 -72,0 -132,-49 -84,107 -217,107 -51,0 -101,-19 l 70,120 q 194,-56 533,-56 345,0 534,57 z" + display="block" + id="path8" /> + <path + style="color:#000000" + d="m 1110,1065 -85,-489 -85,483 q 3,-2 14,-10 23,-45 70,-45 51,0 66,45 6,6 20,16 z" + display="block" + id="path10" /> + <path + style="color:#000000" + d="M 1387,1084 V 621 l -165,454 q 19,-7 32,-18 20,-25 54,-25 40,0 64,35 3,4 7,8 4,4 8,9 z" + display="block" + id="path12" /> + <path + style="color:#000000" + d="M 825,1070 661,621 v 457 q 3,-4 9,-10 20,-42 66,-42 38,0 62,32 27,12 27,12 z" + display="block" + id="path14" /> + <path + style="color:#000000" + d="m 571,1126 -215,-371 55,338 q 57,40 111,40 21,0 49,-7 z" + display="block" + id="path16" /> + <path + style="color:#000000" + d="m 1474,1131 q 23,7 51,7 61,0 114,-38 l 55,-346 z" + display="block" + id="path18" /> + <path + style="color:#000000" + d="m 1534,1637 -30,-113 q -196,-43 -480,-43 -281,0 -479,43 l -31,114 q 186,-56 511,-56 317,0 509,55 z" + display="block" + id="path20" /> + <path + style="color:#000000" + d="m 1559,1729 q -183,-76 -531,-76 -355,0 -537,78 175,69 534,69 172,0 314,-19 142,-19 220,-52 z" + display="block" + id="path22" /> + <path + style="color:#000000" + d="m 604,407 q 66,0 66,-66 0,-66 -66,-66 -67,0 -67,66 0,66 67,66 z" + display="block" + id="path24" /> + <path + style="color:#000000" + d="m 1444,407 q 67,0 67,-66 0,-66 -67,-66 -66,0 -66,66 0,66 66,66 z" + display="block" + id="path26" /> + <path + style="color:#000000" + d="m 236,517 q 67,0 67,-66 0,-67 -67,-67 -66,0 -66,67 0,66 66,66 z" + display="block" + id="path28" /> + <path + style="color:#000000" + d="m 1814,517 q 66,0 66,-66 0,-67 -66,-67 -67,0 -67,67 0,66 67,66 z" + display="block" + id="path30" /> + </g> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="M 889.47678,362.90619 C 730.17696,354.10255 593.79445,329.77628 507.96343,294.85644 l -13.79035,-5.61052 9.20338,-3.86817 c 30.41234,-12.78231 109.73294,-32.12785 171.17501,-41.74798 88.42775,-13.84533 173.4185,-19.73686 308.85963,-21.41004 180.2871,-2.22719 318.2009,7.74617 441.8392,31.95199 52.992,10.37474 127.5651,31.89837 127.5651,36.81841 0,2.61331 -35.7458,15.254 -72.9319,25.79067 -75.5906,21.41861 -154.9807,33.99216 -278.452,44.10033 -38.6307,3.16256 -264.80493,4.63078 -311.95472,2.02506 z" + id="path70" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 866.28312,534.5427 c -88.18293,-4.755 -182.28514,-14.66593 -253.197,-26.66694 -45.53136,-7.70566 -64.62258,-11.76771 -66.71693,-14.19539 -2.01445,-2.33506 -30.76576,-107.82364 -29.68288,-108.90651 0.40788,-0.40789 10.08794,1.84517 21.51122,5.00679 78.12793,21.62346 189.71561,37.19241 325.76623,45.45161 59.06158,3.58544 259.07664,3.5748 321.23214,-0.0172 128.3292,-7.41589 247.134,-23.8579 326.4508,-45.17911 11.1619,-3.00046 20.2944,-4.90317 20.2944,-4.22825 0,1.93989 -28.242,108.13763 -28.9644,108.91412 -1.3501,1.45121 -57.3734,11.93946 -94.0462,17.60662 -49.7773,7.69223 -109.3579,14.25153 -172.7085,19.01367 -58.2448,4.37833 -308.02102,6.53929 -369.93888,3.20056 z" + id="path72" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="M 888.3171,701.59761 C 777.74593,696.7451 681.16019,686.89563 601.87542,672.38728 c -28.37286,-5.19195 -81.33543,-16.88631 -83.01873,-18.33087 -0.658,-0.56468 13.39491,-92.31459 14.27719,-93.2142 0.23966,-0.24438 9.5828,1.59384 20.76253,4.08493 139.09659,30.99373 365.96638,46.54415 575.51679,39.44785 147.0785,-4.98072 241.5785,-14.38137 341.8322,-34.00468 23.3838,-4.57707 42.9629,-7.87516 43.5089,-7.32909 0.5461,0.54607 4.5855,21.21889 8.9764,45.9396 5.4341,30.59313 7.1951,45.43407 5.5145,46.47274 -3.5622,2.20157 -65.5875,15.20633 -98.1965,20.58874 -60.277,9.94925 -133.5157,17.73831 -219.1801,23.31015 -49.6787,3.23123 -266.75837,4.73757 -323.5515,2.24516 z" + id="path74" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 1017.9812,937.83079 c -10.6763,-12.06104 -40.20143,-33.05464 -59.72727,-42.46868 -28.52808,-13.7543 -43.90956,-17.57057 -76.89493,-19.07823 -46.35255,-2.11863 -83.99585,8.05785 -121.79479,32.92599 -10.64881,7.00592 -19.67205,12.73803 -20.05161,12.73803 -0.37957,0 -9.32427,-9.03704 -19.87713,-20.08231 -43.14904,-45.16246 -89.89235,-70.42527 -149.55868,-80.83021 -38.09475,-6.64317 -92.13637,-3.27697 -128.35323,7.99498 -8.11863,2.5268 -15.1596,4.19574 -15.64659,3.70875 -0.63937,-0.63937 62.69896,-111.36656 65.27493,-114.11273 0.1945,-0.20735 9.74708,2.14989 21.22794,5.23832 32.87062,8.84242 95.92719,21.08624 141.48131,27.4717 103.85554,14.55775 182.67803,19.74622 325.8709,21.45036 231.10985,2.75044 401.53895,-11.39853 534.46105,-44.37082 22.8777,-5.67497 42.3314,-9.86347 43.2306,-9.30776 2.8275,1.7475 60.7508,105.58261 59.5616,106.77188 -0.6225,0.62249 -9.9939,-1.43632 -20.8253,-4.57514 -100.838,-29.2217 -214.059,5.9525 -275.4977,85.58851 l -9.3672,12.14171 -20.2413,-13.46339 c -36.5341,-24.30042 -70.7114,-34.64989 -114.4251,-34.64989 -56.423,0 -97.4043,16.34243 -134.9942,53.8327 -9.9636,9.9372 -18.4125,18.06764 -18.7753,18.06764 -0.3628,0 -2.6479,-2.24614 -5.078,-4.99141 z" + id="path76" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 359.23528,1250.1382 c 0.78932,-3.827 12.94057,-77.8704 27.00276,-164.5408 14.0622,-86.67054 25.87784,-157.89297 26.25698,-158.27212 0.37914,-0.37914 9.27789,-5.85121 19.77499,-12.16015 34.86477,-20.95435 73.20082,-30.03033 108.38013,-25.65878 10.66961,1.32585 21.45035,3.16938 23.9572,4.09672 4.0864,1.51166 -6.1819,20.21547 -99.25956,180.80223 -57.09962,98.5139 -104.65677,179.9205 -105.68257,180.9035 -1.02579,0.9831 -1.21926,-1.3437 -0.42993,-5.1706 z" + id="path78" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 662.41565,1168.9604 -0.0901,-222.65915 5.14528,6.24058 c 2.8299,3.43232 8.4919,10.89508 12.58221,16.5839 5.16924,7.18939 11.82408,12.5356 21.82459,17.53292 12.33224,6.16249 16.92646,7.18959 32.15896,7.18959 23.95519,0 36.84679,-4.78311 52.97173,-19.65385 11.20019,-10.32905 35.20688,-24.40108 35.20688,-20.63727 0,0.92209 -142.61927,392.28598 -156.6787,429.94458 -2.53101,6.7794 -3.04554,-28.5927 -3.12082,-214.5413 z" + id="path80" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 1024.2976,1435.6874 c -0.1322,-1.2756 -18.6519,-106.9921 -41.15468,-234.9256 -22.50283,-127.9334 -40.36048,-233.15995 -39.68366,-233.83677 2.09904,-2.09903 10.50234,4.35981 13.1054,10.07289 4.7092,10.33557 23.49428,27.92978 35.6281,33.36948 9.59164,4.3 16.17004,5.4254 31.80724,5.4417 10.843,0.011 23.8017,-1.4104 28.7969,-3.1592 12.0351,-4.2135 28.8568,-19.92521 34.2127,-31.95506 4.3705,-9.81656 18.5355,-24.01416 19.8937,-19.93951 0.6118,1.83513 -78.6411,462.67967 -81.4761,473.77237 -0.489,1.9135 -0.9973,2.4354 -1.1296,1.1597 z" + id="path82" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 1304.404,1169.4977 c -44.1415,-121.4824 -79.9899,-221.21083 -79.663,-221.61873 1.6178,-2.01887 22.063,10.66248 31.8514,19.75614 16.5379,15.36411 29.1817,20.35028 51.5299,20.32123 26.6439,-0.0346 38.3653,-5.8132 60.4288,-29.79101 l 17.27,-18.76831 v 225.53138 c 0,124.0423 -0.261,225.5123 -0.5799,225.4889 -0.3189,-0.023 -36.6956,-99.4371 -80.8372,-220.9196 z" + id="path84" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 1584.1944,1075.5446 c -58.4976,-100.42384 -106.7415,-183.32285 -107.2087,-184.22005 -3.9048,-7.49958 63.9484,-10.02487 90.7716,-3.37824 25.7576,6.3826 70.7828,28.69932 70.9264,35.15469 0.028,1.27927 11.9597,76.9361 26.5138,168.1262 14.5542,91.1901 26.2133,166.0491 25.9092,166.3532 -0.3041,0.3041 -48.4146,-81.612 -106.9123,-182.0358 z" + id="path86" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 1783.3806,1630.2605 c -12.07,-4.2822 -23.5325,-15.3987 -29.6328,-28.7384 -6.4346,-14.0707 -6.8306,-47.3018 -0.7516,-63.0553 8.3498,-21.6378 30.8402,-34.3581 60.7479,-34.3581 43.0628,0 65.2513,22.6607 64.7244,66.102 -0.1083,8.9295 -1.4739,20.7659 -3.0347,26.303 -3.8641,13.708 -18.5861,29.2285 -32.0888,33.8293 -13.4702,4.5898 -46.9244,4.5437 -59.9644,-0.082 z" + id="path88" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 1415.3883,1739.6942 c -21.6129,-7.7128 -33.5513,-25.0784 -35.8136,-52.0944 -3.5131,-41.9512 13.7421,-66.4513 51.0304,-72.4564 36.4408,-5.8686 67.565,9.5473 75.9954,37.6405 3.8123,12.7043 3.1662,41.886 -1.2199,55.0911 -4.6392,13.9675 -19.2604,28.1959 -33.295,32.4008 -12.1449,3.6387 -45.8399,3.2931 -56.6973,-0.5816 z" + id="path90" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 998.47196,1791.9871 c -26.32252,-8.5718 -39.4142,-29.0618 -39.4142,-61.6879 0,-39.9455 19.67585,-62.6986 56.63604,-65.4939 31.8922,-2.412 53.768,6.4143 65.4954,26.4256 5.4743,9.3411 6.5591,14.1418 7.3663,32.5996 1.115,25.4926 -1.8883,38.442 -11.6668,50.3052 -11.6137,14.0893 -22.7259,18.388 -49.4097,19.1137 -12.7565,0.347 -25.8097,-0.2211 -29.00704,-1.2623 z" + id="path92" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 570.56398,1737.4757 c -22.88704,-10.8199 -31.68544,-27.0374 -31.60473,-58.2549 0.0264,-10.2052 1.11843,-22.1018 2.42676,-26.4369 6.14979,-20.3769 22.07991,-33.2143 46.28194,-37.2965 29.29527,-4.9413 56.99662,3.419 69.77411,21.0578 18.36862,25.3571 13.77794,77.2331 -8.32662,94.0931 -11.99243,9.1471 -23.31337,12.1543 -46.08034,12.2406 -17.23538,0.065 -22.8959,-0.8765 -32.47112,-5.4032 z" + id="path94" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 206.21183,1630.2605 c -12.09745,-4.2919 -23.56007,-15.4279 -29.58126,-28.7384 -6.40416,-14.1571 -6.82809,-47.4419 -0.8031,-63.0553 8.34974,-21.6378 30.84019,-34.3581 60.74783,-34.3581 43.06283,0 65.25134,22.6607 64.72448,66.102 -0.29462,24.292 -4.20952,35.3624 -16.82976,47.5907 -6.25786,6.0636 -14.83371,11.6844 -20.34741,13.3364 -12.73523,3.8156 -46.10806,3.31 -57.91078,-0.8773 z" + id="path96" /> +</svg> diff --git a/client/public/images/pieces/Cwda/ws.svg b/client/public/images/pieces/Cwda/ws.svg index ee56aff4..539083de 100644 --- a/client/public/images/pieces/Cwda/ws.svg +++ b/client/public/images/pieces/Cwda/ws.svg @@ -1,6 +1,4 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" @@ -9,145 +7,116 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="45" - height="45" - id="svg3128" - sodipodi:version="0.32" - inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" - version="1.0" - sodipodi:docname="wc.svg" - inkscape:output_extension="org.inkscape.output.svg.inkscape"> - <defs - id="defs3130"> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 22.5 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="45 : 22.5 : 1" - inkscape:persp3d-origin="22.5 : 15 : 1" - id="perspective15" /> - <inkscape:perspective - id="perspective12" - inkscape:persp3d-origin="22.5 : 15 : 1" - inkscape:vp_z="45 : 22.5 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_x="0 : 22.5 : 1" - sodipodi:type="inkscape:persp3d" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - gridtolerance="10000" - guidetolerance="10" - objecttolerance="10" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="8.0000004" - inkscape:cx="60.308779" - inkscape:cy="24.511479" - inkscape:document-units="px" - inkscape:current-layer="layer1" - height="45px" - width="45px" - inkscape:grid-points="true" - showgrid="false" - inkscape:window-width="1920" - inkscape:window-height="1060" - inkscape:window-x="0" - inkscape:window-y="20" - inkscape:window-maximized="0"> - <inkscape:grid - id="GridFromPre046Settings" - type="xygrid" - originx="0" - originy="0" - spacingx="0.5" - spacingy="0.5" - color="#0000ff" - empcolor="#0000ff" - opacity="0.2" - empopacity="0.4" - empspacing="5" /> - </sodipodi:namedview> + height="100%" + width="100%" + version="1.1" + viewBox="0 0 2048 2048" + id="svg18" + sodipodi:docname="ws.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> <metadata - id="metadata3133"> + id="metadata24"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> </cc:Work> </rdf:RDF> </metadata> + <defs + id="defs22" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="960" + inkscape:window-height="1060" + id="namedview20" + showgrid="false" + inkscape:zoom="0.43115234" + inkscape:cx="1024" + inkscape:cy="1021.6806" + inkscape:window-x="0" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:current-layer="svg18" + inkscape:document-rotation="0" /> + <path + style="color:#000000" + d="m 1161,1706 h 170 v 137 h 274 V 1468 L 1383,1297 V 819 L 1553,649 V 444 h 153 V 205 H 341 v 239 h 153 v 205 l 171,170 v 478 l -222,171 v 375 h 273 v -137 h 171 v 137 h 274 z M 1639,376 H 409 V 273 H 1639 Z M 1484,580 H 564 V 444 h 920 z m -170,717 H 734 V 819 h 580 z m 222,239 v 239 h -137 v -137 h -308 v 137 H 956 V 1638 H 649 v 137 H 512 V 1536 Z M 1459,649 1356,751 H 693 L 588,649 Z m -110,716 127,103 H 572 l 128,-103 z" + fill-rule="nonzero" + display="block" + fill="#000000" + id="path2" /> <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - style="display:inline"> + fill-rule="nonzero" + fill="#ffffff" + id="g12" + transform="matrix(1,0,0,-1,0,2048)"> + <path + style="color:#000000" + d="M 1639,1672 H 409 v 103 h 1230 z" + display="block" + id="path4" /> <path - style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 37.725,38.008918 c -3.723781,-1.069562 -11.126219,0.473903 -14.85,-2.2 -3.723782,2.673903 -11.12622,1.130438 -14.8500002,2.2 0,0 -1.8104878,0.595658 -3.3,2.2 0.7447561,1.069561 1.8104878,1.08478 3.3,0.55 3.7237802,-1.069561 11.1262182,0.504342 14.8500002,-1.1 3.723781,1.604342 11.126219,0.03044 14.85,1.1 1.489512,0.53478 2.555244,0.519561 3.3,-0.55 -1.489512,-2.139123 -3.3,-2.2 -3.3,-2.2 z" - id="path4582" - sodipodi:nodetypes="ccccccccc" - inkscape:connector-curvature="0" /> + style="color:#000000" + d="M 1484,1468 H 564 v 136 h 920 z" + display="block" + id="path6" /> <path - style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 31.125,33.608918 c -2.75,2.75 -13.75,2.75 -16.5,0 -0.55,-1.65 0,-2.2 0,-2.2 h 16.5 c 0,0 0.55,0.55 0,2.2 z" - id="path4584" - sodipodi:nodetypes="ccccc" - inkscape:connector-curvature="0" /> + style="color:#000000" + d="M 1314,751 H 734 v 478 h 580 z" + display="block" + id="path8" /> <path - style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.64999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 31.125,31.408918 h -16.5" - id="path4590" - sodipodi:nodetypes="cc" - inkscape:connector-curvature="0" /> - <g - id="g3323" - inkscape:label="Layer 1" - transform="matrix(-0.84196464,0,0,-0.84196464,39.051174,37.108928)"> - <path - sodipodi:nodetypes="cccc" - id="path3491" - d="M 22.028958,36 C 11.528958,35 5.5289585,28 6.0289585,7 H 29.028958 c 0,9 -10,6.5 -8,21" - style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - inkscape:connector-curvature="0" /> - <path - sodipodi:nodetypes="csccccccccccc" - id="path3495" - d="m 20.028958,28 c -0.384461,-2.911278 5.552936,-7.368624 8,-9 3,-2 2.819198,-4.342892 5,-4 1.04172,0.944016 -1.413429,3.037549 0,3 1,0 -0.187332,-1.231727 1,-2 1,0 4.003161,-0.999999 4,4 0,2 -6,12 -6,12 0,0 -1.885866,1.902129 -2,3.5 0.726047,0.994369 0.5,2 0.5,3 -1,1 -3,-2.5 -3,-2.5 h -2 c 0,0 -0.781781,1.991926 -2.5,3 -1,0 -1,-3 -1,-3" - style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - inkscape:connector-curvature="0" /> - <circle - transform="rotate(180,21.764479,22)" - id="path3499" - style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - cx="8.5" - cy="23.5" - r="0.5" /> - <ellipse - transform="rotate(-149.99999,24.024104,20.986505)" - id="path3501" - style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.50000048;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - cx="14.5" - cy="15.5" - rx="0.5" - ry="1.5" /> - <path - sodipodi:nodetypes="cc" - id="path8049" - d="m 7.0289585,7 c -1,20 5.4999995,27.5 11.9999995,28.5" - style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - inkscape:connector-curvature="0" /> - </g> + style="color:#000000" + d="M 1536,512 V 273 H 1399 V 410 H 1091 V 273 H 956 V 410 H 649 V 273 H 512 v 239 z" + display="block" + id="path10" /> </g> - <g - inkscape:groupmode="layer" - id="layer2" - inkscape:label="Layer 1#1" - style="display:inline" /> + <path + style="color:#000000" + d="M 1459,649 1356,751 H 693 L 588,649 Z" + fill-rule="nonzero" + display="block" + fill="#ffffff" + id="path14" /> + <path + style="color:#000000" + d="m 1349,1365 127,103 H 572 l 128,-103 z" + fill-rule="nonzero" + display="block" + fill="#ffffff" + id="path16" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="M 734.07927,1057.6308 V 819.89581 H 1024 1313.9207 v 237.73499 237.735 H 1024 734.07927 Z" + id="path56" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 642.46432,700.4574 -51.02605,-49.68534 432.56173,0.0234 432.5617,0.0234 -51.026,49.71003 -51.0261,49.71003 -330.5096,-0.0481 -330.50963,-0.0481 z" + id="path60" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 564.76557,511.42015 v -67.2616 H 1024 1483.2344 v 67.2616 67.26161 H 1024 564.76557 Z" + id="path62" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="M 409.36806,324.71121 V 274.84484 H 1024 1638.6319 v 49.86637 49.86636 H 1024 409.36806 Z" + id="path64" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="M 513.73952,1654.8675 V 1536.5798 H 1024 1534.2605 v 118.2877 118.2877 h -67.2616 -67.2616 v -68.4378 -68.4377 l -154.8177,0.5963 -154.8177,0.5963 -0.6148,67.8414 -0.6149,67.8415 h -66.0669 -66.06691 v -68.4213 -68.4213 H 802.50056 648.26274 v 68.4213 68.4213 h -67.26161 -67.26161 z" + id="path66" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 578.7646,1463.8788 c 1.86792,-1.716 30.26808,-24.6778 63.11148,-51.026 l 59.71527,-47.906 322.98005,0.02 322.9801,0.02 60.3035,48.8812 c 33.167,26.8847 61.2951,49.8374 62.507,51.006 1.3347,1.2872 -174.6518,2.1249 -446.3951,2.1249 -375.95171,0 -448.04853,-0.5053 -445.2023,-3.1201 z" + id="path68" /> </svg> diff --git a/client/public/images/pieces/Cwda/wt.svg b/client/public/images/pieces/Cwda/wt.svg new file mode 100644 index 00000000..90291260 --- /dev/null +++ b/client/public/images/pieces/Cwda/wt.svg @@ -0,0 +1,95 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="100%" + width="100%" + version="1.1" + viewBox="0 0 2048 2048" + id="svg18" + sodipodi:docname="wt.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <metadata + id="metadata24"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs22" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="960" + inkscape:window-height="1060" + id="namedview20" + showgrid="false" + inkscape:zoom="0.43115234" + inkscape:cx="1024" + inkscape:cy="1024" + inkscape:window-x="0" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:current-layer="svg18" /> + <path + style="color:#000000" + d="m 1024,864.11538 q 97,0 186,-15 98,35 142,109 38,64.00002 38,141.00002 0,46 -23,101 -23,55 -75,101 -59,49 -129,107 -70,58 -139,137 -70,-78 -140,-136 -70,-58 -128,-108 -53,-45 -75,-100 -22,-55 -23,-102 0,-77 37,-141.00002 43,-74 143,-109 88,15 186,15 z" + fill-rule="nonzero" + display="block" + fill="#ffffff" + id="path2" /> + <path + style="color:#000000" + d="m 988,1120.1154 -83,1 q -34,0 -34,34 0,34 34,34 h 83 v 86 q 0,35 36,35 35,0 35,-35 v -86 h 86 q 33,0 33,-34 0,-34 -33,-34 h -86 v -82 q 0,-36 -35,-36 -36,0 -36,36 z m 36,-578.00002 q 68,0 132,11 64,11 125,28 -117,31 -257,31 -142,0 -257,-31 58,-16 123,-27 65,-11 134,-12 z m 0,1089.00002 q 68,0 68,68 0,68 -68,68 -68,0 -68,-68 0,-68 68,-68 z m 0,-949.00002 q 117,0 225,-23 l -48,123 q -88,14 -177,14 -91,0 -178,-14 l -48,-123 q 107,23 226,23 z m 0,182 q 97,0 186,-15 98,35 142,109 38,64.00002 38,141.00002 0,46 -23,101 -23,55 -75,101 -59,49 -129,107 -70,58 -139,137 -70,-78 -140,-136 -70,-58 -128,-108 -53,-45 -75,-100 -22,-55 -23,-102 0,-77 37,-141.00002 43,-74 143,-109 88,15 186,15 z m -36,-377 h -32 q -56,-90 -107,-113 -24,-12 -53,-22 -29,-10 -67,-10 -7,0 -107,16 -48,7 -76,15 -28,8 -44,10 -57,7 -133,-6 -46,-8 -86,-29 l 48,-78 q 12,12 31,15 19,3 36,8 42,7 80,2 13,-3 51,-7 38,-4 101,-15 75,-11 102,-11 105,0 161,40 34,26 64,72 30,46 31,113 z m 36,-113 q -14,-57 -34,-79 -20,-22 -53,-46 -36,-25 -85,-42 -49,-17 -109,-9 l -281,39 q -17,2 -30,0 -13,-2 -26,-2 -21,0 -53,-9 -32,-9 -51,-28 l -97,159 q 18,20 32,28 14,8 33,17 58,27 124,33 28,2 55,1 27,-1 56,2 54,-9 108,-16 54,-7 110,-16 60,0 81,12 11,6 35,22 24,16 48,47 -53,6 -108,20 -55,14 -97,31 l 104,258 q -78,45 -109,72 -31,27 -49,64 -26,46 -33,89.00002 -7,43 -7,77 1,60 28,132 27,72 104,130 63,48 123,99 60,51 119,119 -74,38 -74,121 0,56 39,96 39,40 97,40 56,0 96,-40 40,-40 40,-96 0,-82 -74,-121 58,-68 117,-119 59,-51 125,-99 75,-57 102,-129 27,-72 29,-133 0,-34 -7,-77 -7,-43.00002 -32,-89.00002 -20,-36 -50,-63 -30,-27 -108,-73 l 104,-258 q -44,-16 -99,-30 -55,-14 -106,-21 23,-31 47,-47 24,-16 36,-22 21,-12 81,-12 54,8 108,15 54,7 110,17 27,-3 54,-2 27,1 57,-1 64,-6 124,-33 18,-9 32,-17 14,-8 33,-28 l -98,-159 q -18,18 -50,27 -32,9 -53,10 -13,0 -26,2 -13,2 -31,0 l -280,-39 q -60,-9 -111,8 -51,17 -85,45 -33,27 -52,46 -19,19 -33,77 z m 35,113 q 0,-66 30,-112 30,-46 66,-73 55,-40 161,-40 26,0 102,11 62,10 100,14 38,4 51,8 38,5 80,-2 16,-4 35,-7 19,-3 33,-16 l 48,78 q -41,21 -87,29 -76,13 -133,6 -17,-2 -44,-10 -27,-8 -75,-15 -101,-16 -107,-16 -39,0 -68,10 -29,10 -52,22 -53,24 -108,113 z" + fill-rule="nonzero" + display="block" + fill="#000000" + id="path4" /> + <g + fill-rule="nonzero" + fill="#ffffff" + id="g16" + transform="matrix(1,0,0,-1,0,2030.1154)"> + <path + style="color:#000000" + d="m 1024,1488 q 68,0 132,-11 64,-11 125,-28 -117,-31 -257,-31 -142,0 -257,31 58,16 123,27 65,11 134,12 z" + display="block" + id="path6" /> + <path + style="color:#000000" + d="m 1024,399 q 68,0 68,-68 0,-68 -68,-68 -68,0 -68,68 0,68 68,68 z" + display="block" + id="path8" /> + <path + style="color:#000000" + d="m 1024,1348 q 117,0 225,23 l -48,-123 q -88,-14 -177,-14 -91,0 -178,14 l -48,123 q 107,-23 226,-23 z" + display="block" + id="path10" /> + <path + style="color:#000000" + d="m 988,1543 h -32 q -56,90 -107,113 -24,12 -53,22 -29,10 -67,10 -7,0 -107,-16 -48,-7 -76,-15 -28,-8 -44,-10 -57,-7 -133,6 -46,8 -86,29 l 48,78 q 12,-12 31,-15 19,-3 36,-8 42,-7 80,-2 13,3 51,7 38,4 101,15 75,11 102,11 105,0 161,-40 34,-26 64,-72 30,-46 31,-113 z" + display="block" + id="path12" /> + <path + style="color:#000000" + d="m 1059,1543 q 0,66 30,112 30,46 66,73 55,40 161,40 26,0 102,-11 62,-10 100,-14 38,-4 51,-8 38,-5 80,2 16,4 35,7 19,3 33,16 l 48,-78 q -41,-21 -87,-29 -76,-13 -133,-6 -17,2 -44,10 -27,8 -75,15 -101,16 -107,16 -39,0 -68,-10 -29,-10 -52,-22 -53,-24 -108,-113 z" + display="block" + id="path14" /> + </g> +</svg> diff --git a/client/public/images/pieces/Cwda/wa.svg b/client/public/images/pieces/Cwda/ww.svg similarity index 100% rename from client/public/images/pieces/Cwda/wa.svg rename to client/public/images/pieces/Cwda/ww.svg diff --git a/client/public/images/pieces/Cwda/wy.svg b/client/public/images/pieces/Cwda/wy.svg new file mode 100644 index 00000000..75bdb6d8 --- /dev/null +++ b/client/public/images/pieces/Cwda/wy.svg @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + height="100%" + width="100%" + version="1.1" + viewBox="0 0 2048 2048" + id="svg6" + sodipodi:docname="wy.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <metadata + id="metadata12"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs10" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="960" + inkscape:window-height="1060" + id="namedview8" + showgrid="false" + inkscape:zoom="0.43115234" + inkscape:cx="1024" + inkscape:cy="1024" + inkscape:window-x="0" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:current-layer="svg6" + inkscape:document-rotation="0" /> + <path + style="color:#000000" + d="m 1756,234 q -1,0 2,54 3,54 3,118 1,125 0,258 -1,133 -36,267 -34,128 -75,218 -41,90 -89,157 -72,108 -196,183 -124,75 -259,98 9,-49 8,-96 -2,-36 -34,-36 -37,0 -33,36 3,132 -94,226 -76,-80 -82,-186 -2,-35 -36,-31 -32,1 -32,37 0,0 2,8 -41,-13 -86,-37 -29,-20 -47,10 -18,30 16,47 43,22 65,33 -86,88 -196,142 12,-139 76,-263 17,-26 -8,-46 -28,-22 -47,7 -7,10 -20,36 -21,-21 -28,-31 -7,-9 -24,-40 -17,-31 -26,-51 -9,-25 -8,-40 1,-15 3,-35 -9,-59 -40,-111 -31,-52 -81,-127 -47,-72 -72,-108 -25,-36 -38,-92 -9,-34 0,-82 9,-48 39,-76 46,-47 89,-43 14,0 37,11 23,11 37,42 26,57 43,57 25,0 27,-28 0,-6 -16,-50 -9,-20 -24,-42 -19,-26 -17,-22 16,-57 53,-20 11,11 25,41 14,30 44,81 35,59 75,96 40,37 71,60 18,13 44,30 26,17 70,35 35,14 77,34 42,20 76,53 46,45 71,111 13,37 10,91 -9,34 34,34 32,0 36,-33 0,-113 -64,-206 21,-64 11,-140 -9,-61 -42,-130 Q 1017,674 914,588 707,416 718,234 q 0,0 170,0 170,0 321,0 z" + fill-rule="nonzero" + display="block" + fill="#ffffff" + id="path2" /> + <path + style="color:#000000" + d="m 697,1319 q 13,-20 10,-42 -10,-64 -71,-54 -18,3 -29,12 -4,-5 -12,-22 -11,-32 -42,-22 -31,12 -24,45 45,115 163,158 34,10 45,-20 12,-32 -18,-44 -6,-3 -11,-5 -5,-2 -11,-6 z M 400,842 q -29,-18 -35,-48 1,-33 -31,-36 -35,-4 -36,30 4,66 59,105 26,21 48,-4 22,-27 -5,-47 z m 679,815 q 157,-10 291,-81 134,-71 228,-182 66,-78 124,-188 58,-110 94,-233 40,-143 50,-300 10,-157 11,-292 V 163 q 0,0 -155,0 -155,0 -404,0 H 647 q -9,0 -9,49 0,49 7,79 4,24 19,68 15,44 50,107 16,32 76,93 60,61 138,143 45,46 70,116 25,70 22,127 -37,-30 -81,-49 -212,-76 -307,-220 -7,-9 -45,-81 -20,-38 -34,-52 -19,-19 -55,-21 -56,-3 -87,54 -42,-12 -75,-10 -56,21 -81,45 -51,51 -66,102 -15,51 -16,110 0,84 104,222 122,159 130,242 0,36 7,81 6,31 25,60 13,20 17,27 4,7 17,23 9,12 15,18 6,6 15,18 11,13 28,30 -53,146 -43,301 199,-71 334,-223 33,113 130,183 80,-56 127,-148 z M 1756,234 q -1,0 2,54 3,54 3,118 1,125 0,258 -1,133 -36,267 -34,128 -75,218 -41,90 -89,157 -72,108 -196,183 -124,75 -259,98 9,-49 8,-96 -2,-36 -34,-36 -37,0 -33,36 3,132 -94,226 -76,-80 -82,-186 -2,-35 -36,-31 -32,1 -32,37 0,0 2,8 -41,-13 -86,-37 -29,-20 -47,10 -18,30 16,47 43,22 65,33 -86,88 -196,142 12,-139 76,-263 17,-26 -8,-46 -28,-22 -47,7 -7,10 -20,36 -21,-21 -28,-31 -7,-9 -24,-40 -17,-31 -26,-51 -9,-25 -8,-40 1,-15 3,-35 -9,-59 -40,-111 -31,-52 -81,-127 -47,-72 -72,-108 -25,-36 -38,-92 -9,-34 0,-82 9,-48 39,-76 46,-47 89,-43 14,0 37,11 23,11 37,42 26,57 43,57 25,0 27,-28 0,-6 -16,-50 -9,-20 -24,-42 -19,-26 -17,-22 16,-57 53,-20 11,11 25,41 14,30 44,81 35,59 75,96 40,37 71,60 18,13 44,30 26,17 70,35 35,14 77,34 42,20 76,53 46,45 71,111 13,37 10,91 -9,34 34,34 32,0 36,-33 0,-113 -64,-206 21,-64 11,-140 -9,-61 -42,-130 Q 1017,674 914,588 707,416 718,234 q 0,0 170,0 170,0 321,0 z" + fill-rule="nonzero" + display="block" + fill="#000000" + id="path4" /> + <path + style="fill:#ffd700;stroke:#000000;stroke-width:2.31937" + d="m 559.35852,1727.3477 c 9.06079,-80.4896 30.96157,-157.3391 65.9241,-231.3268 8.81211,-18.6482 16.01812,-36.4599 16.01335,-39.5817 -0.009,-6.148 -7.56023,-19.954 -13.62127,-24.9052 -8.50845,-6.9505 -23.01163,-12.0598 -30.16906,-10.6283 -8.56681,1.7133 -20.95447,14.6818 -28.99474,30.3542 -11.17391,21.7805 -10.49513,21.6397 -25.12557,5.2152 -14.15657,-15.8925 -26.48303,-35.5961 -47.82811,-76.4524 -19.22248,-36.7935 -21.55403,-46.1127 -20.98117,-83.8616 0.38977,-25.6833 -0.41451,-34.3003 -4.7286,-50.6617 -13.29917,-50.4375 -27.44043,-75.3004 -137.29082,-241.3821 -34.23287,-51.75629 -64.74473,-99.76717 -67.80412,-106.69082 -9.22738,-20.8822 -19.48412,-55.50166 -22.42987,-75.70726 -2.14635,-14.72236 -2.15475,-24.40668 -0.037,-42.62319 5.61799,-48.32424 16.73199,-71.93954 47.86344,-101.70141 41.34398,-39.5251 74.63083,-47.59174 115.63441,-28.02255 18.60917,8.88134 26.34854,18.17612 44.4146,53.34084 7.61093,14.8143 18.00494,31.15426 23.43933,36.84788 9.25706,9.69866 10.28119,10.16077 19.71461,8.89574 7.1632,-0.96058 11.73687,-3.33369 16.32857,-8.47222 8.70609,-9.74298 8.36187,-21.13743 -1.52556,-50.49735 -8.76528,-26.02778 -19.17411,-45.98108 -36.09186,-69.18668 -10.41734,-14.28915 -11.07455,-15.98236 -8.82277,-22.73046 3.60827,-10.81319 12.81838,-22.13545 19.33696,-23.77151 15.18744,-3.8118 32.37427,13.1965 51.06156,50.53117 18.53973,37.03983 50.25277,92.51769 65.38842,114.38852 36.55075,52.81542 95.54087,107.26047 165.20365,152.47502 24.75204,16.0653 37.70913,22.55546 88.21239,44.1854 58.99105,25.26516 78.72856,35.05207 101.76285,50.45945 49.28186,32.96403 91.78326,89.24783 111.13396,147.17233 6.6134,19.7965 10.4761,56.2908 8.6435,81.6618 -1.0359,14.3399 -0.6757,22.9786 1.0961,26.2892 3.8315,7.1592 16.265,11.4976 32.9227,11.4877 22.1985,-0.014 33.1486,-8.5653 37.6311,-29.3901 1.9376,-9.0013 -2.201,-55.6108 -7.0588,-79.4971 -7.742,-38.0692 -29.4755,-91.1989 -49.2332,-120.3556 -6.7301,-9.9317 -6.7799,-10.2371 -3.597,-22.0339 9.5875,-35.53484 12.734,-85.89565 7.7754,-124.45193 -5.2969,-41.18663 -23.4931,-96.93472 -45.6636,-139.9006 C 1025.2237,692.95819 984.67798,647.11052 916.14949,587.89016 851.8942,532.36257 814.3378,491.95926 782.03207,443.60623 741.91135,383.55625 720.72249,321.8015 719.52085,261.41783 l -0.51746,-26.00221 517.55701,-0.58494 517.5571,-0.58494 1.9809,34.21574 c 1.0895,18.81866 1.9809,131.28121 1.9809,249.91677 0,193.87563 -0.4252,219.22124 -4.2018,250.49151 -10.8217,89.60167 -30.343,173.95021 -62.2673,269.04644 -45.0901,134.3148 -110.1475,251.4853 -187.0231,336.8343 -73.5943,81.7062 -200.2441,157.846 -320.5509,192.71 -33.8937,9.8221 -73.2746,18.3845 -75.2894,16.3698 -0.6893,-0.6893 -0.1797,-6.3841 1.1325,-12.6551 1.3122,-6.2709 2.9624,-29.6667 3.6671,-51.9906 1.4545,-46.0731 -0.3387,-53.1058 -15.5234,-60.8798 -15.5306,-7.951 -40.8939,-3.6978 -48.3834,8.1136 -2.303,3.6319 -3.8322,16.8579 -5.028,43.4887 -1.9626,43.7034 -8.2256,73.0955 -22.7735,106.8751 -10.7052,24.857 -34.37011,61.0095 -53.4711,81.6869 l -14.56699,15.7693 -5.74662,-5.3321 c -9.19944,-8.5359 -25.33717,-30.322 -36.71183,-49.5614 -21.28951,-36.0097 -33.19532,-72.7737 -38.21605,-118.0074 -1.40865,-12.691 -4.06397,-25.9807 -5.90072,-29.5326 -5.19195,-10.0401 -15.63422,-14.2788 -31.60834,-12.8303 -22.19056,2.0122 -32.48959,12.0087 -32.88717,31.9213 -0.12571,6.2996 -0.42744,11.4602 -0.67032,11.4681 -3.8867,0.1259 -41.82513,-15.7572 -67.0746,-28.081 -17.99914,-8.785 -34.54083,-15.9727 -36.75933,-15.9727 -9.38427,0 -20.22603,7.8489 -26.88957,19.4667 -15.16798,26.4454 -8.99737,35.5152 41.84115,61.5003 l 38.15823,19.5037 -18.48509,17.1559 c -25.83771,23.9798 -63.0302,53.783 -90.40551,72.444 -19.66855,13.4075 -80.00822,48.8241 -83.1822,48.8241 -0.55725,0 -0.51381,-4.4358 0.0965,-9.8573 z M 715.6562,1396.26 c 14.68098,-4.0784 25.38117,-20.4073 25.38117,-38.7326 0,-13.4536 -5.34152,-20.1561 -23.65129,-29.6775 -9.31569,-4.8443 -17.2112,-9.016 -17.54559,-9.2705 -0.33438,-0.2545 1.62715,-5.5157 4.359,-11.6914 9.68991,-21.9057 1.30153,-58.3631 -17.0411,-74.0637 -16.67578,-14.2739 -47.44194,-16.3617 -70.33264,-4.773 l -10.41544,5.273 -8.17114,-16.9885 c -12.887,-26.7932 -25.488,-33.798 -46.31289,-25.7448 -26.6886,10.3206 -31.5787,31.9237 -14.99085,66.2253 19.88534,41.1203 45.45806,72.5797 80.01587,98.4351 19.34135,14.4707 69.13285,40.0363 81.1778,41.6811 3.82696,0.5225 7.47996,1.1006 8.11778,1.2846 0.63783,0.184 4.87202,-0.6967 9.40932,-1.9571 z M 391.0026,900.72719 c 10.89621,-4.3598 22.12955,-18.14574 24.32597,-29.85367 2.01293,-10.72983 -4.48453,-23.06665 -16.50389,-31.33619 -19.75275,-13.59025 -33.52457,-35.69146 -33.52457,-53.80068 0,-9.65039 -5.96597,-19.71377 -14.21643,-23.98025 -11.35557,-5.87219 -29.57001,-6.67655 -39.09672,-1.72655 -10.52292,5.46764 -13.87238,12.64274 -13.91427,29.80675 -0.0792,32.43354 14.48454,64.13742 41.058,89.37961 15.63834,14.85489 31.6994,25.14693 39.45884,25.28552 1.56875,0.0281 7.15463,-1.67053 12.41307,-3.77454 z" + id="path52" /> +</svg> diff --git a/client/src/base_rules.js b/client/src/base_rules.js index 0c20b59e..7c1c8232 100644 --- a/client/src/base_rules.js +++ b/client/src/base_rules.js @@ -40,7 +40,7 @@ export const ChessRules = class ChessRules { { label: "Randomness", variable: "randomness", - defaut: 2, + defaut: 0, options: [ { label: "Deterministic", value: 0 }, { label: "Symmetric random", value: 1 }, @@ -58,6 +58,10 @@ export const ChessRules = class ChessRules { //return "R" + opts.randomness; } + static IsValidOptions(opts) { + return true; + } + // Some variants don't have flags: static get HasFlags() { return true; @@ -368,8 +372,7 @@ export const ChessRules = class ChessRules { // Setup the initial random (asymmetric) position static GenRandInitFen(options) { - const randomness = parseInt(options.randomness, 10); - if (!randomness || randomness == 0) + if (!options.randomness || options.randomness == 0) // Deterministic: return "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 ahah -"; @@ -746,14 +749,15 @@ export const ChessRules = class ChessRules { // Generic method to find possible moves of non-pawn pieces: // "sliding or jumping" - getSlideNJumpMoves([x, y], steps, oneStep) { + getSlideNJumpMoves([x, y], steps, nbSteps) { let moves = []; outerLoop: for (let step of steps) { let i = x + step[0]; let j = y + step[1]; + let stepCounter = 0; while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { moves.push(this.getBasicMove([x, y], [i, j])); - if (!!oneStep) continue outerLoop; + if (nbSteps && ++stepCounter >= nbSteps) continue outerLoop; i += step[0]; j += step[1]; } @@ -895,7 +899,7 @@ export const ChessRules = class ChessRules { // What are the knight moves from square x,y ? getPotentialKnightMoves(sq) { - return this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep"); + return this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1); } // What are the bishop moves from square x,y ? @@ -906,19 +910,14 @@ export const ChessRules = class ChessRules { // What are the queen moves from square x,y ? getPotentialQueenMoves(sq) { return this.getSlideNJumpMoves( - sq, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]) - ); + sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP])); } // What are the king moves from square x,y ? getPotentialKingMoves(sq) { // Initialize with normal moves let moves = this.getSlideNJumpMoves( - sq, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); if (V.HasCastle && this.castleFlags[this.turn].some(v => v < V.size.y)) moves = moves.concat(this.getCastleMoves(sq)); return moves; @@ -1102,13 +1101,18 @@ export const ChessRules = class ChessRules { // Generic method for non-pawn pieces ("sliding or jumping"): // is x,y attacked by a piece of given color ? - isAttackedBySlideNJump([x, y], color, piece, steps, oneStep) { + isAttackedBySlideNJump([x, y], color, piece, steps, nbSteps) { for (let step of steps) { let rx = x + step[0], ry = y + step[1]; - while (V.OnBoard(rx, ry) && this.board[rx][ry] == V.EMPTY && !oneStep) { + let stepCounter = 1; + while ( + V.OnBoard(rx, ry) && this.board[rx][ry] == V.EMPTY && + (!nbSteps || stepCounter < nbSteps) + ) { rx += step[0]; ry += step[1]; + stepCounter++; } if ( V.OnBoard(rx, ry) && diff --git a/client/src/components/BaseGame.vue b/client/src/components/BaseGame.vue index 7627f2dc..4b6529ff 100644 --- a/client/src/components/BaseGame.vue +++ b/client/src/components/BaseGame.vue @@ -167,7 +167,8 @@ export default { baseGameDiv.tabIndex = 0; baseGameDiv.addEventListener("click", this.focusBg); baseGameDiv.addEventListener("keydown", this.handleKeys); - baseGameDiv.addEventListener("wheel", this.handleScroll); + if (this.st.settings.scrollmove) + baseGameDiv.addEventListener("wheel", this.handleScroll); } document.getElementById("eogDiv") .addEventListener("click", processModalClick); @@ -340,6 +341,7 @@ export default { pgn += '[Url "' + params.serverUrl + '/game/' + this.game.id + '"]\n'; if (!!this.game.cadence) pgn += '[Cadence "' + this.game.cadence + '"]\n'; + pgn += '[Options "' + JSON.stringify(this.game.options) + '"]\n'; pgn += '\n'; for (let i = 0; i < this.moves.length; i += 2) { if (i > 0) pgn += " "; diff --git a/client/src/components/ChallengeList.vue b/client/src/components/ChallengeList.vue index 21179a65..a1c46cdc 100644 --- a/client/src/components/ChallengeList.vue +++ b/client/src/components/ChallengeList.vue @@ -62,17 +62,14 @@ export default { return c.to || this.st.tr["Any player"]; return c.from.name || "@nonymous"; }, + // TODO: duplicated from Hall getRandomnessClass: function(c) { - if ( - // TODO: one extra test here - !Number.isInteger(c.options.randomness) && - !parseInt(c.options.randomness, 10) - ) { + const opts = c.options; + if (opts.randomness === undefined && opts.random === undefined) return {}; - } - return { - ["random-" + c.options.randomness]: true - }; + if (opts.randomness !== undefined) + return { ["random-" + opts.randomness]: true }; + return { ["random-" + (opts.random ? 2 : 0)]: true }; } } }; diff --git a/client/src/components/Settings.vue b/client/src/components/Settings.vue index 514e7049..e04cbdfa 100644 --- a/client/src/components/Settings.vue +++ b/client/src/components/Settings.vue @@ -60,6 +60,13 @@ div type="checkbox" v-model="st.settings.gotonext" ) + fieldset(v-if="desktopBrowser") + label(for="setScrollmove") + | {{ st.tr["Mouse scroll to replay moves"] }} + input#setScrollmove( + type="checkbox" + v-model="st.settings.scrollmove" + ) </template> <script> @@ -83,6 +90,9 @@ export default { computed: { flagImage: function() { return `/images/flags/${this.st.lang}.svg`; + }, + desktopBrowser: function() { + return !("ontouchstart" in window); } }, methods: { diff --git a/client/src/components/UploadGame.vue b/client/src/components/UploadGame.vue index ea85ea75..b57a23e7 100644 --- a/client/src/components/UploadGame.vue +++ b/client/src/components/UploadGame.vue @@ -64,6 +64,9 @@ export default { case "Cadence": game.cadence = value; break; + case "Options": + game.options = value; + break; } idx++; } diff --git a/client/src/data/challengeCheck.js b/client/src/data/challengeCheck.js index 7665f6f4..554dfdff 100644 --- a/client/src/data/challengeCheck.js +++ b/client/src/data/challengeCheck.js @@ -19,5 +19,7 @@ export function checkChallenge(c) { } else c.fen = ""; + if (!V.IsValidOptions(c.options)) return "Invalid options"; + return ""; } diff --git a/client/src/store.js b/client/src/store.js index 13c600b7..6489b937 100644 --- a/client/src/store.js +++ b/client/src/store.js @@ -79,17 +79,18 @@ export const store = { this.state.user.notify = json.notify; }); // Settings initialized with values from localStorage - const getItemDefaultTrue = (item) => { + const getItemDefault = (item, defaut) => { const value = localStorage.getItem(item); - if (!value) return true; + if (!value) return defaut; return value == "true"; }; this.state.settings = { bcolor: localStorage.getItem("bcolor") || "lichess", - sound: getItemDefaultTrue("sound"), - hints: getItemDefaultTrue("hints"), - highlight: getItemDefaultTrue("highlight"), - gotonext: getItemDefaultTrue("gotonext"), + sound: getItemDefault("sound", true), + hints: getItemDefault("hints", true), + highlight: getItemDefault("highlight", true), + gotonext: getItemDefault("gotonext", true), + scrollmove: getItemDefault("scrollmove", false) }; const supportedLangs = ["en", "es", "fr"]; const navLanguage = navigator.language.substr(0, 2); diff --git a/client/src/translations/about/en.pug b/client/src/translations/about/en.pug index 82fabd0e..5ab686be 100644 --- a/client/src/translations/about/en.pug +++ b/client/src/translations/about/en.pug @@ -14,9 +14,8 @@ h3 Notes p ELO rating is purposely absent from this website. p. - Games start by default with a random asymmetric position. - Random symmetric or even deterministic positions are available too, - if you prefer more fairness (but also less fun? :-P ). + Most games can start from three initial setups: deterministic + (the usual one), or random – symmetric or not. h3 Contribute diff --git a/client/src/translations/about/es.pug b/client/src/translations/about/es.pug index 95f69c06..ffbc5c33 100644 --- a/client/src/translations/about/es.pug +++ b/client/src/translations/about/es.pug @@ -13,9 +13,8 @@ h3 Notas p El ranking ELO está ausente a propósito de este sitio. p. - Las partidas comienzan por defecto con una posición aleatoria no simétrica. - Es posible una posición aleatoria simétrica o incluso determinista, - si prefieres más justicia (¿pero también más aburrimiento? :-P). + La mayorÃÂa de los juegos pueden comenzar desde tres tipos de posiciones: + determinista (patrón habitual) o aleatorio – simétrico o no. h3 Contribuir diff --git a/client/src/translations/about/fr.pug b/client/src/translations/about/fr.pug index eb47ccd3..c6d076e7 100644 --- a/client/src/translations/about/fr.pug +++ b/client/src/translations/about/fr.pug @@ -14,9 +14,8 @@ h3 Notes p Le classement ELO est à dessein absent de ce site. p. - Les parties démarrent par défaut avec une position aléatoire non symétrique. - Une position aléatoire symétrique ou même déterministe est possible, - si vous préférez plus de justice (mais aussi plus d'ennui ? :-P ). + La plupart des jeux peuvent démarrer depuis trois types de positions : + déterministe (schéma habituel), ou aléatoire – symétrique ou non. h3 Contribuer diff --git a/client/src/translations/en.js b/client/src/translations/en.js index 832bcb9d..cdcb7eaf 100644 --- a/client/src/translations/en.js +++ b/client/src/translations/en.js @@ -11,6 +11,8 @@ export const translations = { "Any player": "Any player", Apply: "Apply", "Are you sure?": "Are you sure?", + "Army 1": "Army 1", + "Army 2": "Army 2", "Asymmetric random": "Asymmetric random", "Authentication successful!": "Authentication successful!", "Back to list": "Back to list", @@ -31,6 +33,7 @@ export const translations = { "Clear history": "Clear history", Code: "Code", Color: "Color", + "Colorbound Clobberers": "Colorbound Clobberers", "Color option only for targeted challenge": "Color option only for targeted challenge", "Connection token sent. Check your emails!": "Connection token sent. Check your emails!", Contact: "Contact", @@ -49,6 +52,8 @@ export const translations = { "Error: try to delete cookies": "Error: try to delete cookies", "Errors in FEN": "Errors in FEN", "Example game": "Example game", + Fide: "Fide", + Four: "Four", Go: "Go", green: "green", Hall: "Hall", @@ -56,6 +61,7 @@ export const translations = { "Imported games": "Imported games", Instructions: "Instructions", "Invalid email": "Invalid email", + "Invalid options": "Invalid options", "It's your turn!": "It's your turn!", "is not online": "is not online", Language: "Language", @@ -73,6 +79,7 @@ export const translations = { "Missing name": "Missing name", "Missing solution": "Missing solution", "Modifications applied!": "Modifications applied!", + "Mouse scroll to replay moves": "Mouse scroll to replay moves", "Move played:": "Move played:", "Mutual agreement": "Mutual agreement", "My games": "My games", @@ -91,9 +98,12 @@ export const translations = { "No subject. Send anyway?": "No subject. Send anyway?", "Notifications by email": "Notifications by email", "Number": "Number", + "Number of pawns": "Number of pawns", + "Nutty Knights": "Nutty Knights", Observe: "Observe", "Offer draw?": "Offer draw?", "Opponent action": "Opponent action", + Options: "Options", orange: "orange", "Participant(s):": "Participant(s):", "Play with": "Play with", @@ -108,9 +118,12 @@ export const translations = { Previous_p: "Previous", "Processing... Please wait": "Processing... Please wait", Problems: "Problems", + Random: "Random", + Randomness: "Randomness", Refuse: "Refuse", Register: "Register", "Registration complete! Please check your emails now": "Registration complete! Please check your emails now", + "Remarkable Rookies": "Remarkable Rookies", Rematch: "Rematch", "Rematch in progress": "Rematch in progress", "Remove game?": "Remove game?", @@ -127,6 +140,7 @@ export const translations = { "Show next game after a move": "Show next game after move", "Show possible moves": "Show possible moves", "Show solution": "Show solution", + Six: "Six", Solution: "Solution", "Sound alert at game start": "Sound alert at game start", Stop: "Stop", @@ -138,6 +152,7 @@ export const translations = { "The game was already imported": "The game was already imported", "Three repetitions": "Three repetitions", Time: "Time", + Two: "Two", "Undetermined result": "Undetermined result", Update: "Update", "Upload a game": "Upload a game", @@ -155,6 +170,7 @@ export const translations = { "White win": "White win", "Who's there?": "Who's there?", With: "With", + "With switch": "With switch", with: "with", "Wrong color": "Wrong color", "Wrong time control": "Wrong time control", @@ -404,9 +420,4 @@ export const translations = { "vg30": "Pieces can temporarily borrow powers from others.", "vt31": "Miscelleanous", "vg31": "These variants are not classified yet, generally because they are the only one of their kind on this website.", - - // Variants' options - "Options": "Options", - "Randomness": "Randomness", - "With switch": "With switch", }; diff --git a/client/src/translations/es.js b/client/src/translations/es.js index 4c458fb3..0e8af8cb 100644 --- a/client/src/translations/es.js +++ b/client/src/translations/es.js @@ -11,6 +11,8 @@ export const translations = { "Any player": "Cualquier jugador", Apply: "Aplicar", "Are you sure?": "¿Está usted seguro?", + "Army 1": "Ejército 1", + "Army 2": "Ejército 2", "Asymmetric random": "Aleatorio asimétrico", "Authentication successful!": "¡Autenticación exitosa!", "Back to list": "Volver a la lista", @@ -31,6 +33,7 @@ export const translations = { "Clear history": "Clara historia", Code: "Código", Color: "Color", + "Colorbound Clobberers": "Batidores Unicolor", "Color option only for targeted challenge": "Elección de color solo para desafÃÂos especÃÂficos", "Connection token sent. Check your emails!": "Token de conexión enviado. ¡Revisa tus correos!", Contact: "Contacto", @@ -49,6 +52,8 @@ export const translations = { "Error: try to delete cookies": "Error: intente eliminar las cookies", "Errors in FEN": "FEN errónea", "Example game": "Ejemplo de partida", + Fide: "Fide", + Four: "Cuatro", Go: "Go", green: "verde", Hall: "Salón", @@ -56,6 +61,7 @@ export const translations = { "Imported games": "Partidas importadas", Instructions: "Instrucciones", "Invalid email": "Email inválido", + "Invalid options": "Optiones inválidas", "It's your turn!": "¡Es su turno!", "is not online": "no está en lÃÂnea", Language: "Idioma", @@ -73,6 +79,7 @@ export const translations = { "Missing name": "Nombre falta", "Missing solution": "Solución falta", "Modifications applied!": "¡Modificaciones aplicadas!", + "Mouse scroll to replay moves": "Pergamino mouse para repetir las jugadas", "Move played:": "Movimiento jugado:", "Mutual agreement": "Acuerdo mutuo", "My games": "Mis partidas", @@ -91,9 +98,12 @@ export const translations = { "No subject. Send anyway?": "Sin asunto. ¿Enviar sin embargo?", "Notifications by email": "Notificaciones por email", "Number": "Número", + "Number of pawns": "Número de peones", + "Nutty Knights": "Caballeros Locos", "Offer draw?": "¿Ofrecer tablas?", Observe: "Observar", "Opponent action": "Acción del adversario", + Options: "Optiones", orange: "naranja", "Participant(s):": "Participante(s):", "Play with": "Jugar con", @@ -108,9 +118,12 @@ export const translations = { Previous_n: "Anterior", "Processing... Please wait": "Procesando... por favor espere", Problems: "Problemas", + Random: "Aleatorio", + Randomness: "Grado de azar", Refuse: "Rechazar", Register: "Inscribirse", "Registration complete! Please check your emails now": "¡Registro completo! Revise sus correos electrónicos ahora", + "Remarkable Rookies": "Reclutas Notables", Rematch: "Revancha", "Rematch in progress": "Revancha en progreso", "Remove game?": "¿Eliminar la partida?", @@ -127,6 +140,7 @@ export const translations = { "Show next game after a move": "Mostrar la siguiente partida después de una jugada", "Show possible moves": "Mostrar posibles movimientos", "Show solution": "Mostrar la solución", + Six: "Seis", Solution: "Solución", "Sound alert at game start": "Alerta audible cuando comienza una partida", Stop: "Interrupción", @@ -138,6 +152,7 @@ export const translations = { "The game was already imported": "La partida ya ha sido importada", "Three repetitions": "Tres repeticiones", Time: "Tiempo", + Two: "Dos", "Undetermined result": "Resultado indeterminado", Update: "Actualización", "Upload a game": "Enviar una partida", @@ -155,6 +170,7 @@ export const translations = { "White win": "Las blancas ganan", "Who's there?": "¿Quién está ahÃÂ?", With: "Con", + "With switch": "Con switch", with: "con", "Wrong color": "Color incorrecto", "Wrong time control": "Cadencia errónea", @@ -404,9 +420,4 @@ export const translations = { "vg30": "Las piezas pueden temporalmente tomar prestados poderes de otras", "vt31": "Varios", "vg31": "Estas variantes aún no están clasificadas, en general porque son el único representante de su tipo en este sitio.", - - // Variants' options - "Options": "Optiones", - "Randomness": "Grado de azar", - "With switch": "Con switch", }; diff --git a/client/src/translations/faq/en.pug b/client/src/translations/faq/en.pug index 0f914b71..3062b0b0 100644 --- a/client/src/translations/faq/en.pug +++ b/client/src/translations/faq/en.pug @@ -7,14 +7,6 @@ against the computer. Keep in mind that the "engine" is generally quite weak. It's here for illustration and learning purpose only. -.question. - The initial position looks weird? -.answer. - Everything is randomized by default - when possible. This is the initial - spirit of the website. However, you can change this for a practice game - using the upper-right Settings menu ("randomness level"), and for a game - from main Hall by changing this same parameter in the form. - .question. The bot is too weak! Where should I continue? .answer diff --git a/client/src/translations/faq/es.pug b/client/src/translations/faq/es.pug index 8a8f464e..23f12c32 100644 --- a/client/src/translations/faq/es.pug +++ b/client/src/translations/faq/es.pug @@ -9,15 +9,6 @@ en general bastante débil. Se utiliza solo para ilustrar y aprender las reglas. -.question. - ¿Es extraña la posición inicial? -.answer. - Todo es aleatorio por defecto - cuando es posible. Es el espÃÂritu - inicial del sitio. Sin embargo, puede cambiar esto por una partida de - entrenamiento a través de la configuración en la parte superior derecha - ("grado de azar"), y para una partida del Salón principal cambiando el mismo - parámetro en el formulario. - .question. ¡La computadora está jugando demasiado mal! ¿Dónde debo continuar? .answer diff --git a/client/src/translations/faq/fr.pug b/client/src/translations/faq/fr.pug index cb89549f..e5fce105 100644 --- a/client/src/translations/faq/fr.pug +++ b/client/src/translations/faq/fr.pug @@ -8,15 +8,6 @@ en général plutôt faible. Il sert à illustrer et à apprendre les règles seulement. -.question. - La position initiale est bizarre ? -.answer. - Tout est rendu aléatoire par défaut - quand c'est possible. C'est l'esprit - initial du site. Cependant, vous pouvez changer cela pour une partie - d'entraînement via les Réglages en haut à droite ("degré d'aléa"), et pour - une partie depuis le Salon principal en changeant le même paramètre dans le - formulaire. - .question. L'ordinateur joue trop mal ! Où dois-je continuer ? .answer diff --git a/client/src/translations/fr.js b/client/src/translations/fr.js index 5d3dbf1d..bc8b4080 100644 --- a/client/src/translations/fr.js +++ b/client/src/translations/fr.js @@ -10,9 +10,11 @@ export const translations = { "Analysis disabled for this variant": "Analyse désactivée pour cette variante", "Any player": "N'importe qui", Apply: "Appliquer", - "Authentication successful!": "Authentification réussie !", "Are you sure?": "Étes vous sûr?", + "Army 1": "Armée 1", + "Army 2": "Armée 2", "Asymmetric random": "Aléatoire asymétrique", + "Authentication successful!": "Authentification réussie !", "Back to list": "Retour à la liste", "Black": "Noirs", "Black to move": "Trait aux noirs", @@ -31,6 +33,7 @@ export const translations = { "Clear history": "Effacer l'historique", Code: "Code", Color: "Couleur", + "Colorbound Clobberers": "Tabasseurs Unicolores", "Color option only for targeted challenge": "Choix de la couleur seulement pour défis ciblés", "Connection token sent. Check your emails!": "Token de connection envoyé. Allez voir vos emails !", Contact: "Contact", @@ -49,6 +52,8 @@ export const translations = { "Error: try to delete cookies": "Erreur : essayez de supprimer les cookies", "Errors in FEN": "FEN erronée", "Example game": "Partie exemple", + Fide: "Fide", + Four: "Quatre", Go: "Go", green: "vert", Hall: "Salon", @@ -56,6 +61,7 @@ export const translations = { "Imported games": "Parties importées", Instructions: "Instructions", "Invalid email": "Email invalide", + "Invalid options": "Options invalides", "It's your turn!": "À vous de jouer !", "is not online": "n'est pas en ligne", Language: "Langue", @@ -73,6 +79,7 @@ export const translations = { "Missing name": "Nom manquant", "Missing solution": "Solution manquante", "Modifications applied!": "Modifications effectuées !", + "Mouse scroll to replay moves": "Défilement souris pour rejouer les coups", "Move played:": "Coup joué :", "Mutual agreement": "Accord mutuel", "My games": "Mes parties", @@ -91,9 +98,12 @@ export const translations = { "No subject. Send anyway?": "Pas de sujet. Envoyer quand-même ??", "Notifications by email": "Notifications par email", "Number": "Numéro", + "Number of pawns": "Nombre de pions", + "Nutty Knights": "Chevaliers Fous", "Offer draw?": "Proposer nulle ?", Observe: "Observer", "Opponent action": "Action de l'adversaire", + Options: "Options", orange: "orange", "Participant(s):": "Participant(s) :", "Play with": "Jouer avec", @@ -108,9 +118,12 @@ export const translations = { Previous_n: "Précédente", "Processing... Please wait": "Traitement en cours... Attendez SVP", Problems: "Problèmes", + Random: "Aléatoire", + Randomness: "Degré d'aléa", Refuse: "Refuser", Register: "S'inscrire", "Registration complete! Please check your emails now": "Enregistrement terminé ! Allez voir vos emails maintenant", + "Remarkable Rookies": "Recrues Remarquables", Rematch: "Rejouer", "Rematch in progress": "Revanche en cours", "Remove game?": "Supprimer la partie ?", @@ -127,6 +140,7 @@ export const translations = { "Show next game after a move": "Montrer la partie suivante après un coup", "Show possible moves": "Montrer les coups possibles", "Show solution": "Montrer la solution", + Six: "Six", Solution: "Solution", "Sound alert at game start": "Alerte sonore quand une partie démarre", Stop: "Arrêt", @@ -138,6 +152,7 @@ export const translations = { "The game was already imported": "La partie a déjà été importée", "Three repetitions": "Triple répétition", Time: "Temps", + Two: "Deux", "Undetermined result": "Résultat indéterminé", Update: "Mise à jour", "Upload a game": "Envoyer une partie", @@ -155,6 +170,7 @@ export const translations = { "White win": "Les blancs gagnent", "Who's there?": "Qui est là ?", With: "Avec", + "With switch": "Avec switch", with: "avec", "Wrong color": "Mauvaise couleur", "Wrong time control": "Cadence erronée", @@ -404,9 +420,4 @@ export const translations = { "vg30": "Les pièces peuvent temporairement emprunter des pouvoir aux autres", "vt31": "Divers", "vg31": "Ces variantes ne sont pas encore classées, en général car elles sont l'unique représentant de leur type sur ce site.", - - // Variants' options - "Options": "Options", - "Randomness": "Degré d'aléa", - "With switch": "Avec switch", }; diff --git a/client/src/translations/rules/Capture/en.pug b/client/src/translations/rules/Capture/en.pug index 0007569b..64246b06 100644 --- a/client/src/translations/rules/Capture/en.pug +++ b/client/src/translations/rules/Capture/en.pug @@ -18,8 +18,7 @@ figure.diagram-container h3 More information p - | The variant idea was suggested recently (2020) by Vincent Rothuis. - | It is mentioned on + | The variant is mentioned on a(href="https://www.chessvariants.com/other.dir/modest-various.html") | this page | . diff --git a/client/src/translations/rules/Capture/es.pug b/client/src/translations/rules/Capture/es.pug index 7cd18827..a38b8ca1 100644 --- a/client/src/translations/rules/Capture/es.pug +++ b/client/src/translations/rules/Capture/es.pug @@ -18,8 +18,7 @@ figure.diagram-container h3 Más información p - | Esta idea fue sugerida recientemente (2020) por Vincent Rothuis. - | La variante es mencionada en + | Esta variante es mencionada en a(href="https://www.chessvariants.com/other.dir/modest-various.html") | esta página | . diff --git a/client/src/translations/rules/Capture/fr.pug b/client/src/translations/rules/Capture/fr.pug index e956d8ab..b04fd911 100644 --- a/client/src/translations/rules/Capture/fr.pug +++ b/client/src/translations/rules/Capture/fr.pug @@ -18,8 +18,7 @@ figure.diagram-container h3 Plus d'information p - | Cette idée a été suggérée récemment (2020) par Vincent Rothuis. - | La variante est mentionnée sur + | Cette variante est mentionnée sur a(href="https://www.chessvariants.com/other.dir/modest-various.html") | cette page | . diff --git a/client/src/translations/rules/Cwda/en.pug b/client/src/translations/rules/Cwda/en.pug index 603c8d7e..30c016d2 100644 --- a/client/src/translations/rules/Cwda/en.pug +++ b/client/src/translations/rules/Cwda/en.pug @@ -1,46 +1,103 @@ p.boxed - | TODO: other armies as well - | Black pieces are replaced by a new army, where most pieces are quite - | colorbound. + | White and black pieces are replaced by different armies. -p Black pawns and king move as usual, but the other pieces do not: +p. + Pawns and kings move as usual, but the other pieces generally do not. + Indeed, before the game start you must select two armies, defining + new movements for "rooks", "knights", "bishops" and "queens". + +p Pieces movements are described using these simple pieces: ul - li Rook = bishop + dabbabah (D), - li Knight = wazir + alfil = "phoenix" (H), - li Bishop = ferz + alfil + dabbabah (A), - li Queen = bishop + knight = "princess" (S). + li Dabbabah = jump two squares orthogonally + li Alfil = jump two squares diagonally + li Wazir = one square orthogonally + li Ferz = one square diagonally + li Three leaper (L3) = jump three squares orthogonally + li Narrow knight = knight without "2+1 lateral moves" + +p Pawns can be promoted into a piece of any of the two armies playing. + +h3 The Colorbound Clobberers + +figure.showPieces.text-center + img(src="/images/pieces/Cwda/bd.svg") + img(src="/images/pieces/Cwda/ww.svg") + img(src="/images/pieces/Cwda/bf.svg") + img(src="/images/pieces/Cwda/wc.svg") + +ul + li Rook = bishop + dabbabah = "bede" (D), + li Knight = wazir + alfil = "waffle" (W), + li Bishop = ferz + alfil + dabbabah = "fad" (F), + li Queen = bishop + knight = "cardinal" (C). + +figure.diagram-container + .diagram.diag12 + | fen:8/8/8/3D4/8/8/8/8 a8,b7,c6,e4,f3,g2,h1,c4,b3,a2,e6,f7,g8,f5,d3,b5,d7: + .diagram.diag22 + | fen:8/8/8/4w3/8/8/8/8 e6,f5,e4,d5,c7,g7,g3,c3: + figcaption. + Moves of the Bede on the left, and of the Waffle on the right. + p. - The Ferz and Wazir move respectively like a single-step bishop, and - single-step rook. The Alfil and Dabbabah move respectively like a - double-step bishop and a double-step rook. They can both leap over a piece. + When castling large, the king and rook arrive respectively on + b1/b8 and c1/c8 so that the rook remains on the same color. + +h3 The Nutty Knights + +figure.showPieces.text-center + img(src="/images/pieces/Cwda/bg.svg") + img(src="/images/pieces/Cwda/wi.svg") + img(src="/images/pieces/Cwda/bt.svg") + img(src="/images/pieces/Cwda/wl.svg") + +ul + li Rook = rook forward and sideways + king backwards = "charging rook" (G), + li Knight = narrow knight + ferz = "fibnif" (I), + li. + Bishop = knight forward + king sideways and backwards = + "charging knight" (T), + li Queen = rook forward and sideways + knight forward + king = "colonel" (L). figure.diagram-container .diagram.diag12 - | fen:8/8/8/3d4/8/8/8/8 a8,b7,c6,e4,f3,g2,h1,c4,b3,a2,e6,f7,g8,f5,d3,b5,d7: + | fen:8/8/8/3i4/8/8/8/8 c7,c3,e7,e3,c4,c6,e6,e4: .diagram.diag22 - | fen:8/8/8/4h3/8/8/8/8 e6,f5,e4,d5,c7,g7,g3,c3: + | fen:8/8/8/4T3/8/8/8/8 c6,d7,f7,g6,d5,f5,d4,e4,f4: figcaption. - Moves of the black rook on the left, and of the black knight on the right. + Moves of the Fibnif on the left, and of the Charging knight on the right. + +h3 The Remarkable Rookies + +figure.showPieces.text-center + img(src="/images/pieces/Cwda/bs.svg") + img(src="/images/pieces/Cwda/wy.svg") + img(src="/images/pieces/Cwda/bh.svg") + img(src="/images/pieces/Cwda/wo.svg") + +ul + li Rook = rook limited to 4 squares = "short rook" (S), + li Knight = dabbabah + wazir = "woody rook" (Y), + li Bishop = dabbabah + ferz + L3 = "half-duck" (H), + li Queen = rook + knight = "chancellor" (O). figure.diagram-container .diagram.diag12 - | fen:8/8/8/3a4/8/8/8/8 c6,b7,e6,f7,e4,f3,c4,b3,d7,f5,d3,b5: + | fen:8/8/8/3y4/8/8/8/8 d3,b5,d7,f5,c5,d6,e5,d4: .diagram.diag22 - | fen:8/8/8/4s3/8/8/8/8 a1,b2,c3,d4,f6,g7,h8,b8,c7,d6,f4,g3,h2,c6,d7,f7,g6,g4,f3,d3,c4: + | fen:8/8/8/4H3/8/8/8/8 c5,e7,g5,e3,b5,e8,h5,e2,d4,d6,f6,f4: figcaption. - Moves of the black bishop on the left, and of the black queen on the right. + Moves of the Woody rook on the left, and of the Half-duck on the right. -p Pawns can be promoted into any piece (including those of the other team). +h3 Fide army -p. - When castling large, the black king arrives on b8 and the a8 rook moves - to c8, to remain on the same color. +p The standard chess pieces. h3 Source p - a(href="https://www.chessvariants.com/d.betza/chessvar/dan/colclob.html") - | The colorbound clobberers + a(href="https://www.chessvariants.com/unequal.dir/cwda.html") + | Chess with different armies | on chessvariants.com. p Inventor: Ralph Betza (1996) diff --git a/client/src/translations/rules/Cwda/es.pug b/client/src/translations/rules/Cwda/es.pug index bb3cf20d..a5b5ac85 100644 --- a/client/src/translations/rules/Cwda/es.pug +++ b/client/src/translations/rules/Cwda/es.pug @@ -1,50 +1,109 @@ p.boxed - | Las piezas negras son reemplazadas por un nuevo equipo, que incluye - | la mayorÃÂa de las piezas se estiraron para evolucionar en un solo color. + | Las piezas blancas y negras son reemplazadas por diferentes ejércitos. p. - Los peones negros y el rey mantienen sus movimientos habituales, pero este - no es el caso para las otras piezas: + Los peones y los reyes se mueven como de costumbre, pero normalmente no + las otras piezas. De hecho, antes del inicio del juego debes + seleccionar dos ejércitos, definiendo nuevos movimientos para los + "torres", "caballos", "alfiles" y "damas". + +p Los movimientos de las piezas se describen utilizando estas piezas básicas: ul - li Torre = alfil + dabbabah (D), - li Caballo = wazir + alfil = "phoenix" (H), - li Alfil = ferz + elefante + dabbabah (A), - li Dama = alfil + caballo = "princesa" (S). + li Dabbabah = saltar dos casillas ortogonalmente + li Alfil_A = saltar dos casillas en diagonal + li Wazir = una casilla ortogonalmente + li Ferz = una casilla diagonal + li Three leaper (L3) = saltar tres casillas ortogonalmente + li Narrow knight = Caballo sin "movimientos laterales 2+1" + +p. + Los peones pueden promocionarse en una pieza de cualquier + cuál de los ejércitos presentes. + +h3 Los Batidores Unicolor + +figure.showPieces.text-center + img(src="/images/pieces/Cwda/bd.svg") + img(src="/images/pieces/Cwda/ww.svg") + img(src="/images/pieces/Cwda/bf.svg") + img(src="/images/pieces/Cwda/wc.svg") + +ul + li Torre = alfil_A + dabbabah = "bede" (D), + li Caballo = wazir + alfil = "gofre" (W), + li Alfil = ferz + alfil_A + dabbabah = "fad" (F), + li Dama = alfil + caballo = "cardenal" (C). + +figure.diagram-container + .diagram.diag12 + | fen:8/8/8/3D4/8/8/8/8 a8,b7,c6,e4,f3,g2,h1,c4,b3,a2,e6,f7,g8,f5,d3,b5,d7: + .diagram.diag22 + | fen:8/8/8/4w3/8/8/8/8 e6,f5,e4,d5,c7,g7,g3,c3: + figcaption Jugadas del Bede a la izquierda y del Gofre a la derecha. + p. - El Ferz y el Wazir viajan respectivamente como un alfil y una torre, - pero de una casilla solamente. El Elefante y el Dabbabah se mueven - respectivamente de dos casillas como un alfil y una torre, - posiblemente saltando sobre una pieza. + Después del gran enroque, el rey y la torre llegan respectivamente en b1/b8 + y c1/c8 para que la torre permanezca al mismo color. + +h3 Los Caballeros Locos + +figure.showPieces.text-center + img(src="/images/pieces/Cwda/bg.svg") + img(src="/images/pieces/Cwda/wi.svg") + img(src="/images/pieces/Cwda/bt.svg") + img(src="/images/pieces/Cwda/wl.svg") + +ul + li. + Torre = torre hacia adelante y hacia los lados + rey atrás = + "torre de carga" (G), + li Caballo = narrow knight + ferz = "fibnif" (I), + li. + Alfil = caballo hacia adelante + rey lateralmente y hacia atrás = + "caballo de carga" (T), + li. + Dama = torre hacia adelante y hacia los lados + caballo hacia adelante + + rey = "coronel" (L). figure.diagram-container .diagram.diag12 - | fen:8/8/8/3d4/8/8/8/8 a8,b7,c6,e4,f3,g2,h1,c4,b3,a2,e6,f7,g8,f5,d3,b5,d7: + | fen:8/8/8/3i4/8/8/8/8 c7,c3,e7,e3,c4,c6,e6,e4: .diagram.diag22 - | fen:8/8/8/4h3/8/8/8/8 e6,f5,e4,d5,c7,g7,g3,c3: + | fen:8/8/8/4T3/8/8/8/8 c6,d7,f7,g6,d5,f5,d4,e4,f4: figcaption. - Jugadas de la torre negra a la izquierda y del caballo negro a la derecha. + Jugadas del Fibnif a la izquierda, y del Caballo de carga a la derecha. + +h3 Las Reclutas Notables + +figure.showPieces.text-center + img(src="/images/pieces/Cwda/bs.svg") + img(src="/images/pieces/Cwda/wy.svg") + img(src="/images/pieces/Cwda/bh.svg") + img(src="/images/pieces/Cwda/wo.svg") + +ul + li Torre = torre limitada a 4 casillas = "torre corta" (S), + li Caballo = dabbabah + wazir = "torre arbolada" (Y), + li Alfil = dabbabah + ferz + L3 = "medio-pato" (H), + li Dama = torre + caballo = "canciller" (O). figure.diagram-container .diagram.diag12 - | fen:8/8/8/3a4/8/8/8/8 c6,b7,e6,f7,e4,f3,c4,b3,d7,f5,d3,b5: + | fen:8/8/8/3y4/8/8/8/8 d3,b5,d7,f5,c5,d6,e5,d4: .diagram.diag22 - | fen:8/8/8/4s3/8/8/8/8 a1,b2,c3,d4,f6,g7,h8,b8,c7,d6,f4,g3,h2,c6,d7,f7,g6,g4,f3,d3,c4: + | fen:8/8/8/4H3/8/8/8/8 c5,e7,g5,e3,b5,e8,h5,e2,d4,d6,f6,f4: figcaption. - Jugadas del alfil negro a la izquierda, y de la dama negra a la derecha. + Jugadas de la Torre arbolada a la izquierda y del Medio-pato a la derecha. -p. - Los peones pueden ser promovidos a cualquier piezas (incluidos las del - otro equipo) +h3 Ejército Fide -p. - Después del gran enroque, el rey negro llega en b8 y la torre a8 entra en c8, - para permanecer en el mismo color. +p Piezas de ajedrez estándar. h3 Fuente p - a(href="https://www.chessvariants.com/d.betza/chessvar/dan/colclob.html") - | Los "batidores unicolor" + a(href="https://www.chessvariants.com/unequal.dir/cwda.html") + | Ajedrez con diferentes ejércitos. | en chessvariants.com. p Inventor: Ralph Betza (1996) diff --git a/client/src/translations/rules/Cwda/fr.pug b/client/src/translations/rules/Cwda/fr.pug index 4d5a82b3..53e51d8d 100644 --- a/client/src/translations/rules/Cwda/fr.pug +++ b/client/src/translations/rules/Cwda/fr.pug @@ -1,50 +1,107 @@ p.boxed - | Les pièces noires sont remplacées par une nouvelle équipe, dont - | la plupart des pièces tendent à évoluer sur une seule couleur. + | Les pièces noires et blanches sont remplacées par des armées différentes. p. - Les pions et le roi noirs conservent leur déplacements habituels, mais ce - n'est pas le cas des autres pièces : + Les pions et rois se déplacent comme d'habitude, mais en général pas + les autres pièces. En effet, avant le début de la partie vous devez + sélectionner deux armées, définissant de nouveaux déplacements pour les + "tours", "cavaliers", "fous" et "dames". + +p Les mouvements des pièces sont décrits en utilisant ces pièces élmentaires : ul - li Tour = fou + dabbabah (D), - li Cavalier = wazir + alfil = "phoenix" (H), - li Fou = ferz + alfil + dabbabah (A), - li Dame = fou + cavalier = "princesse" (S). + li Dabbabah = saute deux cases orthogonalement + li Alfil = saute deux cases en diagonale + li Wazir = une case orthogonalement + li Ferz = une case en diagonale + li Three leaper (L3) = saute trois cases orthogonalement + li Narrow knight = cavalier sans "coups latéraux 2+1" + +p. + Les pions peuvent se promouvoir en une pièce de n'importe + laquelle des armées présentes. + +h3 Les Tabasseurs Unicolores + +figure.showPieces.text-center + img(src="/images/pieces/Cwda/bd.svg") + img(src="/images/pieces/Cwda/ww.svg") + img(src="/images/pieces/Cwda/bf.svg") + img(src="/images/pieces/Cwda/wc.svg") + +ul + li Tour = fou + dabbabah = "bede" (D), + li Cavalier = wazir + alfil = "gaufre" (W), + li Fou = ferz + alfil + dabbabah = "fad" (F), + li Dame = fou + cavalier = "cardinal" (C). + +figure.diagram-container + .diagram.diag12 + | fen:8/8/8/3D4/8/8/8/8 a8,b7,c6,e4,f3,g2,h1,c4,b3,a2,e6,f7,g8,f5,d3,b5,d7: + .diagram.diag22 + | fen:8/8/8/4w3/8/8/8/8 e6,f5,e4,d5,c7,g7,g3,c3: + figcaption Coups du Bede à gauche, et de la Gaufre à droite. + p. - Le Ferz et le Wazir se déplacent respectivement comme un fou et une tour - mais d'une seule case. L'Alfil et le Dabbabah se déplacent respectivement - de deux cases comme un fou et une tour, - en sautant éventuellement par dessus une pièce. + Après le grand roque, roi et tour arrivent respectivement en b1/b8 et c1/c8 + afin que la tour reste sur la même couleur. + +h3 Les Chevaliers Fous + +figure.showPieces.text-center + img(src="/images/pieces/Cwda/bg.svg") + img(src="/images/pieces/Cwda/wi.svg") + img(src="/images/pieces/Cwda/bt.svg") + img(src="/images/pieces/Cwda/wl.svg") + +ul + li. + Tour = tour vers l'avant et latéralement + roi vers l'arrière = + "tour chargeante" (G), + li Cavalier = narrow knight + ferz = "fibnif" (I), + li. + Fou = cavalier vers l'avant + roi latéralement et vers l'arrière = + "cavalier chargeant" (T), + li. + Dame = tour vers l'avant et latéralement + cavalier vers l'avant + roi = + "colonel" (L). figure.diagram-container .diagram.diag12 - | fen:8/8/8/3d4/8/8/8/8 a8,b7,c6,e4,f3,g2,h1,c4,b3,a2,e6,f7,g8,f5,d3,b5,d7: + | fen:8/8/8/3i4/8/8/8/8 c7,c3,e7,e3,c4,c6,e6,e4: .diagram.diag22 - | fen:8/8/8/4h3/8/8/8/8 e6,f5,e4,d5,c7,g7,g3,c3: - figcaption. - Coups de la tour noire à gauche, et du cavalier noir à droite. + | fen:8/8/8/4T3/8/8/8/8 c6,d7,f7,g6,d5,f5,d4,e4,f4: + figcaption Coups du Fibnif à gauche, et du Cavalier chargeant à droite. + +h3 Les Recrues Remarquables + +figure.showPieces.text-center + img(src="/images/pieces/Cwda/bs.svg") + img(src="/images/pieces/Cwda/wy.svg") + img(src="/images/pieces/Cwda/bh.svg") + img(src="/images/pieces/Cwda/wo.svg") + +ul + li Tour = tour limitée à 4 cases = "tour courte" (S), + li Cavalier = dabbabah + wazir = "tour boisée" (Y), + li Fou = dabbabah + ferz + L3 = "demi-canard" (H), + li Dame = tour + cavalier = "chancelier" (O). figure.diagram-container .diagram.diag12 - | fen:8/8/8/3a4/8/8/8/8 c6,b7,e6,f7,e4,f3,c4,b3,d7,f5,d3,b5: + | fen:8/8/8/3y4/8/8/8/8 d3,b5,d7,f5,c5,d6,e5,d4: .diagram.diag22 - | fen:8/8/8/4s3/8/8/8/8 a1,b2,c3,d4,f6,g7,h8,b8,c7,d6,f4,g3,h2,c6,d7,f7,g6,g4,f3,d3,c4: - figcaption. - Coups du fou noir à gauche, et de la dame noire à droite. + | fen:8/8/8/4H3/8/8/8/8 c5,e7,g5,e3,b5,e8,h5,e2,d4,d6,f6,f4: + figcaption Coups de la Tour boisée à gauche, et du Demi-canard à droite. -p. - Les pions peuvent être promus en n'importe quelle pièce (incluant celles - de l'autre équipe). +h3 Armée Fide -p. - Après le grand roque, le roi noir arrive en b8 et la tour a8 vient en c8, - afin de rester sur la même couleur. +p Les pièces d'échecs standard. h3 Source p - a(href="https://www.chessvariants.com/d.betza/chessvar/dan/colclob.html") - | Les "tabasseurs unicolores" - | sur chessvariants.com. + a(href="https://www.chessvariants.com/unequal.dir/cwda.html") + | Échecs avec armées différentes + | sur chessvariants.com. p Inventeur : Ralph Betza (1996) diff --git a/client/src/variants/Absorption.js b/client/src/variants/Absorption.js index 33c83517..293238db 100644 --- a/client/src/variants/Absorption.js +++ b/client/src/variants/Absorption.js @@ -116,7 +116,7 @@ export class AbsorptionRules extends ChessRules { return ( this.isAttackedBySlideNJump(sq, color, V.BN, V.steps[V.BISHOP]) || this.isAttackedBySlideNJump( - sq, color, V.BN, V.steps[V.KNIGHT], "oneStep") + sq, color, V.BN, V.steps[V.KNIGHT], 1) ); } @@ -124,7 +124,7 @@ export class AbsorptionRules extends ChessRules { return ( this.isAttackedBySlideNJump(sq, color, V.RN, V.steps[V.ROOK]) || this.isAttackedBySlideNJump( - sq, color, V.RN, V.steps[V.KNIGHT], "oneStep") + sq, color, V.RN, V.steps[V.KNIGHT], 1) ); } @@ -133,7 +133,7 @@ export class AbsorptionRules extends ChessRules { this.isAttackedBySlideNJump( sq, color, V.QN, V.steps[V.BISHOP].concat(V.steps[V.ROOK])) || this.isAttackedBySlideNJump( - sq, color, V.QN, V.steps[V.KNIGHT], "oneStep") + sq, color, V.QN, V.steps[V.KNIGHT], 1) ); } diff --git a/client/src/variants/Alapo.js b/client/src/variants/Alapo.js index 3037954e..2d2a7900 100644 --- a/client/src/variants/Alapo.js +++ b/client/src/variants/Alapo.js @@ -34,16 +34,14 @@ export class AlapoRules extends ChessRules { } getPotentialMinirookMoves(sq) { - return super.getSlideNJumpMoves(sq, V.steps[V.ROOK], "oneStep"); + return super.getSlideNJumpMoves(sq, V.steps[V.ROOK], 1); } getPotentialMinibishopMoves(sq) { - return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], "oneStep"); + return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1); } getPotentialMiniqueenMoves(sq) { - return ( - super.getSlideNJumpMoves( - sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), "oneStep") - ); + return super.getSlideNJumpMoves( + sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } getPotentialMovesFrom(sq) { @@ -68,8 +66,8 @@ export class AlapoRules extends ChessRules { return "Alapo/" + b + suffix; } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "rbqqbr/tcssct/6/6/TCSSCT/RBQQBR w 0"; const piece2pawn = { @@ -81,7 +79,7 @@ export class AlapoRules extends ChessRules { let pieces = { w: new Array(6), b: new Array(6) }; // Shuffle pieces on first (and last rank if randomness == 2) for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; break; } diff --git a/client/src/variants/Align4.js b/client/src/variants/Align4.js index fb438717..47f0092a 100644 --- a/client/src/variants/Align4.js +++ b/client/src/variants/Align4.js @@ -2,8 +2,21 @@ import { ChessRules, Move, PiPo } from "@/base_rules"; export class Align4Rules extends ChessRules { - static GenRandInitFen(randomness) { - const baseFen = ChessRules.GenRandInitFen(Math.min(randomness, 1)); + static get Options() { + return { + check: [ + { + label: "Random", + defaut: false, + variable: "random" + } + ] + }; + } + + static GenRandInitFen(options) { + const baseFen = ChessRules.GenRandInitFen( + { randomness: (options.random ? 1 : 0) }); return "4k3/8" + baseFen.substring(17, 50) + " -"; } @@ -80,10 +93,7 @@ export class Align4Rules extends ChessRules { if (this.getColor(x, y) == 'w') return super.getPotentialKingMoves([x, y]); // Black doesn't castle: return super.getSlideNJumpMoves( - [x, y], - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } getAllValidMoves() { diff --git a/client/src/variants/Allmate.js b/client/src/variants/Allmate.js index 86409c25..9c43a46c 100644 --- a/client/src/variants/Allmate.js +++ b/client/src/variants/Allmate.js @@ -11,8 +11,8 @@ export class AllmateRules extends ChessRules { return []; } - static GenRandInitFen(randomness) { - return ChessRules.GenRandInitFen(randomness).slice(0, -2); + static GenRandInitFen(options) { + return ChessRules.GenRandInitFen(options).slice(0, -2); } getPotentialMovesFrom([x, y]) { @@ -69,10 +69,7 @@ export class AllmateRules extends ChessRules { case V.KING: // Do not allow castling to escape from check oppMoves = super.getSlideNJumpMoves( - [i, j], - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + [i, j], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); break; } for (let om of oppMoves) { diff --git a/client/src/variants/Ambiguous.js b/client/src/variants/Ambiguous.js index b478887d..5e2b32a7 100644 --- a/client/src/variants/Ambiguous.js +++ b/client/src/variants/Ambiguous.js @@ -232,13 +232,13 @@ export class AmbiguousRules extends ChessRules { this.kingPos[this.turn] = [move.vanish[1].x, move.vanish[1].y]; } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 -"; let pieces = { w: new Array(8), b: new Array(8) }; for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; break; } diff --git a/client/src/variants/Antiking1.js b/client/src/variants/Antiking1.js index 92034a30..781984f9 100644 --- a/client/src/variants/Antiking1.js +++ b/client/src/variants/Antiking1.js @@ -5,6 +5,10 @@ import { randInt } from "@/utils/alea"; export class Antiking1Rules extends BerolinaRules { + static get Options() { + return null; + } + static get PawnSpecs() { return Object.assign( {}, @@ -132,10 +136,7 @@ export class Antiking1Rules extends BerolinaRules { getPotentialAntikingMoves(sq) { // The antiking moves like a king (only captured colors differ) return this.getSlideNJumpMoves( - sq, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } isAttacked(sq, color) { @@ -149,24 +150,14 @@ export class Antiking1Rules extends BerolinaRules { // Antiking is not attacked by king: if (this.getPiece(x, y) == V.ANTIKING) return false; return this.isAttackedBySlideNJump( - [x, y], - color, - V.KING, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + [x, y], color, V.KING, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } isAttackedByAntiking([x, y], color) { // (Anti)King is not attacked by antiking if ([V.KING, V.ANTIKING].includes(this.getPiece(x, y))) return false; return this.isAttackedBySlideNJump( - [x, y], - color, - V.ANTIKING, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + [x, y], color, V.ANTIKING, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } underCheck(color) { diff --git a/client/src/variants/Antiking2.js b/client/src/variants/Antiking2.js index df764583..fa0bbcc4 100644 --- a/client/src/variants/Antiking2.js +++ b/client/src/variants/Antiking2.js @@ -79,10 +79,7 @@ export class Antiking2Rules extends ChessRules { getPotentialAntikingMoves(sq) { // The antiking moves like a king (only captured colors differ) return this.getSlideNJumpMoves( - sq, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } isAttacked(sq, color) { @@ -102,12 +99,7 @@ export class Antiking2Rules extends ChessRules { // (Anti)King is not attacked by antiking if ([V.KING, V.ANTIKING].includes(this.getPiece(x, y))) return false; return this.isAttackedBySlideNJump( - [x, y], - color, - V.ANTIKING, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + [x, y], color, V.ANTIKING, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } underCheck(color) { @@ -154,15 +146,15 @@ export class Antiking2Rules extends ChessRules { ); } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "rnbqkbnr/pppppppp/3A4/8/8/3a4/PPPPPPPP/RNBQKBNR w 0 ahah -"; let pieces = { w: new Array(8), b: new Array(8) }; let flags = ""; let antikingPos = { w: -1, b: -1 }; for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; antikingPos['b'] = antikingPos['w']; flags += flags; diff --git a/client/src/variants/Apocalypse.js b/client/src/variants/Apocalypse.js index e817296a..fc309155 100644 --- a/client/src/variants/Apocalypse.js +++ b/client/src/variants/Apocalypse.js @@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea"; export class ApocalypseRules extends ChessRules { + static get Options() { + return null; + } + static get PawnSpecs() { return Object.assign( {}, diff --git a/client/src/variants/Arena.js b/client/src/variants/Arena.js index 285dd4c8..880f0082 100644 --- a/client/src/variants/Arena.js +++ b/client/src/variants/Arena.js @@ -2,6 +2,13 @@ import { ChessRules } from "@/base_rules"; export class ArenaRules extends ChessRules { + static get Lines() { + return [ + [[2, 0], [2, 8]], + [[6, 0], [6, 8]] + ]; + } + static get HasFlags() { return false; } @@ -45,8 +52,8 @@ export class ArenaRules extends ChessRules { scanKings() {} - static GenRandInitFen(randomness) { - return ChessRules.GenRandInitFen(randomness).slice(0, -6) + "-"; + static GenRandInitFen(options) { + return ChessRules.GenRandInitFen(options).slice(0, -6) + "-"; } static InArena(x) { @@ -69,27 +76,13 @@ export class ArenaRules extends ChessRules { } getPotentialQueenMoves(sq) { - return this.getSlideNJumpMoves( - sq, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]) - ).filter(m => { - // Filter out moves longer than 3 squares - return Math.max( - Math.abs(m.end.x - m.start.x), - Math.abs(m.end.y - m.start.y)) <= 3; - }); + return super.getSlideNJumpMoves( + sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 3); } getPotentialKingMoves(sq) { - return this.getSlideNJumpMoves( - sq, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]) - ).filter(m => { - // Filter out moves longer than 3 squares - return Math.max( - Math.abs(m.end.x - m.start.x), - Math.abs(m.end.y - m.start.y)) <= 3; - }); + return super.getSlideNJumpMoves( + sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 3); } getCheckSquares() { diff --git a/client/src/variants/Atarigo.js b/client/src/variants/Atarigo.js index f2c84a89..07e9e67d 100644 --- a/client/src/variants/Atarigo.js +++ b/client/src/variants/Atarigo.js @@ -4,6 +4,10 @@ import { ArrayFun } from "@/utils/array"; export class AtarigoRules extends ChessRules { + static get Options() { + return null; + } + static get Monochrome() { return true; } diff --git a/client/src/variants/Avalam2.js b/client/src/variants/Avalam2.js index 6c39e94c..c05b4d92 100644 --- a/client/src/variants/Avalam2.js +++ b/client/src/variants/Avalam2.js @@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea"; export class Avalam2Rules extends ChessRules { + static get Options() { + return null; + } + static get HasFlags() { return false; } diff --git a/client/src/variants/Avalanche.js b/client/src/variants/Avalanche.js index 17e21380..40a43938 100644 --- a/client/src/variants/Avalanche.js +++ b/client/src/variants/Avalanche.js @@ -340,6 +340,7 @@ export class AvalancheRules extends ChessRules { this.play(moves[3]); //HACK... 3 = queen index const res = this.getComputerMove(); this.undo(moves[3]); + if (Array.isArray(res)) return [moves[3]].concat(res); return [moves[3], res]; } // subTurn == 1 (necessarily) diff --git a/client/src/variants/Balaklava.js b/client/src/variants/Balaklava.js index 835aa965..6a38a51c 100644 --- a/client/src/variants/Balaklava.js +++ b/client/src/variants/Balaklava.js @@ -46,11 +46,10 @@ export class BalaklavaRules extends ChessRules { ); } - static GenRandInitFen(randomness) { + static GenRandInitFen(options) { // No collision between 'n' and castle flags, so next replacement is fine return ( - ChessRules.GenRandInitFen(randomness) - .replace(/n/g, 'm').replace(/N/g, 'M') + ChessRules.GenRandInitFen(options).replace(/n/g, 'm').replace(/N/g, 'M') ); } @@ -90,7 +89,7 @@ export class BalaklavaRules extends ChessRules { } getPotentialMammothMoves(sq) { - return this.getSlideNJumpMoves(sq, V.steps[V.MAMMOTH], "oneStep"); + return this.getSlideNJumpMoves(sq, V.steps[V.MAMMOTH], 1); } isAttacked(sq, color) { @@ -101,10 +100,8 @@ export class BalaklavaRules extends ChessRules { } isAttackedByMammoth(sq, color) { - return ( - this.isAttackedBySlideNJump( - sq, color, V.MAMMOTH, V.steps[V.MAMMOTH], "oneStep") - ); + return this.isAttackedBySlideNJump( + sq, color, V.MAMMOTH, V.steps[V.MAMMOTH], 1); } static get SEARCH_DEPTH() { diff --git a/client/src/variants/Ball.js b/client/src/variants/Ball.js index 8f6493a3..47689757 100644 --- a/client/src/variants/Ball.js +++ b/client/src/variants/Ball.js @@ -186,13 +186,13 @@ export class BallRules extends ChessRules { ); } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "hbnrqrnhb/ppppppppp/9/9/4a4/9/9/PPPPPPPPP/HBNRQRNHB w 0 - -"; let pieces = { w: new Array(9), b: new Array(9) }; for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; break; } @@ -411,28 +411,13 @@ export class BallRules extends ChessRules { return moves; } - // "Sliders": at most 3 steps - getSlideNJumpMoves([x, y], steps, oneStep) { - let moves = []; - outerLoop: for (let step of steps) { - let i = x + step[0]; - let j = y + step[1]; - let stepCount = 1; - while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { - moves.push(this.getBasicMove([x, y], [i, j])); - if (oneStep || stepCount == 3) continue outerLoop; - i += step[0]; - j += step[1]; - stepCount++; - } - if (V.OnBoard(i, j) && this.canTake([x, y], [i, j])) - moves.push(this.getBasicMove([x, y], [i, j])); - } - return moves; + getSlideNJumpMoves(sq, steps, nbSteps) { + // "Sliders": at most 3 steps + return super.getSlideNJumpMoves(sq, steps, !nbSteps ? 3 : 1); } getPotentialPhoenixMoves(sq) { - return this.getSlideNJumpMoves(sq, V.steps[V.PHOENIX], "oneStep"); + return super.getSlideNJumpMoves(sq, V.steps[V.PHOENIX], 1); } getPmove(move) { diff --git a/client/src/variants/Bario.js b/client/src/variants/Bario.js index 3564e748..3e076658 100644 --- a/client/src/variants/Bario.js +++ b/client/src/variants/Bario.js @@ -4,6 +4,10 @@ import { randInt } from "@/utils/alea"; export class BarioRules extends ChessRules { + static get Options() { + return null; + } + // Does not really seem necessary (although the author mention it) // Instead, first move = pick a square for the king. static get HasFlags() { diff --git a/client/src/variants/Baroque.js b/client/src/variants/Baroque.js index 063b1822..7abb77d4 100644 --- a/client/src/variants/Baroque.js +++ b/client/src/variants/Baroque.js @@ -107,23 +107,11 @@ export class BaroqueRules extends ChessRules { } } - getSlideNJumpMoves([x, y], steps, oneStep) { - const piece = this.getPiece(x, y); - let moves = []; - outerLoop: for (let step of steps) { - let i = x + step[0]; - let j = y + step[1]; - while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { - moves.push(this.getBasicMove([x, y], [i, j])); - if (oneStep !== undefined) continue outerLoop; - i += step[0]; - j += step[1]; - } - // Only king can take on occupied square: - if (piece == V.KING && V.OnBoard(i, j) && this.canTake([x, y], [i, j])) - moves.push(this.getBasicMove([x, y], [i, j])); - } - return moves; + canTake([x1, y1], [x2, y2]) { + return ( + this.getPiece(x1, y1) == V.KING && + this.getColor(x1, y1) != this.getColor(x2, y2) + ); } // Modify capturing moves among listed pawn moves @@ -531,15 +519,15 @@ export class BaroqueRules extends ChessRules { return false; } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) // Deterministic: return "rnbkqbnm/pppppppp/8/8/8/8/PPPPPPPP/MNBQKBNR w 0"; let pieces = { w: new Array(8), b: new Array(8) }; // Shuffle pieces on first and last rank for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; break; } diff --git a/client/src/variants/Benedict.js b/client/src/variants/Benedict.js index 40d7a091..5584fb87 100644 --- a/client/src/variants/Benedict.js +++ b/client/src/variants/Benedict.js @@ -14,22 +14,8 @@ export class BenedictRules extends ChessRules { ); } - // TODO(?): some duplicated code in 2 next functions - getSlideNJumpMoves([x, y], steps, oneStep) { - let moves = []; - outerLoop: for (let loop = 0; loop < steps.length; loop++) { - const step = steps[loop]; - let i = x + step[0]; - let j = y + step[1]; - while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { - moves.push(this.getBasicMove([x, y], [i, j])); - if (oneStep) continue outerLoop; - i += step[0]; - j += step[1]; - } - // No capture check: handled elsewhere (next method) - } - return moves; + canTake() { + return false; } // Find possible captures from a square diff --git a/client/src/variants/Bicolour.js b/client/src/variants/Bicolour.js index 795f4ba4..c426b811 100644 --- a/client/src/variants/Bicolour.js +++ b/client/src/variants/Bicolour.js @@ -14,8 +14,8 @@ export class BicolourRules extends ChessRules { ); } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "rqbnkbnr/pppppppp/8/8/8/8/PPPPPPPP/RQBNKBNR w 0 -"; // Place pieces at random but the king cannot be next to a rook or queen. @@ -23,7 +23,7 @@ export class BicolourRules extends ChessRules { let pieces = { w: new Array(8), b: new Array(8) }; let flags = ""; for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; break; } diff --git a/client/src/variants/Bishopawns.js b/client/src/variants/Bishopawns.js index feecd458..57a6051a 100644 --- a/client/src/variants/Bishopawns.js +++ b/client/src/variants/Bishopawns.js @@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules"; export class BishopawnsRules extends ChessRules { + static get Options() { + return null; + } + static get PawnSpecs() { return Object.assign( {}, diff --git a/client/src/variants/Capablanca.js b/client/src/variants/Capablanca.js index ec1e299a..a58263cc 100644 --- a/client/src/variants/Capablanca.js +++ b/client/src/variants/Capablanca.js @@ -51,13 +51,13 @@ export class CapablancaRules extends ChessRules { getPotentialEmpressMoves(sq) { return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat( - this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep") + this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1) ); } getPotentialPrincessMoves(sq) { return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat( - this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep") + this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1) ); } @@ -72,26 +72,14 @@ export class CapablancaRules extends ChessRules { isAttackedByEmpress(sq, color) { return ( this.isAttackedBySlideNJump(sq, color, V.EMPRESS, V.steps[V.ROOK]) || - this.isAttackedBySlideNJump( - sq, - color, - V.EMPRESS, - V.steps[V.KNIGHT], - "oneStep" - ) + this.isAttackedBySlideNJump(sq, color, V.EMPRESS, V.steps[V.KNIGHT], 1) ); } isAttackedByPrincess(sq, color) { return ( this.isAttackedBySlideNJump(sq, color, V.PRINCESS, V.steps[V.BISHOP]) || - this.isAttackedBySlideNJump( - sq, - color, - V.PRINCESS, - V.steps[V.KNIGHT], - "oneStep" - ) + this.isAttackedBySlideNJump(sq, color, V.PRINCESS, V.steps[V.KNIGHT], 1) ); } @@ -106,8 +94,8 @@ export class CapablancaRules extends ChessRules { return 2; } - static GenRandInitFen(randomness) { - if (randomness == 0) { + static GenRandInitFen(options) { + if (options.randomness == 0) { return ( "rnsbqkbenr/pppppppppp/91/91/91/91/PPPPPPPPPP/RNSBQKBENR w 0 ajaj -" ); @@ -116,7 +104,7 @@ export class CapablancaRules extends ChessRules { let pieces = { w: new Array(10), b: new Array(10) }; let flags = ""; for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; flags += flags; break; diff --git a/client/src/variants/Chakart.js b/client/src/variants/Chakart.js index ad584e3d..0042bf1a 100644 --- a/client/src/variants/Chakart.js +++ b/client/src/variants/Chakart.js @@ -1149,9 +1149,9 @@ export class ChakartRules extends ChessRules { return "*"; } - static GenRandInitFen(randomness) { + static GenRandInitFen(options) { return ( - SuicideRules.GenRandInitFen(randomness).slice(0, -1) + + SuicideRules.GenRandInitFen(options).slice(0, -1) + // Add Peach + Mario flags + capture counts "1111 000000000000" ); diff --git a/client/src/variants/Checkered.js b/client/src/variants/Checkered.js index 5036a82d..aac3e024 100644 --- a/client/src/variants/Checkered.js +++ b/client/src/variants/Checkered.js @@ -2,6 +2,26 @@ import { ChessRules, Move, PiPo } from "@/base_rules"; export class CheckeredRules extends ChessRules { + static get Options() { + return Object.assign( + {}, + ChessRules.Options, + { + check: [ + { + label: "With switch", + defaut: true, + variable: "switch" + } + ] + } + ); + } + + static AbbreviateOptions(opts) { + return (!opts["switch"] ? "NS" : ""); + } + static board2fen(b) { const checkered_codes = { p: "s", @@ -41,26 +61,6 @@ export class CheckeredRules extends ChessRules { return (b[0] == "c" ? "Checkered/" : "") + b; } - static get Options() { - return Object.assign( - {}, - ChessRules.Options, - { - check: [ - { - label: "With switch", - defaut: true, - variable: "switch" - } - ] - } - ); - } - - static AbbreviateOptions(opts) { - return (!opts["switch"] ? "NS" : ""); - } - setOtherVariables(fen) { super.setOtherVariables(fen); // Local stack of non-capturing checkered moves: @@ -433,12 +433,7 @@ export class CheckeredRules extends ChessRules { isAttackedByKnight(sq, colors) { return this.isAttackedBySlideNJump( - sq, - colors, - V.KNIGHT, - V.steps[V.KNIGHT], - "oneStep" - ); + sq, colors, V.KNIGHT, V.steps[V.KNIGHT], "oneStep"); } isAttackedByBishop(sq, colors) { @@ -448,20 +443,13 @@ export class CheckeredRules extends ChessRules { isAttackedByQueen(sq, colors) { return this.isAttackedBySlideNJump( - sq, - colors, - V.QUEEN, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]) - ); + sq, colors, V.QUEEN, V.steps[V.ROOK].concat(V.steps[V.BISHOP])); } isAttackedByKing(sq, colors) { return this.isAttackedBySlideNJump( - sq, - colors, - V.KING, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" + sq, colors, V.KING, + V.steps[V.ROOK].concat(V.steps[V.BISHOP]), "oneStep" ); } diff --git a/client/src/variants/Chess960.js b/client/src/variants/Chess960.js index 968ec1c3..8d5cbafc 100644 --- a/client/src/variants/Chess960.js +++ b/client/src/variants/Chess960.js @@ -15,8 +15,7 @@ export class Chess960Rules extends ChessRules { { label: "Asymmetric random", value: 2 } ] } - ], - check: [] + ] }; } diff --git a/client/src/variants/Circular.js b/client/src/variants/Circular.js index 47758442..333ad320 100644 --- a/client/src/variants/Circular.js +++ b/client/src/variants/Circular.js @@ -35,8 +35,8 @@ export class CircularRules extends ChessRules { this.pawnFlags = flags; } - static GenRandInitFen(randomness) { - if (randomness == 0) { + static GenRandInitFen(options) { + if (options.randomness == 0) { return "8/8/pppppppp/rnbqkbnr/8/8/PPPPPPPP/RNBQKBNR " + "w 0 1111111111111111"; } @@ -44,7 +44,7 @@ export class CircularRules extends ChessRules { let pieces = { w: new Array(8), b: new Array(8) }; // Shuffle pieces on first and last rank for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; break; } @@ -92,7 +92,7 @@ export class CircularRules extends ChessRules { let j = y + step[1]; while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { moves.push(this.getBasicMove([x, y], [i, j])); - if (oneStep !== undefined) continue outerLoop; + if (oneStep) continue outerLoop; i = V.ComputeX(i + step[0]); j += step[1]; } diff --git a/client/src/variants/Clorange.js b/client/src/variants/Clorange.js index d4ec1ef3..30256fa6 100644 --- a/client/src/variants/Clorange.js +++ b/client/src/variants/Clorange.js @@ -20,9 +20,9 @@ export class ClorangeRules extends ChessRules { ); } - static GenRandInitFen(randomness) { + static GenRandInitFen(options) { // Capturing and non-capturing reserves: - return ChessRules.GenRandInitFen(randomness) + " 00000000000000000000"; + return ChessRules.GenRandInitFen(options) + " 00000000000000000000"; } getFen() { @@ -195,22 +195,11 @@ export class ClorangeRules extends ChessRules { return moves; } - getSlideNJumpMoves([x, y], steps, oneStep) { - let moves = []; - const canTake = ChessRules.PIECES.includes(this.getPiece(x, y)); - outerLoop: for (let step of steps) { - let i = x + step[0]; - let j = y + step[1]; - while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { - moves.push(this.getBasicMove([x, y], [i, j])); - if (oneStep) continue outerLoop; - i += step[0]; - j += step[1]; - } - if (V.OnBoard(i, j) && canTake && this.canTake([x, y], [i, j])) - moves.push(this.getBasicMove([x, y], [i, j])); - } - return moves; + canTake([x1, y1], [x2, y2]) { + return ( + this.getColor(x1, y1) !== this.getColor(x2, y2) && + ChessRules.PIECES.includes(this.getPiece(x1, y1)) + ); } getAllValidMoves() { diff --git a/client/src/variants/Convert.js b/client/src/variants/Convert.js index 1180e375..c501c023 100644 --- a/client/src/variants/Convert.js +++ b/client/src/variants/Convert.js @@ -13,10 +13,8 @@ export class ConvertRules extends ChessRules { this.lastMoveEnd = [null]; } - static GenRandInitFen(randomness) { - if (randomness == 0) - return "rnbqkbnr/8/pppppppp/8/8/PPPPPPPP/8/RNBQKBNR w 0 ahah"; - const baseFen = ChessRules.GenRandInitFen(randomness); + static GenRandInitFen(options) { + const baseFen = ChessRules.GenRandInitFen(options); return ( baseFen.substr(0, 8) + "/8/pppppppp/8/8/PPPPPPPP/8/" + diff --git a/client/src/variants/Copycat.js b/client/src/variants/Copycat.js index 78299c69..c7d12a52 100644 --- a/client/src/variants/Copycat.js +++ b/client/src/variants/Copycat.js @@ -8,7 +8,6 @@ export class CopycatRules extends ChessRules { const piece = this.getPiece(x,y); if ([V.PAWN, V.KING].includes(piece)) return moves; const color = this.turn; - const oneStep = (piece == V.PAWN); let movements = {}, steps = []; if (piece == V.QUEEN) steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]); @@ -39,8 +38,9 @@ export class CopycatRules extends ChessRules { (piece != V.QUEEN && type != piece) || (piece == V.QUEEN && type == V.KNIGHT) ) { + const nbSteps = (type == V.KNIGHT ? 1 : undefined); Array.prototype.push.apply(moves, - this.getSlideNJumpMoves([x, y], V.steps[type], type == V.KNIGHT)); + super.getSlideNJumpMoves([x, y], V.steps[type], nbSteps)); } }); return moves; diff --git a/client/src/variants/Coregal.js b/client/src/variants/Coregal.js index cf83f1fc..aa023c15 100644 --- a/client/src/variants/Coregal.js +++ b/client/src/variants/Coregal.js @@ -78,15 +78,15 @@ export class CoregalRules extends ChessRules { return squares; } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) // Castle flags here indicate pieces positions (if can castle) return "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 adehadeh -"; let pieces = { w: new Array(8), b: new Array(8) }; let flags = ""; for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; flags += flags; break; @@ -186,10 +186,7 @@ export class CoregalRules extends ChessRules { getPotentialKingMoves([x, y]) { let moves = this.getSlideNJumpMoves( - [x, y], - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); const c = this.getColor(x, y); if (this.castleFlags[c].slice(1, 3).includes(y)) moves = moves.concat(this.getCastleMoves([x, y])); diff --git a/client/src/variants/Crazyhouse.js b/client/src/variants/Crazyhouse.js index 56e65412..eabdd493 100644 --- a/client/src/variants/Crazyhouse.js +++ b/client/src/variants/Crazyhouse.js @@ -38,8 +38,8 @@ export class CrazyhouseRules extends ChessRules { ); } - static GenRandInitFen(randomness) { - return ChessRules.GenRandInitFen(randomness) + " 0000000000 -"; + static GenRandInitFen(options) { + return ChessRules.GenRandInitFen(options) + " 0000000000 -"; } getFen() { @@ -237,11 +237,13 @@ export class CrazyhouseRules extends ChessRules { if (move.vanish.length > 0) return super.getNotation(move); // Rebirth: let piece = move.appear[0].p; - if (ChessRules.PIECES.includes(piece)) { - if (move.appear[0].p != V.PAWN) piece = move.appear[0].p.toUpperCase(); + let prefix = ""; + const endNotation = "@" + V.CoordsToSquare(move.end); + if (piece != V.PAWN) { + if (ChessRules.PIECES.includes(piece)) prefix = piece.toUpperCase(); + else piece = V.PromotionMap[piece].toUpperCase(); } - else piece = V.PromotionMap[piece].toUpperCase(); - return piece + "@" + V.CoordsToSquare(move.end); + return prefix + endNotation; } }; diff --git a/client/src/variants/Cwda.js b/client/src/variants/Cwda.js index 6e30e681..c0d36edd 100644 --- a/client/src/variants/Cwda.js +++ b/client/src/variants/Cwda.js @@ -1,81 +1,220 @@ -import { ChessRules, Move, PiPo } from "@/base_rules"; -import { ArrayFun } from "@/utils/array"; -import { randInt } from "@/utils/alea"; +import { ChessRules } from "@/base_rules"; export class CwdaRules extends ChessRules { - static get PawnSpecs() { - return Object.assign( - {}, - ChessRules.PawnSpecs, - { - promotions: - ChessRules.PawnSpecs.promotions.concat( - [V.C_ROOK, V.C_KNIGHT, V.C_BISHOP, V.C_QUEEN]) - } + static get Options() { + return { + select: ChessRules.Options.select.concat([ + { + label: "Army 1", + variable: "army1", + defaut: 'C', + options: [ + { label: "Colorbound Clobberers", value: 'C' }, + { label: "Nutty Knights", value: 'N' }, + { label: "Remarkable Rookies", value: 'R' }, + { label: "Fide", value: 'F' } + ] + }, + { + label: "Army 2", + variable: "army2", + defaut: 'C', + options: [ + { label: "Colorbound Clobberers", value: 'C' }, + { label: "Nutty Knights", value: 'N' }, + { label: "Remarkable Rookies", value: 'R' }, + { label: "Fide", value: 'F' } + ] + } + ]) + }; + } + + static AbbreviateOptions(opts) { + return opts["army1"] + opts["army2"]; + } + + static IsValidOptions(opts) { + // Both armies filled, avoid Fide vs Fide + return ( + opts.army1 && opts.army2 && + (opts.army1 != 'F' || opts.army2 != 'F') ); } getPpath(b) { - if ([V.C_ROOK, V.C_KNIGHT, V.C_BISHOP, V.C_QUEEN].includes(b[1])) - return "Cwda/" + b; - return b; - } - - static GenRandInitFen(randomness) { - if (randomness == 0) - return "dhaskahd/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 ahah -"; - - // Mapping white --> black (at least at start): - const piecesMap = { - 'r': 'd', - 'n': 'h', - 'b': 'a', - 'q': 's', - 'k': 'k' + return (ChessRules.PIECES.includes(b[1]) ? "" : "Cwda/") + b; + } + + static get PiecesMap() { + return { + // Colorbound Clobberers + 'C': { + 'r': 'd', + 'n': 'w', + 'b': 'f', + 'q': 'c', + 'k': 'k' + }, + // Nutty Knights + 'N': { + 'r': 'g', + 'n': 'i', + 'b': 't', + 'q': 'l', + 'k': 'k' + }, + // Remarkable Rookies + 'R': { + 'r': 's', + 'n': 'y', + 'b': 'h', + 'q': 'o', + 'k': 'k' + } }; + } - const baseFen = ChessRules.GenRandInitFen(randomness); + static GenRandInitFen(options) { + const baseFen = ChessRules.GenRandInitFen(options.randomness); + let blackLine = baseFen.substr(0, 8); + if (options.army2 != 'F') { + blackLine = blackLine.split('') + .map(p => V.PiecesMap[options.army2][p]).join(''); + } + let whiteLine = baseFen.substr(35, 8); + if (options.army1 != 'F') { + whiteLine = whiteLine.split('') + .map(p => V.PiecesMap[options.army1][p.toLowerCase()]) + .join('').toUpperCase(); + } return ( - baseFen.substr(0, 8).split('').map(p => piecesMap[p]).join('') + - baseFen.substr(8) + blackLine + baseFen.substring(8, 35) + whiteLine + + baseFen.substr(43) + " " + options.army1 + options.army2 ); } + setOtherVariables(fen) { + super.setOtherVariables(fen); + const armies = V.ParseFen(fen).armies; + this.army1 = armies.charAt(0); + this.army2 = armies.charAt(1); + } + + static ParseFen(fen) { + return Object.assign( + { armies: fen.split(" ")[5] }, + ChessRules.ParseFen(fen) + ); + } + + static IsGoodFen(fen) { + if (!ChessRules.IsGoodFen(fen)) return false; + const armies = V.ParseFen(fen).armies; + if (!armies || !armies.match(/^[CNRF]{2,2}$/)) return false; + return true; + } + + getFen() { + return super.getFen() + " " + this.army1 + this.army2; + } + static get C_ROOK() { return 'd'; } static get C_KNIGHT() { - return 'h'; + return 'w'; } static get C_BISHOP() { - return 'a'; + return 'f'; } static get C_QUEEN() { + return 'c'; + } + static get N_ROOK() { + return 'g'; + } + static get N_KNIGHT() { + return 'i'; + } + static get N_BISHOP() { + return 't'; + } + static get N_QUEEN() { + return 'l'; + } + static get R_ROOK() { return 's'; } + static get R_KNIGHT() { + return 'y'; + } + static get R_BISHOP() { + return 'h'; + } + static get R_QUEEN() { + return 'o'; + } static get PIECES() { - return ( - ChessRules.PIECES.concat([V.C_ROOK, V.C_KNIGHT, V.C_BISHOP, V.C_QUEEN]) - ); + return ChessRules.PIECES.concat( + [V.C_ROOK, V.C_KNIGHT, V.C_BISHOP, V.C_QUEEN]).concat( + [V.N_ROOK, V.N_KNIGHT, V.N_BISHOP, V.N_QUEEN]).concat( + [V.R_ROOK, V.R_KNIGHT, V.R_BISHOP, V.R_QUEEN]); } - getPotentialMovesFrom([x, y]) { - switch (this.getPiece(x, y)) { - case V.C_ROOK: return this.getPotentialC_rookMoves([x, y]); - case V.C_KNIGHT: return this.getPotentialC_knightMoves([x, y]); - case V.C_BISHOP: return this.getPotentialC_bishopMoves([x, y]); - case V.C_QUEEN: return this.getPotentialC_queenMoves([x, y]); - default: return super.getPotentialMovesFrom([x, y]); + getPotentialMovesFrom(sq) { + switch (this.getPiece(sq[0], sq[1])) { + case V.C_ROOK: return this.getPotentialC_rookMoves(sq); + case V.C_KNIGHT: return this.getPotentialC_knightMoves(sq); + case V.C_BISHOP: return this.getPotentialC_bishopMoves(sq); + case V.C_QUEEN: return this.getPotentialC_queenMoves(sq); + case V.N_ROOK: return this.getPotentialN_rookMoves(sq); + case V.N_KNIGHT: return this.getPotentialN_knightMoves(sq); + case V.N_BISHOP: return this.getPotentialN_bishopMoves(sq); + case V.N_QUEEN: return this.getPotentialN_queenMoves(sq); + case V.R_ROOK: return this.getPotentialR_rookMoves(sq); + case V.R_KNIGHT: return this.getPotentialR_knightMoves(sq); + case V.R_BISHOP: return this.getPotentialR_bishopMoves(sq); + case V.R_QUEEN: return this.getPotentialR_queenMoves(sq); + case V.PAWN: { + // Can promote in anything from the two current armies + let promotions = []; + for (let army of ["army1", "army2"]) { + if (army == "army2" && this.army2 == this.army1) break; + switch (this[army]) { + case 'C': { + Array.prototype.push.apply(promotions, + [V.C_ROOK, V.C_KNIGHT, V.C_BISHOP, V.C_QUEEN]); + break; + } + case 'N': { + Array.prototype.push.apply(promotions, + [V.N_ROOK, V.N_KNIGHT, V.N_BISHOP, V.N_QUEEN]); + break; + } + case 'R': { + Array.prototype.push.apply(promotions, + [V.R_ROOK, V.R_KNIGHT, V.R_BISHOP, V.R_QUEEN]); + break; + } + case 'F': { + Array.prototype.push.apply(promotions, + [V.ROOK, V.KNIGHT, V.BISHOP, V.QUEEN]); + break; + } + } + } + return super.getPotentialPawnMoves(sq, promotions); + } + default: return super.getPotentialMovesFrom(sq); } return []; } static get steps() { return Object.assign( - {}, - ChessRules.steps, { // Dabbabah 'd': [ @@ -97,106 +236,301 @@ export class CwdaRules extends ChessRules { [1, -1], [-1, 1], [-1, -1] + ], + // Wazir + 'w': [ + [-1, 0], + [0, -1], + [1, 0], + [0, 1] + ], + // Threeleaper + '$3': [ + [-3, 0], + [0, -3], + [3, 0], + [0, 3] + ], + // Narrow knight + '$n': [ + [-2, -1], + [-2, 1], + [2, -1], + [2, 1] ] - } + }, + ChessRules.steps, ); } getPotentialC_rookMoves(sq) { return ( - this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat( - this.getSlideNJumpMoves(sq, V.steps['d'], "oneStep")) + this.getSlideNJumpMoves(sq, V.steps.b).concat( + this.getSlideNJumpMoves(sq, V.steps.d, 1)) ); } getPotentialC_knightMoves(sq) { return ( - this.getSlideNJumpMoves(sq, V.steps['a'], "oneStep").concat( - this.getSlideNJumpMoves(sq, V.steps[V.ROOK], "oneStep")) + this.getSlideNJumpMoves(sq, V.steps.a, 1).concat( + this.getSlideNJumpMoves(sq, V.steps.r, 1)) ); } getPotentialC_bishopMoves(sq) { return ( - this.getSlideNJumpMoves(sq, V.steps['d'], "oneStep").concat( - this.getSlideNJumpMoves(sq, V.steps['a'], "oneStep")).concat( - this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], "oneStep")) + this.getSlideNJumpMoves(sq, V.steps.d, 1).concat( + this.getSlideNJumpMoves(sq, V.steps.a, 1)).concat( + this.getSlideNJumpMoves(sq, V.steps.b, 1)) ); } getPotentialC_queenMoves(sq) { return ( - this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat( - this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")) + this.getSlideNJumpMoves(sq, V.steps.b).concat( + this.getSlideNJumpMoves(sq, V.steps.n, 1)) + ); + } + + getPotentialN_rookMoves(sq) { + const c = this.turn; + const rookSteps = [ [0, -1], [0, 1], [c == 'w' ? -1 : 1, 0] ]; + const backward = (c == 'w' ? 1 : -1); + const kingSteps = [ [backward, -1], [backward, 0], [backward, 1] ]; + return ( + this.getSlideNJumpMoves(sq, rookSteps).concat( + this.getSlideNJumpMoves(sq, kingSteps, 1)) + ); + } + + getPotentialN_knightMoves(sq) { + const backward = (this.turn == 'w' ? 1 : -1); + const kingSteps = [ + [0, -1], [0, 1], [backward, -1], [backward, 0], [backward, 1] + ]; + return ( + this.getSlideNJumpMoves(sq, V.steps.$n, 1).concat( + this.getSlideNJumpMoves(sq, kingSteps, 1)) + ); + } + + getPotentialN_bishopMoves(sq) { + const backward = (this.turn == 'w' ? 1 : -1); + const kingSteps = [ + [0, -1], [0, 1], [backward, -1], [backward, 0], [backward, 1] + ]; + const forward = -backward; + const knightSteps = [ + [2*forward, -1], [2*forward, 1], [forward, -2], [forward, 2] + ]; + return ( + this.getSlideNJumpMoves(sq, knightSteps, 1).concat( + this.getSlideNJumpMoves(sq, kingSteps, 1)) + ); + } + + getPotentialN_queenMoves(sq) { + const backward = (this.turn == 'w' ? 1 : -1); + const forward = -backward; + const kingSteps = [ + [forward, -1], [forward, 1], + [backward, -1], [backward, 0], [backward, 1] + ]; + const knightSteps = [ + [2*forward, -1], [2*forward, 1], [forward, -2], [forward, 2] + ]; + const rookSteps = [ [0, -1], [0, 1], [forward, 0] ]; + return ( + this.getSlideNJumpMoves(sq, rookSteps).concat( + this.getSlideNJumpMoves(sq, kingSteps, 1)).concat( + this.getSlideNJumpMoves(sq, knightSteps, 1)) + ); + } + + getPotentialR_rookMoves(sq) { + return this.getSlideNJumpMoves(sq, V.steps.r, 4); + } + + getPotentialR_knightMoves(sq) { + return ( + this.getSlideNJumpMoves(sq, V.steps.d, 1).concat( + this.getSlideNJumpMoves(sq, V.steps.w, 1)) + ); + } + + getPotentialR_bishopMoves(sq) { + return ( + this.getSlideNJumpMoves(sq, V.steps.d, 1).concat( + this.getSlideNJumpMoves(sq, V.steps.f, 1)).concat( + this.getSlideNJumpMoves(sq, V.steps.$3, 1)) + ); + } + + getPotentialR_queenMoves(sq) { + return ( + this.getSlideNJumpMoves(sq, V.steps.r).concat( + this.getSlideNJumpMoves(sq, V.steps.n, 1)) ); } getCastleMoves([x, y]) { const color = this.getColor(x, y); - const finalSquares = [ - // Black castle long in an unusual way: - (color == 'w' ? [2, 3] : [1, 2]), - [V.size.y - 2, V.size.y - 3] - ]; + let finalSquares = [ [2, 3], [V.size.y - 2, V.size.y - 3] ]; + if ( + (color == 'w' && this.army1 == 'C') || + (color == 'b' && this.army2 == 'C') + ) { + // Colorbound castle long in an unusual way: + finalSquares[0] = [1, 2]; + } return super.getCastleMoves([x, y], finalSquares); } isAttacked(sq, color) { - return ( - super.isAttacked(sq, color) || - this.isAttackedByC_rook(sq, color) || - this.isAttackedByC_knight(sq, color) || - this.isAttackedByC_bishop(sq, color) || - this.isAttackedByC_queen(sq, color) - ); + if (super.isAttackedByPawn(sq, color) || super.isAttackedByKing(sq, color)) + return true; + for (let army of ['C', 'N', 'R', 'F']) { + if ( + [this.army1, this.army2].includes(army) && + ( + this["isAttackedBy" + army + "_rook"](sq, color) || + this["isAttackedBy" + army + "_knight"](sq, color) || + this["isAttackedBy" + army + "_bishop"](sq, color) || + this["isAttackedBy" + army + "_queen"](sq, color) + ) + ) { + return true; + } + } + return false; } isAttackedByC_rook(sq, color) { return ( - this.isAttackedBySlideNJump(sq, color, V.C_ROOK, V.steps[V.BISHOP]) || - this.isAttackedBySlideNJump( - sq, color, V.C_ROOK, V.steps['d'], "oneStep") + this.isAttackedBySlideNJump(sq, color, V.C_ROOK, V.steps.b) || + this.isAttackedBySlideNJump(sq, color, V.C_ROOK, V.steps.d, 1) ); } isAttackedByC_knight(sq, color) { return ( - this.isAttackedBySlideNJump( - sq, color, V.C_KNIGHT, V.steps[V.ROOK], "oneStep") || - this.isAttackedBySlideNJump( - sq, color, V.C_KNIGHT, V.steps['a'], "oneStep") + this.isAttackedBySlideNJump(sq, color, V.C_KNIGHT, V.steps.r, 1) || + this.isAttackedBySlideNJump(sq, color, V.C_KNIGHT, V.steps.a, 1) ); } isAttackedByC_bishop(sq, color) { return ( - this.isAttackedBySlideNJump( - sq, color, V.C_BISHOP, V.steps['d'], "oneStep") || - this.isAttackedBySlideNJump( - sq, color, V.C_BISHOP, V.steps['a'], "oneStep") || - this.isAttackedBySlideNJump( - sq, color, V.C_BISHOP, V.steps['f'], "oneStep") + this.isAttackedBySlideNJump(sq, color, V.C_BISHOP, V.steps.d, 1) || + this.isAttackedBySlideNJump(sq, color, V.C_BISHOP, V.steps.a, 1) || + this.isAttackedBySlideNJump(sq, color, V.C_BISHOP, V.steps.f, 1) ); } isAttackedByC_queen(sq, color) { return ( - this.isAttackedBySlideNJump(sq, color, V.C_QUEEN, V.steps[V.BISHOP]) || - this.isAttackedBySlideNJump( - sq, color, V.C_QUEEN, V.steps[V.KNIGHT], "oneStep") + this.isAttackedBySlideNJump(sq, color, V.C_QUEEN, V.steps.b) || + this.isAttackedBySlideNJump(sq, color, V.C_QUEEN, V.steps.n, 1) + ); + } + + isAttackedByN_rook(sq, color) { + const rookSteps = [ [0, -1], [0, 1], [color == 'w' ? 1 : -1, 0] ]; + const backward = (color == 'w' ? -1 : 1); + const kingSteps = [ [backward, -1], [backward, 0], [backward, 1] ]; + return ( + this.isAttackedBySlideNJump(sq, color, V.N_ROOK, rookSteps) || + this.isAttackedBySlideNJump(sq, color, V.N_ROOK, kingSteps, 1) + ); + } + + isAttackedByN_knight(sq, color) { + const backward = (color == 'w' ? -1 : 1); + const kingSteps = [ + [0, -1], [0, 1], [backward, -1], [backward, 0], [backward, 1] + ]; + return ( + this.isAttackedBySlideNJump(sq, color, V.N_KNIGHT, V.steps.$n) || + this.isAttackedBySlideNJump(sq, color, V.N_KNIGHT, kingSteps, 1) + ); + } + + isAttackedByN_bishop(sq, color) { + const backward = (color == 'w' ? -1 : 1); + const kingSteps = [ + [0, -1], [0, 1], [backward, -1], [backward, 0], [backward, 1] + ]; + const forward = -backward; + const knightSteps = [ + [2*forward, -1], [2*forward, 1], [forward, -2], [forward, 2] + ]; + return ( + this.isAttackedBySlideNJump(sq, color, V.N_BISHOP, knightSteps, 1) || + this.isAttackedBySlideNJump(sq, color, V.N_BISHOP, kingSteps, 1) + ); + } + + isAttackedByN_queen(sq, color) { + const backward = (color == 'w' ? -1 : 1); + const forward = -backward; + const kingSteps = [ + [forward, -1], [forward, 1], + [backward, -1], [backward, 0], [backward, 1] + ]; + const knightSteps = [ + [2*forward, -1], [2*forward, 1], [forward, -2], [forward, 2] + ]; + const rookSteps = [ [0, -1], [0, 1], [forward, 0] ]; + return ( + this.isAttackedBySlideNJump(sq, color, V.N_QUEEN, knightSteps, 1) || + this.isAttackedBySlideNJump(sq, color, V.N_QUEEN, kingSteps, 1) || + this.isAttackedBySlideNJump(sq, color, V.N_QUEEN, rookSteps) + ); + } + + isAttackedByR_rook(sq, color) { + return this.isAttackedBySlideNJump(sq, color, V.R_ROOK, V.steps.r, 4); + } + + isAttackedByR_knight(sq, color) { + return ( + this.isAttackedBySlideNJump(sq, color, V.R_KNIGHT, V.steps.d, 1) || + this.isAttackedBySlideNJump(sq, color, V.R_KNIGHT, V.steps.w, 1) + ); + } + + isAttackedByR_bishop(sq, color) { + return ( + this.isAttackedBySlideNJump(sq, color, V.R_BISHOP, V.steps.d, 1) || + this.isAttackedBySlideNJump(sq, color, V.R_BISHOP, V.steps.f, 1) || + this.isAttackedBySlideNJump(sq, color, V.R_BISHOP, V.steps.$3, 1) + ); + } + + isAttackedByR_queen(sq, color) { + return ( + this.isAttackedBySlideNJump(sq, color, V.R_QUEEN, V.steps.r) || + this.isAttackedBySlideNJump(sq, color, V.R_QUEEN, V.steps.n, 1) ); } static get VALUES() { return Object.assign( - {}, - ChessRules.VALUES, { d: 4, - h: 3, - a: 5, - s: 6 - } + w: 3, + f: 5, + c: 7, + g: 4, + i: 3, + t: 4, + l: 7, + s: 4, + y: 3, + h: 4, + o: 8 + }, + ChessRules.VALUES ); } diff --git a/client/src/variants/Cylinder.js b/client/src/variants/Cylinder.js index 8b68e9ce..bcb53932 100644 --- a/client/src/variants/Cylinder.js +++ b/client/src/variants/Cylinder.js @@ -22,7 +22,7 @@ export class CylinderRules extends ChessRules { let j = V.ComputeY(y + step[1]); while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { moves.push(this.getBasicMove([x, y], [i, j])); - if (oneStep !== undefined) continue outerLoop; + if (oneStep) continue outerLoop; i += step[0]; j = V.ComputeY(j + step[1]); } diff --git a/client/src/variants/Diamond.js b/client/src/variants/Diamond.js index 1aa9b0ef..658b7ad7 100644 --- a/client/src/variants/Diamond.js +++ b/client/src/variants/Diamond.js @@ -12,12 +12,12 @@ export class DiamondRules extends ChessRules { return false; } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "krbp4/rqnp4/nbpp4/pppp4/4PPPP/4PPBN/4PNQR/4PBRK w 0"; let pieces = { w: new Array(8), b: new Array(8) }; for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; break; } diff --git a/client/src/variants/Dice.js b/client/src/variants/Dice.js index 262f273d..2e987764 100644 --- a/client/src/variants/Dice.js +++ b/client/src/variants/Dice.js @@ -35,8 +35,8 @@ export class DiceRules extends ChessRules { return (L > 0 ? this.p2play[L-1] : "-"); } - static GenRandInitFen(randomness) { - return ChessRules.GenRandInitFen(randomness) + " -"; + static GenRandInitFen(options) { + return ChessRules.GenRandInitFen(options) + " -"; } canMove(piece, color, [x, y]) { diff --git a/client/src/variants/Discoduel.js b/client/src/variants/Discoduel.js index f5735700..635e6db0 100644 --- a/client/src/variants/Discoduel.js +++ b/client/src/variants/Discoduel.js @@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules"; export class DiscoduelRules extends ChessRules { + static get Options() { + return null; + } + static get PawnSpecs() { return Object.assign( {}, diff --git a/client/src/variants/Dobutsu.js b/client/src/variants/Dobutsu.js index da632b83..af8c4f64 100644 --- a/client/src/variants/Dobutsu.js +++ b/client/src/variants/Dobutsu.js @@ -4,6 +4,10 @@ import { sample, shuffle } from "@/utils/alea"; export class DobutsuRules extends ChessRules { + static get Options() { + return null; + } + static get HasFlags() { return false; } @@ -207,15 +211,15 @@ export class DobutsuRules extends ChessRules { const c = this.turn; const forward = (c == 'w' ? -1 : 1); const steps = V.steps[V.ROOK].concat([[forward, 1], [forward, -1]]); - return super.getSlideNJumpMoves(sq, steps, "oneStep"); + return super.getSlideNJumpMoves(sq, steps, 1); } getPotentialElephantMoves(sq) { - return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], "oneStep"); + return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1); } getPotentialGiraffeMoves(sq) { - return super.getSlideNJumpMoves(sq, V.steps[V.ROOK], "oneStep"); + return super.getSlideNJumpMoves(sq, V.steps[V.ROOK], 1); } getAllValidMoves() { diff --git a/client/src/variants/Doublearmy.js b/client/src/variants/Doublearmy.js index 8a6c806f..87d262a6 100644 --- a/client/src/variants/Doublearmy.js +++ b/client/src/variants/Doublearmy.js @@ -19,8 +19,8 @@ export class DoublearmyRules extends ChessRules { return (b[1] == V.COMMONER ? "Doublearmy/" : "") + b; } - static GenRandInitFen(randomness) { - const fen = ChessRules.GenRandInitFen(randomness); + static GenRandInitFen(options) { + const fen = ChessRules.GenRandInitFen(options); const rows = fen.split(" ")[0].split("/"); return ( rows[0] + "/" + @@ -45,10 +45,7 @@ export class DoublearmyRules extends ChessRules { getPotentialCommonerMoves(sq) { return this.getSlideNJumpMoves( - sq, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } isAttacked(sq, color) { @@ -60,19 +57,13 @@ export class DoublearmyRules extends ChessRules { isAttackedByCommoner(sq, color) { return this.isAttackedBySlideNJump( - sq, - color, - V.COMMONER, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + sq, color, V.COMMONER, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } static get VALUES() { return Object.assign( - {}, - ChessRules.VALUES, - { c: 5 } + { c: 5 }, + ChessRules.VALUES ); } diff --git a/client/src/variants/Eightpieces.js b/client/src/variants/Eightpieces.js index c380610c..927530c0 100644 --- a/client/src/variants/Eightpieces.js +++ b/client/src/variants/Eightpieces.js @@ -167,11 +167,11 @@ export class EightpiecesRules extends ChessRules { } } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "jfsqkbnr/pppppppp/8/8/8/8/PPPPPPPP/JDSQKBNR w 0 ahah - -"; - const baseFen = ChessRules.GenRandInitFen(randomness); + const baseFen = ChessRules.GenRandInitFen(options); const fenParts = baseFen.split(' '); const posParts = fenParts[0].split('/'); @@ -671,10 +671,7 @@ export class EightpiecesRules extends ChessRules { getPotentialKingMoves(sq) { const moves = this.getSlideNJumpMoves( - sq, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); return ( this.subTurn == 1 ? moves.concat(this.getCastleMoves(sq)) diff --git a/client/src/variants/Emergo.js b/client/src/variants/Emergo.js index a1a98488..13069de4 100644 --- a/client/src/variants/Emergo.js +++ b/client/src/variants/Emergo.js @@ -8,6 +8,10 @@ export class EmergoRules extends ChessRules { // Lowercase if black controls. // Single piece (no prisoners): A@ to L@ (+ lowercase) + static get Options() { + return null; + } + static get HasFlags() { return false; } @@ -105,7 +109,7 @@ export class EmergoRules extends ChessRules { return { x: 9, y: 9 }; } - static GenRandInitFen(randomness) { + static GenRandInitFen() { return "9/9/9/9/9/9/9/9/9 w 0 12,12"; } diff --git a/client/src/variants/Empire.js b/client/src/variants/Empire.js index c8577a72..d04e4a82 100644 --- a/client/src/variants/Empire.js +++ b/client/src/variants/Empire.js @@ -23,8 +23,8 @@ export class EmpireRules extends ChessRules { return (b[0] == 'w' ? "Empire/" : "") + b; } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "rnbqkbnr/pppppppp/8/8/8/PPPSSPPP/8/TECDKCET w 0 ah -"; // Mapping kingdom --> empire: @@ -36,7 +36,7 @@ export class EmpireRules extends ChessRules { 'K': 'K' }; - const baseFen = ChessRules.GenRandInitFen(randomness); + const baseFen = ChessRules.GenRandInitFen(options); return ( baseFen.substr(0, 24) + "PPPSSPPP/8/" + baseFen.substr(35, 8).split('').map(p => piecesMap[p]).join('') + @@ -211,6 +211,7 @@ export class EmpireRules extends ChessRules { }); } + // TODO: some merging to do with Orda method (and into base_rules.js) getSlideNJumpMoves_([x, y], steps, oneStep) { let moves = []; outerLoop: for (let step of steps) { @@ -221,7 +222,7 @@ export class EmpireRules extends ChessRules { if (!step.onlyTake) moves.push(this.getBasicMove([x, y], [i, j])); // NOTE: (bad) HACK here, since onlyTake is true only for Eagle // capturing moves, which are oneStep... - if (!!oneStep || !!step.onlyTake) continue outerLoop; + if (oneStep || step.onlyTake) continue outerLoop; i += s[0]; j += s[1]; } @@ -318,10 +319,7 @@ export class EmpireRules extends ChessRules { if (this.getColor(x, y) == 'b') return super.getPotentialKingMoves([x, y]); // Empire doesn't castle: return super.getSlideNJumpMoves( - [x, y], - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } getPotentialSoldierMoves([x, y]) { @@ -332,7 +330,7 @@ export class EmpireRules extends ChessRules { if (!lastRank) steps.push([shiftX, 0]); if (y > 0) steps.push([0, -1]); if (y < 9) steps.push([0, 1]); - return super.getSlideNJumpMoves([x, y], steps, "oneStep"); + return super.getSlideNJumpMoves([x, y], steps, 1); } isAttacked(sq, color) { @@ -356,7 +354,7 @@ export class EmpireRules extends ChessRules { isAttackedByEagle(sq, color) { return super.isAttackedBySlideNJump( - sq, color, V.EAGLE, V.steps[V.KNIGHT], "oneStep"); + sq, color, V.EAGLE, V.steps[V.KNIGHT], 1); } isAttackedByCardinal(sq, color) { @@ -368,7 +366,7 @@ export class EmpireRules extends ChessRules { return ( super.isAttackedBySlideNJump( sq, color, V.DUKE, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), "oneStep" + V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1 ) ); } @@ -376,7 +374,7 @@ export class EmpireRules extends ChessRules { isAttackedBySoldier([x, y], color) { const shiftX = (color == 'w' ? 1 : -1); //shift from king return super.isAttackedBySlideNJump( - [x, y], color, V.SOLDIER, [[shiftX, 0], [0, 1], [0, -1]], "oneStep"); + [x, y], color, V.SOLDIER, [[shiftX, 0], [0, 1], [0, -1]], 1); } updateCastleFlags(move, piece) { diff --git a/client/src/variants/Fanorona.js b/client/src/variants/Fanorona.js index 4593e6bb..e1e653a3 100644 --- a/client/src/variants/Fanorona.js +++ b/client/src/variants/Fanorona.js @@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea"; export class FanoronaRules extends ChessRules { + static get Options() { + return null; + } + static get HasFlags() { return false; } diff --git a/client/src/variants/Football.js b/client/src/variants/Football.js index d63cfee3..7829c2d6 100644 --- a/client/src/variants/Football.js +++ b/client/src/variants/Football.js @@ -104,13 +104,13 @@ export class FootballRules extends ChessRules { } } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "rnbq1knbr/9/9/9/4a4/9/9/9/RNBQ1KNBR w 0"; let pieces = { w: new Array(8), b: new Array(8) }; for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; break; } @@ -314,22 +314,8 @@ export class FootballRules extends ChessRules { return moves; } - // No captures: - getSlideNJumpMoves([x, y], steps, oneStep) { - let moves = []; - outerLoop: for (let step of steps) { - let i = x + step[0]; - let j = y + step[1]; - let stepCount = 1; - while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { - moves.push(this.getBasicMove([x, y], [i, j])); - if (!!oneStep) continue outerLoop; - i += step[0]; - j += step[1]; - stepCount++; - } - } - return moves; + canTake() { + return false; } // Extra arg "computer" to avoid trimming all redundant pass moves: diff --git a/client/src/variants/Fugue.js b/client/src/variants/Fugue.js index c29324ac..2c83fb2c 100644 --- a/client/src/variants/Fugue.js +++ b/client/src/variants/Fugue.js @@ -122,7 +122,11 @@ export class FugueRules extends ChessRules { } canTake([x1, y1], [x2, y2]) { - return !this.isProtected([x2, y2]) && super.canTake([x1, y1], [x2, y2]); + return ( + [V.QUEEN, V.KING].includes(this.getPiece(x1, y1)) && + !this.isProtected([x2, y2]) && + this.getColor(x1, y1) != this.getColor(x2, y2) + ); } getPotentialMovesFrom([x, y]) { @@ -143,30 +147,6 @@ export class FugueRules extends ChessRules { } } - getSlideNJumpMoves([x, y], steps, oneStep) { - const piece = this.getPiece(x, y); - let moves = []; - outerLoop: for (let step of steps) { - let i = x + step[0]; - let j = y + step[1]; - while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { - moves.push(this.getBasicMove([x, y], [i, j])); - if (oneStep !== undefined) continue outerLoop; - i += step[0]; - j += step[1]; - } - // Only queen and king can take on occupied square: - if ( - [V.KING, V.QUEEN].includes(piece) && - V.OnBoard(i, j) && - this.canTake([x, y], [i, j]) - ) { - moves.push(this.getBasicMove([x, y], [i, j])); - } - } - return moves; - } - // "Cannon/grasshopper pawn" getPotentialPawnMoves([x, y]) { const c = this.turn; @@ -228,7 +208,7 @@ export class FugueRules extends ChessRules { getPotentialKingMoves(sq) { const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]); - return this.getSlideNJumpMoves(sq, steps, "oneStep"); + return this.getSlideNJumpMoves(sq, steps, 1); } // NOTE: not really captures, but let's keep the name @@ -512,8 +492,8 @@ export class FugueRules extends ChessRules { } } - static GenRandInitFen(randomness) { - if (randomness == 0) { + static GenRandInitFen(options) { + if (options.randomness == 0) { return ( "wlqksaui/pppppppp/8/8/8/8/PPPPPPPP/IUASKQLW w 0" ); @@ -522,7 +502,7 @@ export class FugueRules extends ChessRules { let pieces = { w: new Array(8), b: new Array(8) }; // Shuffle pieces on first and last rank for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; break; } diff --git a/client/src/variants/Fullcavalry.js b/client/src/variants/Fullcavalry.js index c211aa8f..07951f6b 100644 --- a/client/src/variants/Fullcavalry.js +++ b/client/src/variants/Fullcavalry.js @@ -88,12 +88,12 @@ export class FullcavalryRules extends ChessRules { ); } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) // Deterministic: return "enbqkbnm/pppppppp/8/8/8/8/PPPPPPPP/ENBQKBNM w 0 ahah -"; - const baseFen = ChessRules.GenRandInitFen(randomness); + const baseFen = ChessRules.GenRandInitFen(options); // Replace rooks by lancers with expected orientation: const firstBlackRook = baseFen.indexOf('r'), lastBlackRook = baseFen.lastIndexOf('r'), diff --git a/client/src/variants/Fusion.js b/client/src/variants/Fusion.js index 2eb8b2da..2179aae2 100644 --- a/client/src/variants/Fusion.js +++ b/client/src/variants/Fusion.js @@ -185,7 +185,7 @@ export class FusionRules extends ChessRules { ] }) ); - if (!!oneStep) continue outerLoop; + if (oneStep) continue outerLoop; i += step[0]; j += step[1]; } @@ -326,32 +326,29 @@ export class FusionRules extends ChessRules { isAttackedByBN(sq, color) { return ( this.isAttackedBySlideNJump(sq, color, V.BN, V.steps[V.BISHOP]) || - this.isAttackedBySlideNJump( - sq, color, V.BN, V.steps[V.KNIGHT], "oneStep") + this.isAttackedBySlideNJump(sq, color, V.BN, V.steps[V.KNIGHT], 1) ); } isAttackedByRN(sq, color) { return ( this.isAttackedBySlideNJump(sq, color, V.RN, V.steps[V.ROOK]) || - this.isAttackedBySlideNJump( - sq, color, V.RN, V.steps[V.KNIGHT], "oneStep") + this.isAttackedBySlideNJump(sq, color, V.RN, V.steps[V.KNIGHT], 1) ); } isAttackedByKN(sq, color) { const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]); return ( - this.isAttackedBySlideNJump(sq, color, V.KN, steps, "oneStep") || - this.isAttackedBySlideNJump( - sq, color, V.KN, V.steps[V.KNIGHT], "oneStep") + this.isAttackedBySlideNJump(sq, color, V.KN, steps, 1) || + this.isAttackedBySlideNJump(sq, color, V.KN, V.steps[V.KNIGHT], 1) ); } isAttackedByKB(sq, color) { const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]); return ( - this.isAttackedBySlideNJump(sq, color, V.KB, steps, "oneStep") || + this.isAttackedBySlideNJump(sq, color, V.KB, steps, 1) || this.isAttackedBySlideNJump(sq, color, V.KB, V.steps[V.BISHOP]) ); } @@ -359,7 +356,7 @@ export class FusionRules extends ChessRules { isAttackedByKR(sq, color) { const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]); return ( - this.isAttackedBySlideNJump(sq, color, V.KR, steps, "oneStep") || + this.isAttackedBySlideNJump(sq, color, V.KR, steps, 1) || this.isAttackedBySlideNJump(sq, color, V.KR, V.steps[V.ROOK]) ); } diff --git a/client/src/variants/Gomoku.js b/client/src/variants/Gomoku.js index 51d0bed5..621f6e6f 100644 --- a/client/src/variants/Gomoku.js +++ b/client/src/variants/Gomoku.js @@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea"; export class GomokuRules extends ChessRules { + static get Options() { + return null; + } + static get Monochrome() { return true; } diff --git a/client/src/variants/Grand.js b/client/src/variants/Grand.js index 43cad103..7be8886c 100644 --- a/client/src/variants/Grand.js +++ b/client/src/variants/Grand.js @@ -121,13 +121,13 @@ export class GrandRules extends ChessRules { getPotentialMarshallMoves(sq) { return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat( - this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep") + this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1) ); } getPotentialCardinalMoves(sq) { return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat( - this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep") + this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1) ); } @@ -142,26 +142,14 @@ export class GrandRules extends ChessRules { isAttackedByMarshall(sq, color) { return ( this.isAttackedBySlideNJump(sq, color, V.MARSHALL, V.steps[V.ROOK]) || - this.isAttackedBySlideNJump( - sq, - color, - V.MARSHALL, - V.steps[V.KNIGHT], - "oneStep" - ) + this.isAttackedBySlideNJump(sq, color, V.MARSHALL, V.steps[V.KNIGHT], 1) ); } isAttackedByCardinal(sq, color) { return ( this.isAttackedBySlideNJump(sq, color, V.CARDINAL, V.steps[V.BISHOP]) || - this.isAttackedBySlideNJump( - sq, - color, - V.CARDINAL, - V.steps[V.KNIGHT], - "oneStep" - ) + this.isAttackedBySlideNJump(sq, color, V.CARDINAL, V.steps[V.KNIGHT], 1) ); } @@ -176,8 +164,8 @@ export class GrandRules extends ChessRules { return 2; } - static GenRandInitFen(randomness) { - if (randomness == 0) { + static GenRandInitFen(options) { + if (options.randomness == 0) { return ( "r8r/1nbqkmcbn1/pppppppppp/91/91/91/91/PPPPPPPPPP/1NBQKMCBN1/R8R " + "w 0 -" @@ -187,7 +175,7 @@ export class GrandRules extends ChessRules { let pieces = { w: new Array(8), b: new Array(8) }; // Shuffle pieces on second and before-last rank for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; break; } diff --git a/client/src/variants/Grasshopper.js b/client/src/variants/Grasshopper.js index 90411d14..fcc6bb10 100644 --- a/client/src/variants/Grasshopper.js +++ b/client/src/variants/Grasshopper.js @@ -101,8 +101,8 @@ export class GrasshopperRules extends ChessRules { return 2; } - static GenRandInitFen(randomness) { - return ChessRules.GenRandInitFen(randomness) + static GenRandInitFen(options) { + return ChessRules.GenRandInitFen(options) .slice(0, -2) .replace( "/pppppppp/8/8/8/8/PPPPPPPP/", diff --git a/client/src/variants/Hamilton.js b/client/src/variants/Hamilton.js index 856725c1..8738b289 100644 --- a/client/src/variants/Hamilton.js +++ b/client/src/variants/Hamilton.js @@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea"; export class HamiltonRules extends ChessRules { + static get Options() { + return null; + } + static get HasFlags() { return false; } diff --git a/client/src/variants/Hidden.js b/client/src/variants/Hidden.js index 280062c3..24b8dd04 100644 --- a/client/src/variants/Hidden.js +++ b/client/src/variants/Hidden.js @@ -4,6 +4,11 @@ import { randInt } from "@/utils/alea"; export class HiddenRules extends ChessRules { + static get Options() { + // TODO: later, option "free placement" + return null; + } + static get HasFlags() { return false; } diff --git a/client/src/variants/Hiddenqueen.js b/client/src/variants/Hiddenqueen.js index cbe7f929..1ce85bea 100644 --- a/client/src/variants/Hiddenqueen.js +++ b/client/src/variants/Hiddenqueen.js @@ -152,8 +152,8 @@ export class HiddenqueenRules extends ChessRules { return this.filterValid(this.getPotentialMovesFrom(sq)); } - static GenRandInitFen(randomness) { - let fen = ChessRules.GenRandInitFen(randomness); + static GenRandInitFen(options) { + let fen = ChessRules.GenRandInitFen(options); // Place hidden queens at random (always): let hiddenQueenPos = randInt(8); let pawnRank = "PPPPPPPP".split(""); diff --git a/client/src/variants/Hoppelpoppel.js b/client/src/variants/Hoppelpoppel.js index 59c20bb8..59574f87 100644 --- a/client/src/variants/Hoppelpoppel.js +++ b/client/src/variants/Hoppelpoppel.js @@ -2,6 +2,7 @@ import { ChessRules } from "@/base_rules"; export class HoppelpoppelRules extends ChessRules { + // TODO: merge with base_rules.js (see also Orda, Empire) getSlideNJumpMoves_([x, y], steps, oneStep, options) { options = options || {}; let moves = []; @@ -10,7 +11,7 @@ export class HoppelpoppelRules extends ChessRules { let j = y + step[1]; while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { if (!options.onlyTake) moves.push(this.getBasicMove([x, y], [i, j])); - if (!!oneStep) continue outerLoop; + if (oneStep) continue outerLoop; i += step[0]; j += step[1]; } @@ -44,21 +45,12 @@ export class HoppelpoppelRules extends ChessRules { isAttackedByKnight([x, y], color) { return super.isAttackedBySlideNJump( - [x, y], - color, - V.KNIGHT, - V.steps[V.BISHOP] - ); + [x, y], color, V.KNIGHT, V.steps[V.BISHOP]); } isAttackedByBishop([x, y], color) { return super.isAttackedBySlideNJump( - [x, y], - color, - V.BISHOP, - V.steps[V.KNIGHT], - "oneStep" - ); + [x, y], color, V.BISHOP, V.steps[V.KNIGHT], 1); } }; diff --git a/client/src/variants/Horde.js b/client/src/variants/Horde.js index 33157c94..a54b5092 100644 --- a/client/src/variants/Horde.js +++ b/client/src/variants/Horde.js @@ -2,6 +2,18 @@ import { ChessRules } from "@/base_rules"; export class HordeRules extends ChessRules { + static get Options() { + return { + check: [ + { + label: "Random", + defaut: false, + variable: "random" + } + ] + }; + } + static get HasFlags() { return false; } @@ -36,9 +48,9 @@ export class HordeRules extends ChessRules { return true; } - static GenRandInitFen(randomness) { - if (randomness == 2) randomness--; - const fen = ChessRules.GenRandInitFen(randomness); + static GenRandInitFen(options) { + const fen = + ChessRules.GenRandInitFen({ randomness: (options.random ? 1 : 0) }); return ( // 20 first chars are 3 rows + 3 slashes fen.substr(0, 20) diff --git a/client/src/variants/Hypnotic.js b/client/src/variants/Hypnotic.js index a429c7c4..3b678433 100644 --- a/client/src/variants/Hypnotic.js +++ b/client/src/variants/Hypnotic.js @@ -23,8 +23,8 @@ export class HypnoticRules extends ChessRules { ); } - static GenRandInitFen(randomness) { - return ChessRules.GenRandInitFen(randomness) + " -"; + static GenRandInitFen(options) { + return ChessRules.GenRandInitFen(options) + " -"; } setOtherVariables(fen) { @@ -69,7 +69,7 @@ export class HypnoticRules extends ChessRules { this.getPiece(x, y) == V.KING // No castling with enemy king (...yes, should eat it but...) ? super.getSlideNJumpMoves( - [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), "oneStep") + [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1) : super.getPotentialMovesFrom([x, y]); return moves; } diff --git a/client/src/variants/Iceage.js b/client/src/variants/Iceage.js index 01f82d85..a9c9fbaf 100644 --- a/client/src/variants/Iceage.js +++ b/client/src/variants/Iceage.js @@ -47,8 +47,8 @@ export class IceageRules extends ChessRules { return true; } - static GenRandInitFen(randomness) { - return ChessRules.GenRandInitFen(randomness).replace(/8/g, "cccccccc"); + static GenRandInitFen(options) { + return ChessRules.GenRandInitFen(options).replace(/8/g, "cccccccc"); } play(move) { diff --git a/client/src/variants/Interweave.js b/client/src/variants/Interweave.js index 1a9cd94c..3277c742 100644 --- a/client/src/variants/Interweave.js +++ b/client/src/variants/Interweave.js @@ -8,13 +8,13 @@ export class InterweaveRules extends ChessRules { return false; } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "rbnkknbr/pppppppp/8/8/8/8/PPPPPPPP/RBNKKNBR w 0 - 000000"; let pieces = { w: new Array(8), b: new Array(8) }; for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; break; } diff --git a/client/src/variants/Janggi.js b/client/src/variants/Janggi.js index aecc8fe2..8ede111a 100644 --- a/client/src/variants/Janggi.js +++ b/client/src/variants/Janggi.js @@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea"; export class JanggiRules extends ChessRules { + static get Options() { + return null; + } + static get Monochrome() { return true; } @@ -193,7 +197,7 @@ export class JanggiRules extends ChessRules { if (y == 3) steps.push([shiftX, 1]); else if (y == 5) steps.push([shiftX, -1]); } - return super.getSlideNJumpMoves([x, y], steps, "oneStep"); + return super.getSlideNJumpMoves([x, y], steps, 1); } knightStepsFromRookStep(step) { @@ -211,7 +215,7 @@ export class JanggiRules extends ChessRules { this.knightStepsFromRookStep(rookStep)); } } - return super.getSlideNJumpMoves([x, y], steps, "oneStep"); + return super.getSlideNJumpMoves([x, y], steps, 1); } elephantStepsFromRookStep(step) { @@ -234,7 +238,7 @@ export class JanggiRules extends ChessRules { } } } - return super.getSlideNJumpMoves([x, y], steps, "oneStep"); + return super.getSlideNJumpMoves([x, y], steps, 1); } palacePeopleMoves([x, y]) { @@ -278,7 +282,7 @@ export class JanggiRules extends ChessRules { // At the middle: all directions available Array.prototype.push.apply(steps, ChessRules.steps[V.BISHOP]); } - return super.getSlideNJumpMoves([x, y], steps, "oneStep"); + return super.getSlideNJumpMoves([x, y], steps, 1); } getPotentialAdvisorMoves(sq) { @@ -310,9 +314,7 @@ export class JanggiRules extends ChessRules { // In the middle of a palace: 4 one-diagonal-step to check Array.prototype.push.apply( moves, - super.getSlideNJumpMoves([x, y], - ChessRules.steps[V.BISHOP], - "oneStep") + super.getSlideNJumpMoves([x, y], ChessRules.steps[V.BISHOP], 1) ); } return moves; @@ -391,7 +393,7 @@ export class JanggiRules extends ChessRules { isAttackedByPawn([x, y], color) { const shiftX = (color == 'w' ? 1 : -1); //shift from king if (super.isAttackedBySlideNJump( - [x, y], color, V.PAWN, [[shiftX, 0], [0, 1], [0, -1]], "oneStep") + [x, y], color, V.PAWN, [[shiftX, 0], [0, 1], [0, -1]], 1) ) { return true; } @@ -428,7 +430,7 @@ export class JanggiRules extends ChessRules { } } return ( - super.isAttackedBySlideNJump([x, y], color, V.KNIGHT, steps, "oneStep") + super.isAttackedBySlideNJump([x, y], color, V.KNIGHT, steps, 1) ); } @@ -450,7 +452,7 @@ export class JanggiRules extends ChessRules { } } return ( - super.isAttackedBySlideNJump([x, y], color, V.ELEPHANT, steps, "oneStep") + super.isAttackedBySlideNJump([x, y], color, V.ELEPHANT, steps, 1) ); } diff --git a/client/src/variants/Joker.js b/client/src/variants/Joker.js index fd302bbb..bc3a7f1b 100644 --- a/client/src/variants/Joker.js +++ b/client/src/variants/Joker.js @@ -11,8 +11,8 @@ export class JokerRules extends ChessRules { ); } - static GenRandInitFen(randomness) { - const antikingFen = Antiking2Rules.GenRandInitFen(randomness); + static GenRandInitFen(options) { + const antikingFen = Antiking2Rules.GenRandInitFen(options); return antikingFen.replace('a', 'J').replace('A', 'j'); } @@ -48,7 +48,7 @@ export class JokerRules extends ChessRules { getPotentialJokerMoves([x, y]) { const moving = - super.getSlideNJumpMoves([x, y], V.steps[V.KNIGHT], "oneStep") + super.getSlideNJumpMoves([x, y], V.steps[V.KNIGHT], 1) .concat(super.getSlideNJumpMoves([x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]))); let swapping = []; diff --git a/client/src/variants/Knightmate1.js b/client/src/variants/Knightmate1.js index 80e7005b..7946d6a3 100644 --- a/client/src/variants/Knightmate1.js +++ b/client/src/variants/Knightmate1.js @@ -14,8 +14,8 @@ export class Knightmate1Rules extends ChessRules { return ([V.KING, V.COMMONER].includes(b[1]) ? "Knightmate/" : "") + b; } - static GenRandInitFen(randomness) { - return ChessRules.GenRandInitFen(randomness) + static GenRandInitFen(options) { + return ChessRules.GenRandInitFen(options) .replace(/n/g, 'c').replace(/N/g, 'C'); } @@ -30,10 +30,7 @@ export class Knightmate1Rules extends ChessRules { getPotentialCommonerMoves(sq) { return this.getSlideNJumpMoves( - sq, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } getPotentialKingMoves(sq) { @@ -53,22 +50,12 @@ export class Knightmate1Rules extends ChessRules { isAttackedByKing(sq, color) { return this.isAttackedBySlideNJump( - sq, - color, - V.KING, - V.steps[V.KNIGHT], - "oneStep" - ); + sq, color, V.KING, V.steps[V.KNIGHT], 1); } isAttackedByCommoner(sq, color) { return this.isAttackedBySlideNJump( - sq, - color, - V.COMMONER, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + sq, color, V.COMMONER, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } static get VALUES() { diff --git a/client/src/variants/Knightmate2.js b/client/src/variants/Knightmate2.js index 3630b5c4..bbdd12d9 100644 --- a/client/src/variants/Knightmate2.js +++ b/client/src/variants/Knightmate2.js @@ -43,9 +43,9 @@ export class Knightmate2Rules extends ChessRules { scanKings() {} - static GenRandInitFen(randomness) { + static GenRandInitFen(options) { return ( - ChessRules.GenRandInitFen(randomness) + ChessRules.GenRandInitFen(options) .replace(/k/g, 'c').replace(/K/g, 'C') .replace(/n/g, 'k').replace(/N/g, 'K') ); @@ -62,10 +62,7 @@ export class Knightmate2Rules extends ChessRules { getPotentialCommonerMoves(sq) { return this.getSlideNJumpMoves( - sq, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } getPotentialKingMoves(sq) { @@ -85,22 +82,12 @@ export class Knightmate2Rules extends ChessRules { isAttackedByKing(sq, color) { return this.isAttackedBySlideNJump( - sq, - color, - V.KING, - V.steps[V.KNIGHT], - "oneStep" - ); + sq, color, V.KING, V.steps[V.KNIGHT], 1); } isAttackedByCommoner(sq, color) { return this.isAttackedBySlideNJump( - sq, - color, - V.COMMONER, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + sq, color, V.COMMONER, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } postPlay() {} diff --git a/client/src/variants/Knightpawns.js b/client/src/variants/Knightpawns.js index c8c1ceaa..bf3e7733 100644 --- a/client/src/variants/Knightpawns.js +++ b/client/src/variants/Knightpawns.js @@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules"; export class KnightpawnsRules extends ChessRules { + static get Options() { + return null; + } + static get PawnSpecs() { return Object.assign( {}, diff --git a/client/src/variants/Konane.js b/client/src/variants/Konane.js index 80311817..7931347b 100644 --- a/client/src/variants/Konane.js +++ b/client/src/variants/Konane.js @@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea"; export class KonaneRules extends ChessRules { + static get Options() { + return null; + } + static get HasFlags() { return false; } diff --git a/client/src/variants/Koopa.js b/client/src/variants/Koopa.js index a624eebb..38b3e885 100644 --- a/client/src/variants/Koopa.js +++ b/client/src/variants/Koopa.js @@ -216,9 +216,7 @@ export class KoopaRules extends ChessRules { getPotentialKingMoves(sq) { return ( this.getSlideNJumpMoves( - sq, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" + sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1 ).concat(super.getCastleMoves(sq, null, true, ['r'])) ); } diff --git a/client/src/variants/Madrasi.js b/client/src/variants/Madrasi.js index f0db5107..e16d78f5 100644 --- a/client/src/variants/Madrasi.js +++ b/client/src/variants/Madrasi.js @@ -25,8 +25,8 @@ export class MadrasiRules extends ChessRules { steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]); break; } - return super.isAttackedBySlideNJump( - sq, oppCol, piece, steps, [V.KING, V.PAWN, V.KNIGHT].includes(piece)) + const nbSteps = [V.KING, V.PAWN, V.KNIGHT].includes(piece) ? 1 : null; + return super.isAttackedBySlideNJump(sq, oppCol, piece, steps, nbSteps); } getPotentialMovesFrom([x, y]) { diff --git a/client/src/variants/Maharajah.js b/client/src/variants/Maharajah.js index a49828b2..65523e7c 100644 --- a/client/src/variants/Maharajah.js +++ b/client/src/variants/Maharajah.js @@ -2,6 +2,18 @@ import { ChessRules } from "@/base_rules"; export class MaharajahRules extends ChessRules { + static get Options() { + return { + check: [ + { + label: "Random", + defaut: false, + variable: "random" + } + ] + }; + } + static get HasEnpassant() { return false; } @@ -84,9 +96,10 @@ export class MaharajahRules extends ChessRules { } } - static GenRandInitFen(randomness) { - const sFen = ChessRules.GenRandInitFen(Math.max(randomness, 1)); - return "3mm3/8/" + sFen.substring(18, 50); + static GenRandInitFen(options) { + const baseFen = ChessRules.GenRandInitFen( + { randomness: (options.random ? 1 : 0) }); + return "3mm3/8/" + baseFen.substring(18, 50); } getFlagsFen() { @@ -108,7 +121,7 @@ export class MaharajahRules extends ChessRules { let moves = super.getPotentialQueenMoves(sq); moves = moves.concat(super.getPotentialKnightMoves(sq)); const otherJumpMoves = - super.getSlideNJumpMoves(sq, V.M_EXTRA_STEPS, "oneStep") + super.getSlideNJumpMoves(sq, V.M_EXTRA_STEPS, 1) .filter(m => moves.every(mv => mv.end.x != m.end.x || mv.end.y != m.end.y)); return moves.concat(otherJumpMoves); diff --git a/client/src/variants/Makruk.js b/client/src/variants/Makruk.js index 75fb1da2..b721273b 100644 --- a/client/src/variants/Makruk.js +++ b/client/src/variants/Makruk.js @@ -36,13 +36,13 @@ export class MakrukRules extends ChessRules { return 'f'; } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "rnbqkbnr/8/pppppppp/8/8/PPPPPPPP/8/RNBKQBNR w 0"; let pieces = { w: new Array(8), b: new Array(8) }; for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; break; } @@ -95,18 +95,11 @@ export class MakrukRules extends ChessRules { getPotentialBishopMoves(sq) { const forward = (this.turn == 'w' ? -1 : 1); return this.getSlideNJumpMoves( - sq, - V.steps[V.BISHOP].concat([ [forward, 0] ]), - "oneStep" - ); + sq, V.steps[V.BISHOP].concat([ [forward, 0] ]), 1); } getPotentialQueenMoves(sq) { - return this.getSlideNJumpMoves( - sq, - V.steps[V.BISHOP], - "oneStep" - ); + return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1); } isAttacked(sq, color) { @@ -118,32 +111,17 @@ export class MakrukRules extends ChessRules { isAttackedByBishop(sq, color) { const forward = (color == 'w' ? 1 : -1); return this.isAttackedBySlideNJump( - sq, - color, - V.BISHOP, - V.steps[V.BISHOP].concat([ [forward, 0] ]), - "oneStep" - ); + sq, color, V.BISHOP, V.steps[V.BISHOP].concat([ [forward, 0] ]), 1); } isAttackedByQueen(sq, color) { return this.isAttackedBySlideNJump( - sq, - color, - V.QUEEN, - V.steps[V.BISHOP], - "oneStep" - ); + sq, color, V.QUEEN, V.steps[V.BISHOP], 1); } isAttackedByPromoted(sq, color) { return super.isAttackedBySlideNJump( - sq, - color, - V.PROMOTED, - V.steps[V.BISHOP], - "oneStep" - ); + sq, color, V.PROMOTED, V.steps[V.BISHOP], 1); } static get VALUES() { diff --git a/client/src/variants/Maxima.js b/client/src/variants/Maxima.js index 05df0bd9..df781b9e 100644 --- a/client/src/variants/Maxima.js +++ b/client/src/variants/Maxima.js @@ -4,6 +4,10 @@ import { shuffle } from "@/utils/alea"; export class MaximaRules extends ChessRules { + static get Options() { + return null; + } + static get HasFlags() { return false; } @@ -192,7 +196,7 @@ export class MaximaRules extends ChessRules { if (piece == V.KING) j = j % V.size.y; while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { moves.push(this.getBasicMove(initSquare, [i, j])); - if (!!oneStep) continue outerLoop; + if (oneStep) continue outerLoop; i += step[0]; j += step[1]; } @@ -450,14 +454,8 @@ export class MaximaRules extends ChessRules { } getPotentialGuardMoves(sq) { - return ( - this.getSlideNJumpMoves( - sq, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep", - null - ) - ); + return this.getSlideNJumpMoves( + sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), "oneStep"); } getNextMageSteps(step) { @@ -679,15 +677,8 @@ export class MaximaRules extends ChessRules { } isAttackedByGuard(sq, color) { - return ( - super.isAttackedBySlideNJump( - sq, - color, - V.GUARD, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ) - ); + return super.isAttackedBySlideNJump( + sq, color, V.GUARD, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } getNextMageCheck(step) { diff --git a/client/src/variants/Mesmer.js b/client/src/variants/Mesmer.js index ec40b482..c522e733 100644 --- a/client/src/variants/Mesmer.js +++ b/client/src/variants/Mesmer.js @@ -36,8 +36,8 @@ export class MesmerRules extends ChessRules { ); } - static GenRandInitFen(randomness) { - const antikingFen = Antiking2Rules.GenRandInitFen(randomness); + static GenRandInitFen(options) { + const antikingFen = Antiking2Rules.GenRandInitFen(options); return antikingFen.replace('a', 'M').replace('A', 'm') + " -"; } @@ -113,7 +113,7 @@ export class MesmerRules extends ChessRules { piece == V.KING // No castling with enemy king (...yes, should eat it but...) ? super.getSlideNJumpMoves( - [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), "oneStep") + [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1) : super.getPotentialMovesFrom([x, y]); return moves; } diff --git a/client/src/variants/Minixiangqi.js b/client/src/variants/Minixiangqi.js index fc1d164e..d8f6ebba 100644 --- a/client/src/variants/Minixiangqi.js +++ b/client/src/variants/Minixiangqi.js @@ -39,7 +39,7 @@ export class MinixiangqiRules extends XiangqiRules { if (!lastRank) steps.push([shiftX, 0]); if (y > 0) steps.push([0, -1]); if (y < 9) steps.push([0, 1]); - return super.getSlideNJumpMoves([x, y], steps, "oneStep"); + return super.getSlideNJumpMoves([x, y], steps, 1); } insidePalace(x, y, c) { diff --git a/client/src/variants/Monocolor.js b/client/src/variants/Monocolor.js index 1e263699..1478f482 100644 --- a/client/src/variants/Monocolor.js +++ b/client/src/variants/Monocolor.js @@ -156,9 +156,9 @@ export class MonocolorRules extends ChessRules { return "1/2"; } - static GenRandInitFen(randomness) { + static GenRandInitFen(options) { // Remove the en-passant + castle part of the FEN - let fen = ChessRules.GenRandInitFen(randomness).slice(0, -6); + let fen = ChessRules.GenRandInitFen(options).slice(0, -6); // Replace kings with queens fen = fen.replace("k", "q").replace("K", "Q"); // Move pawns up: diff --git a/client/src/variants/Monster.js b/client/src/variants/Monster.js index cb29adae..bbba3193 100644 --- a/client/src/variants/Monster.js +++ b/client/src/variants/Monster.js @@ -3,21 +3,53 @@ import { randInt } from "@/utils/alea"; export class MonsterRules extends ChessRules { + static get Options() { + return { + check: [ + { + label: "Random", + defaut: false, + variable: "random" + } + ], + select: [ + { + label: "Number of pawns", + variable: "pawnsCount", + defaut: 4, + options: [ + { label: "Two", value: 2 }, + { label: "Four", value: 4 }, + { label: "Six", value: 6 } + ] + } + ] + }; + } + + static AbbreviateOptions(opts) { + return opts["pawnsCount"]; + } + static IsGoodFlags(flags) { // Only black can castle return !!flags.match(/^[a-z]{2,2}$/); } - static GenRandInitFen(randomness) { - if (randomness == 2) randomness--; - const fen = ChessRules.GenRandInitFen(randomness); + static GenRandInitFen(options) { + const baseFen = ChessRules.GenRandInitFen( + { randomness: (options.random ? 1 : 0) }); + let pawnsLine = ""; + switch (options.pawnsCount) { + case 2: pawnsLine = "3PP3"; break; + case 4: pawnsLine = "2PPPP2"; break; + case 6: pawnsLine = "1PPPPPP1"; break; + } return ( // 26 first chars are 6 rows + 6 slashes - fen.substr(0, 26) + baseFen.substr(0, 26) + pawnsLine + "/4K3 w 0 " + // En passant available, and "half-castle" - .concat("1PPPPPP1/4K3 w 0 ") - .concat(fen.substr(-6, 2)) - .concat(" -") + baseFen.substr(-6, 2) + " -" ); } @@ -40,10 +72,7 @@ export class MonsterRules extends ChessRules { if (this.getColor(x, y) == 'b') return super.getPotentialKingMoves([x, y]); // White doesn't castle: return this.getSlideNJumpMoves( - [x, y], - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } isAttacked() { diff --git a/client/src/variants/Musketeer.js b/client/src/variants/Musketeer.js index 14ba9192..e10457fc 100644 --- a/client/src/variants/Musketeer.js +++ b/client/src/variants/Musketeer.js @@ -323,31 +323,6 @@ export class MusketeerRules extends ChessRules { return moves; } - getSlideNJumpMoves([x, y], steps, nbSteps) { - let moves = []; - outerLoop: for (let step of steps) { - let i = x + step[0]; - let j = y + step[1]; - let stepCounter = 0; - while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { - moves.push(this.getBasicMove([x, y], [i, j])); - stepCounter++; - if ( - !!nbSteps && - // Next condition to remain compatible with super method - (stepCounter >= nbSteps || isNaN(parseInt(nbSteps, 10))) - ) { - continue outerLoop; - } - i += step[0]; - j += step[1]; - } - if (V.OnBoard(i, j) && this.canTake([x, y], [i, j])) - moves.push(this.getBasicMove([x, y], [i, j])); - } - return moves; - } - // All types of leaps used here: static get Leap2Ortho() { return [ [-2, 0], [0, -2], [2, 0], [0, 2] ]; @@ -385,13 +360,13 @@ export class MusketeerRules extends ChessRules { const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]) .concat(V.Leap2Ortho).concat(V.HorizontalKnight); - return super.getSlideNJumpMoves(sq, steps, "oneStep"); + return super.getSlideNJumpMoves(sq, steps, 1); } getPotentialUnicornMoves(sq) { return ( super.getPotentialKnightMoves(sq) - .concat(super.getSlideNJumpMoves(sq, V.CamelSteps, "oneStep")) + .concat(super.getSlideNJumpMoves(sq, V.CamelSteps, 1)) ); } @@ -400,20 +375,20 @@ export class MusketeerRules extends ChessRules { V.steps[V.ROOK].concat(V.steps[V.BISHOP]) .concat(V.Leap2Ortho) .concat(V.Leap2Diago); - return super.getSlideNJumpMoves(sq, steps, "oneStep"); + return super.getSlideNJumpMoves(sq, steps, 1); } getPotentialHawkMoves(sq) { const steps = V.Leap2Ortho.concat(V.Leap2Diago) .concat(V.Leap3Ortho).concat(V.Leap3Diago); - return super.getSlideNJumpMoves(sq, steps, "oneStep"); + return super.getSlideNJumpMoves(sq, steps, 1); } getPotentialFortressMoves(sq) { const steps = V.Leap2Ortho.concat(V.VerticalKnight) return ( - super.getSlideNJumpMoves(sq, steps, "oneStep") + super.getSlideNJumpMoves(sq, steps, 1) .concat(this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 3)) ); } @@ -421,7 +396,7 @@ export class MusketeerRules extends ChessRules { getPotentialSpiderMoves(sq) { const steps = V.Leap2Ortho.concat(V.steps[V.KNIGHT]) return ( - super.getSlideNJumpMoves(sq, steps, "oneStep") + super.getSlideNJumpMoves(sq, steps, 1) .concat(this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 2)) ); } @@ -496,37 +471,10 @@ export class MusketeerRules extends ChessRules { return false; } - // Modify because of the limiyted steps options of some of the pieces here - isAttackedBySlideNJump([x, y], color, piece, steps, nbSteps) { - if (!!nbSteps && isNaN(parseInt(nbSteps, 10))) nbSteps = 1; - for (let step of steps) { - let rx = x + step[0], - ry = y + step[1]; - let stepCounter = 1; - while ( - V.OnBoard(rx, ry) && this.board[rx][ry] == V.EMPTY && - (!nbSteps || stepCounter < nbSteps) - ) { - rx += step[0]; - ry += step[1]; - stepCounter++; - } - if ( - V.OnBoard(rx, ry) && - this.board[rx][ry] != V.EMPTY && - this.getPiece(rx, ry) == piece && - this.getColor(rx, ry) == color - ) { - return true; - } - } - return false; - } - isAttackedByLeopard(sq, color) { return ( super.isAttackedBySlideNJump( - sq, color, V.LEOPARD, V.steps[V.KNIGHT], "oneStep") || + sq, color, V.LEOPARD, V.steps[V.KNIGHT], 1) || this.isAttackedBySlideNJump(sq, color, V.LEOPARD, V.steps[V.BISHOP], 2) ); } @@ -535,13 +483,13 @@ export class MusketeerRules extends ChessRules { const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]) .concat(V.Leap2Ortho).concat(V.HorizontalKnight); - return super.isAttackedBySlideNJump(sq, color, V.CANNON, steps, "oneStep"); + return super.isAttackedBySlideNJump(sq, color, V.CANNON, steps, 1); } isAttackedByUnicorn(sq, color) { const steps = V.steps[V.KNIGHT].concat(V.CamelSteps) return ( - super.isAttackedBySlideNJump(sq, color, V.UNICORN, steps, "oneStep") + super.isAttackedBySlideNJump(sq, color, V.UNICORN, steps, 1) ); } @@ -551,7 +499,7 @@ export class MusketeerRules extends ChessRules { .concat(V.Leap2Ortho) .concat(V.Leap2Diago); return ( - super.isAttackedBySlideNJump(sq, color, V.ELEPHANT, steps, "oneStep") + super.isAttackedBySlideNJump(sq, color, V.ELEPHANT, steps, 1) ); } @@ -559,13 +507,13 @@ export class MusketeerRules extends ChessRules { const steps = V.Leap2Ortho.concat(V.Leap2Diago) .concat(V.Leap3Ortho).concat(V.Leap3Diago); - return super.isAttackedBySlideNJump(sq, color, V.HAWK, steps, "oneStep"); + return super.isAttackedBySlideNJump(sq, color, V.HAWK, steps, 1); } isAttackedByFortress(sq, color) { const steps = V.Leap2Ortho.concat(V.VerticalKnight) return ( - super.isAttackedBySlideNJump(sq, color, V.FORTRESS, steps, "oneStep") || + super.isAttackedBySlideNJump(sq, color, V.FORTRESS, steps, 1) || this.isAttackedBySlideNJump(sq, color, V.FORTRESS, V.steps[V.BISHOP], 3) ); } @@ -573,7 +521,7 @@ export class MusketeerRules extends ChessRules { isAttackedBySpider(sq, color) { const steps = V.Leap2Ortho.concat(V.steps[V.KNIGHT]) return ( - super.isAttackedBySlideNJump(sq, color, V.SPIDER, steps, "oneStep") || + super.isAttackedBySlideNJump(sq, color, V.SPIDER, steps, 1) || this.isAttackedBySlideNJump(sq, color, V.SPIDER, V.steps[V.BISHOP], 2) ); } diff --git a/client/src/variants/Newzealand.js b/client/src/variants/Newzealand.js index eb7d6251..3d78cbad 100644 --- a/client/src/variants/Newzealand.js +++ b/client/src/variants/Newzealand.js @@ -3,6 +3,7 @@ import { ChessRules } from "@/base_rules"; // NOTE: a lot copy-pasted from Hoppelpoppel export class NewzealandRules extends ChessRules { + // TODO: merge with base_rules.js getSlideNJumpMoves_([x, y], steps, oneStep, options) { options = options || {}; let moves = []; @@ -11,7 +12,7 @@ export class NewzealandRules extends ChessRules { let j = y + step[1]; while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { if (!options.onlyTake) moves.push(this.getBasicMove([x, y], [i, j])); - if (!!oneStep) continue outerLoop; + if (oneStep) continue outerLoop; i += step[0]; j += step[1]; } @@ -45,21 +46,12 @@ export class NewzealandRules extends ChessRules { isAttackedByKnight([x, y], color) { return super.isAttackedBySlideNJump( - [x, y], - color, - V.KNIGHT, - V.steps[V.ROOK] - ); + [x, y], color, V.KNIGHT, V.steps[V.ROOK]); } isAttackedByRook([x, y], color) { return super.isAttackedBySlideNJump( - [x, y], - color, - V.ROOK, - V.steps[V.KNIGHT], - "oneStep" - ); + [x, y], color, V.ROOK, V.steps[V.KNIGHT], 1); } }; diff --git a/client/src/variants/Omega.js b/client/src/variants/Omega.js index a688a2ea..29b58e53 100644 --- a/client/src/variants/Omega.js +++ b/client/src/variants/Omega.js @@ -140,8 +140,8 @@ export class OmegaRules extends ChessRules { ); } - static GenRandInitFen(randomness) { - if (randomness == 0) { + static GenRandInitFen(options) { + if (options.randomness == 0) { return ( "wxxxxxxxxxxw/xcrnbqkbnrcx/xppppppppppx/x91x/x91x/x91x/" + "x91x/x91x/x91x/xPPPPPPPPPPx/xCRNBQKBNRCx/WxxxxxxxxxxW " + @@ -153,7 +153,7 @@ export class OmegaRules extends ChessRules { let flags = ""; // Shuffle pieces on first (and last rank if randomness == 2) for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; flags += flags; break; @@ -320,11 +320,11 @@ export class OmegaRules extends ChessRules { } getPotentialChampionMoves(sq) { - return this.getSlideNJumpMoves(sq, V.steps[V.CHAMPION], "oneStep"); + return this.getSlideNJumpMoves(sq, V.steps[V.CHAMPION], 1); } getPotentialWizardMoves(sq) { - return this.getSlideNJumpMoves(sq, V.steps[V.WIZARD], "oneStep"); + return this.getSlideNJumpMoves(sq, V.steps[V.WIZARD], 1); } getCastleMoves([x, y]) { @@ -346,14 +346,14 @@ export class OmegaRules extends ChessRules { isAttackedByWizard(sq, color) { return ( this.isAttackedBySlideNJump( - sq, color, V.WIZARD, V.steps[V.WIZARD], "oneStep") + sq, color, V.WIZARD, V.steps[V.WIZARD], 1) ); } isAttackedByChampion(sq, color) { return ( this.isAttackedBySlideNJump( - sq, color, V.CHAMPION, V.steps[V.CHAMPION], "oneStep") + sq, color, V.CHAMPION, V.steps[V.CHAMPION], 1) ); } diff --git a/client/src/variants/Orda.js b/client/src/variants/Orda.js index 1fd5c1d3..4bca5496 100644 --- a/client/src/variants/Orda.js +++ b/client/src/variants/Orda.js @@ -24,8 +24,8 @@ export class OrdaRules extends ChessRules { return b; } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "lhaykahl/8/pppppppp/8/8/8/PPPPPPPP/RNBQKBNR w 0 ah -"; // Mapping kingdom --> horde: @@ -37,7 +37,7 @@ export class OrdaRules extends ChessRules { 'k': 'k' }; - const baseFen = ChessRules.GenRandInitFen(randomness); + const baseFen = ChessRules.GenRandInitFen(options); return ( baseFen.substr(0, 8).split('').map(p => piecesMap[p]).join('') + // Skip 3 first rows + black castle flags @@ -89,6 +89,7 @@ export class OrdaRules extends ChessRules { return []; } + // TODO: merge this extension into base_rules.js getSlideNJumpMoves([x, y], steps, oneStep, options) { options = options || {}; let moves = []; @@ -97,7 +98,7 @@ export class OrdaRules extends ChessRules { let j = y + step[1]; while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { if (!options.onlyTake) moves.push(this.getBasicMove([x, y], [i, j])); - if (!!oneStep) continue outerLoop; + if (oneStep) continue outerLoop; i += step[0]; j += step[1]; } @@ -109,60 +110,36 @@ export class OrdaRules extends ChessRules { getPotentialLancerMoves(sq) { const onlyMoves = this.getSlideNJumpMoves( - sq, - V.steps[V.KNIGHT], - "oneStep", - { onlyMove: true } - ); + sq, V.steps[V.KNIGHT], "oneStep", { onlyMove: true }); const onlyTakes = this.getSlideNJumpMoves( - sq, - V.steps[V.ROOK], - null, - { onlyTake: true } - ); + sq, V.steps[V.ROOK], null, { onlyTake: true }); return onlyMoves.concat(onlyTakes); } getPotentialArcherMoves(sq) { const onlyMoves = this.getSlideNJumpMoves( - sq, - V.steps[V.KNIGHT], - "oneStep", - { onlyMove: true } - ); + sq, V.steps[V.KNIGHT], "oneStep", { onlyMove: true }); const onlyTakes = this.getSlideNJumpMoves( - sq, - V.steps[V.BISHOP], - null, - { onlyTake: true } - ); + sq, V.steps[V.BISHOP], null, { onlyTake: true }); return onlyMoves.concat(onlyTakes); } getPotentialKheshigMoves(sq) { - return super.getSlideNJumpMoves( - sq, - V.steps[V.KNIGHT].concat(V.steps[V.ROOK]).concat(V.steps[V.BISHOP]), - "oneStep" - ); + const steps = + V.steps[V.KNIGHT].concat(V.steps[V.ROOK]).concat(V.steps[V.BISHOP]); + return super.getSlideNJumpMoves(sq, steps, 1); } getPotentialYurtMoves(sq) { return super.getSlideNJumpMoves( - sq, - V.steps[V.BISHOP].concat([ [1, 0] ]), - "oneStep" - ); + sq, V.steps[V.BISHOP].concat([ [1, 0] ]), 1); } getPotentialKingMoves([x, y]) { if (this.getColor(x, y) == 'w') return super.getPotentialKingMoves([x, y]); // Horde doesn't castle: return super.getSlideNJumpMoves( - [x, y], - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } isAttacked(sq, color) { @@ -193,23 +170,14 @@ export class OrdaRules extends ChessRules { } isAttackedByKheshig(sq, color) { - return super.isAttackedBySlideNJump( - sq, - color, - V.KHESHIG, - V.steps[V.KNIGHT].concat(V.steps[V.ROOK]).concat(V.steps[V.BISHOP]), - "oneStep" - ); + const steps = + V.steps[V.KNIGHT].concat(V.steps[V.ROOK]).concat(V.steps[V.BISHOP]); + return super.isAttackedBySlideNJump(sq, color, V.KHESHIG, steps, 1); } isAttackedByYurt(sq, color) { return super.isAttackedBySlideNJump( - sq, - color, - V.YURT, - V.steps[V.BISHOP].concat([ [1, 0] ]), - "oneStep" - ); + sq, color, V.YURT, V.steps[V.BISHOP].concat([ [1, 0] ]), 1); } updateCastleFlags(move, piece) { diff --git a/client/src/variants/Ordamirror.js b/client/src/variants/Ordamirror.js index 8176b957..21aebaaf 100644 --- a/client/src/variants/Ordamirror.js +++ b/client/src/variants/Ordamirror.js @@ -25,14 +25,14 @@ export class OrdamirrorRules extends OrdaRules { return "Orda/" + b; } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "lhafkahl/8/pppppppp/8/8/PPPPPPPP/8/LHAFKAHL w 0 ah -"; let pieces = { w: new Array(8), b: new Array(8) }; // Shuffle pieces on first (and last rank if randomness == 2) for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; break; } @@ -106,17 +106,9 @@ export class OrdamirrorRules extends OrdaRules { getPotentialFalconMoves(sq) { const onlyMoves = this.getSlideNJumpMoves( - sq, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - null, - { onlyMove: true } - ); + sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), null, { onlyMove: true }); const onlyTakes = this.getSlideNJumpMoves( - sq, - V.steps[V.KNIGHT], - "oneStep", - { onlyTake: true } - ); + sq, V.steps[V.KNIGHT], "oneStep", { onlyTake: true }); return onlyMoves.concat(onlyTakes); } @@ -133,7 +125,7 @@ export class OrdamirrorRules extends OrdaRules { isAttackedByFalcon(sq, color) { return this.isAttackedBySlideNJump( - sq, color, V.FALCON, V.steps[V.KNIGHT], "oneStep"); + sq, color, V.FALCON, V.steps[V.KNIGHT], 1); } static get VALUES() { diff --git a/client/src/variants/Otage.js b/client/src/variants/Otage.js index 79157157..caf55c9c 100644 --- a/client/src/variants/Otage.js +++ b/client/src/variants/Otage.js @@ -197,9 +197,9 @@ export class OtageRules extends ChessRules { this.pawnFlags = flags[1]; } - static GenRandInitFen(randomness) { + static GenRandInitFen(options) { // Add 16 pawns flags: - return ChessRules.GenRandInitFen(randomness) + return ChessRules.GenRandInitFen(options) .slice(0, -2) + "1111111111111111 -"; } @@ -390,10 +390,7 @@ export class OtageRules extends ChessRules { break; case V.KING: baseMoves = this.getSlideNJumpMoves( - [x, y], - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); if (!noCastle && this.castleFlags[this.turn].some(v => v < V.size.y)) baseMoves = baseMoves.concat(this.getCastleMoves([x, y])); break; diff --git a/client/src/variants/Pacifist1.js b/client/src/variants/Pacifist1.js index 37d0521f..e595b0da 100644 --- a/client/src/variants/Pacifist1.js +++ b/client/src/variants/Pacifist1.js @@ -154,21 +154,9 @@ export class Pacifist1Rules extends ChessRules { return moves; } - getSlideNJumpMoves([x, y], steps, oneStep) { - let moves = []; - outerLoop: for (let loop = 0; loop < steps.length; loop++) { - const step = steps[loop]; - let i = x + step[0]; - let j = y + step[1]; - while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { - moves.push(this.getBasicMove([x, y], [i, j])); - if (oneStep) continue outerLoop; - i += step[0]; - j += step[1]; - } - // No captures - } - return moves; + canTake() { + // No captures + return false; } underCheck(color) { diff --git a/client/src/variants/Pacosako.js b/client/src/variants/Pacosako.js index 4745f631..0462d2db 100644 --- a/client/src/variants/Pacosako.js +++ b/client/src/variants/Pacosako.js @@ -199,9 +199,9 @@ export class PacosakoRules extends ChessRules { ); } - static GenRandInitFen(randomness) { + static GenRandInitFen(options) { // Add 16 pawns flags + empty umove: - return ChessRules.GenRandInitFen(randomness) + return ChessRules.GenRandInitFen(options) .slice(0, -2) + "1111111111111111 - -"; } diff --git a/client/src/variants/Pandemonium1.js b/client/src/variants/Pandemonium1.js index 579ee9ce..aef9c06a 100644 --- a/client/src/variants/Pandemonium1.js +++ b/client/src/variants/Pandemonium1.js @@ -25,8 +25,8 @@ export class Pandemonium1Rules extends Pandemonium2Rules { return true; } - static GenRandInitFen(randomness) { - const baseFen = Pandemonium2Rules.GenRandInitFen(randomness) + static GenRandInitFen(options) { + const baseFen = Pandemonium2Rules.GenRandInitFen(options) return baseFen.substr(0, 22) + "91/91/" + baseFen.substr(22); } diff --git a/client/src/variants/Pandemonium2.js b/client/src/variants/Pandemonium2.js index 7951608a..4a980832 100644 --- a/client/src/variants/Pandemonium2.js +++ b/client/src/variants/Pandemonium2.js @@ -139,8 +139,8 @@ export class Pandemonium2Rules extends ChessRules { return counts.join(""); } - static GenRandInitFen(randomness) { - if (randomness == 0) { + static GenRandInitFen(options) { + if (options.randomness == 0) { return ( "rnbqkmcbnr/pppppppppp/91/91/91/91/PPPPPPPPPP/RNBQKMCBNR " + "w 0 ajaj - 00000000000000" @@ -150,7 +150,7 @@ export class Pandemonium2Rules extends ChessRules { let pieces = { w: new Array(10), b: new Array(10) }; let flags = ""; for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; flags += flags; break; @@ -379,39 +379,36 @@ export class Pandemonium2Rules extends ChessRules { getPotentialMarshalMoves(sq) { return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat( - this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep") + this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1) ); } getPotentialCardinalMoves(sq) { return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat( - this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep") + this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1) ); } getPotentialScepterMoves(sq) { const steps = V.steps[V.KNIGHT].concat(V.steps[V.BISHOP]).concat(V.steps[V.ROOK]); - return this.getSlideNJumpMoves(sq, steps, "oneStep"); + return this.getSlideNJumpMoves(sq, steps, 1); } getPotentialHorseMoves(sq) { return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat( - this.getSlideNJumpMoves(sq, V.steps[V.ROOK], "oneStep")); + this.getSlideNJumpMoves(sq, V.steps[V.ROOK], 1)); } getPotentialDragonMoves(sq) { return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat( - this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], "oneStep")); + this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1)); } getPotentialKingMoves(sq) { // Initialize with normal moves let moves = this.getSlideNJumpMoves( - sq, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); const c = this.turn; if ( this.castleFlags[c][0] < V.size.y || @@ -469,7 +466,7 @@ export class Pandemonium2Rules extends ChessRules { const steps = V.steps[V.KNIGHT].concat(V.steps[V.ROOK]).concat(V.steps[V.BISHOP]); return ( - super.isAttackedBySlideNJump(sq, color, V.SCEPTER, steps, "oneStep") + super.isAttackedBySlideNJump(sq, color, V.SCEPTER, steps, 1) ); } @@ -477,7 +474,7 @@ export class Pandemonium2Rules extends ChessRules { return ( super.isAttackedBySlideNJump(sq, color, V.HORSE, V.steps[V.BISHOP]) || super.isAttackedBySlideNJump( - sq, color, V.HORSE, V.steps[V.ROOK], "oneStep") + sq, color, V.HORSE, V.steps[V.ROOK], 1) ); } @@ -485,7 +482,7 @@ export class Pandemonium2Rules extends ChessRules { return ( super.isAttackedBySlideNJump(sq, color, V.DRAGON, V.steps[V.ROOK]) || super.isAttackedBySlideNJump( - sq, color, V.DRAGON, V.steps[V.BISHOP], "oneStep") + sq, color, V.DRAGON, V.steps[V.BISHOP], 1) ); } @@ -493,12 +490,7 @@ export class Pandemonium2Rules extends ChessRules { return ( super.isAttackedBySlideNJump(sq, color, V.MARSHAL, V.steps[V.ROOK]) || super.isAttackedBySlideNJump( - sq, - color, - V.MARSHAL, - V.steps[V.KNIGHT], - "oneStep" - ) + sq, color, V.MARSHAL, V.steps[V.KNIGHT], 1) ); } @@ -506,12 +498,7 @@ export class Pandemonium2Rules extends ChessRules { return ( super.isAttackedBySlideNJump(sq, color, V.CARDINAL, V.steps[V.BISHOP]) || super.isAttackedBySlideNJump( - sq, - color, - V.CARDINAL, - V.steps[V.KNIGHT], - "oneStep" - ) + sq, color, V.CARDINAL, V.steps[V.KNIGHT], 1) ); } diff --git a/client/src/variants/Parachute.js b/client/src/variants/Parachute.js index 631301c9..35ca6fbc 100644 --- a/client/src/variants/Parachute.js +++ b/client/src/variants/Parachute.js @@ -2,6 +2,11 @@ import { ChessRules, PiPo, Move } from "@/base_rules"; export class ParachuteRules extends ChessRules { + static get Options() { + // TODO: later, allow variant, placing piece giving check maybe... + return null; + } + static get HasFlags() { return false; } diff --git a/client/src/variants/Pawnmassacre.js b/client/src/variants/Pawnmassacre.js index 1fe61cbe..c08b585b 100644 --- a/client/src/variants/Pawnmassacre.js +++ b/client/src/variants/Pawnmassacre.js @@ -10,9 +10,9 @@ export class PawnmassacreRules extends ChessRules { return true; } - static GenRandInitFen(randomness) { + static GenRandInitFen(options) { const bFen = - ChessRules.GenRandInitFen(randomness) + ChessRules.GenRandInitFen(options) // Remove castle flags .slice(0, -6).concat("-"); const splitIdx = bFen.indexOf(' '); diff --git a/client/src/variants/Pawns.js b/client/src/variants/Pawns.js index b3e84ea9..fdecf0a4 100644 --- a/client/src/variants/Pawns.js +++ b/client/src/variants/Pawns.js @@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules"; export class PawnsRules extends ChessRules { + static get Options() { + return null; + } + static get PawnSpecs() { return Object.assign( {}, diff --git a/client/src/variants/Pawnsking.js b/client/src/variants/Pawnsking.js index bce2fe75..27fc90fe 100644 --- a/client/src/variants/Pawnsking.js +++ b/client/src/variants/Pawnsking.js @@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules"; export class PawnskingRules extends ChessRules { + static get Options() { + return null; + } + static get PawnSpecs() { return Object.assign( {}, diff --git a/client/src/variants/Perfect.js b/client/src/variants/Perfect.js index 0c5e6e11..65334e2a 100644 --- a/client/src/variants/Perfect.js +++ b/client/src/variants/Perfect.js @@ -58,19 +58,19 @@ export class PerfectRules extends ChessRules { getPotentialAmazonMoves(sq) { return super.getPotentialQueenMoves(sq).concat( - this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep") + this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1) ); } getPotentialEmpressMoves(sq) { return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat( - this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep") + this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1) ); } getPotentialPrincessMoves(sq) { return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat( - this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep") + this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1) ); } @@ -87,39 +87,21 @@ export class PerfectRules extends ChessRules { return ( this.isAttackedBySlideNJump(sq, color, V.AMAZON, V.steps[V.BISHOP]) || this.isAttackedBySlideNJump(sq, color, V.AMAZON, V.steps[V.ROOK]) || - this.isAttackedBySlideNJump( - sq, - color, - V.AMAZON, - V.steps[V.KNIGHT], - "oneStep" - ) + this.isAttackedBySlideNJump(sq, color, V.AMAZON, V.steps[V.KNIGHT], 1) ); } isAttackedByEmpress(sq, color) { return ( this.isAttackedBySlideNJump(sq, color, V.EMPRESS, V.steps[V.ROOK]) || - this.isAttackedBySlideNJump( - sq, - color, - V.EMPRESS, - V.steps[V.KNIGHT], - "oneStep" - ) + this.isAttackedBySlideNJump(sq, color, V.EMPRESS, V.steps[V.KNIGHT], 1) ); } isAttackedByPrincess(sq, color) { return ( this.isAttackedBySlideNJump(sq, color, V.PRINCESS, V.steps[V.BISHOP]) || - this.isAttackedBySlideNJump( - sq, - color, - V.PRINCESS, - V.steps[V.KNIGHT], - "oneStep" - ) + this.isAttackedBySlideNJump(sq, color, V.PRINCESS, V.steps[V.KNIGHT], 1) ); } @@ -134,11 +116,11 @@ export class PerfectRules extends ChessRules { return 2; } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "esqakbnr/pppppppp/8/8/8/8/PPPPPPPP/ESQAKBNR w 0 ahah -"; - const baseFen = ChessRules.GenRandInitFen(randomness); + const baseFen = ChessRules.GenRandInitFen(options); const fenParts = baseFen.split(' '); const posParts = fenParts[0].split('/'); diff --git a/client/src/variants/Pocketknight.js b/client/src/variants/Pocketknight.js index 41dbb725..ad17f937 100644 --- a/client/src/variants/Pocketknight.js +++ b/client/src/variants/Pocketknight.js @@ -33,10 +33,9 @@ export class PocketknightRules extends ChessRules { this.subTurn = 1; } - static GenRandInitFen(randomness) { + static GenRandInitFen(options) { // Add 2 knight flags - return ChessRules.GenRandInitFen(randomness) - .slice(0, -2) + "11 -"; + return ChessRules.GenRandInitFen(options).slice(0, -2) + "11 -"; } getFlagsFen() { diff --git a/client/src/variants/Queenpawns.js b/client/src/variants/Queenpawns.js index 0ea2e45f..1b02dcfc 100644 --- a/client/src/variants/Queenpawns.js +++ b/client/src/variants/Queenpawns.js @@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules"; export class QueenpawnsRules extends ChessRules { + static get Options() { + return null; + } + static get PawnSpecs() { return Object.assign( {}, diff --git a/client/src/variants/Racingkings.js b/client/src/variants/Racingkings.js index e898a554..745843b9 100644 --- a/client/src/variants/Racingkings.js +++ b/client/src/variants/Racingkings.js @@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules"; export class RacingkingsRules extends ChessRules { + static get Options() { + return null; + } + static get HasFlags() { return false; } diff --git a/client/src/variants/Recycle.js b/client/src/variants/Recycle.js index 4afae21c..de0ff501 100644 --- a/client/src/variants/Recycle.js +++ b/client/src/variants/Recycle.js @@ -28,8 +28,8 @@ export class RecycleRules extends ChessRules { ); } - static GenRandInitFen(randomness) { - return ChessRules.GenRandInitFen(randomness) + " 0000000000"; + static GenRandInitFen(options) { + return ChessRules.GenRandInitFen(options) + " 0000000000"; } getFen() { diff --git a/client/src/variants/Refusal1.js b/client/src/variants/Refusal1.js index 4f50d754..319d4ad2 100644 --- a/client/src/variants/Refusal1.js +++ b/client/src/variants/Refusal1.js @@ -29,8 +29,8 @@ export class Refusal1Rules extends ChessRules { // NOTE: with this variant's special rule, // some extra repetitions could be detected... TODO (...) - static GenRandInitFen(randomness) { - return ChessRules.GenRandInitFen(randomness).slice(0, -6) + "- null"; + static GenRandInitFen(options) { + return ChessRules.GenRandInitFen(options).slice(0, -6) + "- null"; } setOtherVariables(fen) { diff --git a/client/src/variants/Relayup.js b/client/src/variants/Relayup.js index 446c9273..029eeb55 100644 --- a/client/src/variants/Relayup.js +++ b/client/src/variants/Relayup.js @@ -46,7 +46,7 @@ export class RelayupRules extends ChessRules { else steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]); const extraMoves = super.getSlideNJumpMoves( - sq, steps, oneStep || [V.KNIGHT, V.KING].includes(pg)) + sq, steps, (oneStep || [V.KNIGHT, V.KING].includes(pg) ? 1 : null)) .filter(m => { return ( (piece != V.PAWN || m.end.x != lastRank) && diff --git a/client/src/variants/Rococo.js b/client/src/variants/Rococo.js index 6af29c05..3101a7c3 100644 --- a/client/src/variants/Rococo.js +++ b/client/src/variants/Rococo.js @@ -205,23 +205,11 @@ export class RococoRules extends ChessRules { // NOTE: not removing "dist" field; shouldn't matter much... } - getSlideNJumpMoves([x, y], steps, oneStep) { - const piece = this.getPiece(x, y); - let moves = []; - outerLoop: for (let step of steps) { - let i = x + step[0]; - let j = y + step[1]; - while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { - moves.push(this.getBasicMove([x, y], [i, j])); - if (oneStep !== undefined) continue outerLoop; - i += step[0]; - j += step[1]; - } - // Only king can take on occupied square: - if (piece == V.KING && V.OnBoard(i, j) && this.canTake([x, y], [i, j])) - moves.push(this.getBasicMove([x, y], [i, j])); - } - return moves; + canTake([x1, y1], [x2, y2]) { + return ( + this.getPiece(x1, y1) == V.KING && + this.getColor(x1, y1) != this.getColor(x2, y2) + ); } // "Cannon/grasshopper pawn" @@ -632,8 +620,8 @@ export class RococoRules extends ChessRules { return false; } - static GenRandInitFen(randomness) { - if (randomness == 0) { + static GenRandInitFen(options) { + if (options.randomness == 0) { return ( "91/1rqnbknqm1/1pppppppp1/91/91/91/91/1PPPPPPPP1/1MQNBKNQR1/91 w 0 -" ); @@ -642,7 +630,7 @@ export class RococoRules extends ChessRules { let pieces = { w: new Array(8), b: new Array(8) }; // Shuffle pieces on first and last rank for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; break; } diff --git a/client/src/variants/Rollerball.js b/client/src/variants/Rollerball.js index 36373b29..c39339ef 100644 --- a/client/src/variants/Rollerball.js +++ b/client/src/variants/Rollerball.js @@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules"; export class RollerballRules extends ChessRules { + static get Options() { + return null; + } + static get HasEnpassant() { return false; } @@ -121,14 +125,14 @@ export class RollerballRules extends ChessRules { const forward = (y <= 1 ? -1 : 1); return ( super.getSlideNJumpMoves( - [x, y], [[forward, -1], [forward, 0], [forward, 1]], "oneStep") + [x, y], [[forward, -1], [forward, 0], [forward, 1]], 1) ); } if (inMiddleY) { const forward = (x <= 1 ? 1 : -1); let moves = super.getSlideNJumpMoves( - [x, y], [[-1, forward], [0, forward], [1, forward]], "oneStep"); + [x, y], [[-1, forward], [0, forward], [1, forward]], 1); // Promotions may happen: let extraMoves = []; moves.forEach(m => { @@ -154,13 +158,13 @@ export class RollerballRules extends ChessRules { const forward = (toRight ? 1 : -1); return ( super.getSlideNJumpMoves( - [x, y], [[-1, forward], [0, forward], [1, forward]], "oneStep") + [x, y], [[-1, forward], [0, forward], [1, forward]], 1) ); } const forward = (toUp ? -1 : 1); return ( super.getSlideNJumpMoves( - [x, y], [[forward, -1], [forward, 0], [forward, 1]], "oneStep") + [x, y], [[forward, -1], [forward, 0], [forward, 1]], 1) ); } @@ -176,7 +180,7 @@ export class RollerballRules extends ChessRules { if (y >= 5) multiStep.push([1, 0]); else oneStep.push([1, 0]); const c = this.turn; - let moves = super.getSlideNJumpMoves([x, y], oneStep, "oneStep"); + let moves = super.getSlideNJumpMoves([x, y], oneStep, 1); for (let step of multiStep) { let [i, j] = [x + step[0], y + step[1]]; while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { @@ -248,7 +252,7 @@ export class RollerballRules extends ChessRules { if (!multiStep[str]) oneStep.push(V.DictBishopSteps[str]); }); const c = this.turn; - let moves = super.getSlideNJumpMoves([x, y], oneStep, "oneStep"); + let moves = super.getSlideNJumpMoves([x, y], oneStep, 1); for (let step of Object.values(multiStep)) { let [i, j] = [x + step[0], y + step[1]]; while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { @@ -345,7 +349,7 @@ export class RollerballRules extends ChessRules { ? [ [forward, -1], [forward, 0], [forward, 1] ] : [ [-1, forward], [0, forward], [1, forward] ]; return ( - super.isAttackedBySlideNJump([x, y], color, V.PAWN, steps, "oneStep") + super.isAttackedBySlideNJump([x, y], color, V.PAWN, steps, 1) ); } // In a corner: can be attacked by one square only @@ -359,7 +363,7 @@ export class RollerballRules extends ChessRules { else step = [-1, 0]; } return ( - super.isAttackedBySlideNJump([x, y], color, V.PAWN, [step], "oneStep") + super.isAttackedBySlideNJump([x, y], color, V.PAWN, [step], 1) ); } @@ -376,7 +380,7 @@ export class RollerballRules extends ChessRules { if (y >= 5) multiStep.push([-1, 0]); else oneStep.push([-1, 0]); if ( - super.isAttackedBySlideNJump([x, y], color, V.ROOK, oneStep, "oneStep") + super.isAttackedBySlideNJump([x, y], color, V.ROOK, oneStep, 1) ) { return true; } @@ -444,7 +448,7 @@ export class RollerballRules extends ChessRules { if (!multiStep[str]) oneStep.push(V.DictBishopSteps[str]); }); if ( - super.isAttackedBySlideNJump([x, y], color, V.BISHOP, oneStep, "oneStep") + super.isAttackedBySlideNJump([x, y], color, V.BISHOP, oneStep, 1) ) { return true; } diff --git a/client/src/variants/Rookpawns.js b/client/src/variants/Rookpawns.js index 1daae907..3ffa6fc6 100644 --- a/client/src/variants/Rookpawns.js +++ b/client/src/variants/Rookpawns.js @@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules"; export class RookpawnsRules extends ChessRules { + static get Options() { + return null; + } + static get PawnSpecs() { return Object.assign( {}, diff --git a/client/src/variants/Royalrace.js b/client/src/variants/Royalrace.js index 5d5992c8..3be0c149 100644 --- a/client/src/variants/Royalrace.js +++ b/client/src/variants/Royalrace.js @@ -24,14 +24,14 @@ export class RoyalraceRules extends ChessRules { return (b[1] == V.KNIGHT ? "Enpassant/" : "") + b; } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "92/92/92/92/92/92/92/92/92/qrbnp1PNBRQ/krbnp1PNBRK w 0"; let pieces = { w: new Array(10), b: new Array(10) }; // Shuffle pieces on first and second rank for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = JSON.parse(JSON.stringify(pieces['w'])).reverse(); pieces['b'] = pieces['b'].splice(5,10).reverse().concat( @@ -109,6 +109,7 @@ export class RoyalraceRules extends ChessRules { ); } + // TODO: simplify this when base function is more general. getPotentialPawnMoves([x, y]) { // Normal moves (as a rook) let moves = @@ -153,30 +154,13 @@ export class RoyalraceRules extends ChessRules { isAttackedByPawn([x, y], color) { // Pawns can capture forward and backward: - for (let pawnShift of [-1, 1]) { - if (0 < x + pawnShift && x + pawnShift < V.size.x) { - for (let i of [-1, 1]) { - if ( - y + i >= 0 && - y + i < V.size.y && - this.getPiece(x + pawnShift, y + i) == V.PAWN && - this.getColor(x + pawnShift, y + i) == color - ) { - return true; - } - } - } - } - return false; + return this.isAttackedBySlideNJump( + sq, color, V.PAWN, V.steps[V.BISHOP], 1); } isAttackedByKnight(sq, color) { return this.isAttackedBySlideNJump( - sq, - color, - V.KNIGHT, - V.steps[V.KNIGHT] - ); + sq, color, V.KNIGHT, V.steps[V.KNIGHT]); } getCurrentScore() { diff --git a/client/src/variants/Rugby.js b/client/src/variants/Rugby.js index d802ca1a..64c99426 100644 --- a/client/src/variants/Rugby.js +++ b/client/src/variants/Rugby.js @@ -3,6 +3,10 @@ import { ArrayFun } from "@/utils/array"; export class RugbyRules extends ChessRules { + static get Options() { + return null; + } + static get HasFlags() { return false; } @@ -29,7 +33,7 @@ export class RugbyRules extends ChessRules { this.turn == 'w' ? [ [-1,-1], [-1,1], [0,1], [0,-1], [1,-1], [1,0], [1,1] ] : [ [1,-1], [1,1], [0,1], [0,-1], [-1,-1], [-1,0], [-1,1] ]; - let addMoves = this.getSlideNJumpMoves(sq, steps, "oneStep"); + let addMoves = this.getSlideNJumpMoves(sq, steps, 1); return moves.concat(addMoves.filter(m => m.vanish.length == 1)); } diff --git a/client/src/variants/Schess.js b/client/src/variants/Schess.js index d8e1b1c5..5f585719 100644 --- a/client/src/variants/Schess.js +++ b/client/src/variants/Schess.js @@ -78,9 +78,9 @@ export class SchessRules extends ChessRules { ); } - static GenRandInitFen(randomness) { + static GenRandInitFen(options) { return ( - ChessRules.GenRandInitFen(randomness).slice(0, -2) + + ChessRules.GenRandInitFen(options).slice(0, -2) + // Add pieceFlags + pocket "1111111111111111 - 1111" ); @@ -221,13 +221,13 @@ export class SchessRules extends ChessRules { getPotentialHawkMoves(sq) { return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat( - this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep") + this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1) ); } getPotentialElephantMoves(sq) { return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat( - this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep") + this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1) ); } @@ -242,26 +242,14 @@ export class SchessRules extends ChessRules { isAttackedByHawk(sq, color) { return ( this.isAttackedBySlideNJump(sq, color, V.HAWK, V.steps[V.BISHOP]) || - this.isAttackedBySlideNJump( - sq, - color, - V.HAWK, - V.steps[V.KNIGHT], - "oneStep" - ) + this.isAttackedBySlideNJump(sq, color, V.HAWK, V.steps[V.KNIGHT], 1) ); } isAttackedByElephant(sq, color) { return ( this.isAttackedBySlideNJump(sq, color, V.ELEPHANT, V.steps[V.ROOK]) || - this.isAttackedBySlideNJump( - sq, - color, - V.ELEPHANT, - V.steps[V.KNIGHT], - "oneStep" - ) + this.isAttackedBySlideNJump(sq, color, V.ELEPHANT, V.steps[V.KNIGHT], 1) ); } @@ -330,9 +318,11 @@ export class SchessRules extends ChessRules { static get VALUES() { return Object.assign( - {}, - ChessRules.VALUES, - { 'h': 5, 'e': 7 } + { + 'h': 5, + 'e': 7 + }, + ChessRules.VALUES ); } diff --git a/client/src/variants/Screen.js b/client/src/variants/Screen.js index 8785560b..75da9600 100644 --- a/client/src/variants/Screen.js +++ b/client/src/variants/Screen.js @@ -4,6 +4,10 @@ import { ArrayFun } from "@/utils/array"; export class ScreenRules extends ChessRules { + static get Options() { + return null; + } + static get HasFlags() { return false; } diff --git a/client/src/variants/Shako.js b/client/src/variants/Shako.js index c3db2794..2701f1e2 100644 --- a/client/src/variants/Shako.js +++ b/client/src/variants/Shako.js @@ -68,7 +68,7 @@ export class ShakoRules extends ChessRules { } getPotentialElephantMoves([x, y]) { - return this.getSlideNJumpMoves([x, y], V.steps[V.ELEPHANT], "oneStep"); + return this.getSlideNJumpMoves([x, y], V.steps[V.ELEPHANT], 1); } getPotentialCannonMoves([x, y]) { @@ -115,7 +115,7 @@ export class ShakoRules extends ChessRules { isAttackedByElephant(sq, color) { return ( this.isAttackedBySlideNJump( - sq, color, V.ELEPHANT, V.steps[V.ELEPHANT], "oneStep" + sq, color, V.ELEPHANT, V.steps[V.ELEPHANT], 1 ) ); } @@ -185,8 +185,8 @@ export class ShakoRules extends ChessRules { return 2; } - static GenRandInitFen(randomness) { - if (randomness == 0) { + static GenRandInitFen(options) { + if (options.randomness == 0) { return ( "c8c/ernbqkbnre/pppppppppp/91/91/91/91/PPPPPPPPPP/ERNBQKBNRE/C8C " + "w 0 bibi -" @@ -197,7 +197,7 @@ export class ShakoRules extends ChessRules { let flags = ""; // Shuffle pieces on second (and before-last rank if randomness == 2) for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; flags += flags; break; diff --git a/client/src/variants/Shatranj.js b/client/src/variants/Shatranj.js index 0569f713..568e2d96 100644 --- a/client/src/variants/Shatranj.js +++ b/client/src/variants/Shatranj.js @@ -43,57 +43,40 @@ export class ShatranjRules extends ChessRules { ]; } - static GenRandInitFen(randomness) { + static GenRandInitFen(options) { // Remove castle flags and en-passant indication - return ChessRules.GenRandInitFen(randomness).slice(0, -7); + return ChessRules.GenRandInitFen(options).slice(0, -7); } getPotentialBishopMoves(sq) { - let moves = this.getSlideNJumpMoves(sq, V.ElephantSteps, "oneStep"); + let moves = this.getSlideNJumpMoves(sq, V.ElephantSteps, 1); // Complete with "repositioning moves": like a queen, without capture - let repositioningMoves = this.getSlideNJumpMoves( - sq, - V.steps[V.BISHOP], - "oneStep" - ).filter(m => m.vanish.length == 1); + let repositioningMoves = + this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1) + .filter(m => m.vanish.length == 1); return moves.concat(repositioningMoves); } getPotentialQueenMoves(sq) { // Diagonal capturing moves - let captures = this.getSlideNJumpMoves( - sq, - V.steps[V.BISHOP], - "oneStep" - ).filter(m => m.vanish.length == 2); + let captures = + this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1) + .filter(m => m.vanish.length == 2); return captures.concat( // Orthogonal non-capturing moves - this.getSlideNJumpMoves( - sq, - V.steps[V.ROOK], - "oneStep" - ).filter(m => m.vanish.length == 1) + this.getSlideNJumpMoves(sq, V.steps[V.ROOK], 1) + .filter(m => m.vanish.length == 1) ); } isAttackedByBishop(sq, color) { return this.isAttackedBySlideNJump( - sq, - color, - V.BISHOP, - V.ElephantSteps, - "oneStep" - ); + sq, color, V.BISHOP, V.ElephantSteps, 1); } isAttackedByQueen(sq, color) { return this.isAttackedBySlideNJump( - sq, - color, - V.QUEEN, - V.steps[V.BISHOP], - "oneStep" - ); + sq, color, V.QUEEN, V.steps[V.BISHOP], 1); } getCurrentScore() { diff --git a/client/src/variants/Shinobi.js b/client/src/variants/Shinobi.js index 995d2b91..e993188b 100644 --- a/client/src/variants/Shinobi.js +++ b/client/src/variants/Shinobi.js @@ -208,37 +208,34 @@ export class ShinobiRules extends ChessRules { if (this.getColor(x, y) == 'b') return super.getPotentialKingMoves([x, y]); // Clan doesn't castle: return super.getSlideNJumpMoves( - [x, y], - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } getPotentialCaptainMoves(sq) { const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]); - return super.getSlideNJumpMoves(sq, steps, "oneStep"); + return super.getSlideNJumpMoves(sq, steps, 1); } getPotentialNinjaMoves(sq) { return ( super.getSlideNJumpMoves(sq, V.steps[V.BISHOP]) - .concat(super.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")) + .concat(super.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)) ); } getPotentialDragonMoves(sq) { return ( super.getSlideNJumpMoves(sq, V.steps[V.ROOK]) - .concat(super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], "oneStep")) + .concat(super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1)) ); } getPotentialMonkMoves(sq) { - return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], "oneStep"); + return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1); } getPotentialHorseMoves(sq) { - return super.getSlideNJumpMoves(sq, [ [-2, 1], [-2, -1] ], "oneStep"); + return super.getSlideNJumpMoves(sq, [ [-2, 1], [-2, -1] ], 1); } getPotentialLanceMoves(sq) { @@ -267,7 +264,7 @@ export class ShinobiRules extends ChessRules { isAttackedByCaptain(sq, color) { const steps = V.steps[V.BISHOP].concat(V.steps[V.ROOK]); return ( - super.isAttackedBySlideNJump(sq, color, V.CAPTAIN, steps, "oneStep") + super.isAttackedBySlideNJump(sq, color, V.CAPTAIN, steps, 1) ); } @@ -275,7 +272,7 @@ export class ShinobiRules extends ChessRules { return ( super.isAttackedBySlideNJump(sq, color, V.NINJA, V.steps[V.BISHOP]) || super.isAttackedBySlideNJump( - sq, color, V.NINJA, V.steps[V.KNIGHT], "oneStep") + sq, color, V.NINJA, V.steps[V.KNIGHT], 1) ); } @@ -283,21 +280,21 @@ export class ShinobiRules extends ChessRules { return ( super.isAttackedBySlideNJump(sq, color, V.DRAGON, V.steps[V.ROOK]) || super.isAttackedBySlideNJump( - sq, color, V.DRAGON, V.steps[V.BISHOP], "oneStep") + sq, color, V.DRAGON, V.steps[V.BISHOP], 1) ); } isAttackedByMonk(sq, color) { return ( super.isAttackedBySlideNJump( - sq, color, V.MONK, V.steps[V.BISHOP], "oneStep") + sq, color, V.MONK, V.steps[V.BISHOP], 1) ); } isAttackedByHorse(sq, color) { return ( super.isAttackedBySlideNJump( - sq, color, V.HORSE, [ [2, 1], [2, -1] ], "oneStep") + sq, color, V.HORSE, [ [2, 1], [2, -1] ], 1) ); } diff --git a/client/src/variants/Shogi.js b/client/src/variants/Shogi.js index bca37627..1526aabd 100644 --- a/client/src/variants/Shogi.js +++ b/client/src/variants/Shogi.js @@ -113,8 +113,8 @@ export class ShogiRules extends ChessRules { ); } - static GenRandInitFen(randomness) { - if (randomness == 0) { + static GenRandInitFen(options) { + if (options.randomness == 0) { return ( "lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL " + "w 0 00000000000000" @@ -125,7 +125,7 @@ export class ShogiRules extends ChessRules { let pieces1 = { w: new Array(4), b: new Array(4) }; let positions2 = { w: new Array(2), b: new Array(2) }; for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces1['b'] = JSON.parse(JSON.stringify(pieces1['w'])).reverse(); positions2['b'] = JSON.parse(JSON.stringify(positions2['w'])).reverse() @@ -426,7 +426,7 @@ export class ShogiRules extends ChessRules { const forward = (this.turn == 'w' ? -1 : 1); return this.getSlideNJumpMoves( sq, - [[forward, 0]], + [ [forward, 0] ], { promote: V.P_LANCE, force: true @@ -492,35 +492,19 @@ export class ShogiRules extends ChessRules { isAttackedBySilver([x, y], color) { const shift = (color == 'w' ? 1 : -1); - for (let step of V.steps[V.BISHOP].concat([[shift, 0]])) { - const [i, j] = [x + step[0], y + step[1]]; - if ( - V.OnBoard(i, j) && - this.board[i][j] != V.EMPTY && - this.getColor(i, j) == color && - this.getPiece(i, j) == V.SILVER_G - ) { - return true; - } - } - return false; + return this.isAttackedBySlideNJump( + sq, color, V.SILVER, V.steps[V.BISHOP].concat([ [shift, 0] ]), 1); } isAttackedByPawn([x, y], color) { const shift = (color == 'w' ? 1 : -1); - const [i, j] = [x + shift, y]; - return ( - V.OnBoard(i, j) && - this.board[i][j] != V.EMPTY && - this.getColor(i, j) == color && - this.getPiece(i, j) == V.PAWN - ); + return this.isAttackedBySlideNJump(sq, color, V.PAWN, [ [shift, 0] ], 1); } isAttackedByKnight(sq, color) { const forward = (color == 'w' ? 2 : -2); return this.isAttackedBySlideNJump( - sq, color, V.KNIGHT, [[forward, 1], [forward, -1]], "oneStep"); + sq, color, V.KNIGHT, [ [forward, 1], [forward, -1] ], 1); } isAttackedByLance(sq, color) { @@ -531,16 +515,14 @@ export class ShogiRules extends ChessRules { isAttackedByDragon(sq, color) { return ( this.isAttackedBySlideNJump(sq, color, V.P_ROOK, V.steps[V.ROOK]) || - this.isAttackedBySlideNJump( - sq, color, V.P_ROOK, V.steps[V.BISHOP], "oneStep") + this.isAttackedBySlideNJump(sq, color, V.P_ROOK, V.steps[V.BISHOP], 1) ); } isAttackedByHorse(sq, color) { return ( this.isAttackedBySlideNJump(sq, color, V.P_BISHOP, V.steps[V.BISHOP]) || - this.isAttackedBySlideNJump( - sq, color, V.P_BISHOP, V.steps[V.ROOK], "oneStep") + this.isAttackedBySlideNJump(sq, color, V.P_BISHOP, V.steps[V.ROOK], 1) ); } diff --git a/client/src/variants/Shogun.js b/client/src/variants/Shogun.js index 1a20d329..c45dff23 100644 --- a/client/src/variants/Shogun.js +++ b/client/src/variants/Shogun.js @@ -51,8 +51,8 @@ export class ShogunRules extends ChessRules { ); } - static GenRandInitFen(randomness) { - return ChessRules.GenRandInitFen(randomness) + " 0000000000"; + static GenRandInitFen(options) { + return ChessRules.GenRandInitFen(options) + " 0000000000"; } getFen() { @@ -257,31 +257,31 @@ export class ShogunRules extends ChessRules { } getPotentialDuchessMoves(sq) { - return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], "oneStep"); + return super.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1); } getPotentialCaptainMoves(sq) { const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]); - return super.getSlideNJumpMoves(sq, steps, "oneStep"); + return super.getSlideNJumpMoves(sq, steps, 1); } getPotentialMortarMoves(sq) { return ( super.getSlideNJumpMoves(sq, V.steps[V.ROOK]) - .concat(super.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")) + .concat(super.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)) ); } getPotentialGeneralMoves(sq) { const steps = V.steps[V.BISHOP].concat(V.steps[V.ROOK]).concat(V.steps[V.KNIGHT]); - return super.getSlideNJumpMoves(sq, steps, "oneStep"); + return super.getSlideNJumpMoves(sq, steps, 1); } getPotentialArchbishopMoves(sq) { return ( super.getSlideNJumpMoves(sq, V.steps[V.BISHOP]) - .concat(super.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep")) + .concat(super.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1)) ); } @@ -299,14 +299,14 @@ export class ShogunRules extends ChessRules { isAttackedByDuchess(sq, color) { return ( super.isAttackedBySlideNJump( - sq, color, V.DUCHESS, V.steps[V.BISHOP], "oneStep") + sq, color, V.DUCHESS, V.steps[V.BISHOP], 1) ); } isAttackedByCaptain(sq, color) { const steps = V.steps[V.BISHOP].concat(V.steps[V.ROOK]); return ( - super.isAttackedBySlideNJump(sq, color, V.DUCHESS, steps, "oneStep") + super.isAttackedBySlideNJump(sq, color, V.DUCHESS, steps, 1) ); } @@ -314,7 +314,7 @@ export class ShogunRules extends ChessRules { return ( super.isAttackedBySlideNJump(sq, color, V.MORTAR, V.steps[V.ROOK]) || super.isAttackedBySlideNJump( - sq, color, V.MORTAR, V.steps[V.KNIGHT], "oneStep") + sq, color, V.MORTAR, V.steps[V.KNIGHT], 1) ); } @@ -322,7 +322,7 @@ export class ShogunRules extends ChessRules { const steps = V.steps[V.BISHOP].concat(V.steps[V.ROOK]).concat(V.steps[V.KNIGHT]); return ( - super.isAttackedBySlideNJump(sq, color, V.GENERAL, steps, "oneStep") + super.isAttackedBySlideNJump(sq, color, V.GENERAL, steps, 1) ); } @@ -331,7 +331,7 @@ export class ShogunRules extends ChessRules { super.isAttackedBySlideNJump(sq, color, V.ARCHBISHOP, V.steps[V.BISHOP]) || super.isAttackedBySlideNJump( - sq, color, V.ARCHBISHOP, V.steps[V.KNIGHT], "oneStep") + sq, color, V.ARCHBISHOP, V.steps[V.KNIGHT], 1) ); } diff --git a/client/src/variants/Sittuyin.js b/client/src/variants/Sittuyin.js index 5efd8cda..a18c2f0b 100644 --- a/client/src/variants/Sittuyin.js +++ b/client/src/variants/Sittuyin.js @@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea"; export class SittuyinRules extends ChessRules { + static get Options() { + return null; + } + static get HasFlags() { return false; } @@ -260,18 +264,11 @@ export class SittuyinRules extends ChessRules { getPotentialBishopMoves(sq) { const forward = (this.turn == 'w' ? -1 : 1); return this.getSlideNJumpMoves( - sq, - V.steps[V.BISHOP].concat([ [forward, 0] ]), - "oneStep" - ); + sq, V.steps[V.BISHOP].concat([ [forward, 0] ]), 1); } getPotentialQueenMoves(sq) { - return this.getSlideNJumpMoves( - sq, - V.steps[V.BISHOP], - "oneStep" - ); + return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP], 1); } getAllValidMoves() { @@ -289,22 +286,12 @@ export class SittuyinRules extends ChessRules { isAttackedByBishop(sq, color) { const forward = (this.turn == 'w' ? 1 : -1); return this.isAttackedBySlideNJump( - sq, - color, - V.BISHOP, - V.steps[V.BISHOP].concat([ [forward, 0] ]), - "oneStep" - ); + sq, color, V.BISHOP, V.steps[V.BISHOP].concat([ [forward, 0] ]), 1); } isAttackedByQueen(sq, color) { return this.isAttackedBySlideNJump( - sq, - color, - V.QUEEN, - V.steps[V.BISHOP], - "oneStep" - ); + sq, color, V.QUEEN, V.steps[V.BISHOP], 1); } underCheck(color) { diff --git a/client/src/variants/Spartan.js b/client/src/variants/Spartan.js index 2400e040..20919eaf 100644 --- a/client/src/variants/Spartan.js +++ b/client/src/variants/Spartan.js @@ -16,8 +16,8 @@ export class SpartanRules extends ChessRules { return b; } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "lgkcckwl/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 ah"; // Mapping white --> black (first knight --> general; TODO): @@ -30,7 +30,7 @@ export class SpartanRules extends ChessRules { 'g': 'g' }; - const baseFen = ChessRules.GenRandInitFen(randomness).replace('n', 'g'); + const baseFen = ChessRules.GenRandInitFen(options).replace('n', 'g'); return ( baseFen.substr(0, 8).split('').map(p => piecesMap[p]).join('') + baseFen.substr(8) @@ -154,7 +154,7 @@ export class SpartanRules extends ChessRules { getPotentialSpartanKingMoves(sq) { // No castle: const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]); - return super.getSlideNJumpMoves(sq, steps, "oneStep"); + return super.getSlideNJumpMoves(sq, steps, 1); } getPotentialHopliteMoves([x, y]) { @@ -212,26 +212,26 @@ export class SpartanRules extends ChessRules { const steps = V.steps[V.BISHOP].concat(V.steps['a']); Array.prototype.push.apply( moves, - super.getSlideNJumpMoves([x, y], steps, "oneStep") + super.getSlideNJumpMoves([x, y], steps, 1) ); return moves; } getPotentialCaptainMoves([x, y]) { const steps = V.steps[V.ROOK].concat(V.steps['d']); - return super.getSlideNJumpMoves([x, y], steps, "oneStep") + return super.getSlideNJumpMoves([x, y], steps, 1) } getPotentialGeneralMoves([x, y]) { return ( - super.getSlideNJumpMoves([x, y], V.steps[V.BISHOP], "oneStep") + super.getSlideNJumpMoves([x, y], V.steps[V.BISHOP], 1) .concat(super.getSlideNJumpMoves([x, y], V.steps[V.ROOK])) ); } getPotentialWarlordMoves([x, y]) { return ( - super.getSlideNJumpMoves([x, y], V.steps[V.KNIGHT], "oneStep") + super.getSlideNJumpMoves([x, y], V.steps[V.KNIGHT], 1) .concat(super.getSlideNJumpMoves([x, y], V.steps[V.BISHOP])) ); } @@ -249,25 +249,25 @@ export class SpartanRules extends ChessRules { } isAttackedByHoplite(sq) { - return super.isAttackedBySlideNJump(sq, 'b', V.PAWN, [[-1,0]], "oneStep"); + return super.isAttackedBySlideNJump(sq, 'b', V.PAWN, [[-1,0]], 1); } isAttackedByLieutenant(sq) { const steps = V.steps[V.BISHOP].concat(V.steps['a']); return ( - super.isAttackedBySlideNJump(sq, 'b', V.LIEUTENANT, steps, "oneStep") + super.isAttackedBySlideNJump(sq, 'b', V.LIEUTENANT, steps, 1) ); } isAttackedByCaptain(sq) { const steps = V.steps[V.ROOK].concat(V.steps['d']); - return super.isAttackedBySlideNJump(sq, 'b', V.CAPTAIN, steps, "oneStep"); + return super.isAttackedBySlideNJump(sq, 'b', V.CAPTAIN, steps, 1); } isAttackedByGeneral(sq) { return ( super.isAttackedBySlideNJump( - sq, 'b', V.GENERAL, V.steps[V.BISHOP], "oneStep") || + sq, 'b', V.GENERAL, V.steps[V.BISHOP], 1) || super.isAttackedBySlideNJump(sq, 'b', V.GENERAL, V.steps[V.ROOK]) ); } @@ -275,7 +275,7 @@ export class SpartanRules extends ChessRules { isAttackedByWarlord(sq) { return ( super.isAttackedBySlideNJump( - sq, 'b', V.WARLORD, V.steps[V.KNIGHT], "oneStep") || + sq, 'b', V.WARLORD, V.steps[V.KNIGHT], 1) || super.isAttackedBySlideNJump(sq, 'b', V.WARLORD, V.steps[V.BISHOP]) ); } diff --git a/client/src/variants/Squatter2.js b/client/src/variants/Squatter2.js index 15caaf5b..54c54c4e 100644 --- a/client/src/variants/Squatter2.js +++ b/client/src/variants/Squatter2.js @@ -81,8 +81,8 @@ export class Squatter2Rules extends ChessRules { return "1/2"; } - static GenRandInitFen(randomness) { - return SuicideRules.GenRandInitFen(randomness); + static GenRandInitFen(options) { + return SuicideRules.GenRandInitFen(options); } }; diff --git a/client/src/variants/Stealthbomb1.js b/client/src/variants/Stealthbomb1.js index dce7f5a9..a82d1700 100644 --- a/client/src/variants/Stealthbomb1.js +++ b/client/src/variants/Stealthbomb1.js @@ -16,8 +16,7 @@ export class Stealthbomb1Rules extends ChessRules { t: "q", u: "r", c: "b", - o: "n", - l: "k" + o: "n" }; } static get BOMB_CODE() { @@ -26,8 +25,7 @@ export class Stealthbomb1Rules extends ChessRules { q: "t", r: "u", b: "c", - n: "o", - k: "l" + n: "o" }; } @@ -77,7 +75,7 @@ export class Stealthbomb1Rules extends ChessRules { ); } - // Initiate the game by choosing a square for the bomb: + // Initiate the game by choosing a piece holding the bomb: doClick(square) { const c = this.turn; if ( @@ -91,6 +89,7 @@ export class Stealthbomb1Rules extends ChessRules { } const [x, y] = square; const piece = super.getPiece(x, y); + if (piece == V.KING) return null; //no bomb on king! return new Move({ appear: [ new PiPo({ x: x, y: y, c: c, p: V.BOMB_CODE[piece] }) ], vanish: [ new PiPo({ x: x, y: y, c: c, p: piece }) ], diff --git a/client/src/variants/Stealthbomb2.js b/client/src/variants/Stealthbomb2.js index 613a5c28..648ee299 100644 --- a/client/src/variants/Stealthbomb2.js +++ b/client/src/variants/Stealthbomb2.js @@ -3,7 +3,7 @@ import { Stealthbomb1Rules } from "@/variants/Stealthbomb1"; export class Stealthbomb2Rules extends Stealthbomb1Rules { - // Initiate the game by choosing a square for the bomb: + // Initiate the game by choosing a pawn holding the bomb: doClick(square) { const c = this.turn; if ( diff --git a/client/src/variants/Suction.js b/client/src/variants/Suction.js index 2bf3ecf7..77aef39a 100644 --- a/client/src/variants/Suction.js +++ b/client/src/variants/Suction.js @@ -149,9 +149,9 @@ export class SuctionRules extends ChessRules { }); } - static GenRandInitFen(randomness) { + static GenRandInitFen(options) { // Add empty cmove: - return SuicideRules.GenRandInitFen(randomness) + " -"; + return SuicideRules.GenRandInitFen(options) + " -"; } getCmoveFen() { diff --git a/client/src/variants/Suicide.js b/client/src/variants/Suicide.js index 13aaa6bb..3b3c03cd 100644 --- a/client/src/variants/Suicide.js +++ b/client/src/variants/Suicide.js @@ -135,13 +135,13 @@ export class SuicideRules extends ChessRules { return -super.evalPosition(); } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w 0 -"; let pieces = { w: new Array(8), b: new Array(8) }; for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; break; } diff --git a/client/src/variants/Swap.js b/client/src/variants/Swap.js index 167adeae..3f4cde40 100644 --- a/client/src/variants/Swap.js +++ b/client/src/variants/Swap.js @@ -146,9 +146,9 @@ export class SwapRules extends ChessRules { }); } - static GenRandInitFen(randomness) { + static GenRandInitFen(options) { // Add empty smove: - return ChessRules.GenRandInitFen(randomness) + " -"; + return ChessRules.GenRandInitFen(options) + " -"; } getSmoveFen() { diff --git a/client/src/variants/Synchrone1.js b/client/src/variants/Synchrone1.js index 7410d278..2aa5b45f 100644 --- a/client/src/variants/Synchrone1.js +++ b/client/src/variants/Synchrone1.js @@ -53,8 +53,8 @@ export class Synchrone1Rules extends ChessRules { ); } - static GenRandInitFen(randomness) { - return ChessRules.GenRandInitFen(randomness).slice(0, -1) + "-,- -"; + static GenRandInitFen(options) { + return ChessRules.GenRandInitFen(options).slice(0, -1) + "-,- -"; } getFen() { diff --git a/client/src/variants/Synchrone2.js b/client/src/variants/Synchrone2.js index dc038ecb..17b0be32 100644 --- a/client/src/variants/Synchrone2.js +++ b/client/src/variants/Synchrone2.js @@ -47,8 +47,8 @@ export class Synchrone2Rules extends Synchrone1Rules { ); } - static GenRandInitFen(randomness) { - const res = ChessRules.GenRandInitFen(randomness); + static GenRandInitFen(options) { + const res = ChessRules.GenRandInitFen(options); // Add initFen field: return res.slice(0, -1) + res.split(' ')[0] + " -"; } diff --git a/client/src/variants/Synochess.js b/client/src/variants/Synochess.js index f5ee12ad..74eecace 100644 --- a/client/src/variants/Synochess.js +++ b/client/src/variants/Synochess.js @@ -2,6 +2,18 @@ import { ChessRules, Move, PiPo } from "@/base_rules"; export class SynochessRules extends ChessRules { + static get Options() { + return { + check: [ + { + label: "Random", + defaut: false, + variable: "random" + } + ] + }; + } + static get LoseOnRepetition() { return true; } @@ -28,8 +40,8 @@ export class SynochessRules extends ChessRules { ); } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (!options.random) return "rneakenr/8/1c4c1/1ss2ss1/8/8/PPPPPPPP/RNBQKBNR w 0 ah - 2"; // Mapping kingdom --> dynasty: @@ -42,7 +54,7 @@ export class SynochessRules extends ChessRules { }; // Always symmetric (randomness = 1), because open files. - const baseFen = ChessRules.GenRandInitFen(1); + const baseFen = ChessRules.GenRandInitFen({ randomness: 1 }); return ( baseFen.substr(0, 8).split("").map(p => piecesMap[p]).join("") + "/8/1c4c1/1ss2ss1/" + baseFen.substr(22, 28) + " - 2" @@ -305,17 +317,14 @@ export class SynochessRules extends ChessRules { getPotentialAdvisorMoves(sq) { return super.getSlideNJumpMoves( - sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), "oneStep"); + sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } getPotentialKingMoves([x, y]) { if (this.getColor(x, y) == 'w') return super.getPotentialKingMoves([x, y]); // Dynasty doesn't castle: return super.getSlideNJumpMoves( - [x, y], - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), - "oneStep" - ); + [x, y], V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } getPotentialSoldierMoves([x, y]) { @@ -326,11 +335,11 @@ export class SynochessRules extends ChessRules { if (!lastRank) steps.push([shiftX, 0]); if (y > 0) steps.push([0, -1]); if (y < 9) steps.push([0, 1]); - return super.getSlideNJumpMoves([x, y], steps, "oneStep"); + return super.getSlideNJumpMoves([x, y], steps, 1); } getPotentialElephantMoves([x, y]) { - return this.getSlideNJumpMoves([x, y], V.steps[V.ELEPHANT], "oneStep"); + return this.getSlideNJumpMoves([x, y], V.steps[V.ELEPHANT], 1); } // NOTE: (mostly) duplicated from Shako (TODO?) @@ -417,26 +426,19 @@ export class SynochessRules extends ChessRules { } isAttackedByAdvisor(sq, color) { - return ( - super.isAttackedBySlideNJump( - sq, color, V.ADVISOR, - V.steps[V.ROOK].concat(V.steps[V.BISHOP]), "oneStep" - ) - ); + return super.isAttackedBySlideNJump( + sq, color, V.ADVISOR, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), 1); } isAttackedByElephant(sq, color) { - return ( - this.isAttackedBySlideNJump( - sq, color, V.ELEPHANT, V.steps[V.ELEPHANT], "oneStep" - ) - ); + return this.isAttackedBySlideNJump( + sq, color, V.ELEPHANT, V.steps[V.ELEPHANT], 1); } isAttackedBySoldier([x, y], color) { const shiftX = (color == 'w' ? 1 : -1); //shift from king return super.isAttackedBySlideNJump( - [x, y], color, V.SOLDIER, [[shiftX, 0], [0, 1], [0, -1]], "oneStep"); + [x, y], color, V.SOLDIER, [[shiftX, 0], [0, 1], [0, -1]], 1); } getAllValidMoves() { diff --git a/client/src/variants/Tencubed.js b/client/src/variants/Tencubed.js index af48977e..11270b21 100644 --- a/client/src/variants/Tencubed.js +++ b/client/src/variants/Tencubed.js @@ -60,8 +60,6 @@ export class TencubedRules extends ChessRules { static get steps() { return Object.assign( - {}, - ChessRules.steps, { w: [ [-3, -1], @@ -91,12 +89,13 @@ export class TencubedRules extends ChessRules { [2, 0], [0, 2] ] - } + }, + ChessRules.steps, ); } - static GenRandInitFen(randomness) { - if (randomness == 0) { + static GenRandInitFen(options) { + if (options.randomness == 0) { return ( "2cwamwc2/1rnbqkbnr1/pppppppppp/91/91/" + "91/91/PPPPPPPPPP/1RNBQKBNR1/2CWAMWC2/ " + @@ -104,7 +103,7 @@ export class TencubedRules extends ChessRules { ); } - const baseFen = V.ParseFen(ChessRules.GenRandInitFen(randomness)); + const baseFen = V.ParseFen(ChessRules.GenRandInitFen(options)); const positionParts = baseFen.position.split("/"); const bFen = ( "1" + positionParts[0] + @@ -164,22 +163,22 @@ export class TencubedRules extends ChessRules { getPotentialMarshallMoves(sq) { return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat( - this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep") + this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1) ); } getPotentialArchbishopMoves(sq) { return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat( - this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep") + this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], 1) ); } getPotentialChampionMoves(sq) { - return this.getSlideNJumpMoves(sq, V.steps[V.CHAMPION], "oneStep"); + return this.getSlideNJumpMoves(sq, V.steps[V.CHAMPION], 1); } getPotentialWizardMoves(sq) { - return this.getSlideNJumpMoves(sq, V.steps[V.WIZARD], "oneStep"); + return this.getSlideNJumpMoves(sq, V.steps[V.WIZARD], 1); } isAttacked(sq, color) { @@ -195,41 +194,28 @@ export class TencubedRules extends ChessRules { isAttackedByMarshall(sq, color) { return ( this.isAttackedBySlideNJump(sq, color, V.MARSHALL, V.steps[V.ROOK]) || - this.isAttackedBySlideNJump( - sq, - color, - V.MARSHALL, - V.steps[V.KNIGHT], - "oneStep" - ) + this.isAttackedBySlideNJump(sq, color, V.MARSHALL, V.steps[V.KNIGHT], 1) ); } isAttackedByArchbishop(sq, color) { return ( - this.isAttackedBySlideNJump(sq, color, V.ARCHBISHOP, V.steps[V.BISHOP]) || this.isAttackedBySlideNJump( - sq, - color, - V.ARCHBISHOP, - V.steps[V.KNIGHT], - "oneStep" - ) + sq, color, V.ARCHBISHOP, V.steps[V.BISHOP]) + || + this.isAttackedBySlideNJump( + sq, color, V.ARCHBISHOP, V.steps[V.KNIGHT], 1) ); } isAttackedByWizard(sq, color) { - return ( - this.isAttackedBySlideNJump( - sq, color, V.WIZARD, V.steps[V.WIZARD], "oneStep") - ); + return this.isAttackedBySlideNJump( + sq, color, V.WIZARD, V.steps[V.WIZARD], 1); } isAttackedByChampion(sq, color) { - return ( - this.isAttackedBySlideNJump( - sq, color, V.CHAMPION, V.steps[V.CHAMPION], "oneStep") - ); + return this.isAttackedBySlideNJump( + sq, color, V.CHAMPION, V.steps[V.CHAMPION], 1); } static get SEARCH_DEPTH() { @@ -238,9 +224,13 @@ export class TencubedRules extends ChessRules { static get VALUES() { return Object.assign( - {}, - ChessRules.VALUES, - { c: 4, w: 3, a: 6, m: 8 } + { + c: 4, + w: 3, + a: 6, + m: 8 + }, + ChessRules.VALUES ); } diff --git a/client/src/variants/Threechecks.js b/client/src/variants/Threechecks.js index c297d0a4..038d2238 100644 --- a/client/src/variants/Threechecks.js +++ b/client/src/variants/Threechecks.js @@ -48,9 +48,9 @@ export class ThreechecksRules extends ChessRules { return super.getCurrentScore(); } - static GenRandInitFen(randomness) { + static GenRandInitFen(options) { // Add check flags (at 0) - return ChessRules.GenRandInitFen(randomness).slice(0, -2) + "00"; + return ChessRules.GenRandInitFen(options).slice(0, -2) + "00"; } getFlagsFen() { diff --git a/client/src/variants/Titan.js b/client/src/variants/Titan.js index 4d71b857..425e08d8 100644 --- a/client/src/variants/Titan.js +++ b/client/src/variants/Titan.js @@ -154,6 +154,8 @@ export class TitanRules extends ChessRules { const [x, y] = [square[0], square[1]]; if ((color == 'w' && x != 7) || (color == 'b' && x != 0)) return null; const selectedPiece = this.board[x][y][1]; + // Prevent re-augmenting a chosen piece: + if (!ChessRules.PIECES.includes(selectedPiece)) return null; return new Move({ appear: [ new PiPo({ diff --git a/client/src/variants/Twokings.js b/client/src/variants/Twokings.js index 6606da58..b5f2b059 100644 --- a/client/src/variants/Twokings.js +++ b/client/src/variants/Twokings.js @@ -55,8 +55,8 @@ export class TwokingsRules extends CoregalRules { return squares; } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "rnqkkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNQKKBNR w 0 adehadeh -"; const replaceBishop = (fen, first, ch1, ch2) => { @@ -84,7 +84,7 @@ export class TwokingsRules extends CoregalRules { }; const fen = - CoregalRules.GenRandInitFen(randomness) + CoregalRules.GenRandInitFen(options) .replace("q", "k").replace("Q", "K"); // Now replace a bishop by the queen, // so that bishops are of different colors: diff --git a/client/src/variants/Upsidedown.js b/client/src/variants/Upsidedown.js index 43f38257..3149daea 100644 --- a/client/src/variants/Upsidedown.js +++ b/client/src/variants/Upsidedown.js @@ -12,13 +12,13 @@ export class UpsidedownRules extends ChessRules { return false; } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "RNBQKBNR/PPPPPPPP/8/8/8/8/pppppppp/rnbqkbnr w 0"; let pieces = { w: new Array(8), b: new Array(8) }; for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; break; } diff --git a/client/src/variants/Vchess.js b/client/src/variants/Vchess.js index c12435c5..fc433729 100644 --- a/client/src/variants/Vchess.js +++ b/client/src/variants/Vchess.js @@ -12,12 +12,7 @@ export class VchessRules extends ChessRules { isAttackedByPawn(sq, color) { return this.isAttackedBySlideNJump( - sq, - color, - V.PAWN, - V.steps[V.BISHOP], - "oneStep" - ); + sq, color, V.PAWN, V.steps[V.BISHOP], 1); } getNotation(move) { diff --git a/client/src/variants/Wildebeest.js b/client/src/variants/Wildebeest.js index 93353f9e..647a234a 100644 --- a/client/src/variants/Wildebeest.js +++ b/client/src/variants/Wildebeest.js @@ -181,15 +181,12 @@ export class WildebeestRules extends ChessRules { } getPotentialCamelMoves(sq) { - return this.getSlideNJumpMoves(sq, V.steps[V.CAMEL], "oneStep"); + return this.getSlideNJumpMoves(sq, V.steps[V.CAMEL], 1); } getPotentialWildebeestMoves(sq) { return this.getSlideNJumpMoves( - sq, - V.steps[V.KNIGHT].concat(V.steps[V.CAMEL]), - "oneStep" - ); + sq, V.steps[V.KNIGHT].concat(V.steps[V.CAMEL]), 1); } getPPpath(m) { @@ -276,22 +273,12 @@ export class WildebeestRules extends ChessRules { isAttackedByCamel(sq, color) { return this.isAttackedBySlideNJump( - sq, - color, - V.CAMEL, - V.steps[V.CAMEL], - "oneStep" - ); + sq, color, V.CAMEL, V.steps[V.CAMEL], 1); } isAttackedByWildebeest(sq, color) { return this.isAttackedBySlideNJump( - sq, - color, - V.WILDEBEEST, - V.steps[V.KNIGHT].concat(V.steps[V.CAMEL]), - "oneStep" - ); + sq, color, V.WILDEBEEST, V.steps[V.KNIGHT].concat(V.steps[V.CAMEL]), 1); } getCurrentScore() { @@ -311,8 +298,8 @@ export class WildebeestRules extends ChessRules { return 2; } - static GenRandInitFen(randomness) { - if (randomness == 0) { + static GenRandInitFen(options) { + if (options.randomness == 0) { return ( "rnccwkqbbnr/ppppppppppp/92/92/92/92/92/92/PPPPPPPPPPP/RNBBQKWCCNR " + "w 0 akak -" @@ -322,7 +309,7 @@ export class WildebeestRules extends ChessRules { let pieces = { w: new Array(11), b: new Array(11) }; let flags = ""; for (let c of ["w", "b"]) { - if (c == 'b' && randomness == 1) { + if (c == 'b' && options.randomness == 1) { pieces['b'] = pieces['w']; flags += flags; break; diff --git a/client/src/variants/Wormhole1.js b/client/src/variants/Wormhole1.js index 11901119..5d838b46 100644 --- a/client/src/variants/Wormhole1.js +++ b/client/src/variants/Wormhole1.js @@ -73,8 +73,8 @@ export class Wormhole1Rules extends Wormhole2Rules { }; } - static GenRandInitFen(randomness) { - if (randomness == 0) + static GenRandInitFen(options) { + if (options.randomness == 0) return "cnwmkwnc/pppppppp/8/8/8/8/PPPPPPPP/CNWMKWNC w 0"; // Mapping new --> standard: @@ -86,7 +86,7 @@ export class Wormhole1Rules extends Wormhole2Rules { 'k': 'k' }; - const baseFen = ChessRules.GenRandInitFen(randomness); + const baseFen = ChessRules.GenRandInitFen(options); return ( baseFen.substr(0, 8).split('').map(p => piecesMap[p]).join('') + baseFen.substr(8, 27) + diff --git a/client/src/variants/Xiangqi.js b/client/src/variants/Xiangqi.js index 6215ea9b..4fef5653 100644 --- a/client/src/variants/Xiangqi.js +++ b/client/src/variants/Xiangqi.js @@ -2,6 +2,10 @@ import { ChessRules } from "@/base_rules"; export class XiangqiRules extends ChessRules { + static get Options() { + return null; + } + // NOTE (TODO?) scanKings() could be more efficient (in Jangqi too) static get Monochrome() { @@ -154,7 +158,7 @@ export class XiangqiRules extends ChessRules { if (y > 0) steps.push([0, -1]); if (y < 9) steps.push([0, 1]); } - return super.getSlideNJumpMoves([x, y], steps, "oneStep"); + return super.getSlideNJumpMoves([x, y], steps, 1); } knightStepsFromRookStep(step) { @@ -172,7 +176,7 @@ export class XiangqiRules extends ChessRules { this.knightStepsFromRookStep(rookStep)); } } - return super.getSlideNJumpMoves([x, y], steps, "oneStep"); + return super.getSlideNJumpMoves([x, y], steps, 1); } getPotentialElephantMoves([x, y]) { @@ -188,7 +192,7 @@ export class XiangqiRules extends ChessRules { // "out of board" checks delayed to next method } } - return super.getSlideNJumpMoves([x, y], steps, "oneStep"); + return super.getSlideNJumpMoves([x, y], steps, 1); } getPotentialAdvisorMoves([x, y]) { @@ -212,11 +216,11 @@ export class XiangqiRules extends ChessRules { if (y == 3) step = [-direction, 1]; else step = [-direction, -1]; } - return super.getSlideNJumpMoves([x, y], [step], "oneStep"); + return super.getSlideNJumpMoves([x, y], [step], 1); } // In the middle of the palace: return ( - super.getSlideNJumpMoves([x, y], ChessRules.steps[V.BISHOP], "oneStep") + super.getSlideNJumpMoves([x, y], ChessRules.steps[V.BISHOP], 1) ); } @@ -234,11 +238,11 @@ export class XiangqiRules extends ChessRules { if (x > (c == 'w' ? V.size.x - 3 : 0)) steps.push([-1, 0]); if (y > 3) steps.push([0, -1]); if (y < 5) steps.push([0, 1]); - return super.getSlideNJumpMoves([x, y], steps, "oneStep"); + return super.getSlideNJumpMoves([x, y], steps, 1); } // In the middle of the palace: return ( - super.getSlideNJumpMoves([x, y], ChessRules.steps[V.ROOK], "oneStep") + super.getSlideNJumpMoves([x, y], ChessRules.steps[V.ROOK], 1) ); } @@ -283,7 +287,7 @@ export class XiangqiRules extends ChessRules { // The pawn necessarily crossed the river (attack on king) const shiftX = (color == 'w' ? 1 : -1); //shift from king return super.isAttackedBySlideNJump( - [x, y], color, V.PAWN, [[shiftX, 0], [0, 1], [0, -1]], "oneStep"); + [x, y], color, V.PAWN, [[shiftX, 0], [0, 1], [0, -1]], 1); } knightStepsFromBishopStep(step) { @@ -303,7 +307,7 @@ export class XiangqiRules extends ChessRules { } } return ( - super.isAttackedBySlideNJump([x, y], color, V.KNIGHT, steps, "oneStep") + super.isAttackedBySlideNJump([x, y], color, V.KNIGHT, steps, 1) ); } diff --git a/client/src/variants/Yote.js b/client/src/variants/Yote.js index 4e53fe91..6863026e 100644 --- a/client/src/variants/Yote.js +++ b/client/src/variants/Yote.js @@ -3,6 +3,10 @@ import { randInt } from "@/utils/alea"; export class YoteRules extends ChessRules { + static get Options() { + return null; + } + static get HasFlags() { return false; } @@ -72,7 +76,7 @@ export class YoteRules extends ChessRules { ); } - static GenRandInitFen(randomness) { + static GenRandInitFen() { return "6/6/6/6/6 w 0 12,12 -,-"; } diff --git a/client/src/variants/Zen.js b/client/src/variants/Zen.js index 7edbe40a..bfbc7e29 100644 --- a/client/src/variants/Zen.js +++ b/client/src/variants/Zen.js @@ -27,24 +27,6 @@ export class ZenRules extends ChessRules { return undefined; } - // TODO(?): some duplicated code in 2 next functions - getSlideNJumpMoves([x, y], steps, oneStep) { - let moves = []; - outerLoop: for (let loop = 0; loop < steps.length; loop++) { - const step = steps[loop]; - let i = x + step[0]; - let j = y + step[1]; - while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { - moves.push(this.getBasicMove([x, y], [i, j])); - if (oneStep) continue outerLoop; - i += step[0]; - j += step[1]; - } - // No capture check: handled elsewhere (next method) - } - return moves; - } - // follow steps from x,y until something is met. // if met piece is opponent and same movement (asA): eat it! findCaptures_aux([x, y], asA) { @@ -110,7 +92,7 @@ export class ZenRules extends ChessRules { return moves; } - canTake(sq1, sq2) { + canTake() { return false; //captures handled separately } diff --git a/client/src/views/Game.vue b/client/src/views/Game.vue index a2afb09d..bbc6484a 100644 --- a/client/src/views/Game.vue +++ b/client/src/views/Game.vue @@ -333,6 +333,29 @@ export default { ) ); }, + requestLastate: function(sid) { + // TODO: maybe also find opponent SID ? + //const oppSid = + // this.game.players.find(p => p.sid != this.st.user.sid).sid; + this.send("asklastate", { target: sid }); + let counter = 1; + this.askLastate = setInterval( + () => { + // Ask at most 3 times: + // if no reply after that there should be a network issue. + if ( + counter < 3 && + !this.gotLastate && + !!this.people[sid] + ) { + this.send("asklastate", { target: sid }); + counter++; + } + else clearInterval(this.askLastate); + }, + 1500 + ); + }, atCreation: function() { document.addEventListener('visibilitychange', this.visibilityChange); window.addEventListener('focus', this.onFocus); @@ -395,6 +418,8 @@ export default { "message", this.socketMessageListener); this.conn = new WebSocket(this.connexionString); this.conn.addEventListener("message", this.socketMessageListener); + const oppSid = this.getOppsid(); + if (!!oppSid) this.requestLaststate(oppSid); //in case of } }, 1000 @@ -672,24 +697,7 @@ export default { this.game.type == "live" && this.game.players.some(p => p.sid == user.sid) ) { - this.send("asklastate", { target: user.sid }); - let counter = 1; - this.askLastate = setInterval( - () => { - // Ask at most 3 times: - // if no reply after that there should be a network issue. - if ( - counter < 3 && - !this.gotLastate && - !!this.people[user.sid] - ) { - this.send("asklastate", { target: user.sid }); - counter++; - } - else clearInterval(this.askLastate); - }, - 1500 - ); + this.requestLaststate(user.sid); } break; } diff --git a/client/src/views/Hall.vue b/client/src/views/Hall.vue index 05ee05b5..224d5d21 100644 --- a/client/src/views/Hall.vue +++ b/client/src/views/Hall.vue @@ -52,8 +52,8 @@ main ) | {{ v.display }} // Variant-specific options (often at least randomness) - fieldset(v-if="!!newchallenge.V") - div(v-for="select of newchallenge.V.Options.select") + fieldset(v-if="!!newchallenge.V && newchallenge.V.Options") + div(v-for="select of newchallenge.V.Options.select || []") label(:for="select.variable + '_opt'") {{ st.tr[select.label] }} * select(:id="select.variable + '_opt'") option( @@ -62,7 +62,7 @@ main :selected="o.value == select.defaut" ) | {{ st.tr[o.label] }} - div(v-for="check of newchallenge.V.Options.check") + div(v-for="check of newchallenge.V.Options.check || []") label(:for="check.variable + '_opt'") {{ st.tr[check.label] }} * input( :id="check.variable + '_opt'" @@ -300,10 +300,6 @@ export default { } }, created: function() { - // TODO: remove this patch soon: - this.presetChalls.forEach(pc => { - if (!pc.options) pc.options = { randomness: pc.randomness }; - }); document.addEventListener('visibilitychange', this.visibilityChange); window.addEventListener('focus', this.onFocus); window.addEventListener('blur', this.onBlur); @@ -479,16 +475,12 @@ export default { this.conn = null; }, getRandomnessClass: function(pc) { - if ( - // TODO: one extra test here - !Number.isInteger(pc.options.randomness) && - !parseInt(pc.options.randomness, 10) - ) { + const opts = pc.options; + if (opts.randomness === undefined && opts.random === undefined) return {}; - } - return { - ["random-" + pc.options.randomness]: true - }; + if (opts.randomness !== undefined) + return { ["random-" + opts.randomness]: true }; + return { ["random-" + (opts.random ? 2 : 0)]: true }; }, anonymousCount: function() { let count = 0; @@ -1090,30 +1082,29 @@ export default { error = this.st.tr["Wrong color"]; } } - if (!!error) { - alert(error); - return; - } - window.V = this.newchallenge.V; - error = checkChallenge(this.newchallenge); if (error) { alert(error); return; } - // NOTE: "from" information is not required here - let chall = Object.assign({}, this.newchallenge); - chall.options = {}; + window.V = this.newchallenge.V; + let chall = Object.assign({ options: {} }, this.newchallenge); // Get/set options variables (if any) / TODO: v-model?! - for (const check of this.newchallenge.V.Options.check) { + for (const check of this.newchallenge.V.Options.check || []) { const elt = document.getElementById(check.variable + "_opt"); if (elt.checked) chall.options[check.variable] = true; } - for (const select of this.newchallenge.V.Options.select) { + for (const select of this.newchallenge.V.Options.select || []) { const elt = document.getElementById(select.variable + "_opt"); - chall.options[select.variable] = elt.value; + chall.options[select.variable] = parseInt(elt.value, 10) || elt.value; + } + error = checkChallenge(chall); + if (error) { + alert(this.st.tr[error]); + return; } chall.options.abridged = V.AbbreviateOptions(chall.options); // Add only if not already issued (not counting FEN): + // NOTE: "from" information is not required here if (this.challenges.some(c => ( c.from.sid == this.st.user.sid || diff --git a/client/src/views/Rules.vue b/client/src/views/Rules.vue index fc3a0cd9..d668ebae 100644 --- a/client/src/views/Rules.vue +++ b/client/src/views/Rules.vue @@ -8,9 +8,9 @@ main .card label.modal-close(for="modalOptions") h3 {{ st.tr["Options"] }} - fieldset(v-if="!!V") - div(v-for="select of V.Options.select") - label(:for="select.variable + '_opt'") {{ st.tr[select.label] }} * + fieldset(v-if="!!V && V.Options") + div(v-for="select of V.Options.select || []") + label(:for="select.variable + '_opt'") {{ st.tr[select.label] }} select(:id="select.variable + '_opt'") option( v-for="o of select.options" @@ -18,8 +18,8 @@ main :selected="o.value == select.defaut" ) | {{ st.tr[o.label] }} - div(v-for="check of V.Options.check") - label(:for="check.variable + '_opt'") {{ st.tr[check.label] }} * + div(v-for="check of V.Options.check || []") + label(:for="check.variable + '_opt'") {{ st.tr[check.label] }} input( :id="check.variable + '_opt'" type="checkbox" @@ -150,13 +150,17 @@ export default { setOptions: function() { let options = {}; // Get/set options variables / TODO: v-model?! - for (const check of this.V.Options.check) { + for (const check of this.V.Options.check || []) { const elt = document.getElementById(check.variable + "_opt"); if (elt.checked) options[check.variable] = true; } - for (const select of this.V.Options.select) { + for (const select of this.V.Options.select || []) { const elt = document.getElementById(select.variable + "_opt"); - options[select.variable] = elt.value; + options[select.variable] = parseInt(elt.value, 10) || elt.value; + } + if (!V.IsValidOptions(options)) { + alert(this.st.tr["Invalid options"]); + return; } document.getElementById("modalOptions").checked = false; if (this.whatNext == "analyze") this.gotoAnalyze(options); @@ -186,12 +190,12 @@ export default { CompgameStorage.remove(game.vname); game = null; } - if (!!game || Object.keys(V.Options).length == 0) next(game); + if (!!game || !V.Options) next(game); else askOptions(); }); } else { - if (Object.keys(V.Options).length == 0) next(); + if (!V.Options) next(); else askOptions(); } }, @@ -206,7 +210,7 @@ export default { CompgameStorage.remove(this.gameInfo.vname); }, gotoAnalyze: function(options) { - if (!options && Object.keys(V.Options).length > 0) { + if (!options && V.Options) { this.whatNext = "analyze"; doClick("modalOptions"); } diff --git a/client/src/views/Variants.vue b/client/src/views/Variants.vue index f60e5f1d..8de335e6 100644 --- a/client/src/views/Variants.vue +++ b/client/src/views/Variants.vue @@ -16,7 +16,7 @@ main h3 {{ st.tr["vt" + g] }} p {{ st.tr["vg" + g] }} ul - li(v-for="v of variantGroup.get(g)") + li(v-for="v of sortVariants(variantGroup.get(g))") a(:href="getLink(v)") {{ v.display }} |  – | {{ st.tr[v.description] }} @@ -59,6 +59,9 @@ export default { } }, methods: { + sortVariants: function(group) { + return group.sort( (v1, v2) => v1.name.localeCompare(v2.name) ); + }, // oninput listener, required for smartphones: setCurPrefix: function(e) { this.curPrefix = e.target.value;