Draft Hiddenqueen, Grasshopper and Knightmate chess (rules unwritten)
authorBenjamin Auder <benjamin.auder@somewhere>
Sun, 1 Mar 2020 15:47:20 +0000 (16:47 +0100)
committerBenjamin Auder <benjamin.auder@somewhere>
Sun, 1 Mar 2020 15:47:20 +0000 (16:47 +0100)
40 files changed:
TODO
client/public/images/pieces/Grasshopper/bg.svg [new file with mode: 0644]
client/public/images/pieces/Grasshopper/wg.svg [new file with mode: 0644]
client/public/images/pieces/Hiddenqueen/bt.svg [new file with mode: 0644]
client/public/images/pieces/Hiddenqueen/wt.svg [new file with mode: 0644]
client/public/images/pieces/Knightmate/bk.svg [moved from client/public/images/pieces/Knightmate/bn.svg with 100% similarity]
client/public/images/pieces/Knightmate/wk.svg [moved from client/public/images/pieces/Knightmate/wn.svg with 100% similarity]
client/src/base_rules.js
client/src/translations/en.js
client/src/translations/es.js
client/src/translations/fr.js
client/src/translations/rules/Enpassant/en.pug
client/src/translations/rules/Enpassant/es.pug
client/src/translations/rules/Enpassant/fr.pug
client/src/translations/rules/Grasshopper/en.pug [new file with mode: 0644]
client/src/translations/rules/Grasshopper/es.pug [new file with mode: 0644]
client/src/translations/rules/Grasshopper/fr.pug [new file with mode: 0644]
client/src/translations/rules/Hiddenqueen/en.pug [new file with mode: 0644]
client/src/translations/rules/Hiddenqueen/es.pug [new file with mode: 0644]
client/src/translations/rules/Hiddenqueen/fr.pug [new file with mode: 0644]
client/src/translations/rules/Knightmate/en.pug [new file with mode: 0644]
client/src/translations/rules/Knightmate/es.pug [new file with mode: 0644]
client/src/translations/rules/Knightmate/fr.pug [new file with mode: 0644]
client/src/translations/rules/Rifle/en.pug
client/src/translations/rules/Rifle/es.pug
client/src/translations/rules/Rifle/fr.pug
client/src/translations/rules/Wormhole/es.pug
client/src/variants/Alice.js
client/src/variants/Antiking.js
client/src/variants/Enpassant.js
client/src/variants/Grand.js
client/src/variants/Grasshopper.js [new file with mode: 0644]
client/src/variants/Hiddenqueen.js [new file with mode: 0644]
client/src/variants/Knightmate.js [new file with mode: 0644]
client/src/variants/Wildebeest.js
client/src/variants/Wormhole.js
client/src/views/Analyse.vue
client/src/views/Rules.vue
server/db/populate.sql
server/models/User.js

diff --git a/TODO b/TODO
index fb75f95..7bcb36f 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,9 +1,18 @@
-newmove received on mygames page should be added to storage if gtype == "live"
-and, on game page "mconnect" events => send newmove to them (better than current setup)
-also, mygames page should ask lastate infos to connected players if any (where it's not my turn)
-(maybe in component GameList, if g.type == "live" ...)
+# Functionality:
+On Game page "mconnect" events =>
+  send lastate to them (because they have the game infos) or just "your turn" - if their turn
+  remember them to send next "newmove" (or just "it's your turn") later - if not their turn
+  (=> listen for "mdisconnect" as well)
+From MyGames page: send "mconnect" to all online players (me included: potential multi-tabs)
+  When quit, send mdisconnect (relayed by server if no other MyGames tab).
+And remove current "notify through newmove" on server in sockets.js
 
 
+# Images:
 Color black wildebeest and camels pieces in white instead of transparent.
 Color black wildebeest and camels pieces in white instead of transparent.
+Color white grasshoppers as well. Adjust wormholes color and size.
+Better "Check3" king images: just horizontal red bars maybe (1 to 3).
+Center king image for Knightmate variant.
 
 
+# Misc:
 Saw once a "double challenge" bug, one anonymous and a second one logged
 Both were asked a challenge probably, and both challenges added as different ones.
 Saw once a "double challenge" bug, one anonymous and a second one logged
 Both were asked a challenge probably, and both challenges added as different ones.
diff --git a/client/public/images/pieces/Grasshopper/bg.svg b/client/public/images/pieces/Grasshopper/bg.svg
new file mode 100644 (file)
index 0000000..5c238e3
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 50 50" version="1.1"><path d="M45.906 2.969c-.043.008-.086.02-.125.031A1.002 1.002 0 0 0 45 4c0 7.152-4.719 10.906-4.719 10.906l-.031.031c-.324.04-.64.102-.938.25-1 .399-2.32 1.102-3.718 2-.899.5-1.899 1.118-3 1.72 0 0-.094-.009-.094.093-.602.398-5.79 2.805-12.188 5.406.801.7 1.583 1.489 2.282 2.188 2 2.101 2.699 4.718 2 7.218-.801 2.602-2.989 4.68-5.688 5.282-.5.101-1.093.218-1.593.218-1.899 0-3.7-.82-5-2.218l-.626-.594c0 1-.374 2.293-.874 3.594.5.101.8.21 1 .312.398.102 1.976.594 4.374.594 4.102 0 7.72-1.988 10.72-4.688L26 30.5c-.102-.5.313-1.094.813-1.094.5-.101 1.093.282 1.093.782l.688 4.5a42.763 42.763 0 0 0 3.093-3.626l.782.657 3.125 6.812a.997.997 0 0 0 1.343.469s.395-.18.844-.25c.45-.07.735-.055.938.188a1.01 1.01 0 0 0 1.562-1.282c-.797-.957-2.011-1.035-2.812-.906-.25.04-.239.094-.438.156l-2.812-6.218a1.022 1.022 0 0 0-.282-.375l-1.062-.844a71.725 71.725 0 0 0 1.625-2.375c.898 2.601 1.906 4.218 3.406 4.218 1.899 0 7.407-3.511 7.407-8.812 0-1.86-.442-3.777-1.25-5.219 1.593-1.047 5.18-3.914 5.937-9.125a1.003 1.003 0 0 0-.277-.879 1.003 1.003 0 0 0-.88-.277.994.994 0 0 0-.843.844c-.703 4.836-4.125 7.23-5.188 7.875-.097-.082-.21-.149-.312-.219C44.07 13.805 47 9.883 47 4a1 1 0 0 0-1.094-1.031zm-41 12.094a2.935 2.935 0 0 0-1.593.53c-1.2.802-1.626 2.305-1.126 3.907L7 43.406c-1.398-.398-3.605-.511-6.406.688-.5.199-.7.812-.5 1.312.101.399.508.594.906.594.102 0 .3-.008.5.094 4-1.7 6.305-.196 6.406-.094.301.2.793.2 1.094 0 .3-.2.508-.602.406-1L8.5 40.687c0-.101.094-.085.094-.187 1.5-3.398 1.613-7.2 1.312-10 .399.5.696 1 1.094 1.5 1 1.3 1.813 2.492 2.813 3.594 1.199 1.3 2.886 1.804 4.687 1.406 1.898-.398 3.688-2.008 4.188-3.906.5-1.801 0-3.688-1.5-5.188-2.602-2.699-6.301-5.71-9.5-8.312-1.5-1.301-2.899-2.508-4-3.407-.875-.75-1.844-1.152-2.782-1.125zM40.5 21c.8 0 1.5.7 1.5 1.5s-.7 1.5-1.5 1.5-1.5-.7-1.5-1.5.7-1.5 1.5-1.5zm-38 10.313c-.602.199-1.21.398-1.813.5-.3 0-.488.292-.687.593-.102.301-.012.7.188 1 .101.102 1.406 1.696 3.406 3.094zm26.188 3.375c-.602.601-1.18 1.117-1.782 1.718l.282 1.907c0 .199.117.398.218.5l4.188 5c.3.398.82.48 1.218.28.301-.1 1.383-.491 1.782-.093.199.2.511.406.812.406.2 0 .492-.117.594-.218.398-.399.492-.977.094-1.376-.899-1.101-2.399-1.113-3.5-.812L29 37.812z" id="surface1"/><metadata><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:dc="http://purl.org/dc/elements/1.1/"><rdf:Description about="https://iconscout.com/legal#licenses" dc:title="grasshopper,filled" dc:description="grasshopper,filled" dc:publisher="Iconscout" dc:date="2017-12-07" dc:format="image/svg+xml" dc:language="en"><dc:creator><rdf:Bag><rdf:li>Icons8</rdf:li></rdf:Bag></dc:creator></rdf:Description></rdf:RDF></metadata></svg>
\ No newline at end of file
diff --git a/client/public/images/pieces/Grasshopper/wg.svg b/client/public/images/pieces/Grasshopper/wg.svg
new file mode 100644 (file)
index 0000000..045fffe
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 50 50" version="1.1"><path d="M45.906 2.969c-.043.008-.086.02-.125.031A1.002 1.002 0 0 0 45 4c0 6.996-4.46 10.684-4.656 10.844a3.304 3.304 0 0 0-1.094.219.466.466 0 0 0-.063.03c-1.738.762-3.89 2.145-6.656 3.626-.043.02-.086.039-.125.062.059-.043-.59.348-1.437.75-.848.403-1.989.926-3.344 1.532a391.07 391.07 0 0 1-9.281 3.968c-3.73-3.3-8.149-6.738-10.594-8.875-.672-.582-1.441-.945-2.188-1.062a3.158 3.158 0 0 0-2.093.375c-1.203.703-1.707 2.304-1.219 3.937h-.031l.031.125L4.5 30.688c-1.04.328-2.527.812-3.688 1.03a1.01 1.01 0 0 0-.765.641c-.121.336-.055.711.172.985 0 0 2.445 3.058 5.718 4.5l1.125 5.593c-.214-.066-.156-.105-.406-.156-1.445-.285-3.539-.261-6.062.813a1.002 1.002 0 0 0-.254 1.789c.32.21.734.222 1.066.023 2.176-.926 3.797-.902 4.875-.687 1.078.215 1.532.593 1.532.593a1.001 1.001 0 0 0 1.563-1L8.499 40.5a.842.842 0 0 0 .094-.188c1.644-3.593 1.625-7.207 1.281-10.03 1.316 1.796 2.727 3.816 3.969 5.187h.031c1.07 1.16 2.48 1.668 3.813 1.593 1.332-.074 2.597-.671 3.562-1.562.965-.89 1.645-2.11 1.75-3.5.105-1.39-.422-2.895-1.688-4.188v-.03c-.417-.419-.878-.848-1.343-1.282a383.223 383.223 0 0 0 8.468-3.625c1.368-.61 2.536-1.148 3.407-1.563.808-.382 1.234-.582 1.625-.843l.125-.063c2.746-1.476 4.941-2.836 6.375-3.468.422-.165.699-.153 1.031 0 .332.152.691.488 1.031 1 .676 1.027 1.157 2.746 1.157 4.468 0 2.047-1.075 3.746-2.376 4.969a9.44 9.44 0 0 1-1.937 1.406c-.582.313-1.121.407-1.063.407-.042 0-.097.011-.25-.125-.152-.137-.347-.426-.562-.844-.434-.836-.902-2.16-1.344-3.782a1.002 1.002 0 0 0-1.812-.28c-.817 1.273-2.73 4.655-5.563 7.905L28 30.157a1 1 0 0 0-1.063-.875 1.008 1.008 0 0 0-.726.367c-.18.223-.254.508-.211.79l.531 3.468C23.621 36.734 20.074 39 16.094 39c-2.34 0-3.75-.531-3.75-.531a.994.994 0 0 0-1.024.14.995.995 0 0 0-.355.97 1 1 0 0 0 .691.765s1.778.656 4.438.656c4.218 0 7.855-2.07 10.812-4.688l.313 1.938a.997.997 0 0 0 .218.5l4.188 5a1 1 0 0 0 1.219.25s.394-.18.843-.25c.45-.07.735-.055.938.188.223.3.59.449.957.394a1.002 1.002 0 0 0 .574-1.676c-.797-.957-1.98-1.035-2.781-.906-.367.059-.41.129-.656.219l-3.563-4.282-.468-3.093c.199-.207.402-.414.593-.625a38.145 38.145 0 0 0 2.375-2.907l.813.657 3.125 6.812a.997.997 0 0 0 1.343.469s.395-.18.844-.25c.45-.07.735-.055.938.188a1.01 1.01 0 0 0 1.562-1.282c-.797-.957-2.011-1.035-2.812-.906-.25.04-.239.094-.438.156l-2.812-6.218a1.022 1.022 0 0 0-.282-.375l-1.093-.875a65 65 0 0 0 1.593-2.47c.25.743.485 1.618.782 2.188.285.547.59.996 1 1.375.41.38.988.657 1.593.657.711 0 1.258-.258 2-.657.743-.398 1.59-.949 2.376-1.687 1.574-1.477 3-3.684 3-6.438 0-1.86-.407-3.676-1.188-5.093 1.54-.989 5.227-3.836 6-9.157a1.003 1.003 0 0 0-.277-.879 1.003 1.003 0 0 0-.88-.277.994.994 0 0 0-.843.844c-.719 4.945-4.281 7.332-5.25 7.906-.086-.074-.16-.152-.25-.219C44.07 13.844 47 9.902 47 4a1 1 0 0 0-1.094-1.031zM4.844 17.063a1.26 1.26 0 0 1 .437 0c.332.054.73.226 1.157.593 2.542 2.227 6.984 5.684 10.625 8.907.003.003-.004.027 0 .03.113.31.37.544.687.626.004.004.027-.004.031 0 .746.676 1.461 1.336 2.094 1.968l.031.032c.907.941 1.153 1.828 1.094 2.625-.063.808-.48 1.59-1.125 2.187-.645.598-1.504.985-2.313 1.032-.808.046-1.539-.2-2.218-.938-1.801-1.988-3.328-4.594-6.375-8.25a1.002 1.002 0 0 0-1.215-.223 1.003 1.003 0 0 0-.504 1.13s1.21 4.75.406 9.437l-1-4.907-.031-.187a.879.879 0 0 0-.031-.094L4.187 19a1.169 1.169 0 0 0-.03-.125c-.34-1.023-.048-1.46.343-1.688.098-.058.215-.101.344-.125zM40.5 21a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3zM4.906 32.656l.5 2.625c-1.004-.648-1.855-1.414-2.5-2.062.801-.23 1.383-.387 2-.563z" id="surface1"/><metadata><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:dc="http://purl.org/dc/elements/1.1/"><rdf:Description about="https://iconscout.com/legal#licenses" dc:title="grasshopper" dc:description="grasshopper" dc:publisher="Iconscout" dc:date="2017-12-07" dc:format="image/svg+xml" dc:language="en"><dc:creator><rdf:Bag><rdf:li>Icons8</rdf:li></rdf:Bag></dc:creator></rdf:Description></rdf:RDF></metadata></svg>
\ No newline at end of file
diff --git a/client/public/images/pieces/Hiddenqueen/bt.svg b/client/public/images/pieces/Hiddenqueen/bt.svg
new file mode 100644 (file)
index 0000000..ea17c33
--- /dev/null
@@ -0,0 +1,7 @@
+<svg width="2048" height="2048" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
+ <g class="layer">
+  <title>Layer 1</title>
+  <path id="svg_1" fill="#000" transform="translate(0,2048) scale(1,-1)" fill-rule="nonzero" d="m1024,205l-540,0q-40,100 -40,209q0,185 105,332t270,210q-71,33 -115,99t-45,151q0,105 70,182t172,89q-81,61 -81,161q0,84 59,144t145,60q84,0 144,-60t60,-144q0,-100 -81,-161q102,-12 172,-89t70,-182q0,-84 -45,-150t-116,-100q165,-63 270,-210t105,-332q0,-108 -39,-209l-540,0z"/>
+  <path d="m819,376c-1.10864,-2.65115 -1.43005,-3.20636 -1.81732,-3.81818c-0.43079,-0.68066 -0.92487,-1.41653 -1.48804,-2.2005c-0.60889,-0.8476 -1.27008,-1.75565 -2.86133,-3.64798c-0.87073,-1.03552 -1.84528,-2.10236 -2.89648,-3.24301c-1.13385,-1.23032 -2.37537,-2.5477 -3.71552,-3.98099c-1.45422,-1.5553 -3.04144,-3.23602 -6.55463,-7.10934c-1.97681,-2.17944 -4.06763,-4.53577 -6.26703,-7.047c-2.3103,-2.63788 -4.69867,-5.40512 -7.14899,-8.289c-2.52118,-2.96729 -5.09711,-6.00662 -10.25067,-12.33066c-2.61664,-3.21088 -5.22595,-6.49396 -7.86749,-9.84302c-2.69867,-3.42151 -5.44696,-6.94714 -8.27252,-10.58099c-2.91949,-3.75473 -5.93329,-7.65588 -12.35999,-15.90933c-3.41547,-4.38628 -6.95422,-8.9063 -10.56299,-13.5345c-3.65521,-4.68777 -7.31976,-9.39703 -10.94104,-14.1015c-3.57062,-4.63864 -7.07538,-9.15788 -13.49597,-17.864c-2.97205,-4.03 -5.71832,-7.89087 -8.29053,-11.57249c-2.44452,-3.49889 -4.73553,-6.86145 -6.91345,-10.08751c-2.09222,-3.09909 -4.07996,-6.11176 -7.96271,-11.84c-1.88171,-2.77608 -3.75427,-5.48759 -5.6145,-8.13901c-1.82922,-2.60718 -3.64941,-5.15764 -5.46149,-7.653c-1.78436,-2.45724 -3.54993,-4.87331 -7.09064,-9.54132c-1.73474,-2.28705 -3.47064,-4.52077 -5.1825,-6.7155c-1.68158,-2.1559 -3.3396,-4.2627 -4.95752,-6.32851c-1.58038,-2.01788 -3.13312,-3.97557 -6.02667,-7.78934c-1.37946,-1.81818 -2.68964,-3.59576 -3.92999,-5.33399c-1.19934,-1.68072 -2.33246,-3.32444 -3.39001,-4.938c-1.02209,-1.55947 -2.00916,-3.07068 -3.67999,-6.06133c-0.7948,-1.42258 -1.50128,-2.83826 -2.1615,-4.2285c-0.6449,-1.35799 -1.23981,-2.70664 -1.81049,-4.0395c-0.5636,-1.3162 -1.09601,-2.63194 -2.1947,-5.232c-0.5498,-1.30115 -1.11273,-2.59476 -1.68146,-3.8775c-0.56335,-1.27058 -1.12866,-2.51943 -1.69055,-3.7425c-0.54913,-1.19524 -1.08734,-2.35553 -2.12799,-4.54666c-0.48743,-1.02637 -0.95947,-2.00164 -1.401,-2.93401c-0.41974,-0.88636 -0.81396,-1.72973 -1.16699,-2.53799c-0.33398,-0.7646 -0.66193,-1.48513 -1.09863,-2.86134c-0.19977,-0.62952 -0.33636,-1.23968 -0.44702,-1.8195c-0.10492,-0.54971 -0.17834,-1.07628 -0.24902,-1.5765c-0.06726,-0.47612 -0.10406,-0.93633 -0.30396,-1.77066c-0.09442,-0.39422 -0.2287,-0.76503 -0.37201,-1.119c-0.13953,-0.34473 -0.2948,-0.67261 -0.44403,-0.993c-0.14545,-0.31228 -0.30652,-0.60992 -0.51733,-1.22134c-0.10205,-0.29589 -0.16907,-0.59618 -0.21899,-0.891c-0.04852,-0.28667 -0.07629,-0.56709 -0.09296,-0.837c-0.01587,-0.25748 -0.0202,-0.50133 -0.02136,-0.93867c-0.00049,-0.19017 -0.00055,-0.36139 0.00452,-0.5145c0.00452,-0.13624 0.01184,-0.25707 0.03149,-0.3615c0.01727,-0.09199 0.03271,-0.18232 0.13068,-0.29067c0.04773,-0.05276 0.11749,-0.08546 0.19049,-0.114c0.0777,-0.03036 0.16376,-0.05228 0.25348,-0.078c0.09399,-0.02693 0.19531,-0.04832 0.38934,-0.14133c0.10291,-0.04932 0.20178,-0.11667 0.3045,-0.186c0.10663,-0.07198 0.21503,-0.14935 0.33148,-0.222c0.11987,-0.07477 0.24329,-0.15697 0.5307,-0.25867c0.15192,-0.05376 0.31689,-0.08492 0.48596,-0.114c0.1723,-0.02964 0.34753,-0.05153 0.52203,-0.078c0.17285,-0.02621 0.34607,-0.04227 0.65863,-0.14133c0.14832,-0.04701 0.28595,-0.11616 0.42303,-0.186c0.14026,-0.07146 0.28375,-0.15067 0.44098,-0.222c0.16809,-0.07627 0.3526,-0.16115 0.80267,-0.25867c0.26227,-0.05682 0.55566,-0.08547 0.87152,-0.1095c0.33618,-0.02557 0.69092,-0.03843 1.06049,-0.0465c0.38141,-0.00833 0.77197,-0.00999 1.56799,-0.01067c0.40015,-0.00034 0.80133,0 1.20453,0c0.40613,0 0.81628,0 1.23145,0c0.4212,0 0.84937,-0.00032 1.73071,0c0.45496,0.00017 0.92004,-0.0002 1.39496,0.009c0.48511,0.0094 0.98041,0.0271 1.48505,0.063c0.51538,0.03666 1.04401,0.07384 2.12,0.26134c0.55768,0.09718 1.12451,0.23282 1.70398,0.39c0.59943,0.1626 1.21448,0.35448 1.84802,0.57c0.65924,0.22427 1.34271,0.46952 2.78131,1.04c0.76727,0.30426 1.56073,0.63686 2.38501,0.9855c0.85577,0.36196 1.74017,0.74325 2.65497,1.1385c0.94519,0.40839 1.91895,0.83327 3.96002,1.70933c1.06439,0.45686 2.16107,0.92152 3.28497,1.4085c1.15613,0.50095 2.34265,1.02319 3.55505,1.5795c1.24774,0.57254 2.53369,1.16103 5.15997,2.512c1.37213,0.70581 2.76324,1.47058 4.18048,2.27551c1.45355,0.82556 2.92798,1.69667 4.42352,2.6085c1.5282,0.9317 3.08209,1.89312 6.22931,3.94933c1.6156,1.05553 3.23999,2.15211 4.88104,3.2715c1.66034,1.13257 3.3288,2.28886 5.00696,3.4605c1.68921,1.17935 3.38171,2.37145 6.77869,4.768c1.69983,1.19923 3.39618,2.39762 5.091,3.5865c1.68658,1.18311 3.36505,2.35431 5.03699,3.5055c1.6554,1.13979 3.29022,2.26878 6.5387,4.408c1.58313,1.04253 3.14508,2.0392 4.66949,2.997c1.47174,0.92471 2.89087,1.79814 4.24646,2.619c1.27759,0.77361 2.47131,1.49071 4.58405,2.71734c0.89435,0.51924 1.68896,0.96973 2.39099,1.3575c0.61285,0.33851 1.14874,0.62532 1.617,0.8625c0.40271,0.20399 0.74957,0.37872 1.32532,0.61333c0.2334,0.09511 0.44122,0.16673 0.62402,0.2145c0.15613,0.0408 0.2926,0.06414 0.40796,0.0615c0.09772,-0.00224 0.19232,-0.01271 0.30133,-0.10933c0.05328,-0.04719 0.08551,-0.11752 0.11401,-0.19051c0.03033,-0.07771 0.05231,-0.16378 0.078,-0.25349c0.02692,-0.09395 0.04828,-0.1953 0.14136,-0.38934c0.04974,-0.10377 0.12097,-0.20825 0.19946,-0.327c0.09076,-0.13728 0.19836,-0.29673 0.31653,-0.489c0.13855,-0.22553 0.2995,-0.49072 0.65063,-1.184c0.21619,-0.42685 0.44244,-0.91831 0.68555,-1.47c0.26801,-0.60817 0.54779,-1.27835 0.8385,-2.01c0.31323,-0.78824 0.64423,-1.63514 1.30933,-3.52c0.36224,-1.02657 0.72198,-2.11224 1.09045,-3.2475c0.38232,-1.17804 0.76605,-2.39761 1.1535,-3.6525c0.3963,-1.28342 0.79492,-2.59207 1.58936,-5.26666c0.40228,-1.35437 0.80133,-2.72 1.20453,-4.095c0.40613,-1.385 0.81488,-2.78042 1.23145,-4.185c0.4198,-1.41542 0.84082,-2.84263 1.73071,-5.72c0.45032,-1.45618 0.9165,-2.91892 1.38599,-4.3905c0.47186,-1.47909 0.94879,-2.9632 1.422,-4.4535c0.47412,-1.49336 0.9541,-2.98681 1.85864,-5.98933c0.45117,-1.4976 0.88354,-2.99462 1.30054,-4.4865c0.4137,-1.48014 0.80902,-2.94961 1.18347,-4.4055c0.36914,-1.43515 0.72906,-2.84781 1.34937,-5.608c0.29956,-1.33287 0.56592,-2.63854 0.828,-3.9105c0.25525,-1.23871 0.49957,-2.44492 0.75598,-3.6135c0.24908,-1.13507 0.47559,-2.24248 1.08264,-4.30933c0.28955,-0.9857 0.62317,-1.92178 0.97205,-2.811c0.33435,-0.85207 0.68585,-1.65151 1.04395,-2.397c0.3371,-0.70169 0.66272,-1.35289 1.31738,-2.45867c0.28168,-0.47579 0.55511,-0.88977 0.81445,-1.248c0.23071,-0.31871 0.45068,-0.59049 0.6615,-0.816c0.18634,-0.19935 0.35773,-0.37338 0.69067,-0.60267c0.14063,-0.09685 0.27814,-0.1688 0.40955,-0.2055c0.11896,-0.03321 0.23987,-0.03585 0.3465,0.0015c0.11121,0.03895 0.2276,0.11518 0.41064,0.37067c0.11273,0.1573 0.20728,0.36102 0.32251,0.5895c0.13153,0.26081 0.27795,0.55835 0.45752,0.8865c0.20166,0.36848 0.42743,0.78229 1.05328,1.69067c0.36353,0.52759 0.79254,1.08141 1.26154,1.6755c0.50275,0.6368 1.0498,1.30461 1.63049,2.0085c0.61029,0.73983 1.25537,1.50788 2.60797,3.14933c0.71198,0.86404 1.44379,1.76202 2.19452,2.6985c0.77875,0.97145 1.57971,1.98637 2.40149,3.0495c0.85474,1.10578 1.74194,2.25875 3.57068,4.752c0.97137,1.32429 1.9599,2.71151 2.97601,4.1475c1.04535,1.47729 2.10828,2.99764 3.19202,4.5525c1.10364,1.58347 2.21851,3.1953 4.49866,6.46666c1.15356,1.65499 2.31482,3.31571 3.495,4.968c1.17981,1.65173 2.37048,3.28915 3.58496,4.896c1.20563,1.59515 2.39581,3.1812 4.92004,6.13599c1.23303,1.44332 2.50171,2.81114 3.77698,4.12051c1.2478,1.28116 2.50366,2.49554 3.75897,3.64349c1.21979,1.11549 2.41473,2.18547 4.79736,4.06934c1.12189,0.88708 2.23187,1.69363 3.31049,2.4435c1.03241,0.71777 2.03918,1.37619 3.01349,1.9845c0.92957,0.58038 1.82465,1.11858 3.50934,2.072c0.77728,0.4399 1.51813,0.84354 2.22003,1.215c0.6582,0.34834 1.27777,0.66451 1.85999,0.94501c0.53796,0.25919 1.03192,0.50042 1.91998,0.84c0.37726,0.14425 0.72229,0.25057 1.03351,0.3285c0.2771,0.06938 0.52838,0.11395 0.75452,0.1395c0.20306,0.02295 0.388,0.03037 0.71198,0.032c0.14532,0.00073 0.2829,0.0005 0.414,-0.009c0.12762,-0.00925 0.25403,-0.02747 0.37799,-0.063c0.12903,-0.03699 0.26672,-0.0854 0.54138,-0.26134c0.16071,-0.10296 0.32758,-0.24139 0.513,-0.4035c0.21228,-0.18555 0.44647,-0.40778 0.711,-0.66451c0.30096,-0.29211 0.63763,-0.62768 1.44263,-1.432c0.47485,-0.47447 0.99738,-0.99733 1.56604,-1.56599c0.61267,-0.61267 1.26733,-1.26734 1.96198,-1.96201c0.73267,-0.73267 1.50134,-1.50134 3.13867,-3.13866c0.86536,-0.86534 1.7627,-1.76268 2.69397,-2.694c0.96735,-0.96735 1.97272,-1.97268 3.01801,-3.018c1.08734,-1.08735 2.21893,-2.21844 4.62134,-4.62134c1.27863,-1.27888 2.62988,-2.6301 4.06952,-4.083c1.55658,-1.57095 3.24609,-3.28898 5.08649,-5.181c2.02295,-2.07968 4.24658,-4.37392 9.34399,-9.736c2.92596,-3.07789 6.03973,-6.38836 9.29553,-9.849c3.33484,-3.54467 6.68225,-7.11063 9.98846,-10.623c3.19751,-3.39692 6.21265,-6.62256 11.54938,-12.19467c2.17334,-2.26921 4.04279,-4.17982 5.62799,-5.7885c1.33252,-1.35226 2.46021,-2.47758 3.396,-3.4395c0.79883,-0.82113 1.51447,-1.53076 2.64264,-2.93867c0.5636,-0.70339 1.08447,-1.46054 1.59601,-2.2305c0.50983,-0.76745 0.98962,-1.53894 1.45203,-2.2935c0.44482,-0.72584 0.84723,-1.42617 1.61865,-2.64267c0.32935,-0.51934 0.63495,-0.96974 0.92401,-1.3485c0.25079,-0.32861 0.48267,-0.59973 0.70801,-0.7995c0.18939,-0.16791 0.36847,-0.3327 0.70129,-0.352c0.14667,-0.00851 0.29425,0.07086 0.41852,0.189c0.14679,0.13955 0.27588,0.3489 0.40948,0.603c0.15674,0.29814 0.31427,0.65612 0.672,1.54133c0.21375,0.529 0.44244,1.12308 0.69,1.7835c0.27271,0.7275 0.56311,1.52791 0.87,2.4045c0.33337,0.95232 0.69098,1.98444 1.44,4.312c0.41595,1.29255 0.84204,2.67498 1.28552,4.1415c0.46735,1.54543 0.94672,3.17011 1.43848,4.8705c0.51202,1.77058 1.03931,3.60962 2.10938,7.488c0.55951,2.02777 1.12061,4.11183 1.69501,6.243c0.58563,2.17282 1.17834,4.38244 1.78497,6.621c0.61334,2.26345 1.22723,4.54758 2.52002,9.136c0.64807,2.30014 1.31146,4.58801 1.98151,6.855c0.66199,2.23965 1.32611,4.43817 1.99048,6.585c0.64673,2.08981 1.27368,4.11269 2.52802,7.89333c0.58167,1.75317 1.15356,3.40543 1.71448,4.959c0.52893,1.46498 1.04681,2.83647 1.56152,4.113c0.48224,1.19596 0.93231,2.31645 1.89063,4.26133c0.42816,0.86893 0.86761,1.6503 1.2915,2.358c0.38892,0.64931 0.76733,1.22779 1.12054,1.746c0.31824,0.4669 0.62366,0.86937 1.08795,1.56267c0.18573,0.27739 0.33002,0.52288 0.44702,0.7335c0.09869,0.17757 0.17432,0.33115 0.24902,0.4545c0.06384,0.10543 0.12195,0.20972 0.30396,0.312c0.10327,0.05804 0.23651,0.08549 0.38104,0.10049c0.15704,0.0163 0.32825,0.01071 0.50696,-0.01649c0.18896,-0.02877 0.39148,-0.06638 0.77869,-0.25067c0.20679,-0.09841 0.40912,-0.23763 0.61798,-0.39899c0.22894,-0.17691 0.46753,-0.39027 0.72601,-0.633c0.28717,-0.26969 0.59808,-0.5779 1.32269,-1.30133c0.42023,-0.41956 0.87933,-0.87936 1.37549,-1.38c0.53448,-0.53931 1.10486,-1.11881 1.7085,-1.74c0.64014,-0.65874 1.3161,-1.35488 2.74933,-2.88c0.76758,-0.81677 1.55847,-1.67493 2.37598,-2.56651c0.84393,-0.92039 1.70789,-1.8705 2.59204,-2.8455c0.9032,-0.99599 1.82062,-2.0126 3.69867,-4.088c0.95477,-1.05514 1.91956,-2.1203 2.89948,-3.19051c0.98932,-1.08048 1.9931,-2.16671 3.01648,-3.25349c1.03296,-1.09692 2.07532,-2.20453 4.25067,-4.38934c1.10242,-1.10724 2.23413,-2.20329 3.37653,-3.3045c1.1496,-1.10815 2.31201,-2.21525 3.47552,-3.3315c1.16748,-1.12007 2.34521,-2.23594 4.64795,-4.53067c1.15198,-1.14801 2.28473,-2.31539 3.414,-3.486c1.12939,-1.17073 2.25165,-2.34833 3.37799,-3.522c1.12634,-1.17366 2.24493,-2.35493 4.54138,-4.65866c1.14734,-1.151 2.30817,-2.27869 3.47247,-3.3825c1.14917,-1.08948 2.29272,-2.14458 3.42749,-3.1575c1.10376,-0.98527 2.17261,-1.93874 4.26666,-3.62667c0.97021,-0.78205 1.91144,-1.48949 2.81104,-2.1345c0.84222,-0.60386 1.64233,-1.14418 2.39697,-1.6215c0.69318,-0.43842 1.32764,-0.83558 2.45868,-1.41067c0.46533,-0.23659 0.88171,-0.41553 1.24805,-0.543c0.31165,-0.10843 0.58374,-0.17735 0.81592,-0.201c0.19397,-0.01976 0.36914,-0.0284 0.60266,0.07734c0.09778,0.04424 0.17627,0.12757 0.24158,0.2355c0.08203,0.1355 0.15552,0.32652 0.25049,0.5685c0.11963,0.3049 0.25757,0.68717 0.67468,1.696c0.26929,0.65125 0.59412,1.39353 0.95691,2.2275c0.3999,0.91938 0.83643,1.91761 1.29907,2.9925c0.49219,1.1434 1.01465,2.34841 2.07727,4.94667c0.56104,1.37177 1.12195,2.7929 1.68604,4.257c0.57727,1.49854 1.15234,3.03282 1.72205,4.599c0.57776,1.58847 1.15833,3.19687 2.25867,6.47733c0.55457,1.65329 1.08887,3.32907 1.63196,5.0265c0.55286,1.72789 1.11401,3.49566 1.70398,5.3055c0.60791,1.86454 1.22998,3.79445 2.66406,7.83467c0.75928,2.13908 1.57361,4.31734 2.4209,6.50249c0.8407,2.1682 1.68945,4.27454 2.54712,6.2775c0.80713,1.88511 1.50684,3.64718 3.03198,6.38667c0.57886,1.03983 1.11865,1.84015 1.67542,2.316c0.42456,0.36288 0.90552,0.5074 1.28857,0.372c0.42041,-0.14861 0.80811,-0.56215 1.53601,-1.688c0.43811,-0.6776 0.84973,-1.47434 1.3125,-2.3415c0.50415,-0.94471 1.03735,-1.97327 1.62744,-3.0705c0.63135,-1.17395 1.29346,-2.43169 2.89331,-5.088c0.86743,-1.44024 1.82788,-2.92381 2.86951,-4.452c1.08716,-1.59499 2.26123,-3.2261 3.52649,-4.884c1.31067,-1.71733 2.67908,-3.48627 5.77075,-6.99734c1.61597,-1.83516 3.36023,-3.67007 5.20947,-5.544c1.93298,-1.95882 4.00867,-3.96764 6.22644,-6.048c2.34143,-2.19634 4.84216,-4.49507 10.39734,-9.408c3.02747,-2.67745 6.22412,-5.44318 9.52954,-8.2905c3.37061,-2.90344 6.78088,-5.81615 10.18652,-8.7135c3.35742,-2.85629 6.63428,-5.63268 12.78394,-10.82933c2.80103,-2.36692 5.41101,-4.57083 7.84509,-6.612c2.2594,-1.89463 4.35828,-3.64407 6.31494,-5.244c1.80701,-1.47762 3.46753,-2.84967 6.50671,-5.144c1.33899,-1.01079 2.59399,-1.8974 3.75452,-2.6775c1.04968,-0.7056 2.01038,-1.31144 2.88147,-1.8225c0.76611,-0.44949 1.43506,-0.83699 2.53064,-1.33333c0.40198,-0.1821 0.73047,-0.30577 0.99451,-0.3525c0.20081,-0.03555 0.36877,-0.0188 0.48145,0.0525c0.10913,0.06904 0.17664,0.19733 0.35742,0.46667c0.10645,0.1586 0.24097,0.32856 0.39001,0.5265c0.17114,0.22729 0.3645,0.49132 0.56995,0.8055c0.23523,0.35979 0.50098,0.77438 1.04004,1.83467c0.32202,0.63338 0.6438,1.3535 0.97192,2.151c0.35535,0.86363 0.7063,1.80338 1.04407,2.817c0.35767,1.07362 0.72644,2.21051 1.31726,4.69867c0.31433,1.32382 0.57288,2.71218 0.83252,4.1475c0.26733,1.47801 0.51929,2.99874 0.78748,4.5525c0.27344,1.58459 0.53113,3.20057 1.21338,6.46667c0.34644,1.6587 0.74695,3.32093 1.17151,4.9905c0.42749,1.68116 0.88586,3.36508 1.36047,5.0535c0.47644,1.69527 0.97021,3.3912 1.96802,6.78933c0.4989,1.69927 0.99756,3.39233 1.49548,5.073c0.4928,1.66332 0.98132,3.30269 1.46851,4.911c0.47668,1.57368 0.93835,3.10791 1.86938,6.016c0.43909,1.3717 0.87451,2.68053 1.30493,3.9255c0.40991,1.18564 0.81323,2.30623 1.21509,3.3585c0.37854,0.99129 0.7312,1.92355 1.47998,3.54934c0.33228,0.72144 0.66992,1.36883 1.00049,1.94849c0.30103,0.52802 0.59619,0.99416 0.88342,1.39951c0.25732,0.36324 0.4928,0.68489 0.94934,1.152c0.18347,0.18772 0.35791,0.3323 0.51904,0.438c0.13843,0.09083 0.27063,0.15202 0.39294,0.186c0.11084,0.03082 0.21875,0.04066 0.42139,0.04266c0.10022,0.00098 0.20215,0.00011 0.30444,-0.018c0.1073,-0.019 0.22046,-0.05828 0.33154,-0.126c0.12622,-0.07695 0.26538,-0.18421 0.53064,-0.52267c0.16663,-0.21259 0.32886,-0.48297 0.52649,-0.789c0.22778,-0.35268 0.48962,-0.75601 0.80554,-1.203c0.35779,-0.50618 0.76392,-1.07651 1.83472,-2.34133c0.62634,-0.73981 1.3457,-1.51669 2.1239,-2.3475c0.8269,-0.88274 1.70862,-1.79908 2.62805,-2.75249c0.94983,-0.98494 1.9314,-1.98754 3.91467,-4.06667c1.00342,-1.05191 2.00281,-2.11852 3.00903,-3.1905c1.01245,-1.07869 2.0304,-2.1657 3.06299,-3.2535c1.04016,-1.09588 2.08459,-2.20452 4.26135,-4.38933c1.10242,-1.10656 2.23108,-2.2011 3.37646,-3.2865c1.14661,-1.08663 2.30603,-2.15651 3.47546,-3.2055c1.16162,-1.042 2.31592,-2.07125 4.64807,-4.008c1.13684,-0.94411 2.27148,-1.84489 3.396,-2.706c1.09705,-0.84008 2.18091,-1.63645 3.25195,-2.382c1.03662,-0.72154 2.03967,-1.41763 4.01868,-2.57867c0.92432,-0.5423 1.82825,-1.01189 2.6925,-1.4295c0.80945,-0.39111 1.57471,-0.72556 2.28748,-1.0065c0.64587,-0.25457 1.224,-0.48334 2.18665,-0.73067c0.35852,-0.09212 0.65649,-0.14838 0.88049,-0.102c0.18323,0.03793 0.32654,0.17619 0.40356,0.366c0.0957,0.23591 0.12646,0.55707 0.21594,1.40266c0.05713,0.53934 0.11938,1.15658 0.2085,1.8465c0.09839,0.76218 0.22107,1.59238 0.37952,2.4855c0.17004,0.95806 0.35388,1.98043 0.91199,4.168c0.3009,1.17933 0.66772,2.3977 1.0575,3.6615c0.40344,1.30828 0.83862,2.65094 1.28259,4.0305c0.45435,1.41144 0.9325,2.84613 1.82666,5.808c0.45483,1.50674 0.88635,3.03596 1.30945,4.581c0.42615,1.55629 0.83911,3.12661 1.24646,4.707c0.40906,1.58695 0.81018,3.18112 1.61072,6.37867c0.40051,1.59956 0.79932,3.19753 1.19995,4.791c0.39929,1.58786 0.79858,3.1677 1.20007,4.737c0.39856,1.55804 0.79272,3.10323 1.59998,6.13866c0.39612,1.48961 0.79443,2.95013 1.19104,4.374c0.38477,1.38145 0.76355,2.71046 1.13696,3.978c0.354,1.20173 0.68262,2.33142 1.33862,4.31467c0.28235,0.85369 0.5542,1.61133 0.81909,2.277c0.23474,0.59005 0.46179,1.10358 0.69299,1.53899c0.20288,0.38214 0.38403,0.7267 0.82129,1.18401c0.18628,0.19478 0.39404,0.33678 0.59998,0.438c0.19495,0.09581 0.39856,0.15316 0.59998,0.186c0.19897,0.03245 0.40002,0.04196 0.80005,0.04266c0.20361,0.00036 0.43103,-0.00565 0.69897,-0.054c0.33826,-0.06103 0.7627,-0.18649 1.29297,-0.378c0.67017,-0.24206 1.49463,-0.57139 3.67468,-1.568c1.41711,-0.64782 3.05115,-1.44051 4.9126,-2.3715c2.10583,-1.05322 4.44727,-2.26373 7.02747,-3.6405c2.84204,-1.51651 5.94604,-3.19109 12.89331,-7.15466c3.88953,-2.21906 7.98352,-4.63321 12.28955,-7.12051c4.44983,-2.5703 9.00696,-5.17938 13.6665,-7.7235c4.66357,-2.54635 9.2655,-5.13206 18.54395,-9.32267c4.39563,-1.9853 8.71301,-3.63119 12.86548,-5.0685c3.93323,-1.36141 7.68689,-2.489 11.21851,-3.4395c3.2666,-0.87918 6.27405,-1.60926 11.41602,-2.65867c2.08557,-0.42564 3.87341,-0.74588 5.38647,-0.9765c1.2594,-0.19196 2.29968,-0.31667 3.14551,-0.3555c0.6759,-0.03104 1.22949,-0.05536 1.96802,0.16533c0.28003,0.08368 0.50122,0.22145 0.65698,0.3765c0.14014,0.13953 0.22937,0.30721 0.27905,0.4755c0.04822,0.16359 0.05994,0.33192 0.06396,0.648c0.00183,0.14549 0,0.284 0,0.4185c0,0.1335 0,0.269 0,0.4095c0,0.1485 0.00037,0.308 0,0.672c-0.00024,0.21067 -0.00037,0.4454 -0.00903,0.708c-0.00977,0.29477 -0.02893,0.62566 -0.06299,0.996c-0.03821,0.41507 -0.08582,0.87933 -0.26135,1.96267c-0.10229,0.63109 -0.23608,1.31918 -0.3855,2.0655c-0.16101,0.80439 -0.34253,1.66391 -0.53845,2.5785c-0.20764,0.96909 -0.43103,1.99059 -0.9093,4.18934c-0.25549,1.17429 -0.51929,2.39513 -0.79956,3.657c-0.28894,1.30082 -0.59167,2.63575 -0.9165,3.999c-0.33154,1.39146 -0.66687,2.80872 -1.45068,5.67733c-0.39868,1.45918 -0.83472,2.93 -1.29443,4.422c-0.46948,1.52406 -0.97156,3.07958 -1.50146,4.674c-0.54626,1.64365 -1.12109,3.33888 -2.37073,6.904c-0.66162,1.8877 -1.36182,3.85163 -2.11206,5.8965c-0.7854,2.14059 -1.62854,4.37799 -2.54395,6.7155c-0.96216,2.45705 -1.98096,5.0402 -4.34399,10.55467c-1.27417,2.97346 -2.65234,6.04797 -4.10095,9.204c-1.47925,3.22279 -3.01123,6.46889 -4.58704,9.70799c-1.56824,3.22357 -3.11731,6.40527 -6.31201,12.42134c-1.5105,2.84445 -3.02661,5.5379 -4.49695,8.11499c-1.41272,2.47609 -2.79761,4.84164 -4.11902,7.125c-1.27319,2.20004 -2.53516,4.3051 -4.71741,8.42667c-1.0415,1.96703 -1.98254,3.91573 -2.87097,5.82451c-0.86609,1.86076 -1.67371,3.69499 -2.45703,5.4915c-0.76733,1.75986 -1.48962,3.50052 -3.00525,6.85066c-0.74231,1.6409 -1.51074,3.24519 -2.28149,4.82401c-0.76147,1.55984 -1.53064,3.09286 -2.29053,4.608c-0.7511,1.49753 -1.5083,2.97073 -2.92798,5.90132c-0.69812,1.44099 -1.36584,2.87599 -2.01001,4.30051c-0.63586,1.4062 -1.24573,2.80124 -1.83008,4.1835c-0.57556,1.36147 -1.13574,2.7045 -2.15991,5.34933c-0.49805,1.28621 -0.96326,2.55313 -1.41907,3.78749c-0.44275,1.19897 -0.86768,2.36023 -1.29297,3.4725c-0.40759,1.06599 -0.7793,2.09109 -1.62134,3.90666c-0.38245,0.82463 -0.78906,1.57663 -1.20447,2.26651c-0.39465,0.6553 -0.80762,1.26083 -1.23157,1.8255c-0.41272,0.54962 -0.83911,1.07426 -1.73059,2.07466c-0.44958,0.50456 -0.91626,1.00104 -1.38599,1.5c-0.47168,0.50104 -0.94788,0.99954 -1.422,1.5c-0.47327,0.49954 -0.94897,0.99309 -1.85876,2c-0.44873,0.49663 -0.88293,0.99754 -1.30493,1.5c-0.41797,0.49759 -0.82324,0.99753 -1.21509,1.5c-0.38806,0.49756 -0.76965,0.99303 -1.47998,2c-0.35022,0.49644 -0.68323,0.99823 -1.01392,1.4955c-0.328,0.49339 -0.65063,0.98509 -0.97803,1.46851c-0.32532,0.48027 -0.64331,0.96227 -1.34131,1.86934c-0.34741,0.45154 -0.71777,0.88733 -1.09509,1.323c-0.38257,0.44171 -0.78052,0.88474 -1.18494,1.341c-0.41577,0.46906 -0.85107,0.94806 -1.71997,2.00266c-0.46082,0.55933 -0.92004,1.15225 -1.3905,1.76251c-0.48035,0.62305 -0.9624,1.25934 -1.45349,1.89749c-0.49255,0.64017 -0.97742,1.28424 -1.98938,2.50665c-0.49316,0.59573 -0.99548,1.16434 -1.49097,1.71902c-0.48584,0.54395 -0.96875,1.07147 -1.43701,1.59299c-0.45898,0.51114 -0.91797,1.00507 -1.73865,2.02133c-0.39856,0.49353 -0.76733,0.9967 -1.11902,1.5c-0.34705,0.49677 -0.67566,0.99817 -0.99304,1.5c-0.31519,0.4982 -0.61938,0.99957 -1.22131,2c-0.30054,0.49945 -0.59888,0.99884 -0.90454,1.491c-0.30371,0.48917 -0.61145,0.97064 -0.93152,1.43701c-0.31641,0.461 -0.62683,0.92007 -1.33057,1.73865c-0.34424,0.40048 -0.71716,0.77097 -1.09509,1.13702c-0.38196,0.37 -0.78149,0.7363 -1.18494,1.11899c-0.41675,0.39526 -0.8584,0.79886 -1.71997,1.74399c-0.46472,0.50977 -0.92029,1.06723 -1.38159,1.6485c-0.47083,0.59335 -0.93311,1.20407 -1.3905,1.81952c-0.45361,0.61023 -0.89099,1.21533 -1.72791,2.36533c-0.39026,0.53632 -0.76514,1.04819 -1.12805,1.54199c-0.35437,0.48218 -0.70544,0.95789 -1.05603,1.43402c-0.35474,0.48187 -0.71875,0.97488 -1.48267,2.02399c-0.41016,0.56326 -0.83411,1.151 -1.27197,1.75351c-0.44482,0.61215 -0.89307,1.22684 -1.34399,1.8345c-0.44373,0.59799 -0.87207,1.18298 -1.71729,2.24533c-0.38562,0.48468 -0.76038,0.92862 -1.11902,1.3425c-0.34021,0.3927 -0.67249,0.7619 -0.99304,1.11749c-0.31201,0.34607 -0.625,0.68115 -1.22131,1.37332c-0.30334,0.35208 -0.60168,0.71732 -0.90002,1.09052c-0.30164,0.37741 -0.60095,0.76291 -0.90002,1.1535c-0.3009,0.39307 -0.60022,0.7905 -1.19995,1.58932c-0.30017,0.39978 -0.59924,0.79919 -0.90002,1.1955c-0.29919,0.39435 -0.59851,0.78479 -0.90002,1.16852c-0.29846,0.37994 -0.59314,0.75641 -1.19995,1.46933c-0.29651,0.34833 -0.59924,0.68344 -0.89551,1.01849c-0.29443,0.33298 -0.5874,0.66589 -0.86853,1.00949c-0.28259,0.34543 -0.57251,0.69363 -1.06934,1.47202c-0.25671,0.40222 -0.48584,0.83298 -0.71399,1.272c-0.23059,0.44363 -0.45105,0.89545 -0.67798,1.34399c-0.22571,0.44611 -0.43652,0.89587 -0.94128,1.71732c-0.24402,0.397 -0.51221,0.76553 -0.78149,1.11902c-0.26294,0.34515 -0.53149,0.67227 -0.79053,0.99298c-0.25195,0.31195 -0.5105,0.6058 -0.92798,1.22134c-0.19934,0.29395 -0.36768,0.59607 -0.51904,0.89551c-0.14722,0.29138 -0.27502,0.58267 -0.39294,0.8685c-0.11462,0.27792 -0.21497,0.55219 -0.42139,1.06934c-0.09814,0.24588 -0.19873,0.48187 -0.30005,0.7095c-0.09875,0.22171 -0.19922,0.43668 -0.29993,0.64648c-0.09924,0.20654 -0.19958,0.40961 -0.40002,0.81067c-0.09998,0.19995 -0.19946,0.39963 -0.30444,0.59549c-0.10437,0.19482 -0.21289,0.38593 -0.33154,0.56851c-0.11768,0.18115 -0.23486,0.36411 -0.53064,0.66934c-0.14758,0.15234 -0.31482,0.28415 -0.48157,0.414c-0.16541,0.12881 -0.33301,0.25003 -0.49048,0.37799c-0.15356,0.12479 -0.31616,0.24011 -0.52795,0.54132c-0.10315,0.14682 -0.16992,0.31708 -0.22803,0.49051c-0.05933,0.17734 -0.104,0.36404 -0.15601,0.5535c-0.05334,0.19424 -0.09607,0.40012 -0.28271,0.78934c-0.09863,0.2056 -0.23242,0.40256 -0.37646,0.60001c-0.14783,0.20267 -0.31042,0.40051 -0.47546,0.60001c-0.16589,0.2005 -0.34033,0.39362 -0.64807,0.79999c-0.14917,0.19699 -0.28381,0.39841 -0.40942,0.60001c-0.12366,0.19846 -0.23792,0.39914 -0.34656,0.60001c-0.10779,0.19916 -0.20984,0.39975 -0.41064,0.79999c-0.10022,0.19971 -0.19934,0.39896 -0.30005,0.59549c-0.09949,0.19412 -0.19861,0.38437 -0.29993,0.56851c-0.09875,0.17953 -0.19336,0.35498 -0.40002,0.66934c-0.0968,0.14722 -0.19788,0.28186 -0.29553,0.40948c-0.09314,0.1217 -0.18457,0.2356 -0.26843,0.3465c-0.07983,0.10547 -0.16162,0.20331 -0.26941,0.41068c-0.05054,0.09726 -0.08411,0.19818 -0.11401,0.2955c-0.02869,0.09341 -0.0509,0.1842 -0.078,0.26849c-0.02551,0.07938 -0.04333,0.1629 -0.14124,0.26935c-0.0481,0.05228 -0.11646,0.08502 -0.18604,0.11398c-0.07166,0.02982 -0.14783,0.05145 -0.22205,0.078c-0.07312,0.02612 -0.1532,0.04385 -0.25867,0.14133c-0.05225,0.04834 -0.08557,0.11795 -0.11841,0.19052c-0.03528,0.07806 -0.06665,0.16479 -0.1095,0.25348c-0.04602,0.09515 -0.0946,0.20258 -0.27209,0.38934c-0.10205,0.10736 -0.23328,0.20184 -0.37195,0.29999c-0.14404,0.10193 -0.29529,0.1991 -0.44397,0.30002c-0.146,0.09912 -0.29614,0.18527 -0.51733,0.39999c-0.0968,0.09396 -0.16833,0.1976 -0.22351,0.29999c-0.05273,0.09787 -0.08899,0.20001 -0.12451,0.30002l-0.03357,0.10001l-0.03442,0.09998" id="svg_3" stroke-width="20" stroke="#000000" fill="none"/>
+ </g>
+</svg>
diff --git a/client/public/images/pieces/Hiddenqueen/wt.svg b/client/public/images/pieces/Hiddenqueen/wt.svg
new file mode 100644 (file)
index 0000000..87c11ca
--- /dev/null
@@ -0,0 +1,8 @@
+<svg width="2048" height="2048" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
+ <g class="layer">
+  <title>Layer 1</title>
+  <path id="svg_1" fill="#000" transform="translate(0,2048) scale(1,-1)" fill-rule="nonzero" d="m1024,273l491,0q21,72 21,141q0,156 -86,283t-223,187q-66,5 -66,72q0,53 67,78q93,65 93,172q0,77 -52,135t-126,67q-60,5 -60,68q0,28 22,52q54,42 54,110q0,56 -40,96t-95,40q-57,0 -96,-40t-40,-96q0,-67 54,-110q22,-22 22,-52q0,-63 -59,-68q-75,-9 -126,-67t-52,-135q0,-107 93,-172q67,-26 67,-78q0,-67 -67,-72q-136,-60 -222,-187t-86,-283q0,-74 21,-141l491,0zm0,-68l-540,0q-40,100 -40,209q0,185 105,332t270,210q-71,33 -115,99t-45,151q0,105 70,182t172,89q-81,61 -81,161q0,84 59,144t145,60q84,0 144,-60t60,-144q0,-100 -81,-161q102,-12 172,-89t70,-182q0,-84 -45,-150t-116,-100q165,-63 270,-210t105,-332q0,-108 -39,-209l-540,0z"/>
+  <path id="svg_2" fill="#fff" fill-rule="nonzero" d="m1024,1775l491,0q21,-72 21,-141q0,-156 -86,-283t-223,-187q-66,-5 -66,-72q0,-53 67,-78q93,-65 93,-172q0,-77 -52,-135t-126,-67q-60,-5 -60,-68q0,-28 22,-52q54,-42 54,-110q0,-56 -40,-96t-95,-40q-57,0 -96,40t-40,96q0,67 54,110q22,22 22,52q0,63 -59,68q-75,9 -126,67t-52,135q0,107 93,172q67,26 67,78q0,67 -67,72q-136,60 -222,187t-86,283q0,74 21,141l491,0z"/>
+  <path d="m819.99966,388.28527c-1.10864,-2.65115 -1.43005,-3.20636 -1.81732,-3.81818c-0.43079,-0.68066 -0.92487,-1.41653 -1.48804,-2.2005c-0.60889,-0.8476 -1.27008,-1.75565 -2.86133,-3.64798c-0.87073,-1.03552 -1.84528,-2.10236 -2.89648,-3.24301c-1.13385,-1.23032 -2.37537,-2.5477 -3.71552,-3.98099c-1.45422,-1.5553 -3.04144,-3.23602 -6.55463,-7.10934c-1.97681,-2.17944 -4.06763,-4.53577 -6.26703,-7.047c-2.3103,-2.63788 -4.69867,-5.40512 -7.14899,-8.289c-2.52118,-2.96729 -5.09711,-6.00662 -10.25067,-12.33066c-2.61664,-3.21088 -5.22595,-6.49396 -7.86749,-9.84302c-2.69867,-3.42151 -5.44696,-6.94714 -8.27252,-10.58099c-2.91949,-3.75473 -5.93329,-7.65588 -12.35999,-15.90933c-3.41547,-4.38628 -6.95422,-8.9063 -10.56299,-13.5345c-3.65521,-4.68777 -7.31976,-9.39703 -10.94104,-14.1015c-3.57062,-4.63864 -7.07538,-9.15788 -13.49597,-17.864c-2.97205,-4.03 -5.71832,-7.89087 -8.29053,-11.57249c-2.44452,-3.49889 -4.73553,-6.86145 -6.91345,-10.08751c-2.09222,-3.09909 -4.07996,-6.11176 -7.96271,-11.84c-1.88171,-2.77608 -3.75427,-5.48759 -5.6145,-8.13901c-1.82922,-2.60718 -3.64941,-5.15764 -5.46149,-7.653c-1.78436,-2.45724 -3.54993,-4.87331 -7.09064,-9.54132c-1.73474,-2.28705 -3.47064,-4.52077 -5.1825,-6.7155c-1.68158,-2.1559 -3.3396,-4.2627 -4.95752,-6.32851c-1.58038,-2.01788 -3.13312,-3.97557 -6.02667,-7.78934c-1.37946,-1.81818 -2.68964,-3.59576 -3.92999,-5.33399c-1.19934,-1.68072 -2.33246,-3.32444 -3.39001,-4.938c-1.02209,-1.55947 -2.00916,-3.07068 -3.67999,-6.06133c-0.7948,-1.42258 -1.50128,-2.83826 -2.1615,-4.2285c-0.6449,-1.35799 -1.23981,-2.70664 -1.81049,-4.0395c-0.5636,-1.3162 -1.09601,-2.63194 -2.1947,-5.232c-0.5498,-1.30115 -1.11273,-2.59476 -1.68146,-3.8775c-0.56335,-1.27058 -1.12866,-2.51943 -1.69055,-3.7425c-0.54913,-1.19524 -1.08734,-2.35553 -2.12799,-4.54666c-0.48743,-1.02637 -0.95947,-2.00164 -1.401,-2.93401c-0.41974,-0.88636 -0.81396,-1.72973 -1.16699,-2.53799c-0.33398,-0.7646 -0.66193,-1.48513 -1.09863,-2.86134c-0.19977,-0.62952 -0.33636,-1.23968 -0.44702,-1.8195c-0.10492,-0.54971 -0.17834,-1.07628 -0.24902,-1.5765c-0.06726,-0.47612 -0.10406,-0.93633 -0.30396,-1.77066c-0.09442,-0.39422 -0.2287,-0.76503 -0.37201,-1.119c-0.13953,-0.34473 -0.2948,-0.67261 -0.44403,-0.993c-0.14545,-0.31228 -0.30652,-0.60992 -0.51733,-1.22134c-0.10205,-0.29589 -0.16907,-0.59618 -0.21899,-0.891c-0.04852,-0.28667 -0.07629,-0.56709 -0.09296,-0.837c-0.01587,-0.25748 -0.0202,-0.50133 -0.02136,-0.93867c-0.00049,-0.19017 -0.00055,-0.36139 0.00452,-0.5145c0.00452,-0.13624 0.01184,-0.25707 0.03149,-0.3615c0.01727,-0.09199 0.03271,-0.18232 0.13068,-0.29067c0.04773,-0.05276 0.11749,-0.08546 0.19049,-0.114c0.0777,-0.03036 0.16376,-0.05228 0.25348,-0.078c0.09399,-0.02693 0.19531,-0.04832 0.38934,-0.14133c0.10291,-0.04932 0.20178,-0.11667 0.3045,-0.186c0.10663,-0.07198 0.21503,-0.14935 0.33148,-0.222c0.11987,-0.07477 0.24329,-0.15697 0.5307,-0.25867c0.15192,-0.05376 0.31689,-0.08492 0.48596,-0.114c0.1723,-0.02964 0.34753,-0.05153 0.52203,-0.078c0.17285,-0.02621 0.34607,-0.04227 0.65863,-0.14133c0.14832,-0.04701 0.28595,-0.11616 0.42303,-0.186c0.14026,-0.07146 0.28375,-0.15067 0.44098,-0.222c0.16809,-0.07627 0.3526,-0.16115 0.80267,-0.25867c0.26227,-0.05682 0.55566,-0.08547 0.87152,-0.1095c0.33618,-0.02557 0.69092,-0.03843 1.06049,-0.0465c0.38141,-0.00833 0.77197,-0.00999 1.56799,-0.01067c0.40015,-0.00034 0.80133,0 1.20453,0c0.40613,0 0.81628,0 1.23145,0c0.4212,0 0.84937,-0.00032 1.73071,0c0.45496,0.00017 0.92004,-0.0002 1.39496,0.009c0.48511,0.0094 0.98041,0.0271 1.48505,0.063c0.51538,0.03666 1.04401,0.07384 2.12,0.26134c0.55768,0.09718 1.12451,0.23282 1.70398,0.39c0.59943,0.1626 1.21448,0.35448 1.84802,0.57c0.65924,0.22427 1.34271,0.46952 2.78131,1.04c0.76727,0.30426 1.56073,0.63686 2.38501,0.9855c0.85577,0.36196 1.74017,0.74325 2.65497,1.1385c0.94519,0.40839 1.91895,0.83327 3.96002,1.70933c1.06439,0.45686 2.16107,0.92152 3.28497,1.4085c1.15613,0.50095 2.34265,1.02319 3.55505,1.5795c1.24774,0.57254 2.53369,1.16103 5.15997,2.512c1.37213,0.70581 2.76324,1.47058 4.18048,2.27551c1.45355,0.82556 2.92798,1.69667 4.42352,2.6085c1.5282,0.9317 3.08209,1.89312 6.22931,3.94933c1.6156,1.05553 3.23999,2.15211 4.88104,3.2715c1.66034,1.13257 3.3288,2.28886 5.00696,3.4605c1.68921,1.17935 3.38171,2.37145 6.77869,4.768c1.69983,1.19923 3.39618,2.39762 5.091,3.5865c1.68658,1.18311 3.36505,2.35431 5.03699,3.5055c1.6554,1.13979 3.29022,2.26878 6.5387,4.408c1.58313,1.04253 3.14508,2.0392 4.66949,2.997c1.47174,0.92471 2.89087,1.79814 4.24646,2.619c1.27759,0.77361 2.47131,1.49071 4.58405,2.71734c0.89435,0.51924 1.68896,0.96973 2.39099,1.3575c0.61285,0.33851 1.14874,0.62532 1.617,0.8625c0.40271,0.20399 0.74957,0.37872 1.32532,0.61333c0.2334,0.09511 0.44122,0.16673 0.62402,0.2145c0.15613,0.0408 0.2926,0.06414 0.40796,0.0615c0.09772,-0.00224 0.19232,-0.01271 0.30133,-0.10933c0.05328,-0.04719 0.08551,-0.11752 0.11401,-0.19051c0.03033,-0.07771 0.05231,-0.16378 0.078,-0.25349c0.02692,-0.09395 0.04828,-0.1953 0.14136,-0.38934c0.04974,-0.10377 0.12097,-0.20825 0.19946,-0.327c0.09076,-0.13728 0.19836,-0.29673 0.31653,-0.489c0.13855,-0.22553 0.2995,-0.49072 0.65063,-1.184c0.21619,-0.42685 0.44244,-0.91831 0.68555,-1.47c0.26801,-0.60817 0.54779,-1.27835 0.8385,-2.01c0.31323,-0.78824 0.64423,-1.63514 1.30933,-3.52c0.36224,-1.02657 0.72198,-2.11224 1.09045,-3.2475c0.38232,-1.17804 0.76605,-2.39761 1.1535,-3.6525c0.3963,-1.28342 0.79492,-2.59207 1.58936,-5.26666c0.40228,-1.35437 0.80133,-2.72 1.20453,-4.095c0.40613,-1.385 0.81488,-2.78042 1.23145,-4.185c0.4198,-1.41542 0.84082,-2.84263 1.73071,-5.72c0.45032,-1.45618 0.9165,-2.91892 1.38599,-4.3905c0.47186,-1.47909 0.94879,-2.9632 1.422,-4.4535c0.47412,-1.49336 0.9541,-2.98681 1.85864,-5.98933c0.45117,-1.4976 0.88354,-2.99462 1.30054,-4.4865c0.4137,-1.48014 0.80902,-2.94961 1.18347,-4.4055c0.36914,-1.43515 0.72906,-2.84781 1.34937,-5.608c0.29956,-1.33287 0.56592,-2.63854 0.828,-3.9105c0.25525,-1.23871 0.49957,-2.44492 0.75598,-3.6135c0.24908,-1.13507 0.47559,-2.24248 1.08264,-4.30933c0.28955,-0.9857 0.62317,-1.92178 0.97205,-2.811c0.33435,-0.85207 0.68585,-1.65151 1.04395,-2.397c0.3371,-0.70169 0.66272,-1.35289 1.31738,-2.45867c0.28168,-0.47579 0.55511,-0.88977 0.81445,-1.248c0.23071,-0.31871 0.45068,-0.59049 0.6615,-0.816c0.18634,-0.19935 0.35773,-0.37338 0.69067,-0.60267c0.14063,-0.09685 0.27814,-0.1688 0.40955,-0.2055c0.11896,-0.03321 0.23987,-0.03585 0.3465,0.0015c0.11121,0.03895 0.2276,0.11518 0.41064,0.37067c0.11273,0.1573 0.20728,0.36102 0.32251,0.5895c0.13153,0.26081 0.27795,0.55835 0.45752,0.8865c0.20166,0.36848 0.42743,0.78229 1.05328,1.69067c0.36353,0.52759 0.79254,1.08141 1.26154,1.6755c0.50275,0.6368 1.0498,1.30461 1.63049,2.0085c0.61029,0.73983 1.25537,1.50788 2.60797,3.14933c0.71198,0.86404 1.44379,1.76202 2.19452,2.6985c0.77875,0.97145 1.57971,1.98637 2.40149,3.0495c0.85474,1.10578 1.74194,2.25875 3.57068,4.752c0.97137,1.32429 1.9599,2.71151 2.97601,4.1475c1.04535,1.47729 2.10828,2.99764 3.19202,4.5525c1.10364,1.58347 2.21851,3.1953 4.49866,6.46666c1.15356,1.65499 2.31482,3.31571 3.495,4.968c1.17981,1.65173 2.37048,3.28915 3.58496,4.896c1.20563,1.59515 2.39581,3.1812 4.92004,6.13599c1.23303,1.44332 2.50171,2.81114 3.77698,4.12051c1.2478,1.28116 2.50366,2.49554 3.75897,3.64349c1.21979,1.11549 2.41473,2.18547 4.79736,4.06934c1.12189,0.88708 2.23187,1.69363 3.31049,2.4435c1.03241,0.71777 2.03918,1.37619 3.01349,1.9845c0.92957,0.58038 1.82465,1.11858 3.50934,2.072c0.77728,0.4399 1.51813,0.84354 2.22003,1.215c0.6582,0.34834 1.27777,0.66451 1.85999,0.94501c0.53796,0.25919 1.03192,0.50042 1.91998,0.84c0.37726,0.14425 0.72229,0.25057 1.03351,0.3285c0.2771,0.06938 0.52838,0.11395 0.75452,0.1395c0.20306,0.02295 0.388,0.03037 0.71198,0.032c0.14532,0.00073 0.2829,0.0005 0.414,-0.009c0.12762,-0.00925 0.25403,-0.02747 0.37799,-0.063c0.12903,-0.03699 0.26672,-0.0854 0.54138,-0.26134c0.16071,-0.10296 0.32758,-0.24139 0.513,-0.4035c0.21228,-0.18555 0.44647,-0.40778 0.711,-0.66451c0.30096,-0.29211 0.63763,-0.62768 1.44263,-1.432c0.47485,-0.47447 0.99738,-0.99733 1.56604,-1.56599c0.61267,-0.61267 1.26733,-1.26734 1.96198,-1.96201c0.73267,-0.73267 1.50134,-1.50134 3.13867,-3.13866c0.86536,-0.86534 1.7627,-1.76268 2.69397,-2.694c0.96735,-0.96735 1.97272,-1.97268 3.01801,-3.018c1.08734,-1.08735 2.21893,-2.21844 4.62134,-4.62134c1.27863,-1.27888 2.62988,-2.6301 4.06952,-4.083c1.55658,-1.57095 3.24609,-3.28898 5.08649,-5.181c2.02295,-2.07968 4.24658,-4.37392 9.34399,-9.736c2.92596,-3.07789 6.03973,-6.38836 9.29553,-9.849c3.33484,-3.54467 6.68225,-7.11063 9.98846,-10.623c3.19751,-3.39692 6.21265,-6.62256 11.54938,-12.19467c2.17334,-2.26921 4.04279,-4.17982 5.62799,-5.7885c1.33252,-1.35226 2.46021,-2.47758 3.396,-3.4395c0.79883,-0.82113 1.51447,-1.53076 2.64264,-2.93867c0.5636,-0.70339 1.08447,-1.46054 1.59601,-2.2305c0.50983,-0.76745 0.98962,-1.53894 1.45203,-2.2935c0.44482,-0.72584 0.84723,-1.42617 1.61865,-2.64267c0.32935,-0.51934 0.63495,-0.96974 0.92401,-1.3485c0.25079,-0.32861 0.48267,-0.59973 0.70801,-0.7995c0.18939,-0.16791 0.36847,-0.3327 0.70129,-0.352c0.14667,-0.00851 0.29425,0.07086 0.41852,0.189c0.14679,0.13955 0.27588,0.3489 0.40948,0.603c0.15674,0.29814 0.31427,0.65612 0.672,1.54133c0.21375,0.529 0.44244,1.12308 0.69,1.7835c0.27271,0.7275 0.56311,1.52791 0.87,2.4045c0.33337,0.95232 0.69098,1.98444 1.44,4.312c0.41595,1.29255 0.84204,2.67498 1.28552,4.1415c0.46735,1.54543 0.94672,3.17011 1.43848,4.8705c0.51202,1.77058 1.03931,3.60962 2.10938,7.488c0.55951,2.02777 1.12061,4.11183 1.69501,6.243c0.58563,2.17282 1.17834,4.38244 1.78497,6.621c0.61334,2.26345 1.22723,4.54758 2.52002,9.136c0.64807,2.30014 1.31146,4.58801 1.98151,6.855c0.66199,2.23965 1.32611,4.43817 1.99048,6.585c0.64673,2.08981 1.27368,4.11269 2.52802,7.89333c0.58167,1.75317 1.15356,3.40543 1.71448,4.959c0.52893,1.46498 1.04681,2.83647 1.56152,4.113c0.48224,1.19596 0.93231,2.31645 1.89063,4.26133c0.42816,0.86893 0.86761,1.6503 1.2915,2.358c0.38892,0.64931 0.76733,1.22779 1.12054,1.746c0.31824,0.4669 0.62366,0.86937 1.08795,1.56267c0.18573,0.27739 0.33002,0.52288 0.44702,0.7335c0.09869,0.17757 0.17432,0.33115 0.24902,0.4545c0.06384,0.10543 0.12195,0.20972 0.30396,0.312c0.10327,0.05804 0.23651,0.08549 0.38104,0.10049c0.15704,0.0163 0.32825,0.01071 0.50696,-0.01649c0.18896,-0.02877 0.39148,-0.06638 0.77869,-0.25067c0.20679,-0.09841 0.40912,-0.23763 0.61798,-0.39899c0.22894,-0.17691 0.46753,-0.39027 0.72601,-0.633c0.28717,-0.26969 0.59808,-0.5779 1.32269,-1.30133c0.42023,-0.41956 0.87933,-0.87936 1.37549,-1.38c0.53448,-0.53931 1.10486,-1.11881 1.7085,-1.74c0.64014,-0.65874 1.3161,-1.35488 2.74933,-2.88c0.76758,-0.81677 1.55847,-1.67493 2.37598,-2.56651c0.84393,-0.92039 1.70789,-1.8705 2.59204,-2.8455c0.9032,-0.99599 1.82062,-2.0126 3.69867,-4.088c0.95477,-1.05514 1.91956,-2.1203 2.89948,-3.19051c0.98932,-1.08048 1.9931,-2.16671 3.01648,-3.25349c1.03296,-1.09692 2.07532,-2.20453 4.25067,-4.38934c1.10242,-1.10724 2.23413,-2.20329 3.37653,-3.3045c1.1496,-1.10815 2.31201,-2.21525 3.47552,-3.3315c1.16748,-1.12007 2.34521,-2.23594 4.64795,-4.53067c1.15198,-1.14801 2.28473,-2.31539 3.414,-3.486c1.12939,-1.17073 2.25165,-2.34833 3.37799,-3.522c1.12634,-1.17366 2.24493,-2.35493 4.54138,-4.65866c1.14734,-1.151 2.30817,-2.27869 3.47247,-3.3825c1.14917,-1.08948 2.29272,-2.14458 3.42749,-3.1575c1.10376,-0.98527 2.17261,-1.93874 4.26666,-3.62667c0.97021,-0.78205 1.91144,-1.48949 2.81104,-2.1345c0.84222,-0.60386 1.64233,-1.14418 2.39697,-1.6215c0.69318,-0.43842 1.32764,-0.83558 2.45868,-1.41067c0.46533,-0.23659 0.88171,-0.41553 1.24805,-0.543c0.31165,-0.10843 0.58374,-0.17735 0.81592,-0.201c0.19397,-0.01976 0.36914,-0.0284 0.60266,0.07734c0.09778,0.04424 0.17627,0.12757 0.24158,0.2355c0.08203,0.1355 0.15552,0.32652 0.25049,0.5685c0.11963,0.3049 0.25757,0.68717 0.67468,1.696c0.26929,0.65125 0.59412,1.39353 0.95691,2.2275c0.3999,0.91938 0.83643,1.91761 1.29907,2.9925c0.49219,1.1434 1.01465,2.34841 2.07727,4.94667c0.56104,1.37177 1.12195,2.7929 1.68604,4.257c0.57727,1.49854 1.15234,3.03282 1.72205,4.599c0.57776,1.58847 1.15833,3.19687 2.25867,6.47733c0.55457,1.65329 1.08887,3.32907 1.63196,5.0265c0.55286,1.72789 1.11401,3.49566 1.70398,5.3055c0.60791,1.86454 1.22998,3.79445 2.66406,7.83467c0.75928,2.13908 1.57361,4.31734 2.4209,6.50249c0.8407,2.1682 1.68945,4.27454 2.54712,6.2775c0.80713,1.88511 1.50684,3.64718 3.03198,6.38667c0.57886,1.03983 1.11865,1.84015 1.67542,2.316c0.42456,0.36288 0.90552,0.5074 1.28857,0.372c0.42041,-0.14861 0.80811,-0.56215 1.53601,-1.688c0.43811,-0.6776 0.84973,-1.47434 1.3125,-2.3415c0.50415,-0.94471 1.03735,-1.97327 1.62744,-3.0705c0.63135,-1.17395 1.29346,-2.43169 2.89331,-5.088c0.86743,-1.44024 1.82788,-2.92381 2.86951,-4.452c1.08716,-1.59499 2.26123,-3.2261 3.52649,-4.884c1.31067,-1.71733 2.67908,-3.48627 5.77075,-6.99734c1.61597,-1.83516 3.36023,-3.67007 5.20947,-5.544c1.93298,-1.95882 4.00867,-3.96764 6.22644,-6.048c2.34143,-2.19634 4.84216,-4.49507 10.39734,-9.408c3.02747,-2.67745 6.22412,-5.44318 9.52954,-8.2905c3.37061,-2.90344 6.78088,-5.81615 10.18652,-8.7135c3.35742,-2.85629 6.63428,-5.63268 12.78394,-10.82933c2.80103,-2.36692 5.41101,-4.57083 7.84509,-6.612c2.2594,-1.89463 4.35828,-3.64407 6.31494,-5.244c1.80701,-1.47762 3.46753,-2.84967 6.50671,-5.144c1.33899,-1.01079 2.59399,-1.8974 3.75452,-2.6775c1.04968,-0.7056 2.01038,-1.31144 2.88147,-1.8225c0.76611,-0.44949 1.43506,-0.83699 2.53064,-1.33333c0.40198,-0.1821 0.73047,-0.30577 0.99451,-0.3525c0.20081,-0.03555 0.36877,-0.0188 0.48145,0.0525c0.10913,0.06904 0.17664,0.19733 0.35742,0.46667c0.10645,0.1586 0.24097,0.32856 0.39001,0.5265c0.17114,0.22729 0.3645,0.49132 0.56995,0.8055c0.23523,0.35979 0.50098,0.77438 1.04004,1.83467c0.32202,0.63338 0.6438,1.3535 0.97192,2.151c0.35535,0.86363 0.7063,1.80338 1.04407,2.817c0.35767,1.07362 0.72644,2.21051 1.31726,4.69867c0.31433,1.32382 0.57288,2.71218 0.83252,4.1475c0.26733,1.47801 0.51929,2.99874 0.78748,4.5525c0.27344,1.58459 0.53113,3.20057 1.21338,6.46667c0.34644,1.6587 0.74695,3.32093 1.17151,4.9905c0.42749,1.68116 0.88586,3.36508 1.36047,5.0535c0.47644,1.69527 0.97021,3.3912 1.96802,6.78933c0.4989,1.69927 0.99756,3.39233 1.49548,5.073c0.4928,1.66332 0.98132,3.30269 1.46851,4.911c0.47668,1.57368 0.93835,3.10791 1.86938,6.016c0.43909,1.3717 0.87451,2.68053 1.30493,3.9255c0.40991,1.18564 0.81323,2.30623 1.21509,3.3585c0.37854,0.99129 0.7312,1.92355 1.47998,3.54934c0.33228,0.72144 0.66992,1.36883 1.00049,1.94849c0.30103,0.52802 0.59619,0.99416 0.88342,1.39951c0.25732,0.36324 0.4928,0.68489 0.94934,1.152c0.18347,0.18772 0.35791,0.3323 0.51904,0.438c0.13843,0.09083 0.27063,0.15202 0.39294,0.186c0.11084,0.03082 0.21875,0.04066 0.42139,0.04266c0.10022,0.00098 0.20215,0.00011 0.30444,-0.018c0.1073,-0.019 0.22046,-0.05828 0.33154,-0.126c0.12622,-0.07695 0.26538,-0.18421 0.53064,-0.52267c0.16663,-0.21259 0.32886,-0.48297 0.52649,-0.789c0.22778,-0.35268 0.48962,-0.75601 0.80554,-1.203c0.35779,-0.50618 0.76392,-1.07651 1.83472,-2.34133c0.62634,-0.73981 1.3457,-1.51669 2.1239,-2.3475c0.8269,-0.88274 1.70862,-1.79908 2.62805,-2.75249c0.94983,-0.98494 1.9314,-1.98754 3.91467,-4.06667c1.00342,-1.05191 2.00281,-2.11852 3.00903,-3.1905c1.01245,-1.07869 2.0304,-2.1657 3.06299,-3.2535c1.04016,-1.09588 2.08459,-2.20452 4.26135,-4.38933c1.10242,-1.10656 2.23108,-2.2011 3.37646,-3.2865c1.14661,-1.08663 2.30603,-2.15651 3.47546,-3.2055c1.16162,-1.042 2.31592,-2.07125 4.64807,-4.008c1.13684,-0.94411 2.27148,-1.84489 3.396,-2.706c1.09705,-0.84008 2.18091,-1.63645 3.25195,-2.382c1.03662,-0.72154 2.03967,-1.41763 4.01868,-2.57867c0.92432,-0.5423 1.82825,-1.01189 2.6925,-1.4295c0.80945,-0.39111 1.57471,-0.72556 2.28748,-1.0065c0.64587,-0.25457 1.224,-0.48334 2.18665,-0.73067c0.35852,-0.09212 0.65649,-0.14838 0.88049,-0.102c0.18323,0.03793 0.32654,0.17619 0.40356,0.366c0.0957,0.23591 0.12646,0.55707 0.21594,1.40266c0.05713,0.53934 0.11938,1.15658 0.2085,1.8465c0.09839,0.76218 0.22107,1.59238 0.37952,2.4855c0.17004,0.95806 0.35388,1.98043 0.91199,4.168c0.3009,1.17933 0.66772,2.3977 1.0575,3.6615c0.40344,1.30828 0.83862,2.65094 1.28259,4.0305c0.45435,1.41144 0.9325,2.84613 1.82666,5.808c0.45483,1.50674 0.88635,3.03596 1.30945,4.581c0.42615,1.55629 0.83911,3.12661 1.24646,4.707c0.40906,1.58695 0.81018,3.18112 1.61072,6.37867c0.40051,1.59956 0.79932,3.19753 1.19995,4.791c0.39929,1.58786 0.79858,3.1677 1.20007,4.737c0.39856,1.55804 0.79272,3.10323 1.59998,6.13866c0.39612,1.48961 0.79443,2.95013 1.19104,4.374c0.38477,1.38145 0.76355,2.71046 1.13696,3.978c0.354,1.20173 0.68262,2.33142 1.33862,4.31467c0.28235,0.85369 0.5542,1.61133 0.81909,2.277c0.23474,0.59005 0.46179,1.10358 0.69299,1.53899c0.20288,0.38214 0.38403,0.7267 0.82129,1.18401c0.18628,0.19478 0.39404,0.33678 0.59998,0.438c0.19495,0.09581 0.39856,0.15316 0.59998,0.186c0.19897,0.03245 0.40002,0.04196 0.80005,0.04266c0.20361,0.00036 0.43103,-0.00565 0.69897,-0.054c0.33826,-0.06103 0.7627,-0.18649 1.29297,-0.378c0.67017,-0.24206 1.49463,-0.57139 3.67468,-1.568c1.41711,-0.64782 3.05115,-1.44051 4.9126,-2.3715c2.10583,-1.05322 4.44727,-2.26373 7.02747,-3.6405c2.84204,-1.51651 5.94604,-3.19109 12.89331,-7.15466c3.88953,-2.21906 7.98352,-4.63321 12.28955,-7.12051c4.44983,-2.5703 9.00696,-5.17938 13.6665,-7.7235c4.66357,-2.54635 9.2655,-5.13206 18.54395,-9.32267c4.39563,-1.9853 8.71301,-3.63119 12.86548,-5.0685c3.93323,-1.36141 7.68689,-2.489 11.21851,-3.4395c3.2666,-0.87918 6.27405,-1.60926 11.41602,-2.65867c2.08557,-0.42564 3.87341,-0.74588 5.38647,-0.9765c1.2594,-0.19196 2.29968,-0.31667 3.14551,-0.3555c0.6759,-0.03104 1.22949,-0.05536 1.96802,0.16533c0.28003,0.08368 0.50122,0.22145 0.65698,0.3765c0.14014,0.13953 0.22937,0.30721 0.27905,0.4755c0.04822,0.16359 0.05994,0.33192 0.06396,0.648c0.00183,0.14549 0,0.284 0,0.4185c0,0.1335 0,0.269 0,0.4095c0,0.1485 0.00037,0.308 0,0.672c-0.00024,0.21067 -0.00037,0.4454 -0.00903,0.708c-0.00977,0.29477 -0.02893,0.62566 -0.06299,0.996c-0.03821,0.41507 -0.08582,0.87933 -0.26135,1.96267c-0.10229,0.63109 -0.23608,1.31918 -0.3855,2.0655c-0.16101,0.80439 -0.34253,1.66391 -0.53845,2.5785c-0.20764,0.96909 -0.43103,1.99059 -0.9093,4.18934c-0.25549,1.17429 -0.51929,2.39513 -0.79956,3.657c-0.28894,1.30082 -0.59167,2.63575 -0.9165,3.999c-0.33154,1.39146 -0.66687,2.80872 -1.45068,5.67733c-0.39868,1.45918 -0.83472,2.93 -1.29443,4.422c-0.46948,1.52406 -0.97156,3.07958 -1.50146,4.674c-0.54626,1.64365 -1.12109,3.33888 -2.37073,6.904c-0.66162,1.8877 -1.36182,3.85163 -2.11206,5.8965c-0.7854,2.14059 -1.62854,4.37799 -2.54395,6.7155c-0.96216,2.45705 -1.98096,5.0402 -4.34399,10.55467c-1.27417,2.97346 -2.65234,6.04797 -4.10095,9.204c-1.47925,3.22279 -3.01123,6.46889 -4.58704,9.70799c-1.56824,3.22357 -3.11731,6.40527 -6.31201,12.42134c-1.5105,2.84445 -3.02661,5.5379 -4.49695,8.11499c-1.41272,2.47609 -2.79761,4.84164 -4.11902,7.125c-1.27319,2.20004 -2.53516,4.3051 -4.71741,8.42667c-1.0415,1.96703 -1.98254,3.91573 -2.87097,5.82451c-0.86609,1.86076 -1.67371,3.69499 -2.45703,5.4915c-0.76733,1.75986 -1.48962,3.50052 -3.00525,6.85066c-0.74231,1.6409 -1.51074,3.24519 -2.28149,4.82401c-0.76147,1.55984 -1.53064,3.09286 -2.29053,4.608c-0.7511,1.49753 -1.5083,2.97073 -2.92798,5.90132c-0.69812,1.44099 -1.36584,2.87599 -2.01001,4.30051c-0.63586,1.4062 -1.24573,2.80124 -1.83008,4.1835c-0.57556,1.36147 -1.13574,2.7045 -2.15991,5.34933c-0.49805,1.28621 -0.96326,2.55313 -1.41907,3.78749c-0.44275,1.19897 -0.86768,2.36023 -1.29297,3.4725c-0.40759,1.06599 -0.7793,2.09109 -1.62134,3.90666c-0.38245,0.82463 -0.78906,1.57663 -1.20447,2.26651c-0.39465,0.6553 -0.80762,1.26083 -1.23157,1.8255c-0.41272,0.54962 -0.83911,1.07426 -1.73059,2.07466c-0.44958,0.50456 -0.91626,1.00104 -1.38599,1.5c-0.47168,0.50104 -0.94788,0.99954 -1.422,1.5c-0.47327,0.49954 -0.94897,0.99309 -1.85876,2c-0.44873,0.49663 -0.88293,0.99754 -1.30493,1.5c-0.41797,0.49759 -0.82324,0.99753 -1.21509,1.5c-0.38806,0.49756 -0.76965,0.99303 -1.47998,2c-0.35022,0.49644 -0.68323,0.99823 -1.01392,1.4955c-0.328,0.49339 -0.65063,0.98509 -0.97803,1.46851c-0.32532,0.48027 -0.64331,0.96227 -1.34131,1.86934c-0.34741,0.45154 -0.71777,0.88733 -1.09509,1.323c-0.38257,0.44171 -0.78052,0.88474 -1.18494,1.341c-0.41577,0.46906 -0.85107,0.94806 -1.71997,2.00266c-0.46082,0.55933 -0.92004,1.15225 -1.3905,1.76251c-0.48035,0.62305 -0.9624,1.25934 -1.45349,1.89749c-0.49255,0.64017 -0.97742,1.28424 -1.98938,2.50665c-0.49316,0.59573 -0.99548,1.16434 -1.49097,1.71902c-0.48584,0.54395 -0.96875,1.07147 -1.43701,1.59299c-0.45898,0.51114 -0.91797,1.00507 -1.73865,2.02133c-0.39856,0.49353 -0.76733,0.9967 -1.11902,1.5c-0.34705,0.49677 -0.67566,0.99817 -0.99304,1.5c-0.31519,0.4982 -0.61938,0.99957 -1.22131,2c-0.30054,0.49945 -0.59888,0.99884 -0.90454,1.491c-0.30371,0.48917 -0.61145,0.97064 -0.93152,1.43701c-0.31641,0.461 -0.62683,0.92007 -1.33057,1.73865c-0.34424,0.40048 -0.71716,0.77097 -1.09509,1.13702c-0.38196,0.37 -0.78149,0.7363 -1.18494,1.11899c-0.41675,0.39526 -0.8584,0.79886 -1.71997,1.74399c-0.46472,0.50977 -0.92029,1.06723 -1.38159,1.6485c-0.47083,0.59335 -0.93311,1.20407 -1.3905,1.81952c-0.45361,0.61023 -0.89099,1.21533 -1.72791,2.36533c-0.39026,0.53632 -0.76514,1.04819 -1.12805,1.54199c-0.35437,0.48218 -0.70544,0.95789 -1.05603,1.43402c-0.35474,0.48187 -0.71875,0.97488 -1.48267,2.02399c-0.41016,0.56326 -0.83411,1.151 -1.27197,1.75351c-0.44482,0.61215 -0.89307,1.22684 -1.34399,1.8345c-0.44373,0.59799 -0.87207,1.18298 -1.71729,2.24533c-0.38562,0.48468 -0.76038,0.92862 -1.11902,1.3425c-0.34021,0.3927 -0.67249,0.7619 -0.99304,1.11749c-0.31201,0.34607 -0.625,0.68115 -1.22131,1.37332c-0.30334,0.35208 -0.60168,0.71732 -0.90002,1.09052c-0.30164,0.37741 -0.60095,0.76291 -0.90002,1.1535c-0.3009,0.39307 -0.60022,0.7905 -1.19995,1.58932c-0.30017,0.39978 -0.59924,0.79919 -0.90002,1.1955c-0.29919,0.39435 -0.59851,0.78479 -0.90002,1.16852c-0.29846,0.37994 -0.59314,0.75641 -1.19995,1.46933c-0.29651,0.34833 -0.59924,0.68344 -0.89551,1.01849c-0.29443,0.33298 -0.5874,0.66589 -0.86853,1.00949c-0.28259,0.34543 -0.57251,0.69363 -1.06934,1.47202c-0.25671,0.40222 -0.48584,0.83298 -0.71399,1.272c-0.23059,0.44363 -0.45105,0.89545 -0.67798,1.34399c-0.22571,0.44611 -0.43652,0.89587 -0.94128,1.71732c-0.24402,0.397 -0.51221,0.76553 -0.78149,1.11902c-0.26294,0.34515 -0.53149,0.67227 -0.79053,0.99298c-0.25195,0.31195 -0.5105,0.6058 -0.92798,1.22134c-0.19934,0.29395 -0.36768,0.59607 -0.51904,0.89551c-0.14722,0.29138 -0.27502,0.58267 -0.39294,0.8685c-0.11462,0.27792 -0.21497,0.55219 -0.42139,1.06934c-0.09814,0.24588 -0.19873,0.48187 -0.30005,0.7095c-0.09875,0.22171 -0.19922,0.43668 -0.29993,0.64648c-0.09924,0.20654 -0.19958,0.40961 -0.40002,0.81067c-0.09998,0.19995 -0.19946,0.39963 -0.30444,0.59549c-0.10437,0.19482 -0.21289,0.38593 -0.33154,0.56851c-0.11768,0.18115 -0.23486,0.36411 -0.53064,0.66934c-0.14758,0.15234 -0.31482,0.28415 -0.48157,0.414c-0.16541,0.12881 -0.33301,0.25003 -0.49048,0.37799c-0.15356,0.12479 -0.31616,0.24011 -0.52795,0.54132c-0.10315,0.14682 -0.16992,0.31708 -0.22803,0.49051c-0.05933,0.17734 -0.104,0.36404 -0.15601,0.5535c-0.05334,0.19424 -0.09607,0.40012 -0.28271,0.78934c-0.09863,0.2056 -0.23242,0.40256 -0.37646,0.60001c-0.14783,0.20267 -0.31042,0.40051 -0.47546,0.60001c-0.16589,0.2005 -0.34033,0.39362 -0.64807,0.79999c-0.14917,0.19699 -0.28381,0.39841 -0.40942,0.60001c-0.12366,0.19846 -0.23792,0.39914 -0.34656,0.60001c-0.10779,0.19916 -0.20984,0.39975 -0.41064,0.79999c-0.10022,0.19971 -0.19934,0.39896 -0.30005,0.59549c-0.09949,0.19412 -0.19861,0.38437 -0.29993,0.56851c-0.09875,0.17953 -0.19336,0.35498 -0.40002,0.66934c-0.0968,0.14722 -0.19788,0.28186 -0.29553,0.40948c-0.09314,0.1217 -0.18457,0.2356 -0.26843,0.3465c-0.07983,0.10547 -0.16162,0.20331 -0.26941,0.41068c-0.05054,0.09726 -0.08411,0.19818 -0.11401,0.2955c-0.02869,0.09341 -0.0509,0.1842 -0.078,0.26849c-0.02551,0.07938 -0.04333,0.1629 -0.14124,0.26935c-0.0481,0.05228 -0.11646,0.08502 -0.18604,0.11398c-0.07166,0.02982 -0.14783,0.05145 -0.22205,0.078c-0.07312,0.02612 -0.1532,0.04385 -0.25867,0.14133c-0.05225,0.04834 -0.08557,0.11795 -0.11841,0.19052c-0.03528,0.07806 -0.06665,0.16479 -0.1095,0.25348c-0.04602,0.09515 -0.0946,0.20258 -0.27209,0.38934c-0.10205,0.10736 -0.23328,0.20184 -0.37195,0.29999c-0.14404,0.10193 -0.29529,0.1991 -0.44397,0.30002c-0.146,0.09912 -0.29614,0.18527 -0.51733,0.39999c-0.0968,0.09396 -0.16833,0.1976 -0.22351,0.29999c-0.05273,0.09787 -0.08899,0.20001 -0.12451,0.30002l-0.03357,0.10001l-0.03442,0.09998" id="svg_3" stroke-width="20" stroke="#000000" fill="none"/>
+ </g>
+</svg>
index 8b49436..149bb4d 100644 (file)
@@ -1114,30 +1114,17 @@ export const ChessRules = class ChessRules {
     return 3;
   }
 
     return 3;
   }
 
-  // NOTE: works also for extinction chess because depth is 3...
   getComputerMove() {
     const maxeval = V.INFINITY;
     const color = this.turn;
     // Some variants may show a bigger moves list to the human (Switching),
     // thus the argument "computer" below (which is generally ignored)
   getComputerMove() {
     const maxeval = V.INFINITY;
     const color = this.turn;
     // Some variants may show a bigger moves list to the human (Switching),
     // thus the argument "computer" below (which is generally ignored)
-    let moves1 = this.getAllValidMoves("computer");
+    let moves1 = this.getAllValidMoves();
 
     if (moves1.length == 0)
       // TODO: this situation should not happen
       return null;
 
 
     if (moves1.length == 0)
       // TODO: this situation should not happen
       return null;
 
-    // Can I mate in 1 ? (for Magnetic & Extinction)
-    for (let i of shuffle(ArrayFun.range(moves1.length))) {
-      this.play(moves1[i]);
-      let finish = Math.abs(this.evalPosition()) >= V.THRESHOLD_MATE;
-      if (!finish) {
-        const score = this.getCurrentScore();
-        if (["1-0", "0-1"].includes(score)) finish = true;
-      }
-      this.undo(moves1[i]);
-      if (finish) return moves1[i];
-    }
-
     // Rank moves using a min-max at depth 2
     for (let i = 0; i < moves1.length; i++) {
       // Initial self evaluation is very low: "I'm checkmated"
     // Rank moves using a min-max at depth 2
     for (let i = 0; i < moves1.length; i++) {
       // Initial self evaluation is very low: "I'm checkmated"
@@ -1149,7 +1136,7 @@ export const ChessRules = class ChessRules {
         // Initial enemy evaluation is very low too, for him
         eval2 = (color == "w" ? 1 : -1) * maxeval;
         // Second half-move:
         // Initial enemy evaluation is very low too, for him
         eval2 = (color == "w" ? 1 : -1) * maxeval;
         // Second half-move:
-        let moves2 = this.getAllValidMoves("computer");
+        let moves2 = this.getAllValidMoves();
         for (let j = 0; j < moves2.length; j++) {
           this.play(moves2[j]);
           const score2 = this.getCurrentScore();
         for (let j = 0; j < moves2.length; j++) {
           this.play(moves2[j]);
           const score2 = this.getCurrentScore();
@@ -1185,6 +1172,7 @@ export const ChessRules = class ChessRules {
     moves1.sort((a, b) => {
       return (color == "w" ? 1 : -1) * (b.eval - a.eval);
     });
     moves1.sort((a, b) => {
       return (color == "w" ? 1 : -1) * (b.eval - a.eval);
     });
+//    console.log(moves1.map(m => { return [this.getNotation(m), m.eval]; }));
 
     let candidates = [0]; //indices of candidates moves
     for (let j = 1; j < moves1.length && moves1[j].eval == moves1[0].eval; j++)
 
     let candidates = [0]; //indices of candidates moves
     for (let j = 1; j < moves1.length && moves1[j].eval == moves1[0].eval; j++)
@@ -1225,7 +1213,7 @@ export const ChessRules = class ChessRules {
     if (score != "*")
       return score == "1/2" ? 0 : (score == "1-0" ? 1 : -1) * maxeval;
     if (depth == 0) return this.evalPosition();
     if (score != "*")
       return score == "1/2" ? 0 : (score == "1-0" ? 1 : -1) * maxeval;
     if (depth == 0) return this.evalPosition();
-    const moves = this.getAllValidMoves("computer");
+    const moves = this.getAllValidMoves();
     let v = color == "w" ? -maxeval : maxeval;
     if (color == "w") {
       for (let i = 0; i < moves.length; i++) {
     let v = color == "w" ? -maxeval : maxeval;
     if (color == "w") {
       for (let i = 0; i < moves.length; i++) {
index ff178cd..c807457 100644 (file)
@@ -5,6 +5,7 @@ export const translations = {
   "Accept challenge?": "Accept challenge?",
   Analyse: "Analyse",
   "Analysis mode": "Analysis mode",
   "Accept challenge?": "Accept challenge?",
   Analyse: "Analyse",
   "Analysis mode": "Analysis mode",
+  "Analysis disabled for this variant": "Analysis disabled for this variant",
   "Any player": "Any player",
   Apply: "Apply",
   "Are you sure?": "Are you sure?",
   "Any player": "Any player",
   Apply: "Apply",
   "Are you sure?": "Are you sure?",
@@ -52,7 +53,9 @@ export const translations = {
   Login: "Login",
   Logout: "Logout",
   "Logout successful!": "Logout successful!",
   Login: "Login",
   Logout: "Logout",
   "Logout successful!": "Logout successful!",
+  "Mispelled variant name": "Mispelled variant name",
   "Missing email": "Missing email",
   "Missing email": "Missing email",
+  "Missing FEN": "Missing FEN",
   "Missing instructions": "Missing instructions",
   "Missing name": "Missing name",
   "Missing solution": "Missing solution",
   "Missing instructions": "Missing instructions",
   "Missing name": "Missing name",
   "Missing solution": "Missing solution",
@@ -89,7 +92,7 @@ export const translations = {
   "participant(s):": "participant(s):",
   Refuse: "Refuse",
   Register: "Register",
   "participant(s):": "participant(s):",
   Refuse: "Refuse",
   Register: "Register",
-  "Registration complete! Please check your emails": "Registration complete! Please check your emails",
+  "Registration complete! Please check your emails now": "Registration complete! Please check your emails now",
   "Remove game?": "Remove game?",
   Resign: "Resign",
   "Resign the game?": "Resign the game?",
   "Remove game?": "Remove game?",
   Resign: "Resign",
   "Resign the game?": "Resign the game?",
@@ -145,13 +148,16 @@ export const translations = {
   "Keep antiking in check": "Keep antiking in check",
   "King crosses the board": "King crosses the board",
   "Laws of attraction": "Laws of attraction",
   "Keep antiking in check": "Keep antiking in check",
   "King crosses the board": "King crosses the board",
   "Laws of attraction": "Laws of attraction",
+  "Long jumps over pieces": "Long jumps over pieces",
   "Lose all pieces": "Lose all pieces",
   "Mate any piece": "Mate any piece",
   "Lose all pieces": "Lose all pieces",
   "Mate any piece": "Mate any piece",
+  "Mate the knight": "Mate the knight",
   "Middle battle": "Middle battle",
   "Move like a knight": "Move like a knight",
   "Move twice": "Move twice",
   "Neverending rows": "Neverending rows",
   "Pawns move diagonally": "Pawns move diagonally",
   "Middle battle": "Middle battle",
   "Move like a knight": "Move like a knight",
   "Move twice": "Move twice",
   "Neverending rows": "Neverending rows",
   "Pawns move diagonally": "Pawns move diagonally",
+  "Queen disguised as a pawn": "Queen disguised as a pawn",
   "Reuse pieces": "Reuse pieces",
   "Reverse captures": "Reverse captures",
   "Run forward": "Run forward",
   "Reuse pieces": "Reuse pieces",
   "Reverse captures": "Reverse captures",
   "Run forward": "Run forward",
index eb08331..3c63ffb 100644 (file)
@@ -5,6 +5,7 @@ export const translations = {
   "Accept challenge?": "¿Acceptar el desafío?",
   Analyse: "Analizar",
   "Analysis mode": "Modo análisis",
   "Accept challenge?": "¿Acceptar el desafío?",
   Analyse: "Analizar",
   "Analysis mode": "Modo análisis",
+  "Analysis disabled for this variant": "Análisis deshabilitado para esta variante",
   "Any player": "Cualquier jugador",
   Apply: "Aplicar",
   "Are you sure?": "¿Está usted seguro?",
   "Any player": "Cualquier jugador",
   Apply: "Aplicar",
   "Are you sure?": "¿Está usted seguro?",
@@ -52,7 +53,9 @@ export const translations = {
   Login: "Login",
   Logout: "Logout",
   "Logout successful!": "¡Desconexión exitosa!",
   Login: "Login",
   Logout: "Logout",
   "Logout successful!": "¡Desconexión exitosa!",
+  "Mispelled variant name": "Variante mal escrita",
   "Missing email": "Email falta",
   "Missing email": "Email falta",
+  "Missing FEN": "FEN falta",
   "Missing instructions": "Instrucciones faltan",
   "Missing name": "Nombre falta",
   "Missing solution": "Solución falta",
   "Missing instructions": "Instrucciones faltan",
   "Missing name": "Nombre falta",
   "Missing solution": "Solución falta",
@@ -89,7 +92,7 @@ export const translations = {
   "participant(s):": "participante(s):",
   Refuse: "Rechazar",
   Register: "Registrarse",
   "participant(s):": "participante(s):",
   Refuse: "Rechazar",
   Register: "Registrarse",
-  "Registration complete! Please check your emails": "¡Registro completo! Por favor revise sus correos electrónicos",
+  "Registration complete! Please check your emails now": "¡Registro completo! Revise sus correos electrónicos ahora",
   "Remove game?": "¿Eliminar la partida?",
   Resign: "Abandonar",
   "Resign the game?": "¿Abandonar la partida?",
   "Remove game?": "¿Eliminar la partida?",
   Resign: "Abandonar",
   "Resign the game?": "¿Abandonar la partida?",
@@ -145,13 +148,16 @@ export const translations = {
   "Keep antiking in check": "Mantener el antirey en jaque",
   "King crosses the board": "El rey cruza el tablero",
   "Laws of attraction": "Las leyes de las atracciones",
   "Keep antiking in check": "Mantener el antirey en jaque",
   "King crosses the board": "El rey cruza el tablero",
   "Laws of attraction": "Las leyes de las atracciones",
+  "Long jumps over pieces": "Saltos largos sobre las piezas",
   "Lose all pieces": "Perder todas las piezas",
   "Mate any piece": "Matar cualquier pieza",
   "Lose all pieces": "Perder todas las piezas",
   "Mate any piece": "Matar cualquier pieza",
+  "Mate the knight": "Matar el caballo",
   "Middle battle": "Batalla media",
   "Move like a knight": "Moverse como un caballo",
   "Move twice": "Mover dos veces",
   "Neverending rows": "Filas interminables",
   "Pawns move diagonally": "Peones se mueven en diagonal",
   "Middle battle": "Batalla media",
   "Move like a knight": "Moverse como un caballo",
   "Move twice": "Mover dos veces",
   "Neverending rows": "Filas interminables",
   "Pawns move diagonally": "Peones se mueven en diagonal",
+  "Queen disguised as a pawn": "Reina disfrazada de peón",
   "Reuse pieces": "Reutilizar piezas",
   "Reverse captures": "Capturas invertidas",
   "Run forward": "Correr hacia adelante",
   "Reuse pieces": "Reutilizar piezas",
   "Reverse captures": "Capturas invertidas",
   "Run forward": "Correr hacia adelante",
index 6e37e60..c724681 100644 (file)
@@ -5,6 +5,7 @@ export const translations = {
   "Accept challenge?": "Accepter le défi ?",
   Analyse: "Analyser",
   "Analysis mode": "Mode analyse",
   "Accept challenge?": "Accepter le défi ?",
   Analyse: "Analyser",
   "Analysis mode": "Mode analyse",
+  "Analysis disabled for this variant": "Analyse désactivée pour cette variante",
   "Any player": "N'importe qui",
   Apply: "Appliquer",
   "Authentication successful!": "Authentification réussie !",
   "Any player": "N'importe qui",
   Apply: "Appliquer",
   "Authentication successful!": "Authentification réussie !",
@@ -52,7 +53,9 @@ export const translations = {
   Login: "Login",
   Logout: "Logout",
   "Logout successful!": "Déconnection réussie !",
   Login: "Login",
   Logout: "Logout",
   "Logout successful!": "Déconnection réussie !",
+  "Mispelled variant name": "Variante mal orthographiée",
   "Missing email": "Email manquant",
   "Missing email": "Email manquant",
+  "Missing FEN": "FEN manquante",
   "Missing instructions": "Instructions manquantes",
   "Missing name": "Nom manquant",
   "Missing solution": "Solution manquante",
   "Missing instructions": "Instructions manquantes",
   "Missing name": "Nom manquant",
   "Missing solution": "Solution manquante",
@@ -89,7 +92,7 @@ export const translations = {
   "participant(s):": "participant(s) :",
   Refuse: "Refuser",
   Register: "S'enregistrer",
   "participant(s):": "participant(s) :",
   Refuse: "Refuser",
   Register: "S'enregistrer",
-  "Registration complete! Please check your emails": "Enregistrement terminé ! Allez voir vos emails",
+  "Registration complete! Please check your emails now": "Enregistrement terminé ! Allez voir vos emails maintenant",
   "Remove game?": "Supprimer la partie ?",
   Resign: "Abandonner",
   "Resign the game?": "Abandonner la partie ?",
   "Remove game?": "Supprimer la partie ?",
   Resign: "Abandonner",
   "Resign the game?": "Abandonner la partie ?",
@@ -145,13 +148,16 @@ export const translations = {
   "Keep antiking in check": "Gardez l'antiroi en Ã©chec",
   "King crosses the board": "Le roi traverse l'échiquier",
   "Laws of attraction": "Les lois de l'attraction",
   "Keep antiking in check": "Gardez l'antiroi en Ã©chec",
   "King crosses the board": "Le roi traverse l'échiquier",
   "Laws of attraction": "Les lois de l'attraction",
+  "Long jumps over pieces": "Sauts longs par dessus les pièces",
   "Lose all pieces": "Perdez toutes les pièces",
   "Lose all pieces": "Perdez toutes les pièces",
-  "Mate any piece": "Mater n'importe quelle pièce",
+  "Mate any piece": "Matez n'importe quelle pièce",
+  "Mate the knight": "Matez le cavalier",
   "Middle battle": "Bataille du milieu",
   "Move like a knight": "Bougez comme un cavalier",
   "Move twice": "Jouer deux coups",
   "Neverending rows": "Rangées sans fin",
   "Pawns move diagonally": "Les pions vont en diagonale",
   "Middle battle": "Bataille du milieu",
   "Move like a knight": "Bougez comme un cavalier",
   "Move twice": "Jouer deux coups",
   "Neverending rows": "Rangées sans fin",
   "Pawns move diagonally": "Les pions vont en diagonale",
+  "Queen disguised as a pawn": "Reine déguisée en pion",
   "Reuse pieces": "Réutiliser les pièces",
   "Reverse captures": "Captures inversées",
   "Run forward": "Courir vers l'avant",
   "Reuse pieces": "Réutiliser les pièces",
   "Reverse captures": "Captures inversées",
   "Run forward": "Courir vers l'avant",
index 7ec2cc2..c2136cf 100644 (file)
@@ -29,6 +29,17 @@ figure.diagram-container
     Possible knightrider moves after 1.d3 g6 2.Nc3 Bg7.
     If 3.Nxd7, 3...Bxe5 e.p. is possible.
 
     Possible knightrider moves after 1.d3 g6 2.Nc3 Bg7.
     If 3.Nxd7, 3...Bxe5 e.p. is possible.
 
+p.
+  Due to the extended knight movement, a capture, check or even checkmate
+  could be played at move 1. On the following diagram 1.Nxe7 is mate,
+  and black in turn could play 1...Nxg2 trapping the queen.
+  Consequently, captures are disabled at move 1.
+
+figure.diagram-container
+  .diagram
+    | fen:nbqnbrkr/pppppppp/8/8/8/8/PPPPPPPP/RNKBQNBR:
+  figcaption 1.Nxe7# and 1...Nxg2: "knightriders' anomalies".
+
 h3 Source
 
 p
 h3 Source
 
 p
index 1c50159..cb4dc79 100644 (file)
@@ -31,6 +31,18 @@ figure.diagram-container
     Posibles jugadas de caballero después de 1.d3 g6 2.Nc3 Bg7.
     Si 3.Nxd7, 3...Bxe5 e.p. es posible.
 
     Posibles jugadas de caballero después de 1.d3 g6 2.Nc3 Bg7.
     Si 3.Nxd7, 3...Bxe5 e.p. es posible.
 
+p.
+  Los movimientos del caballo se incrementan, una captura,
+  un jaque o incluso un jaque mate sería posible en el primer movimiento.
+  En el diagrama a continuación 1.Nxe7 es mate, y las negras al turno
+  podría jugar 1...Nxg2 atrapando a la dama.
+  Es por eso que las capturas solo están autorizadas desde el segundo movimiento.
+
+figure.diagram-container
+  .diagram
+    | fen:nbqnbrkr/pppppppp/8/8/8/8/PPPPPPPP/RNKBQNBR:
+  figcaption 1.Nxe7# y 1...Nxg2: "anomalías de caballeros".
+
 h3 Fuente
 
 p
 h3 Fuente
 
 p
index 6dd1e14..a4178bf 100644 (file)
@@ -31,6 +31,18 @@ figure.diagram-container
     Possibles coups de chevalier après 1.d3 g6 2.Nc3 Bg7.
     Si 3.Nxd7, 3...Bxe5 e.p. est possible.
 
     Possibles coups de chevalier après 1.d3 g6 2.Nc3 Bg7.
     Si 3.Nxd7, 3...Bxe5 e.p. est possible.
 
+p.
+  Les déplacements du cavalier Ã©tant augmentés, une capture,
+  un Ã©chec ou même un mat seraient possibles au premier coup.
+  Sur le diagramme ci-dessous 1.Nxe7 fait mat, et les noirsau trait
+  pourraient jouer 1...Nxg2 piégeant la dame.
+  C'est pourquoi les captures ne sont autorisées qu'à partir du second coup.
+
+figure.diagram-container
+  .diagram
+    | fen:nbqnbrkr/pppppppp/8/8/8/8/PPPPPPPP/RNKBQNBR:
+  figcaption 1.Nxe7# et 1...Nxg2 : "anomalies de chevaliers".
+
 h3 Source
 
 p
 h3 Source
 
 p
diff --git a/client/src/translations/rules/Grasshopper/en.pug b/client/src/translations/rules/Grasshopper/en.pug
new file mode 100644 (file)
index 0000000..4f56997
--- /dev/null
@@ -0,0 +1 @@
+p TODO
diff --git a/client/src/translations/rules/Grasshopper/es.pug b/client/src/translations/rules/Grasshopper/es.pug
new file mode 100644 (file)
index 0000000..4f56997
--- /dev/null
@@ -0,0 +1 @@
+p TODO
diff --git a/client/src/translations/rules/Grasshopper/fr.pug b/client/src/translations/rules/Grasshopper/fr.pug
new file mode 100644 (file)
index 0000000..4f56997
--- /dev/null
@@ -0,0 +1 @@
+p TODO
diff --git a/client/src/translations/rules/Hiddenqueen/en.pug b/client/src/translations/rules/Hiddenqueen/en.pug
new file mode 100644 (file)
index 0000000..4f56997
--- /dev/null
@@ -0,0 +1 @@
+p TODO
diff --git a/client/src/translations/rules/Hiddenqueen/es.pug b/client/src/translations/rules/Hiddenqueen/es.pug
new file mode 100644 (file)
index 0000000..4f56997
--- /dev/null
@@ -0,0 +1 @@
+p TODO
diff --git a/client/src/translations/rules/Hiddenqueen/fr.pug b/client/src/translations/rules/Hiddenqueen/fr.pug
new file mode 100644 (file)
index 0000000..4f56997
--- /dev/null
@@ -0,0 +1 @@
+p TODO
diff --git a/client/src/translations/rules/Knightmate/en.pug b/client/src/translations/rules/Knightmate/en.pug
new file mode 100644 (file)
index 0000000..4f56997
--- /dev/null
@@ -0,0 +1 @@
+p TODO
diff --git a/client/src/translations/rules/Knightmate/es.pug b/client/src/translations/rules/Knightmate/es.pug
new file mode 100644 (file)
index 0000000..4f56997
--- /dev/null
@@ -0,0 +1 @@
+p TODO
diff --git a/client/src/translations/rules/Knightmate/fr.pug b/client/src/translations/rules/Knightmate/fr.pug
new file mode 100644 (file)
index 0000000..4f56997
--- /dev/null
@@ -0,0 +1 @@
+p TODO
index 1b0248d..f168ce9 100644 (file)
@@ -14,7 +14,7 @@ figure.diagram-container
 
 p.
   This "small" difference alters the strategy a lot: guarding pieces is useless,
 
 p.
   This "small" difference alters the strategy a lot: guarding pieces is useless,
-  for example, and the king cannot escape a check by capturing.
+  for example, and the king cannot escape a distant check by capturing.
 
 h3 Source
 
 
 h3 Source
 
index 7e714ed..5314cfc 100644 (file)
@@ -14,7 +14,7 @@ figure.diagram-container
 
 p.
   Esta "pequeña" diferencia altera enormemente la estrategia: defender las piezas
 
 p.
   Esta "pequeña" diferencia altera enormemente la estrategia: defender las piezas
-  es inútil, por ejemplo, y el rey no puede escapar un jaque capturando.
+  es inútil, por ejemplo, y el rey no puede escapar un jaque remota capturando.
 
 h3 Fuente
 
 
 h3 Fuente
 
index cc9bf48..0f0bb3a 100644 (file)
@@ -14,7 +14,7 @@ figure.diagram-container
 
 p.
   Cette "petite" différence altère beaucoup la stratégie : défendre les pièces
 
 p.
   Cette "petite" différence altère beaucoup la stratégie : défendre les pièces
-  est inutile, par exemple, et le roi ne pas Ã©chapper Ã  un Ã©chec en capturant.
+  est inutile, par exemple, et le roi ne pas Ã©chapper Ã  un Ã©chec distant en capturant.
 
 h3 Source
 
 
 h3 Source
 
index 0dd6dd6..1ba5ae0 100644 (file)
@@ -19,9 +19,9 @@ p.
   El rey negro puede ir a c6: se mueve hacia la casilla no desaparecida
   más cercano (si lo hay).
 
   El rey negro puede ir a c6: se mueve hacia la casilla no desaparecida
   más cercano (si lo hay).
 
-figure.diagram de contenedores
+figure.diagram-container
   .diagram
   .diagram
-    | fen: rbkxxxbn / ppxppppx / 2qxxB2 / 4x2p / 3P1x2 / 3n1x2 / PPPxPPPP / RBxxxNKR b2, f2, b4, c5, g5, f6:
+    | fen:rbkxxxbn/ppxppppx/2qxxB2/4x2p/3P1x2/3n1x2/PPPxPPPP/RBxxxNKR b2,f2,b4,c5,g5,f6:
   figcaption Posibles movimientos para el caballo en d3.
 
 p.
   figcaption Posibles movimientos para el caballo en d3.
 
 p.
index a92338f..aa95692 100644 (file)
@@ -282,14 +282,17 @@ export const VariantRules = class AliceRules extends ChessRules {
   }
 
   static get VALUES() {
   }
 
   static get VALUES() {
-    return Object.assign(ChessRules.VALUES, {
-      s: 1,
-      u: 5,
-      o: 3,
-      c: 3,
-      t: 9,
-      l: 1000
-    });
+    return Object.assign(
+      {
+        s: 1,
+        u: 5,
+        o: 3,
+        c: 3,
+        t: 9,
+        l: 1000
+      },
+      ChessRules.VALUES
+    );
   }
 
   getNotation(move) {
   }
 
   getNotation(move) {
index f07f626..21e37f4 100644 (file)
@@ -145,7 +145,10 @@ export const VariantRules = class AntikingRules extends ChessRules {
   }
 
   static get VALUES() {
   }
 
   static get VALUES() {
-    return Object.assign(ChessRules.VALUES, { a: 1000 });
+    return Object.assign(
+      { a: 1000 },
+      ChessRules.VALUES
+    );
   }
 
   static GenRandInitFen() {
   }
 
   static GenRandInitFen() {
index 374a620..3f8f3b2 100644 (file)
@@ -67,6 +67,52 @@ export const VariantRules = class EnpassantRules extends ChessRules {
     return res.slice(0, -1); //remove last comma
   }
 
     return res.slice(0, -1); //remove last comma
   }
 
+  getPotentialMovesFrom([x, y]) {
+    let moves = super.getPotentialMovesFrom([x,y]);
+    // Add en-passant captures from this square:
+    const L = this.epSquares.length;
+    if (!this.epSquares[L - 1]) return moves;
+    const squares = this.epSquares[L - 1];
+    const S = squares.length;
+    // Object describing the removed opponent's piece:
+    const pipoV = new PiPo({
+      x: squares[S-1].x,
+      y: squares[S-1].y,
+      c: V.GetOppCol(this.turn),
+      p: this.getPiece(squares[S-1].x, squares[S-1].y)
+    });
+    // Check if existing non-capturing moves could also capture en passant
+    moves.forEach(m => {
+      if (
+        m.appear[0].p != V.PAWN && //special pawn case is handled elsewhere
+        m.vanish.length <= 1 &&
+        [...Array(S-1).keys()].some(i => {
+          return m.end.x == squares[i].x && m.end.y == squares[i].y;
+        })
+      ) {
+        m.vanish.push(pipoV);
+      }
+    });
+    // Special case of the king knight's movement:
+    if (this.getPiece(x, y) == V.KING) {
+      V.steps[V.KNIGHT].forEach(step => {
+        const endX = x + step[0];
+        const endY = y + step[1];
+        if (
+          V.OnBoard(endX, endY) &&
+          [...Array(S-1).keys()].some(i => {
+            return endX == squares[i].x && endY == squares[i].y;
+          })
+        ) {
+          let enpassantMove = this.getBasicMove([x, y], [endX, endY]);
+          enpassantMove.vanish.push(pipoV);
+          moves.push(enpassantMove);
+        }
+      });
+    }
+    return moves;
+  }
+
   // TODO: this getPotentialPawnMovesFrom() is mostly duplicated:
   // it could be split in "capture", "promotion", "enpassant"...
   getPotentialPawnMoves([x, y]) {
   // TODO: this getPotentialPawnMovesFrom() is mostly duplicated:
   // it could be split in "capture", "promotion", "enpassant"...
   getPotentialPawnMoves([x, y]) {
@@ -144,11 +190,19 @@ export const VariantRules = class EnpassantRules extends ChessRules {
   }
 
   // Remove the "onestep" condition: knight promote to knightrider:
   }
 
   // Remove the "onestep" condition: knight promote to knightrider:
-
   getPotentialKnightMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT]);
   }
 
   getPotentialKnightMoves(sq) {
     return this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT]);
   }
 
+  filterValid(moves) {
+    const filteredMoves = super.filterValid(moves);
+    // If at least one full move made, everything is allowed:
+    if (this.movesCount >= 2)
+      return filteredMoves;
+    // Else, forbid captures:
+    return filteredMoves.filter(m => m.vanish.length == 1);
+  }
+
   isAttackedByKnight(sq, colors) {
     return this.isAttackedBySlideNJump(
       sq,
   isAttackedByKnight(sq, colors) {
     return this.isAttackedBySlideNJump(
       sq,
@@ -158,52 +212,6 @@ export const VariantRules = class EnpassantRules extends ChessRules {
     );
   }
 
     );
   }
 
-  getPotentialMovesFrom([x, y]) {
-    let moves = super.getPotentialMovesFrom([x,y]);
-    // Add en-passant captures from this square:
-    const L = this.epSquares.length;
-    if (!this.epSquares[L - 1]) return moves;
-    const squares = this.epSquares[L - 1];
-    const S = squares.length;
-    // Object describing the removed opponent's piece:
-    const pipoV = new PiPo({
-      x: squares[S-1].x,
-      y: squares[S-1].y,
-      c: V.GetOppCol(this.turn),
-      p: this.getPiece(squares[S-1].x, squares[S-1].y)
-    });
-    // Check if existing non-capturing moves could also capture en passant
-    moves.forEach(m => {
-      if (
-        m.appear[0].p != V.PAWN && //special pawn case is handled elsewhere
-        m.vanish.length <= 1 &&
-        [...Array(S-1).keys()].some(i => {
-          return m.end.x == squares[i].x && m.end.y == squares[i].y;
-        })
-      ) {
-        m.vanish.push(pipoV);
-      }
-    });
-    // Special case of the king knight's movement:
-    if (this.getPiece(x, y) == V.KING) {
-      V.steps[V.KNIGHT].forEach(step => {
-        const endX = x + step[0];
-        const endY = y + step[1];
-        if (
-          V.OnBoard(endX, endY) &&
-          [...Array(S-1).keys()].some(i => {
-            return endX == squares[i].x && endY == squares[i].y;
-          })
-        ) {
-          let enpassantMove = this.getBasicMove([x, y], [endX, endY]);
-          enpassantMove.vanish.push(pipoV);
-          moves.push(enpassantMove);
-        }
-      });
-    }
-    return moves;
-  }
-
   static get VALUES() {
     return {
       p: 1,
   static get VALUES() {
     return {
       p: 1,
index d804f61..d3659af 100644 (file)
@@ -307,8 +307,8 @@ export const VariantRules = class GrandRules extends ChessRules {
 
   static get VALUES() {
     return Object.assign(
 
   static get VALUES() {
     return Object.assign(
-      ChessRules.VALUES,
-      { c: 5, m: 7 } //experimental
+      { c: 5, m: 7 }, //experimental
+      ChessRules.VALUES
     );
   }
 
     );
   }
 
diff --git a/client/src/variants/Grasshopper.js b/client/src/variants/Grasshopper.js
new file mode 100644 (file)
index 0000000..043c0fc
--- /dev/null
@@ -0,0 +1,133 @@
+import { ChessRules } from "@/base_rules";
+import { ArrayFun } from "@/utils/array";
+import { randInt } from "@/utils/alea";
+
+export const VariantRules = class GrasshopperRules extends ChessRules {
+  static get GRASSHOPPER() {
+    return "g";
+  }
+
+  static get PIECES() {
+    return ChessRules.PIECES.concat([V.GRASSHOPPER]);
+  }
+
+  getPpath(b) {
+    return (b[1] == V.GRASSHOPPER ? "Grasshopper/" : "") + b;
+  }
+
+  getPotentialMovesFrom([x, y]) {
+    switch (this.getPiece(x, y)) {
+      case V.GRASSHOPPER:
+        return this.getPotentialGrasshopperMoves([x, y]);
+      default:
+        return super.getPotentialMovesFrom([x, y]);
+    }
+  }
+
+  getPotentialGrasshopperMoves([x, y]) {
+    let moves = [];
+    // Look in every direction until an obstacle (to jump) is met
+    for (const step of V.steps[V.ROOK].concat(V.steps[V.BISHOP])) {
+      let i = x + step[0];
+      let j = y + step[1];
+      while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
+        i += step[0];
+        j += step[1];
+      }
+      // Move is valid if the next square is empty or occupied by enemy
+      const nextSq = [i+step[0], j+step[1]];
+      if (V.OnBoard(nextSq[0], nextSq[1]) && this.canTake([x, y], nextSq))
+        moves.push(this.getBasicMove([x, y], nextSq));
+    }
+    return moves;
+  }
+
+  isAttacked(sq, colors) {
+    return (
+      super.isAttacked(sq, colors) ||
+      this.isAttackedByGrasshopper(sq, colors)
+    );
+  }
+
+  isAttackedByGrasshopper([x, y], colors) {
+    // Reversed process: is there an adjacent obstacle,
+    // and a grasshopper next in the same line?
+    for (const step of V.steps[V.ROOK].concat(V.steps[V.BISHOP])) {
+      const nextSq = [x+step[0], y+step[1]];
+      if (
+        V.OnBoard(nextSq[0], nextSq[1]) &&
+        this.board[nextSq[0]][nextSq[1]] != V.EMPTY
+      ) {
+        let i = nextSq[0] + step[0];
+        let j = nextSq[1] + step[1];
+        while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) {
+          i += step[0];
+          j += step[1];
+        }
+        if (
+          V.OnBoard(i, j) &&
+          this.getPiece(i, j) == V.GRASSHOPPER &&
+          colors.includes(this.getColor(i, j))
+        ) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  static get VALUES() {
+    return Object.assign(
+      // TODO: grasshoppers power decline when less pieces on board...
+      { g: 3 },
+      ChessRules.VALUES
+    );
+  }
+
+  static GenRandInitFen() {
+    let pieces = { w: new Array(10), b: new Array(10) };
+    for (let c of ["w", "b"]) {
+      let positions = ArrayFun.range(8);
+
+      // Get random squares for grasshoppers (unconstrained)
+      let randIndex = randInt(8);
+      const grasshopper1Pos = positions[randIndex];
+      positions.splice(randIndex, 1);
+      randIndex = randInt(7);
+      const grasshopper2Pos = positions[randIndex];
+      positions.splice(randIndex, 1);
+
+      // Knights
+      randIndex = randInt(6);
+      let knight1Pos = positions[randIndex];
+      positions.splice(randIndex, 1);
+      randIndex = randInt(5);
+      let knight2Pos = positions[randIndex];
+      positions.splice(randIndex, 1);
+
+      // Queen
+      randIndex = randInt(4);
+      let queenPos = positions[randIndex];
+      positions.splice(randIndex, 1);
+
+      let rook1Pos = positions[0];
+      let kingPos = positions[1];
+      let rook2Pos = positions[2];
+
+      pieces[c][rook1Pos] = "r";
+      pieces[c][knight1Pos] = "n";
+      pieces[c][grasshopper1Pos] = "g";
+      pieces[c][queenPos] = "q";
+      pieces[c][kingPos] = "k";
+      pieces[c][grasshopper2Pos] = "g";
+      pieces[c][knight2Pos] = "n";
+      pieces[c][rook2Pos] = "r";
+    }
+    return (
+      pieces["b"].join("") +
+      "/pppppppp/8/8/8/8/PPPPPPPP/" +
+      pieces["w"].join("").toUpperCase() +
+      " w 0 1111 -"
+    );
+  }
+};
diff --git a/client/src/variants/Hiddenqueen.js b/client/src/variants/Hiddenqueen.js
new file mode 100644 (file)
index 0000000..fe34fb2
--- /dev/null
@@ -0,0 +1,155 @@
+import { ChessRules, PiPo, Move } from "@/base_rules";
+import { ArrayFun } from "@/utils/array";
+import { randInt } from "@/utils/alea";
+
+export const VariantRules = class HiddenqueenRules extends ChessRules {
+  // Analyse in Hiddenqueen mode makes no sense
+  static get CanAnalyze() {
+    return false;
+  }
+
+  static get HIDDEN_QUEEN() {
+    return 't';
+  }
+
+  static get PIECES() {
+    return ChessRules.PIECES.concat(Object.values(V.HIDDEN_CODE));
+  }
+
+  getPiece(i, j) {
+    const piece = this.board[i][j].charAt(1);
+    if (
+      piece != V.HIDDEN_QUEEN ||
+      // 'side' is used to determine what I see: a pawn or a (hidden)queen?
+      this.getColor(i, j) == this.side
+    ) {
+      return piece;
+    }
+    return V.PAWN;
+  }
+
+  getPpath(b, color, score) {
+    if (b[1] == V.HIDDEN_QUEEN) {
+      // Supposed to be hidden.
+      if (score == "*" && (!color || color != b[0]))
+        return b[0] + "p";
+      return "Hiddenqueen/" + b[0] + "t";
+    }
+    return b;
+  }
+
+  isValidPawnMove(move) {
+    const color = move.vanish[0].c;
+    const pawnShift = color == "w" ? -1 : 1;
+    const startRank = color == "w" ? V.size.x - 2 : 1;
+    const lastRank = color == "w" ? 0 : V.size.x - 1;
+    return (
+      // The queen is discovered if she reaches the 8th rank,
+      // even if this would be a technically valid pawn move.
+      move.end.x != lastRank &&
+      (
+        (
+          move.end.x - move.start.x == pawnShift &&
+          (
+            (
+              // Normal move
+              move.end.y == move.start.y &&
+              this.board[move.end.x][move.end.y] == V.EMPTY
+            )
+            ||
+            (
+              // Capture
+              Math.abs(move.end.y - move.start.y) == 1 &&
+              this.board[move.end.x][move.end.y] != V.EMPTY
+            )
+          )
+        )
+        ||
+        (
+          // Two-spaces initial jump
+          move.start.x == startRank &&
+          move.end.y == move.start.y &&
+          move.end.x - move.start.x == 2 * pawnShift &&
+          this.board[move.end.x][move.end.y] == V.EMPTY
+        )
+      )
+    );
+  }
+
+  getPotentialMovesFrom([x, y]) {
+    if (this.getPiece(x, y) == V.HIDDEN_QUEEN) {
+      const pawnMoves = super.getPotentialPawnMoves([x, y]);
+      let queenMoves = super.getPotentialQueenMoves([x, y]);
+      // Remove from queen moves those corresponding to a pawn move:
+      queenMoves = queenMoves
+        .filter(m => !this.isValidPawnMove(m))
+        // Hidden queen is revealed if moving like a queen:
+        .map(m => {
+          m.appear[0].p = V.QUEEN;
+          return m;
+        });
+      return pawnMoves.concat(queenMoves);
+    }
+    return super.getPotentialMovesFrom([x, y]);
+  }
+
+  getPossibleMovesFrom(sq) {
+    this.side = this.turn;
+    return this.filterValid(this.getPotentialMovesFrom(sq));
+  }
+
+  static GenRandInitFen() {
+    let fen = ChessRules.GenRandInitFen();
+    // Place hidden queens at random:
+    let hiddenQueenPos = randInt(8);
+    let pawnRank = "PPPPPPPP".split("");
+    pawnRank[hiddenQueenPos] = "T";
+    fen = fen.replace("PPPPPPPP", pawnRank.join(""));
+    hiddenQueenPos = randInt(8);
+    pawnRank = "pppppppp".split("");
+    pawnRank[hiddenQueenPos] = "t";
+    fen = fen.replace("pppppppp", pawnRank.join(""));
+    return fen;
+  }
+
+  updateVariables(move) {
+    super.updateVariables(move);
+    if (move.vanish.length == 2 && move.vanish[1].p == V.KING)
+      // We took opponent king
+      this.kingPos[this.turn] = [-1, -1];
+  }
+
+  unupdateVariables(move) {
+    super.unupdateVariables(move);
+    const c = move.vanish[0].c;
+    const oppCol = V.GetOppCol(c);
+    if (this.kingPos[oppCol][0] < 0)
+      // Last move took opponent's king:
+      this.kingPos[oppCol] = [move.vanish[1].x, move.vanish[1].y];
+  }
+
+  getCurrentScore() {
+    const color = this.turn;
+    if (this.kingPos[color][0] < 0)
+      // King disappeared
+      return color == "w" ? "0-1" : "1-0";
+    return super.getCurrentScore();
+  }
+
+  // Search is biased, so not really needed to explore deeply
+  static get SEARCH_DEPTH() {
+    return 2;
+  }
+
+  static get VALUES() {
+    return Object.assign(
+      { t: 9 },
+      ChessRules.VALUES
+    );
+  }
+
+  getComputerMove() {
+    this.side = this.turn;
+    return super.getComputerMove();
+  }
+};
diff --git a/client/src/variants/Knightmate.js b/client/src/variants/Knightmate.js
new file mode 100644 (file)
index 0000000..c0e84c6
--- /dev/null
@@ -0,0 +1,132 @@
+import { ChessRules } from "@/base_rules";
+import { ArrayFun } from "@/utils/array";
+import { randInt } from "@/utils/alea";
+
+export const VariantRules = class KnightmateRules extends ChessRules {
+  static get COMMONER() {
+    return "c";
+  }
+
+  static get PIECES() {
+    return ChessRules.PIECES.concat([V.COMMONER]);
+  }
+
+  getPpath(b) {
+    return ([V.KING, V.COMMONER].includes(b[1]) ? "Knightmate/" : "") + b;
+  }
+
+  static GenRandInitFen() {
+    let pieces = { w: new Array(8), b: new Array(8) };
+    // Shuffle pieces on first and last rank
+    for (let c of ["w", "b"]) {
+      let positions = ArrayFun.range(8);
+
+      // Get random squares for bishops
+      let randIndex = 2 * randInt(4);
+      const bishop1Pos = positions[randIndex];
+      let randIndex_tmp = 2 * randInt(4) + 1;
+      const bishop2Pos = positions[randIndex_tmp];
+      positions.splice(Math.max(randIndex, randIndex_tmp), 1);
+      positions.splice(Math.min(randIndex, randIndex_tmp), 1);
+
+      // Get random squares for commoners
+      randIndex = randInt(6);
+      const commoner1Pos = positions[randIndex];
+      positions.splice(randIndex, 1);
+      randIndex = randInt(5);
+      const commoner2Pos = positions[randIndex];
+      positions.splice(randIndex, 1);
+
+      // Get random square for queen
+      randIndex = randInt(4);
+      const queenPos = positions[randIndex];
+      positions.splice(randIndex, 1);
+
+      // Rooks and king positions are now fixed,
+      // because of the ordering rook-king-rook
+      const rook1Pos = positions[0];
+      const kingPos = positions[1];
+      const rook2Pos = positions[2];
+
+      // Finally put the shuffled pieces in the board array
+      pieces[c][rook1Pos] = "r";
+      pieces[c][commoner1Pos] = "c";
+      pieces[c][bishop1Pos] = "b";
+      pieces[c][queenPos] = "q";
+      pieces[c][kingPos] = "k";
+      pieces[c][bishop2Pos] = "b";
+      pieces[c][commoner2Pos] = "c";
+      pieces[c][rook2Pos] = "r";
+    }
+    // Add turn + flags + enpassant
+    return (
+      pieces["b"].join("") +
+      "/pppppppp/8/8/8/8/PPPPPPPP/" +
+      pieces["w"].join("").toUpperCase() +
+      " w 0 1111 -"
+    );
+  }
+
+  getPotentialMovesFrom([x, y]) {
+    switch (this.getPiece(x, y)) {
+      case V.COMMONER:
+        return this.getPotentialCommonerMoves([x, y]);
+      default:
+        return super.getPotentialMovesFrom([x, y]);
+    }
+  }
+
+  getPotentialCommonerMoves(sq) {
+    return this.getSlideNJumpMoves(
+      sq,
+      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
+      "oneStep"
+    );
+  }
+
+  getPotentialKingMoves(sq) {
+    return super.getPotentialKnightMoves(sq).concat(super.getCastleMoves(sq));
+  }
+
+  isAttacked(sq, colors) {
+    return (
+      this.isAttackedByCommoner(sq, colors) ||
+      this.isAttackedByPawn(sq, colors) ||
+      this.isAttackedByRook(sq, colors) ||
+      this.isAttackedByBishop(sq, colors) ||
+      this.isAttackedByQueen(sq, colors) ||
+      this.isAttackedByKing(sq, colors)
+    );
+  }
+
+  isAttackedByKing(sq, colors) {
+    return this.isAttackedBySlideNJump(
+      sq,
+      colors,
+      V.KING,
+      V.steps[V.KNIGHT],
+      "oneStep"
+    );
+  }
+
+  isAttackedByCommoner(sq, colors) {
+    return this.isAttackedBySlideNJump(
+      sq,
+      colors,
+      V.COMMONER,
+      V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
+      "oneStep"
+    );
+  }
+
+  static get VALUES() {
+    return {
+      p: 1,
+      r: 5,
+      c: 5, //the commoner is valuable
+      b: 3,
+      q: 9,
+      k: 1000
+    };
+  }
+};
index 1634f49..fa89cb2 100644 (file)
@@ -235,8 +235,8 @@ export const VariantRules = class WildebeestRules extends ChessRules {
 
   static get VALUES() {
     return Object.assign(
 
   static get VALUES() {
     return Object.assign(
-      ChessRules.VALUES,
-      { c: 3, w: 7 } //experimental
+      { c: 3, w: 7 }, //experimental
+      ChessRules.VALUES
     );
   }
 
     );
   }
 
index b04efa9..76f6d12 100644 (file)
@@ -264,6 +264,8 @@ export const VariantRules = class WormholeRules extends ChessRules {
     return this.isAttackedByJump(sq, colors, V.KING, V.steps[V.KING]);
   }
 
     return this.isAttackedByJump(sq, colors, V.KING, V.steps[V.KING]);
   }
 
+  // NOTE: altering move in getBasicMove doesn't work and wouldn't be logical.
+  // This is a side-effect on board generated by the move.
   static PlayOnBoard(board, move) {
     board[move.vanish[0].x][move.vanish[0].y] = V.HOLE;
     for (let psq of move.appear) board[psq.x][psq.y] = psq.c + psq.p;
   static PlayOnBoard(board, move) {
     board[move.vanish[0].x][move.vanish[0].y] = V.HOLE;
     for (let psq of move.appear) board[psq.x][psq.y] = psq.c + psq.p;
index 4307b9d..0a66ffc 100644 (file)
@@ -41,15 +41,34 @@ export default {
   // then it doesn't trigger BaseGame.re_init() and the result is weird.
   created: function() {
     this.gameRef.vname = this.$route.params["vname"];
   // then it doesn't trigger BaseGame.re_init() and the result is weird.
   created: function() {
     this.gameRef.vname = this.$route.params["vname"];
-    this.gameRef.fen = this.$route.query["fen"].replace(/_/g, " ");
-    this.initialize();
+    const routeFen = this.$route.query["fen"];
+    if (!routeFen) this.alertAndQuit("Missing FEN");
+    else {
+      this.gameRef.fen = routeFen.replace(/_/g, " ");
+      this.initialize();
+    }
   },
   methods: {
   },
   methods: {
+    alertAndQuit: function(text, wrongVname) {
+      // Soon after component creation, st.tr might be uninitialized.
+      // Set a timeout to let a chance for the message to show translated.
+      const newUrl = "/variants" + (wrongVname ? "" : "/" + this.gameRef.vname);
+      setTimeout(() => {
+        alert(this.st.tr[text] || text);
+        this.$router.replace(newUrl);
+      }, 500);
+    },
     initialize: async function() {
       // Obtain VariantRules object
     initialize: async function() {
       // Obtain VariantRules object
-      const vModule = await import("@/variants/" + this.gameRef.vname + ".js");
-      window.V = vModule.VariantRules;
-      this.loadGame();
+      await import("@/variants/" + this.gameRef.vname + ".js")
+      .then((vModule) => {
+        window.V = vModule.VariantRules;
+        if (!V.CanAnalyze)
+          // Late check, in case the user tried to enter URL by hand
+          this.alertAndQuit("Analysis disabled for this variant");
+        else this.loadGame();
+      })
+      .catch((err) => { this.alertAndQuit("Mispelled variant name", true); });
     },
     loadGame: function() {
       // NOTE: no need to set score (~unused)
     },
     loadGame: function() {
       // NOTE: no need to set score (~unused)
index c05e184..556ea86 100644 (file)
@@ -112,9 +112,20 @@ export default {
       return getDiagram(args);
     },
     re_setVariant: async function(vname) {
       return getDiagram(args);
     },
     re_setVariant: async function(vname) {
-      const vModule = await import("@/variants/" + vname + ".js");
-      this.V = window.V = vModule.VariantRules;
-      this.gameInfo.vname = vname;
+      await import("@/variants/" + vname + ".js")
+      .then((vModule) => {
+        this.V = window.V = vModule.VariantRules;
+        this.gameInfo.vname = vname;
+      })
+      .catch((err) => {
+        // Soon after component creation, st.tr might be uninitialized.
+        // Set a timeout to let a chance for the message to show translated.
+        const text = "Mispelled variant name";
+        setTimeout(() => {
+          alert(this.st.tr[text] || text);
+          this.$router.replace("/variants");
+        }, 500);
+      });
     },
     startGame: function(mode) {
       if (this.gameInProgress) return;
     },
     startGame: function(mode) {
       if (this.gameInProgress) return;
index 2accc88..6ddedf6 100644 (file)
@@ -20,7 +20,10 @@ insert or ignore into Variants (name,description) values
   ('Enpassant', 'Capture en passant'),
   ('Extinction', 'Capture all of a kind'),
   ('Grand', 'Big board'),
   ('Enpassant', 'Capture en passant'),
   ('Extinction', 'Capture all of a kind'),
   ('Grand', 'Big board'),
+  ('Grasshopper', 'Long jumps over pieces'),
   ('Hidden', 'Unidentified pieces'),
   ('Hidden', 'Unidentified pieces'),
+  ('Hiddenqueen', 'Queen disguised as a pawn'),
+  ('Knightmate', 'Mate the knight'),
   ('Knightrelay', 'Move like a knight'),
   ('Losers', 'Lose all pieces'),
   ('Magnetic', 'Laws of attraction'),
   ('Knightrelay', 'Move like a knight'),
   ('Losers', 'Lose all pieces'),
   ('Magnetic', 'Laws of attraction'),
index f3adb31..5117c17 100644 (file)
@@ -141,13 +141,20 @@ const UserModel =
     const day = 86400000;
     db.serialize(function() {
       const query =
     const day = 86400000;
     db.serialize(function() {
       const query =
-        "SELECT id, sessionToken, created " +
+        "SELECT id, sessionToken, created, name, email " +
         "FROM Users";
       db.all(query, (err, users) => {
         users.forEach(u => {
         "FROM Users";
       db.all(query, (err, users) => {
         users.forEach(u => {
-          // Remove unlogged users for >1 day
+          // Remove unlogged users for > 24h
           if (!u.sessionToken && tsNow - u.created > day)
           if (!u.sessionToken && tsNow - u.created > day)
+          {
+            notify(
+              u,
+              "Your account has been deleted because " +
+              "you didn't log in for 24h after registration"
+            );
             db.run("DELETE FROM Users WHERE id = " + u.id);
             db.run("DELETE FROM Users WHERE id = " + u.id);
+          }
         });
       });
     });
         });
       });
     });