diff options
120 files changed, 8542 insertions, 6285 deletions
@@ -1,12 +1,12 @@ -/build/incoming/ -/node_modules/ -/bin/ -/package-lock.json -/data -/0LettreFR.odt -/0LettreEN.odt -/_template -/_translate -/music.staging -/sfx/staging -/music.old +/build/incoming/
+/node_modules/
+/bin/
+/package-lock.json
+/data
+/0LettreFR.odt
+/0LettreEN.odt
+/_template
+/_translate
+/music.staging
+/sfx/staging
+/music.old
diff --git a/.idea/.gitignore b/.idea/.gitignore index b58b603..ea7ed09 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -1,5 +1,5 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ +# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..ac3fdae --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +Kartik Client
\ No newline at end of file diff --git a/.idea/Kartik.iml b/.idea/Kartik Client.iml index 0c8867d..ff88395 100644 --- a/.idea/Kartik.iml +++ b/.idea/Kartik Client.iml @@ -1,12 +1,12 @@ -<?xml version="1.0" encoding="UTF-8"?> -<module type="WEB_MODULE" version="4"> - <component name="NewModuleRootManager"> - <content url="file://$MODULE_DIR$"> - <excludeFolder url="file://$MODULE_DIR$/temp" /> - <excludeFolder url="file://$MODULE_DIR$/.tmp" /> - <excludeFolder url="file://$MODULE_DIR$/tmp" /> - </content> - <orderEntry type="inheritedJdk" /> - <orderEntry type="sourceFolder" forTests="false" /> - </component> +<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+ <component name="NewModuleRootManager">
+ <content url="file://$MODULE_DIR$">
+ <excludeFolder url="file://$MODULE_DIR$/temp" />
+ <excludeFolder url="file://$MODULE_DIR$/.tmp" />
+ <excludeFolder url="file://$MODULE_DIR$/tmp" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ </component>
</module>
\ No newline at end of file diff --git a/.idea/discord.xml b/.idea/discord.xml new file mode 100644 index 0000000..66c4b97 --- /dev/null +++ b/.idea/discord.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="DiscordProjectSettings">
+ <option name="show" value="PROJECT_FILES" />
+ <option name="description" value="" />
+ </component>
+</project>
\ No newline at end of file diff --git a/.idea/icon.svg b/.idea/icon.svg new file mode 100644 index 0000000..5f6134a --- /dev/null +++ b/.idea/icon.svg @@ -0,0 +1,216 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + id="svg62" + width="128" + height="128" + viewBox="0 0 128 128" + sodipodi:docname="icon.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <metadata + id="metadata68"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs66" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1600" + inkscape:window-height="836" + id="namedview64" + showgrid="false" + inkscape:zoom="5.0390625" + inkscape:cx="64" + inkscape:cy="64" + inkscape:window-x="0" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:current-layer="g70" /> + <g + inkscape:groupmode="layer" + inkscape:label="Image" + id="g70"> + <image + width="128" + height="128" + preserveAspectRatio="none" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAZPUlEQVR4Xu2dC3gTVdrHB+QiNGkB +uZY7u4BcpJe03OUqlxYBEVsopdckrYCACK5c2m1BXXVF8LKIiIir66J+CrqfuLC4Cgqtu4+7n36P +++mu620FERRoLk3SpHC+98wlnZwzSWYmk0mKeZ/n9xRoZuac+f/fM+85OQkMo0Ugpk253Tjcaksu +tNgM91nsxt9a7cY3rQ7DMfj7EeBlYGeFw7DC4koeX4uYDuQpfmqB75elwbDCajc8ZbEZ/wg/3wfe +sdoMB+Be1VgakmblxfN9QiA6CDodhH7aYjecAZB8jE447g2rM6mw4rvUzuS5r9ZYjZiO1gbD7RaH +4WP6nkhyCZLo0Qp31wHkuWIW2JUWh7ECGvdPiQar4QKY4VdlDkMP8lpXU5jtxvnAVxL9D4/D4Iaf +92MDkefVNSyNxoWQvV9QDdQAs81gAyNsWof6dSKv25qDTRib4Umyv6qwGf5udncZSF4j6mG2JXeD +59MrVIOiAJjg38BEsg2tMbCZoS9vkX2MkO8qHYaR5LWiFuZLXTKgE19JNCSa+HCBRLalNQVk/jWQ +NIck+hYxUBectri69SOvqXmUNyTNhgrVQTZAL6CjW8k2tYaAWU5bs824n+yPpjiM9RUfMu3Ja2sW +FmfSLLiQh7qw7hh/TbYtrgNmR2DcXXQ/ooFxI3l5TcLc2CUDMt9JXzBG2Aw78Y0l2xmPAaJsp9of +NYyO2x2GnmQbIooKu7E7TDu+oS8WY2yG3+C1B7K98RQwk7mXane0sRm2ke2IKOCkB6mLxAlWZ9Iz ++PlKtjkewtpg3ES2Vye+ra3V6J5UOAx5EheILxyGF8EE7ci2xzLAmGupdupIeUPnLLJNimP150zH +GEz3VAFF1qvxsk5ubjBUQpuukG3UE2xAsl2KA27qSvLE8YzZbnwr1quGVmdyEbTlMtk2vYHE3U+2 +TVHg56rVbvgXeeJWwLvlP3Q3kv3RIyDz8eOyWaJNugPJ+zeyfYrC3JA0kzxpa8FsM36woiGlK9mn +aAZ+Yweu7SXbEkPcEdVFMJ/cK3HSVgOMXh9pPh8OEhXOlNmWuFggI3AYRpBtlRfcytVp6oStj09v +d3XqS3ZPyzA7DFPgRjdKXDvmgIb5ZHtlhdVjHEaerPVi/KK8IWUI2UctwmJLHg/nt9PXjBPULghZ +nEkF1MlaMw7DtxV24/VkPyMJc2PnDHjMXKSuFVcYD5LtlhXYOfTJWj3nYG6cTvZVTZgvGkbD+X6Q +uEacYfwn2XZZgeeQ9MlaPzhjK+3GCWR/lQTcG/x4PEueO05pVrUuAge+LnGyqwIQ0AGPhBlkn+WE +pSFlMBz7H/Kc8UxFQ0om2Y+wAdXjUfJEVxkePG8n+x0qLBc69YvW3seoYksuJvsSNvD+fepEGjLv +rU7ItLlDTMm8p4M3qXfbR6C7NXIYYWn/GXmOWIDvHXk/Q6Ni84wZfxCBOpF24I4weLUhgWLwvSPv +Z2iMhxmlASPADvpE2pEwgHoUG8Bm+IZRGhb8cS3yRBqSMIB6FBvAbriy+kK3ZEZJQIE0SeJEmpEw +gHpUGAAXguMZJVH6FXMtHIg/ekSfTAMSBlCPMgMYBcyM0oDHwBH6hNqQMIB65BnALzwy25MxOxil +wX/YU+LkkZMwgHpCG0AQnhWdJwWZHSlHGaVRcbFrCpwsKp8DSBhAPdIGIIVPEdEFWRxdTjNqAqYQ +u+mLRU7CAOoJNEBo4THl9q4sqnZIlV7qMghqgSZSwEgJZ4ClS5eiZ599VjV79uxB27dvR2vXrkXT +p09HSUlJ1DXkcN111+lG+/btqetLwRkg4PlOiS4WvtzRjcPeYzKjJqx248OkgJESzgA7d+5EWobH +40GHDh1CM2fOpK4VisuXL5OnilrMmDGDur4UmZs7KhPecR1LmaN7JaMmCi90S7bYjF+TIkaC3gYQ +x+HDh1Fqaip1TSni1wDSw3wQ4VnKHT0eZ9SG1WGYatFwr3ssDYDj7NmzKC0tjbouSXwa4FpaeL/o +tPBljh48Pf/MRBJQC9SSQqol1gbAce7cOTRgwADq2mLi1QDBhC+TFl7geyaSqMVfcGA3vkGKqYZ4 +MACOo0ePUtcWE58G6CSR7dLCl/rpxVLm6B3Zl24Vfd8rCQQ8RQqqlHgxAI5p06ZR1xeIXwOQw7yU +8JzopY7ePH3gd/2mMpFGBeqaAjODv5KiKiFSAwwaNAj17NlTkl69eqGRI0eiwsJCdOTIEfJQKp5/ +/nnq+gJbt25F27ZtC4vb7SZP64+9e/dSr5di8ODB1PWlyNjcWZHwJSB8iSNVYBWjRbDfEOYwfEQK +K5dIDWAwGKhjglFcXBwyk3EtQB6jlIsXL5Kn9UdWVhb1+kjgDCCIHkx4LLogfF+WYkc/VOTo/ySj +Vax0JvUGMT8nxZWDngbA7NixgzxFQMidFgZDXwMkKRa+2NGfZ8AJRsvAu2StduUfIdPbAEOHDiVP +ERBjx46ljlGC3gZQITwqcg7E/MhoHfAoGAWi/kiKHAq9DdCmTRt2NTBYTJ06lTpGCfoawMCLLggv +PN+x8Fh0QfgBIuEH8QxGpc5BvRmtg/2MnIJvEIuFAZqamsjT+GP8+PHUMUrQ0wDpYIDAwk7I9hbh +iySEX+4cwlLoHDKTiUZAYTgXxJX1xpHeBhg+fDh5ioDAswryGCXoawBjuGFeJLog/M9YCp0/R8tc +Q9cw0Qqzw7DUImPJWG8D7Nq1izyFP2w2G2rbti11jBL0NUCyKuELnUNZljcO28NEMyw2wypScBK9 +DNChQwdUU1ODrly5Qp7CHwcPHqSOU4r+BggmPDfMc8Jj0QXhh7Escw5HBY7rTzHRDjBByPcNIjVA +dnY2GjVqlCRz585Fq1evRrt370ZnzpwhD6Vi3rx51PWVoqcB0janBH2+hxJ+mfN6nhGXGD2+XBN/ +iycpvFYG0CpOnDjBFojk9ZWiqwG2dFErPCpwjmQpvDAm+t8qXou/ZSzIR8ziwQB4dIi0+BPQ1wBd +gz7fOeGx6ILwI0TCj+IZjfKdo+YwegT/P2NQ28tjbQC8HwA/LsjrqkV/A9DCc6K3CF9ACL8UhF/q +vIFliTPtLkav2IB6JVlsxvp4McCHH36oWeYL6GmAMVu6yRrmhWz3C984hmVJYxrmGUbPwG8eWRyG +T2JpAJz169atk735Ugn6GuC6CIRP58moZ/QO/HVt+JOqsTJAfn4+dR2t0NcA3SMRHuU3ZkINYLIx +eswEyGD/Y0S74XwkBmhsbETHjx+nOHnyJPnSgMBv++L9AuS1tEB/A9CFnfB854Rnh3m/6H7hG008 +WWipK7s/E4uobEzJSl/fwc5IdE4glAE+++wz6vUCBw4cIF8eEHhrOHmMFuhpgBu29IhI+LzGbGAs +ynNOmMvEKtoZmPsZic4JqDVA9+7d0fnz58lDAqKkpIQ6LlL0NUBPecO8X/isAOHzG8cBE9AS10T9 +ZgISUcNIdE5ArQEwS5YsIQ8JiIaGBtS/f3/quEjQ1wC9ZAufJyF8fuNEYDJmHxPDqGEkOicQiQEw +eH0/VBw7dkyTFUABPQ0wGgygTPjxvPCT4LWTgRuBqcC0D5gYRg0j0TmBSA3Qp08fdOHCBfLQgMDv +F5DHqUVfA/RmRQ/5fGeznRR+iiA8jB4zgJmxmQnwUcNIdE4gUgNg8LM+VODZxLBhw6jj1KCvAfrI +EB4P86Tw0znhXTOBWajANRvluefH7H8gr2EkOieghQEw+HOAoaK+vh61a9eOOk4p+htAurBrER4P +85zwS7HwLiz8TX7hC1xzgRz4fU4OE6OoYSQ6J6CVAXCxhzd8hIpNmzZRxylFTwOM2pIaRHjh+Y6F +x8M8Kfwcv/DLXPOAm1Gha8F6JkZRw0h0TkArA2AqKirIUwQE3iuYnp5OHacEfQ3Qlx/mOeGJwo4X +Hg/zN4HYYuFz/cIvcy0A8ReiQveimM0EahiJzgloaQBc7b/99tvkaQLi448/Rh07dqSOlcu+ffvQ +Sy+9JMmQIUOo10fC6C0DRc93sfDC8x0Lj4d5LHyOSPj5LcK7FgG3ouWuxTGbCdQwEp0TSE5OZj+s +IYWa5dzOnTtT5yHB28fI4+KRMVUjUUHjHF54urAThF/GCo+zXRD+FpHwtwF5QL4d/B+TmUANI9G5 +BOFJqxqFhWNFlSrsAoXH2S4Iv1gk/BJgKSpyLUPF7uIYzATatq1lJDqXIDxpVaP94mFBycIuUPhb +RcLns8IX8ccWuQqBIlTsKdZ3JjDz/s/GDJxado6R6FyC8KRV3cALuJwVsMhdQDzfxcKzwzwvfEGg +8O5ioBSVuMo2MHrF9OpPTdPv/fTHwTPvoDqWQB5pVWNEApYAZexPKOgkhMfZLgjPGUYQHh9X4jYD +lmcZPWJ69Vfjplb9+9K0mn+hQdO1W4b9qZFWlcYLHyAi+xMLHig8zvbl8DosvHBMueiYCqDyL0y0 +Y/L6bybfePfXtimbvkRgAjRo2hqqYwnkkV6VzguPhcQiWlkhS923sxTjx4JfeGGUEAsvvL4SWIFK +PSujOxOYtOb09Mlrzzgm3/UfBCZAUzZ+iQZOWUt1LIE80qsyAjKYExKLvxJYhcrcd7C/Fx4PnFHE +wuPXrmBfj19b5l6NzO5VA5loxMSKc7MnrjjXOPGOs2jS2tNIMMHAyXdSHUsgj/QqEy+mIDwWkxMe +i1nmXgvcyf6OHiGCvLbxrlxG6xhbdvHm8eYL7gkVPyAwAeJMcAZM8C0aMGkd1bEE8kivymoZvv1Z +j8Vcwwpa7l4H3AVsYP+NFl543Z3869Yjs+dubWcCY5faF41dbmsaV3IJjS+/gCZYf0ATbgcTrAIT +rDmDBky4i+pYAnlkVGVLCoozWRAUi292/wK4h/17oPCCQfDr7hZet5/RKrLzXEuylzT6sgscCEyA +pEwwYNx6qmMJ5JFRNRbEF4ZwLCoWviXrW0TdCJm9CVk8W4CNoV/j3vxXRovIutVblLXY05yV50Jg +ApRd4AQT2MEEDWCCi2i89UcwwXnUf+zdVMcSyCOjapzkMC7KZlZUs2czL3418Ev2p//3Aeaowr93 +RDwTMC30WjJv8V02LWpCYAKUledG2flggqVggkIwQTGYoAxMYPkR9c/6BdWxBPLIqBovynphuMfi +SwqLrJ4aoBbYBmzlf0f+fisce99ARm1kzEOrM+ddvpI5vxmZFvqQ3wS30SYYBybol3kP1bEE8sio +miCR9YLwOOuxsFzWc8JvZcWv8NwH3M/C/TsnvPC7St8D6j4nkJmL7s7IQQgDJkAtJvCirFs5E2Tl +uwJM0C99I9WxBPLIrJrIZ714OBeGe6msv5cX/lfAA8BD8G+/BvC/CaZ4AFV6HlT+OQEQv1YQv8UE +V1gTZGIT3OJFJtIEyxyob1rk27B+qmRWTQqR9YLwOLOx8C0CV3ge5MV/GNgO7GD/zv07GML9sJJP +DKM26TnoIVJ8P6wJYDRYIJigiTMBXxz2vWEz1bEE8sismixZ5ImH9MCsF4THWY+Ff4QV3+p5FFma +HuP/DP/WtEPudwehNiDyE5ToJNgENxMmWMyZIHX0FqpjCeSRWX2jaLiv5oUXD/c464Xh/kFe+Jas +t3p2ssJbmh4HngB28X9+7BITLvLy0DUZuegZSuxg5AomaOZMwBeHqaOqqI4lkIepekqYIk+c9YLw +OOt3IiHrOeF/AzyJzE27gadYI5Q3PpHKBA/I/Fy0mxI5HGITLORMkDqymupYPLNw4UK0aNEiXTGZ +TFQ7MKbqqSh01gvDPRZfGO7FWY+Fx1mPxX8K2APsBZ5GZt9Twb9F1JSDNlDiyiUXcSbgZwipI1qX +AZqbm4l9xNGPF154gWoHxlQ9nc/68EUeKzyb9cJwL856LPzTvPj7UHnTs6jcs281IxUg4BQQspkS +VgnYBPw0sc/1v6Q6Fs/ElwFm8OJLTe3oIq9F+F3+4b4l65/hhG/aDzwHBniOnglMy0MGEPBrSlCV +4Glin+E1VMfimXgyQFb1TJHw/BSOynqyyCOzHgvPZz0Wvum3wAvA775kyCVhEG07KWKk9BlWS3Us +nokvA9wkGu7FWR+6yGsZ7sVZj4V/HpWB+GVNL6Iy7+9RsfdABiNE9jw0BIbuJlLASOkztJbqWDyD +P/mzf/9+XbFarVQ7MFnVs3jhlRZ5Qtbzwz2f9WVNvwN+D+IfAF6CP7/8C0YIRVM+BbQ2A8QTpurZ +AVmvqMgLyHosPJf1rPDel1Gp979Qme+1gwwOEKpHZg5yk+JpQcIA6jFVz+GzXhjuW7I+bJEHwtNZ +j4V/hRW/1Psa/P21zxkcIP6dpHBakTCAekzVc4msl1vkibOeH+75rC/1vgocBA6hEu/rPgYHCFVP +CqcVCQOox1SdIxruxVkfvMjjsl4Y7sVZj4V/jRf/dRD/DeC/EWOaj7rD8/8yKZxWJAygHlN1rijr +heFenPVSRZ4464XhXpz1WPg/sOKXeA8jJj0XLSRF05KEAdSTWT1PIuvlFnnirD8UkPUl3jeBt2Aa ++EfEZM5FNaRoWpIwgHoyq+fzWS81tQtf5NFZj4U/zIt/BDiK8PP/RVI0LUkYQD2Z1QuIrJdb5HFZ +X8JmvTDct2Q9Fr7Y+ydU7DuG8E6fd0jRtCRhAPVkVi8UDffirJdb5LVkPSc8l/XF3mMg/tuoyPdn +JzbAh6RoWjJ03HHWBIoYVsO+h4DfSMLvJuK3lPG+Ary5pC9mzGZ2q1m/jI3splO887h/9t2o/7gN +qK9pxXmG+1YS2Yxem3EWb8HmGM9uxsxkmchuy+KYDNzIbtLA79Pjt2o5prHv2uE3bjB4/R4v4XLM +YhdzOOaw0zqOHLbA45gH57yZHe45FrDCY3KP3SPKerlFnjjrheFenPWs8MA7qMj77id4DeDvpGgx +R9hXQO48lth+jnce4+3nEyrPo4krv0eTV323iFEYZu/qjDL3GluIT9OI9uSJt2aF26ShZv1eqsgT +Z73cIk+c9X8SZT0I73sXOIGKmt97icmYi05RAsQDoreU5Ww/xyaYWHle9RcglLnvnAHie6T334fb +iavFJg2yyJNev1da5AVmPRb+OCe+731U6Du5Eb8H8Dp18+MIYeexsP1caufx2CIbGld66ctxhReS +SWGVRFnT+ttA+MvBd+KKsz4KmzQki7zA9Xt5RR6f9T6c9fxwL2S97z203HcSOAW/OzkZPwJ2kjc9 +3gi5/XxJI5jA2Tx2+cUbSUHVhNmzcWVg1ofbiRtuk4aa9fsXw0ztZBd5oqx/j816Tvw6jD0P/aMD +LgIryRsel0jtPBa2n+e7HiSFjCQsTVXb5O+/126TBl3kSa7fi7JeqsgTZ70w3LdkPS8+UP8q21lT +LhpH3ex4xb/pVGwCz/+MykMdCA0jC8S0AeH3kB+p0qbIo9fvwxd5gev3dNZLFXnirBcLz1HYXL+E +7Su+eXBzHdTNjlcCtp/7XNmLm0YR8mkSeeiVa0D8g3SRJ95/L7fIC7d+L1XkBV+/l1vk0Vnv59I6 +VNfJ31mYCcR1IUjBm8C00LtGpJnmkfftuk6Q9Seki7zobNIIPbUjijw266WKPOmsF/FoQEfTc9Ey +6ibHOVAYHoGxOrLPucuI0ku1Xayehz6ms15ukadm/Z4u8gKzXlaRFwxfkfsvgwM6OSEPdYKbeoG8 +yXHMD6Y5qE9AJ6IY5Y0PpVZ4HvlKemont8gLt34vVeRJr9/LK/KkKfLWSX9tPEwH75e40XFJ5lyk +eLUv0ij3PDrc4n70fPD991JFnpr1e6kiT5z18oq8INiLXXV9yb6xwW4MyUE28mbHG2DUPWTb9YpK +7xNZILxdeZEXbv1eqsgLsn4vr8iTpOhy3SqyTwGRHslHwvThH2DUzmS79QyLb/cMS9NuT/j1e6ki +L9z6vVSRR6zfyyvypDiKyA+CkDFtGmoHGfY3iRsfc/CuZRj6x5BtjkWUNz29GIRvprNeqsjTdv1e +RpFH01z3bRE61ZPsh2RkzkMjMuJzXWAF2dZYRrl3n1VZkRdu/V6qyKPX7ylxw+MoRnUtnwCSExm5 +aHE0N4oqJTMXqX6XL5ph9j23IXSRF3pqJ7/IU5H1HO5CX13wj4GHCjDAGlKIGHFY86VeDaPM8+I6 +EP9K6CIv3Pq9VJEXUdbDsF/vXI4+mEW2V1FA5q0DAa5IiKILcP03oS65lmxXvEVZ08sFkPXu8EVe +uPV7TniFUzua5rrvCr2nssl2qoqMuWgpiNFIiqMDu00m1J5sT7xGuffVLBD/C7rI02z9Xian3odn +vvRcX23g6hsE+URCJM2Bat8OmV9KtqE1xGr0VjIM93tB+Ct0kRdu/T5S4dnn/Ub8JhbZLk0iJwd1 +BIG2Ai5SNK0A8f+QPhcNIq/d2qLE98YkEL5ew/X7kBQ1171egk79jGxHVMI0Hw2AAvEpQEsjHAfx +Z5DXatWBUJvS5qPzIetPRbp+H4TLwCEY7seSl9YlxsxGPdmVQ25buZpC8QzweHouSifPfbVFMTqR +AcI/Vuw7cSbSIq/IV/fpcl99bam7fhB5nZhFxgKUCkYogILxERD1MGTz/8LP08B54Dv43f/Bz7cB +/NVzK7gVvTDLkldh1KLatiXe902Q+RugUn+FE7POS4rcAkzlvKc+gindc8WX6yqXeT4YSp4z0vh/ +iMNl9/0rMooAAAAASUVORK5CYIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= +" + id="image72" /> + </g> +</svg> diff --git a/.idea/modules.xml b/.idea/modules.xml index 92ee6f8..375fa89 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -1,8 +1,8 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="ProjectModuleManager"> - <modules> - <module fileurl="file://$PROJECT_DIR$/.idea/Kartik.iml" filepath="$PROJECT_DIR$/.idea/Kartik.iml" /> - </modules> - </component> +<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectModuleManager">
+ <modules>
+ <module fileurl="file://$PROJECT_DIR$/.idea/Kartik Client.iml" filepath="$PROJECT_DIR$/.idea/Kartik Client.iml" />
+ </modules>
+ </component>
</project>
\ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index f634aae..001ad59 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,7 +1,7 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="VcsDirectoryMappings"> - <mapping directory="$PROJECT_DIR$" vcs="Git" /> - <mapping directory="$PROJECT_DIR$/bin" vcs="Git" /> - </component> +<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="VcsDirectoryMappings">
+ <mapping directory="$PROJECT_DIR$" vcs="Git" />
+ <mapping directory="$PROJECT_DIR$/bin" vcs="Git" />
+ </component>
</project>
\ No newline at end of file @@ -1,674 +1,674 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <https://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<https://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<https://www.gnu.org/licenses/why-not-lgpl.html>. + GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<https://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<https://www.gnu.org/licenses/why-not-lgpl.html>.
@@ -1,29 +1,29 @@ -<p align="center"> - <img src="https://user-images.githubusercontent.com/46352972/120900504-5c5b8480-c635-11eb-9018-802afcd76df2.png" width="64px" /><br> - <big>»<b> Kartik Game </b>«</big> - <br>developed with<br> - <img src="https://user-images.githubusercontent.com/46352972/116787437-47268f80-aaa4-11eb-99c9-a771eb7dadcc.png" width="48px"> -</p> - ----- - -A free, simple and clean cross-platform 2D car racing game, powered by Web technologies. The build system (which packages all the downloads on the website and on Itch) is proprietary. - -* **Status:** 💻 Actively maintained -<!-- * **Status:** 🕑 Extended maintenance --> -<!-- * **Status:** 🔴 Searching for mainteners --> -<!-- * **Status:** 🚫 Archived, **DO NOT USE IN PRODUCTION** --> - -## Summary -* **Language:** JavaScript -* **Started:** March 2021 -* **License:** GNU General Public License 3.0 -* **Website:** https://minteck.itch.io/kartik - -## Setup -Download Kartik from one of the official sources: -* Itch: https://minteck.itch.io/kartik -* Official website: https://kartik.hopto.org - -## Issues -Issues are reported using GitHub issues. +<p align="center">
+ <img src="https://user-images.githubusercontent.com/46352972/120900504-5c5b8480-c635-11eb-9018-802afcd76df2.png" width="64px" /><br>
+ <big>»<b> Kartik Game </b>«</big>
+ <br>developed with<br>
+ <img src="https://user-images.githubusercontent.com/46352972/116787437-47268f80-aaa4-11eb-99c9-a771eb7dadcc.png" width="48px">
+</p>
+
+----
+
+A free, simple and clean cross-platform 2D car racing game, powered by Web technologies. The build system (which packages all the downloads on the website and on Itch) is proprietary.
+
+* **Status:** 💻 Actively maintained
+<!-- * **Status:** 🕑 Extended maintenance -->
+<!-- * **Status:** 🔴 Searching for mainteners -->
+<!-- * **Status:** 🚫 Archived, **DO NOT USE IN PRODUCTION** -->
+
+## Summary
+* **Language:** JavaScript
+* **Started:** March 2021
+* **License:** GNU General Public License 3.0
+* **Website:** https://minteck.itch.io/kartik
+
+## Setup
+Download Kartik from one of the official sources:
+* Itch: https://minteck.itch.io/kartik
+* Official website: https://kartik.hopto.org
+
+## Issues
+Issues are reported using GitHub issues.
@@ -17,32 +17,113 @@ switch (require('./package.json').channel) { break; } -if (process.argv[2] === "m") { - console.log(" * *******************************************"); - console.log(" * * DATA MITIGATION MODE *"); - console.log(" * * *"); - console.log(" * * Unless you ABSOLUTELY need this, please *"); - console.log(" * * consider starting Kartik normally. *"); - console.log(" * *******************************************"); - if (!require('fs').existsSync(__dirname + "/data")) { - require('fs').mkdirSync(__dirname + "/data"); - } - global.homedir = __dirname + "/data"; -} else { - global.homedir = require('os').userInfo().homedir; -} - -if (require('fs').existsSync(homedir + "/.kartik/current.kfn")) { - global.downgradeError = true; -} - global.start = new Date(); global.KartikRoot = __dirname; global.shouldExitIfClosed = false; const { app, BrowserWindow } = require('electron'); (async () => { - if (!downgradeError) { + process.on('uncaughtException', (error) => { + console.log(" * Starting recovery procedure: E_ERROR: " + error.message); + id = new Date().toISOString().replaceAll(":", "-"); + + require('fs').writeFileSync(require('os').userInfo().homedir + "/.kartik/crashes/" + id + ".txt", "Kartik Bootstraper Crash\n\n" + error.stack); + if (require('os').platform() === "win32") { + require('child_process').exec("runtime\\kartik-crash.bat " + id); + } else if (require('os').platform() === "darwin") { + require('child_process').exec("./runtime/kartik-crash-mac.sh " + id); + } else { + require('child_process').exec("./runtime/kartik-crash.sh " + id); + } + process.exit(2); + }) + + process.on('unhandledRejection', (reason) => { + console.log(" * Starting recovery procedure: E_PROMISE: " + reason); + id = new Date().toISOString(); + + require('fs').writeFileSync(homedir + "/.kartik/crashes/" + id + ".txt", "Kartik Bootstraper Crash (in promise)\n\n" + reason); + if (require('os').platform() === "win32") { + require('child_process').exec("runtime\\kartik-crash.bat"); + } else if (require('os').platform() === "darwin") { + require('child_process').exec("./runtime/kartik-crash-mac.sh"); + } else { + require('child_process').exec("./runtime/kartik-crash.sh"); + } + process.exit(2); + }) + + if (process.argv[2] === "m") { + console.log(" * *******************************************"); + console.log(" * * DATA MITIGATION MODE *"); + console.log(" * * *"); + console.log(" * * Unless you ABSOLUTELY need this, please *"); + console.log(" * * consider starting Kartik normally. *"); + console.log(" * *******************************************"); + if (!require('fs').existsSync(__dirname + "/data")) { + require('fs').mkdirSync(__dirname + "/data"); + } + global.homedir = __dirname + "/data"; + } else { + global.homedir = require('os').userInfo().homedir; + } + + /* --------------------- */ + + console.log(" * Preparing application paths"); + app.setAppLogsPath(homedir + "/.kartik/logs"); + app.setPath("crashDumps", homedir + "/.kartik/dumps"); + app.setPath('userData', homedir + "/.kartik/storage"); + app.whenReady().then(async () => { + if (require('./package.json').channel !== "stable" && require('./package.json').channel !== "git") { + console.log(" * Opening save data conversion dialog"); + global.converting = true; + btn = require('electron').dialog.showMessageBoxSync( + { + type: "warning", + title: "Migrating save data to Kartik Fox Nest required", + message: "Your save data needs to be converted", + buttons: [ + "Use a new game directory (recommended)", + "Convert existing save data", + "Quit without doing anything" + ], + cancelId: 2, + detail: "Kartik Fox Nest (the new save data format) has been introduced in this version, and it requires converting from the old save data format. Because it is not possible to downgrade from Kartik Fox Nest to the old save data format, you have to choose what to do." + } + ) + + switch (btn) { + case 2: + process.exit(2); + break; + case 1: + break; + case 0: + if (process.argv[2] === "m") { + console.log(" * *******************************************"); + console.log(" * * DATA MITIGATION MODE *"); + console.log(" * * *"); + console.log(" * * Unless you ABSOLUTELY need this, please *"); + console.log(" * * consider starting Kartik normally. *"); + console.log(" * *******************************************"); + if (!require('fs').existsSync(__dirname + "/data")) { + require('fs').mkdirSync(__dirname + "/data"); + } + global.homedir = __dirname + "/data/.KartikStaging$"; + } else { + global.homedir = require('os').userInfo().homedir + "/.KartikStaging$"; + } + app.setAppLogsPath(homedir + "/.kartik/logs"); + app.setPath("crashDumps", homedir + "/.kartik/dumps"); + app.setPath('userData', homedir + "/.kartik/storage"); + if (!require('fs').existsSync(homedir)) { + require('fs').mkdirSync(homedir); + } + break; + } + } + console.log(" * Gathering language"); slpm = require('os-locale'); slpw = await slpm(); @@ -54,77 +135,48 @@ const { app, BrowserWindow } = require('electron'); dlp = "en"; } - process.on('uncaughtException', (error) => { - console.log(" * Starting recovery procedure: E_ERROR"); - id = new Date().toISOString().replaceAll(":", "-"); + console.log(" * Saving to " + homedir); - require('fs').writeFileSync(require('os').userInfo().homedir + "/.kartik/crashes/" + id + ".txt", "Kartik Bootstraper Crash\n\n" + error.stack); - if (require('os').platform() === "win32") { - require('child_process').exec("runtime\\kartik-crash.bat " + id); - } else if (require('os').platform() === "darwin") { - require('child_process').exec("./runtime/kartik-crash-mac.sh " + id); - } else { - require('child_process').exec("./runtime/kartik-crash.sh " + id); - } - process.exit(2); - }) + if (!require('fs').existsSync(homedir + "/.kartik")) { + require('fs').mkdirSync(homedir + "/.kartik") + } - process.on('unhandledRejection', (reason) => { - console.log(" * Starting recovery procedure: E_PROMISE"); - id = new Date().toISOString(); + if (!require('fs').existsSync(homedir + "/.kartik/crashes")) { + require('fs').mkdirSync(homedir + "/.kartik/crashes") + } - require('fs').writeFileSync(homedir + "/.kartik/crashes/" + id + ".txt", "Kartik Bootstraper Crash (in promise)\n\n" + reason); - if (require('os').platform() === "win32") { - require('child_process').exec("runtime\\kartik-crash.bat"); - } else if (require('os').platform() === "darwin") { - require('child_process').exec("./runtime/kartik-crash-mac.sh"); - } else { - require('child_process').exec("./runtime/kartik-crash.sh"); - } - process.exit(2); - }) + if (!require('fs').existsSync(homedir + "/.kartik/mods")) { + require('fs').mkdirSync(homedir + "/.kartik/mods") + } - /* --------------------- */ + if (require('fs').existsSync(homedir + "/.kartik/build")) { + require('fs').rmSync(homedir + "/.kartik/build", { recursive: true }) + } + require('fs').mkdirSync(homedir + "/.kartik/build") console.log(" * Creating configuration"); const fs = require('fs'); + const Nest = require('./nest/abi'); - if (!fs.existsSync(homedir + "/.kartik")) { - fs.mkdirSync(homedir + "/.kartik"); - } - if (!fs.existsSync(homedir + "/.kartik/config")) { - fs.mkdirSync(homedir + "/.kartik/config"); - } - if (!fs.existsSync(homedir + "/.kartik/crashes")) { - fs.mkdirSync(homedir + "/.kartik/crashes"); - } - if (!fs.existsSync(homedir + "/.kartik/logs")) { - fs.mkdirSync(homedir + "/.kartik/logs"); - } - if (!fs.existsSync(homedir + "/.kartik/dumps")) { - fs.mkdirSync(homedir + "/.kartik/dumps"); - } - if (!fs.existsSync(homedir + "/.kartik/mods")) { - fs.mkdirSync(homedir + "/.kartik/mods"); - } - if (!fs.existsSync(homedir + "/.kartik/storage")) { - fs.mkdirSync(homedir + "/.kartik/storage"); - } - fs.writeFileSync(homedir + "/.kartik/config/scale.txt", "1.2"); - if (!fs.existsSync(homedir + "/.kartik/config/lang.txt")) { - fs.writeFileSync(homedir + "/.kartik/config/lang.txt", dlp); - } - if (!fs.existsSync(homedir + "/.kartik/config/music.txt")) { - fs.writeFileSync(homedir + "/.kartik/config/music.txt", "1"); - } - if (!fs.existsSync(homedir + "/.kartik/config/online.txt")) { - fs.writeFileSync(homedir + "/.kartik/config/online.txt", "1"); - } - if (!fs.existsSync(homedir + "/.kartik/config/voice.txt")) { - fs.writeFileSync(homedir + "/.kartik/config/voice.txt", "0"); + if (fs.existsSync(homedir + "/.kartik/config") && fs.existsSync(homedir + "/.kartik/config/voice.txt") && fs.existsSync(homedir + "/.kartik/config/online.txt") && fs.existsSync(homedir + "/.kartik/config/music.txt") && fs.existsSync(homedir + "/.kartik/config/lang.txt") && fs.existsSync(homedir + "/.kartik/stats.json")) { + console.log(" * Found complete Config V1, migrating to Kartik Fox Nest..."); + Nest.convert(homedir + "/.kartik/current.kfn", homedir + "/.kartik"); + } else { + if (!fs.existsSync(homedir + "/.kartik/current.kfn")) { + console.log(" * No Kartik Fox Nest found, generating one..."); + Nest.generate(homedir + "/.kartik/current.kfn"); + } else { + fs.copyFileSync(homedir + "/.kartik/current.kfn", homedir + "/.kartik/latest.kfn"); + } } + global.currentNest = Nest.load(homedir + "/.kartik/current.kfn"); + console.log(" * Kartik Fox Nest loaded, " + fs.readFileSync(homedir + "/.kartik/current.kfn").toString().length + " bytes, last loaded in Kartik " + currentNest._version); + + currentNest._version = require('./package.json').version; + Nest.export(homedir + "/.kartik/current.kfn", currentNest); + /* --------------------- */ console.log(" * Checking channel"); @@ -170,40 +222,18 @@ const { app, BrowserWindow } = require('electron'); console.log(" * Checking configuration"); - scale = fs.readFileSync(homedir + "/.kartik/config/scale.txt").toString().trim() - 1 + 1 - lp = fs.readFileSync(homedir + "/.kartik/config/lang.txt").toString().trim() - - if (fs.readFileSync(homedir + "/.kartik/config/online.txt").toString().trim() === "0") { - fs.writeFileSync(homedir + "/.kartik/config/online.txt", "1"); - } - - if (scale !== 1 - && scale !== 0.9 - && scale !== 1.1 - && scale !== 1.2 - && scale !== 1.3 - && scale !== 1.4 - && scale !== 1.5 - && scale !== 1.6 - && scale !== 1.7 - && scale !== 1.8 - && scale !== 1.9 - && scale !== 2 - ) { - fs.writeFileSync(homedir + "/.kartik/config/scale.txt", "1.2"); - scale = 1; - } + lp = currentNest.config.lang time = new Date() - start; console.log(" * Started successfully in " + Math.round(time/1000) + " seconds"); console.log(" * Why are you EVEN reading this?"); - load.close(); + try { load.close(); } catch (e) {} console.log(" * Starting recovery procedure: E_PROMISE"); global.win = new BrowserWindow({ - width: Math.round(720 * scale), - height: Math.round(540 * scale), - minWidth: Math.round(720 * scale), - minHeight: Math.round(540 * scale), + width: 1220, + height: 720, + minWidth: 720, + minHeight: 540, resizeable: true, resizable: true, maximizable: true, @@ -223,14 +253,15 @@ const { app, BrowserWindow } = require('electron'); global.shouldExitIfClosed = true; - console.log(" * Starting IPC engine"); - win.pwidth = Math.round(720 * scale); - win.pheight = Math.round(540 * scale); + win.pwidth = 720; + win.pheight = 540; win.log = console.log; win.debug = process.argv[2] === "d"; win.channel = channel; + win.cmdlineargs = process.argv; + win.scale = 1.2; win.update = dimga; win.gamepads = []; win.controllerAttached = false; @@ -239,14 +270,16 @@ const { app, BrowserWindow } = require('electron'); win.ddetails = "Kartik"; win.mods = mods; + win.invalidfiles = invalidfiles; + win.modsfiles = compiledTypeScriptFiles; win.homedir = homedir; - win.scale = scale; win.lp = lp; - win.music = fs.readFileSync(homedir + "/.kartik/config/music.txt").toString().trim() === "1"; - win.voice = fs.readFileSync(homedir + "/.kartik/config/voice.txt").toString().trim() === "2"; + win.music = currentNest.config.music; + win.voice = currentNest.config.voice; - win.online = fs.readFileSync(homedir + "/.kartik/config/online.txt").toString().trim() === "1"; + win.online = currentNest.config.online; + win.nest = currentNest; win.resources = resources; global.currentSongValue = null; @@ -274,44 +307,48 @@ const { app, BrowserWindow } = require('electron'); win.webContents.send('setmusic', value); } }) - musicIpc.on('prefademusic', (event, value) => { - win.webContents.send('fademusic', value); - }) - musicIpc.on('preunfademusic', (event, value) => { - win.webContents.send('unfademusic', value); + + musicIpc.on('reloadNest', (event) => { + currentNest = Nest.load(homedir + "/.kartik/current.kfn"); + win.nest = currentNest; }) - stats = require(homedir + "/.kartik/stats.json"); + const LevelsAPI = require('./views/script/global_levelsapi'); + const lvl = new LevelsAPI(); + + stats = currentNest.stats; musicIpc.on('addstats', (event, value) => { - stats[value.catalog][value.key] = stats[value.catalog][value.key] + value.add; - fs.writeFile(homedir + "/.kartik/stats.json", JSON.stringify(stats), () => {}); + currentNest.stats[value.catalog][value.key] = currentNest.stats[value.catalog][value.key] + value.add; + Nest.export(homedir + "/.kartik/current.kfn", currentNest); + currentNest = Nest.load(homedir + "/.kartik/current.kfn"); + win.nest = currentNest; + + if (value.key === "laps" && currentNest.auth) { + auth = currentNest.auth; + level = lvl.correspond(currentNest.stats["ingame"]["laps"], "256") - 1 + 1; + + if (level !== auth.level) { + currentNest.auth.level = level; + Nest.export(homedir + "/.kartik/current.kfn", currentNest); + currentNest = Nest.load(homedir + "/.kartik/current.kfn"); + win.nest = currentNest; + if (level < 200) { + win.webContents.send("notification", {title: lang.polymer.levelup[0], message: lang.polymer.levelup[1] + " " + level + " " + lang.polymer.levelup[2]}); + } else { + win.webContents.send("notification", {title: lang.polymer.finished[0], message: lang.polymer.finished[1]}); + } + } + } }) musicIpc.on('addstatsandclose', (event, value) => { - stats[value.catalog][value.key] = stats[value.catalog][value.key] + value.add; - fs.writeFile(homedir + "/.kartik/stats.json", JSON.stringify(stats), () => {}); + currentNest.stats[value.catalog][value.key] = currentNest.stats[value.catalog][value.key] + value.add; + Nest.export(homedir + "/.kartik/current.kfn", currentNest); + currentNest = Nest.load(homedir + "/.kartik/current.kfn"); + win.nest = currentNest; win.destroy(); }) }) } - } - - console.log(" * Preparing application paths"); - app.setAppLogsPath(homedir + "/.kartik/logs"); - app.setPath("crashDumps", homedir + "/.kartik/dumps"); - app.setPath('userData', homedir + "/.kartik/storage"); - - app.whenReady().then(() => { - if (downgradeError) { - console.log(" * Unable to downgrade from Kartik Fox Nest to Config V1"); - require('electron').dialog.showMessageBoxSync( - { - type: "error", - title: "Kartik", - message: "A Kartik Fox Nest file has been found in your Kartik game directory, this means you have been running Kartik 21.08 or later. To prevent you from losing your progress, you cannot start this version of Kartik.\n\nVersion 21.08 introduced a new save data system that breaks backwards compatibility with older versions. Therefore, after you migrated your game directory to the new save data system (Kartik Fox Nest), you cannot downgrade to the version that you had before." - } - ) - process.exit(2); - } console.log(" * Starting splash screen"); global.load = new BrowserWindow({ @@ -321,7 +358,7 @@ const { app, BrowserWindow } = require('electron'); resizable: false, maximizable: false, frame: false, - show: true, + show: false, enableLargerThanScreen: true, icon: "logo/logo.png", backgroundColor: "#4b4e50", @@ -335,82 +372,76 @@ const { app, BrowserWindow } = require('electron'); } }) load.loadFile("./views/load.html"); - setTimeout(() => { - console.log(" * Checking signatures"); - - sigdb = require("./bin/signatures.json"); - total = Object.keys(sigdb["v1"]).length * 3; - processed = 0; - for (file in sigdb["v1"]) { - if (fs.existsSync(file)) { - try { - hash = require('crypto').createHash('sha512').update(fs.readFileSync(file)).digest('base64'); - if (hash !== sigdb["v1"][file]) { - require('electron').dialog.showMessageBoxSync( - { - type: "warning", - title: "Source modification detected", - message: "File " + file + " has been flagged as modified (signing V1). If this is normal, please run the signing process again.\n\nExpected: " + sigdb["v1"][file] + "\nGot: " + hash + "\n\nYou are running a modified version of Kartik, do not expect to get support!" - } - ) + load.webContents.once('dom-ready', () => { + console.log(" * Showing splash screen"); + load.show(); + setTimeout(() => { + console.log(" * Checking signatures"); + + invalidfiles = []; + + sigdb = require("./bin/signatures.json"); + total = Object.keys(sigdb["v1"]).length * 3; + processed = 0; + for (file in sigdb["v1"]) { + if (fs.existsSync(file) && !invalidfiles.includes(file)) { + try { + hash = require('crypto').createHash('sha512').update(fs.readFileSync(file)).digest('base64'); + if (hash !== sigdb["v1"][file]) { + invalidfiles.push(file); + } + } catch (e) { + console.warn(" ! Could not compute V1 hash for " + file); } - } catch (e) { - console.warn(" ! Could not V1 compute hash for " + file); } - } - processed++; - load.webContents.send('progress', (processed/total)*100); - } - for (file in sigdb["v2"]) { - if (fs.existsSync(file)) { - try { - hash = require('crypto').createHash('sha1').update(fs.readFileSync(file)).digest('base64'); - if (hash !== sigdb["v2"][file]) { - require('electron').dialog.showMessageBoxSync( - { - type: "warning", - title: "Source modification detected", - message: "File " + file + " has been flagged as modified (signing V2). If this is normal, please run the signing process again.\n\nExpected: " + sigdb["v2"][file] + "\nGot: " + hash + "\n\nYou are running a modified version of Kartik, do not expect to get support!" - } - ) + processed++; + load.webContents.send('progress', (processed/total)*100); + } + for (file in sigdb["v2"]) { + if (fs.existsSync(file) && !invalidfiles.includes(file)) { + try { + hash = require('crypto').createHash('sha1').update(fs.readFileSync(file)).digest('base64'); + if (hash !== sigdb["v2"][file]) { + invalidfiles.push(file); + } + } catch (e) { + console.warn(" ! Could not compute V2 hash for " + file); } - } catch (e) { - console.warn(" ! Could not compute V2 hash for " + file); } - } - processed++; - load.webContents.send('progress', (processed/total)*100); - } - for (file in sigdb["v3"]) { - if (fs.existsSync(file)) { - try { - hash = require('crypto').createHash('md5').update(fs.readFileSync(file)).digest('base64'); - if (hash !== sigdb["v3"][file]) { - require('electron').dialog.showMessageBoxSync( - { - type: "warning", - title: "Source modification detected", - message: "File " + file + " has been flagged as modified (signing V3). If this is normal, please run the signing process again.\n\nExpected: " + sigdb["v3"][file] + "\nGot: " + hash + "\n\nYou are running a modified version of Kartik, do not expect to get support!" - } - ) + processed++; + load.webContents.send('progress', (processed/total)*100); + } + for (file in sigdb["v3"]) { + if (fs.existsSync(file) && !invalidfiles.includes(file)) { + try { + hash = require('crypto').createHash('md5').update(fs.readFileSync(file)).digest('base64'); + if (hash !== sigdb["v3"][file]) { + invalidfiles.push(file); + } + } catch (e) { + console.warn(" ! Could not compute V3 hash for " + file); } - } catch (e) { - console.warn(" ! Could not compute V3 hash for " + file); } - } - processed++; - load.webContents.send('progress', (processed/total)*100); - } + processed++; + load.webContents.send('progress', (processed/total)*100); + } - console.log(" * Generating resources pack"); - require('./modding/resources'); - console.log(" * Starting Kartik Modding Platform"); - require('./modding/parser'); - createWindow(); - }, 5000) + global.importedTypeScriptFiles = []; + global.compiledTypeScriptFiles = []; + console.log(" * Generating resources pack"); + require('./modding/resources'); + console.log(" * Starting Kartik Modding Platform"); + require('./modding/parser'); + console.log(" * Compiling KMP API TypeScript files"); + require('./modding/compiler'); + console.log(" * Loading KMP TypeScript mods"); + require('./typescript/preloader'); + createWindow(); + }, 5000) + }) }) app.on('window-all-closed', () => { @@ -419,4 +450,4 @@ const { app, BrowserWindow } = require('electron'); app.quit() } }) -})(); +})();
\ No newline at end of file diff --git a/crash/client.js b/crash/client.js index e70467f..2323d18 100644 --- a/crash/client.js +++ b/crash/client.js @@ -1,114 +1,140 @@ -if (native) { - function crash(error) { - try { - require('@electron/remote').getCurrentWindow().hide(); - } catch (e) {} - id = new Date().toISOString().replaceAll(":", "-"); - - try { - global.pkg = require('./package.json'); - } catch (e) { - console.warn(e); - global.pkg = require('../package.json'); - - } - - report = "\n"; - report += "Kartik Crash Report\n\nPlease send this to the developers so they can fix the problem and deploy a patch to all players.\n\nStack Trace:\n" - error.stack.split("\n").forEach((line) => { - report += " " + line + "\n"; - }) - report += "\n\nSystem Information:\n" - report += " " + "Kartik"+require('@electron/remote').getCurrentWindow().channel + "(" + pkg.name + ") " +pkg.version + " [" + pkg.serial + "]\n"; - - report += " " + require('os').type() + " (" + require('os').version() + ", " + require('os').arch() +") version " + require('os').release() + "\n"; - cores = require('os').cpus() - if (cores.length > 1) { - report += " " + cores.length + " processors"; - } else { - report += " " + cores.length + " processor"; - } - report += "\n\nKartik Components:\n"; - Object.keys(process.versions).forEach((e) => { - - v = process.versions[e]; - report += " " + e + "@" + v + "\n"; - }) - - require('fs').writeFileSync(require('os').userInfo().homedir + "/.kartik/crashes/" + id + ".txt", report); - if (error.message !== "Invalid display" && error.message !== "Out of memory") { - - fetch("https://kartik.hopto.org/telemetry/report/?report=" + btoa(report.replaceAll(require('os').userInfo().username, "<information removed>"))) - - .then(() => { - if (require('os').platform() === "win32") { - require('child_process').execSync("runtime\\kartik-crash.bat"); - } else if (require('os').platform() === "darwin") { - require('child_process').execSync("./runtime/kartik-crash-mac.sh"); - } else { - require('child_process').execSync("./runtime/kartik-crash.sh"); - } - require('@electron/remote').getCurrentWindow().destroy(); - - window.close(); - require('@electron/remote').getCurrentWindow().close(); - }) - .catch(() => { - if (require('os').platform() === "win32") { - require('child_process').execSync("runtime\\kartik-crash.bat"); - } else if (require('os').platform() === "darwin") { - - require('child_process').execSync("./runtime/kartik-crash-mac.sh"); - } else { - require('child_process').execSync("./runtime/kartik-crash.sh"); - } - require('@electron/remote').getCurrentWindow().destroy(); - window.close(); - require('@electron/remote').getCurrentWindow().close(); - }) - } else { - if (require('os').platform() === "win32") { - require('child_process').execSync("runtime\\kartik-crash.bat"); - } else if (require('os').platform() === "darwin") { - require('child_process').execSync("./runtime/kartik-crash-mac.sh"); - } else { - require('child_process').execSync("./runtime/kartik-crash.sh"); - } - - require('@electron/remote').getCurrentWindow().destroy(); - window.close(); - require('@electron/remote').getCurrentWindow().close(); - } - } - - window.onerror = (_a, _b, _c, _d, error) => { - if (typeof error != "undefined") { - crash(error); - } else { - error("CrashManager", "An exception was thrown without details about it"); - crash(new Error("Unknown error")); - } - } - - process.on('uncaughtException', (error) => { - if (typeof error != "undefined") { - crash(error); - } else { - error("CrashManager", "An exception was thrown without details about it"); - crash(new Error("Unknown error")); - } - }) - - /*setInterval(() => { - try { - if (document.body.clientWidth >= (screen.width - 50) || document.body.clientHeight >= (screen.height - 50) || require('@electron/remote').getCurrentWindow().pwidth >= (screen.width - 50) || require('@electron/remote').getCurrentWindow().pheight >= (screen.height - 50) || require('@electron/remote').getCurrentWindow().scale < 0.9) { - - if (!location.href.includes("credits.html")) { - error("CrashManager", "Invalid display, crashing"); - crash(new Error("Invalid display")); - // TODO: Instead reset the size and restart - } - } - } catch (e) {} - }, 2000)*/ -} +taglines = [
+ "Who set us up the engine?",
+ "Everything's going as planned. No, really, that was supposed to happen.",
+ "Uh... Did I do that? (oops)",
+ "Oops.",
+ "Why did you do that?",
+ "I feel sad now :(",
+ "My bad.",
+ "I'm sorry, Dave. I'm afraid I can't do that.",
+ "I let you down. Sorry :(",
+ "On the bright side, I bought you a teddy bear!",
+ "Oh - I know what I did wrong!",
+ "Hey, that tickles! Hehehe!",
+ "I blame Microsoft.",
+ "Don't be sad. I'll do better next time, pinky swear!",
+ "Don't be sad, have a hug! <3",
+ "I just don't know what went wrong :(",
+ "Shall we play a game?",
+ "Quite honestly, I wouldn't worry myself about that.",
+ "Sorry :(",
+ "Surprise! Haha. Well, this is awkward.",
+ "Would you like a cupcake?",
+ "Hi. I'm Kartik, and I'm a crashaholic.",
+ "Ooh. Shiny.",
+ "This doesn't make any sense!",
+ "Why is it breaking :(",
+ "Don't do that.",
+ "Ouch. That hurt :(",
+ "You're mean.",
+ "But it works on my machine.",
+ "Welp, I guess it's broken now.",
+ "¯\\_(ツ)_/¯",
+ "*boop*"
+]
+
+if (native) {
+ function crash(error) {
+ id = new Date().toISOString().replaceAll(":", "-");
+
+ try {
+ global.pkg = require('./package.json');
+ } catch (e) {
+ console.warn(e);
+ global.pkg = require('../package.json');
+
+ }
+
+ try {
+ pubver = require('../package.json').version;
+ } catch (e) {
+ pubver = require('./package.json').version;
+ }
+ pvpart = pubver.split(".");
+ if (pvpart.length === 3) {
+ intver = pvpart[0] + "." + pvpart[1];
+ } else {
+ intver = "unknown";
+ }
+
+ if (require('@electron/remote').getCurrentWindow().mods.length > 0) {
+ release = "mods+" + require('@electron/remote').getCurrentWindow().mods.length;
+ } else {
+ release = "official";
+ }
+
+ report = "---- Kartik Crash Report ----\n";
+ report += "// " + taglines[Math.floor(Math.random() * taglines.length)] + "\n\n"
+
+ report += "Time: " + new Date().toUTCString() + "\n\n";
+ error.stack.split("\n").forEach((line) => {
+ report += line + "\n";
+ })
+
+ report += "\n\n\nA detailed walkthrough of the error, its code path and all known details is as follows:\n" +
+ "---------------------------------------------------------------------------------------\n\n";
+
+ report += "-- Head --\nThread: Renderer #" + process.pid + "\n\n"
+
+ report += "-- Initialization --\nDetails: " + require('@electron/remote').getCurrentWindow().cmdlineargs.join(" ") + "\n\n"
+
+ report += "-- System Details --\nDetails: \n";
+
+ report += " Kartik Version: " + pkg.version + "\n";
+ try {
+ channel = require('../package.json').channel;
+ } catch (e) {
+ channel = require('./package.json').channel;
+ }
+ report += " Kartik Version ID: " + intver + "/" + channel + "+" + release + "\n";
+ report += " Kartik Version SKU: " + pkg.serial + "\n";
+ report += " Operating System: " + require('os').type() + " (" + require('os').arch() + ") version " + require('os').release() + "\n";
+ report += " Electron Version: " + process.versions.electron + "\n";
+ report += " Electron VM Version: " + process.versions.v8 + "\n";
+ report += " Node Version: " + process.versions.node + "\n";
+ report += " Memory: " + process.memoryUsage().heapUsed + " bytes (" + Math.round(process.memoryUsage().heapUsed / 1000000) + " MB) / " + process.memoryUsage().heapTotal + " bytes (" + Math.round(process.memoryUsage().heapTotal / 1000000) + " MB) up to " + process.memoryUsage().rss + " bytes (" + Math.round(process.memoryUsage().rss / 1000000) + " MB)\n";
+ report += " CPUs: " + require('os').cpus().length + "\n";
+ if (require('@electron/remote').getCurrentWindow().mods.length > 0) {
+ report += " KMP Mods:\n";
+ for (mod of require('@electron/remote').getCurrentWindow().mods) {
+ report += " " + mod + "\n";
+ }
+ }
+ report += " Is Modded: ";
+ if (require('@electron/remote').getCurrentWindow().mods.length > 0) {
+ report += "Definitely; Client brand changed to 'kmp-client'"
+ } else if (require('@electron/remote').getCurrentWindow().invalidfiles.length > 0) {
+ if (require('@electron/remote').getCurrentWindow().invalidfiles.length > 1) {
+ report += "Very likely; " + require('@electron/remote').getCurrentWindow().invalidfiles.length + " signatures invalidated";
+ } else {
+ report += "Very likely; " + require('@electron/remote').getCurrentWindow().invalidfiles.length + " signature invalidated";
+ }
+ } else {
+ report += "Probably not. All signatures remains and client brand is untouched.";
+ }
+ report += "\n";
+ report += " CPU: " + require('os').cpus().length + "x " + require('os').cpus()[0].model.trim() + "\n";
+
+ require('fs').copyFileSync(homedir + "/.kartik/current.kfn", homedir + "/.kartik/crashed.kfn");
+ require('fs').writeFileSync(require('os').userInfo().homedir + "/.kartik/crashes/" + id + ".txt", report);
+ require('@electron/remote').getCurrentWindow().webContents.send("crashreport", report);
+ }
+
+ window.onerror = (_a, _b, _c, _d, error) => {
+ if (typeof error != "undefined") {
+ crash(error);
+ } else {
+ error("CrashManager", "An exception was thrown without details about it");
+ crash(new Error("Unknown error"));
+ }
+ }
+
+ process.on('uncaughtException', (error) => {
+ if (typeof error != "undefined") {
+ crash(error);
+ } else {
+ error("CrashManager", "An exception was thrown without details about it");
+ crash(new Error("Unknown error"));
+ }
+ })
+}
diff --git a/crash/crash.html b/crash/crash.html index ec4e5ca..c698dcd 100644 --- a/crash/crash.html +++ b/crash/crash.html @@ -1,72 +1,72 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <script src="../lang/loader.js"></script> - <meta charset="UTF-8"> - <script>document.title = lang.crash.title;</script> - <link rel="stylesheet" href="../views/common/fonts.css"> - <style> - - * { - font-family: -apple-system, sans-serif; - cursor: default !important; - font-family: "Comfortaa", -apple-system, sans-serif !important; - } - - button { - border: 1px solid #00b763; - padding: 10px 20px; - border-radius: 999px; - background: #fff; - color: black; - outline: none; - } - - button:hover { - color: white; - border: 1px solid #007b42; - background: #00b763; - } - - button:active { - color: white; - border: 1px solid #00502b; - background: #007b42; - } - - </style> -</head> -<body style="display:grid;grid-template-columns: 1fr 1fr;height:100%;width:100%;margin:0;overflow:hidden;"> - <div> - <img src="./artwork.jpg" style="height: 100vh;"> - </div> - <div style="padding:8px;"> - <h2><script>document.write(lang.crash.head);</script></h2> - <p><script>document.write(lang.crash.intro);</script></p> - <p><script> - document.write(lang.crash.report[0]); - if (require('os').platform() === "win32") { - document.write(require('os').userInfo().homedir + "\\.kartik\\crashes"); - } else { - document.write(require('os').userInfo().homedir + "/.kartik/crashes"); - } - document.write(lang.crash.report[1]); - </script></p> - <p><button onclick="restart();"><script>document.write(lang.crash.close);</script></button> <button onclick="resetrestart();"><script>document.write(lang.crash.reset);</script></button></p> - </div> - - <script> - function restart() { - window.close(); - require('@electron/remote').getCurrentWindow().hide(); - require('@electron/remote').getCurrentWindow().destroy(); - require('@electron/remote').getCurrentWindow().close(); - } - function resetrestart() { - require('fs').rmdirSync(require('os').userInfo().homedir + "/.kartik/config", {recursive:true}); - window.close(); - require('@electron/remote').getCurrentWindow().close(); - } - </script> -</body> -</html> +<!DOCTYPE html>
+<html lang="en">
+<head>
+ <script src="../lang/loader.js"></script>
+ <meta charset="UTF-8">
+ <script>document.title = lang.crash.title;</script>
+ <link rel="stylesheet" href="../views/common/fonts.css">
+ <style>
+
+ * {
+ font-family: -apple-system, sans-serif;
+ cursor: default !important;
+ font-family: "Comfortaa", -apple-system, sans-serif !important;
+ }
+
+ button {
+ border: 1px solid #00b763;
+ padding: 10px 20px;
+ border-radius: 999px;
+ background: #fff;
+ color: black;
+ outline: none;
+ }
+
+ button:hover {
+ color: white;
+ border: 1px solid #007b42;
+ background: #00b763;
+ }
+
+ button:active {
+ color: white;
+ border: 1px solid #00502b;
+ background: #007b42;
+ }
+
+ </style>
+</head>
+<body style="display:grid;grid-template-columns: 1fr 1fr;height:100%;width:100%;margin:0;overflow:hidden;">
+ <div>
+ <img src="./artwork.jpg" style="height: 100vh;">
+ </div>
+ <div style="padding:8px;">
+ <h2><script>document.write(lang.crash.head);</script></h2>
+ <p><script>document.write(lang.crash.intro);</script></p>
+ <p><script>
+ document.write(lang.crash.report[0]);
+ if (require('os').platform() === "win32") {
+ document.write(require('os').userInfo().homedir + "\\.kartik\\crashes");
+ } else {
+ document.write(require('os').userInfo().homedir + "/.kartik/crashes");
+ }
+ document.write(lang.crash.report[1]);
+ </script></p>
+ <p><button onclick="restart();"><script>document.write(lang.crash.close);</script></button> <button onclick="resetrestart();"><script>document.write(lang.crash.reset);</script></button></p>
+ </div>
+
+ <script>
+ function restart() {
+ window.close();
+ require('@electron/remote').getCurrentWindow().hide();
+ require('@electron/remote').getCurrentWindow().destroy();
+ require('@electron/remote').getCurrentWindow().close();
+ }
+ function resetrestart() {
+ require('fs').rmdirSync(require('os').userInfo().homedir + "/.kartik/config", {recursive:true});
+ window.close();
+ require('@electron/remote').getCurrentWindow().close();
+ }
+ </script>
+</body>
+</html>
diff --git a/crash/wrapper.js b/crash/wrapper.js index ba5a8b9..4c291bd 100644 --- a/crash/wrapper.js +++ b/crash/wrapper.js @@ -1,41 +1,39 @@ -const { app, BrowserWindow } = require('electron') - -if (require('fs').existsSync(require('os').userInfo().homedir + "/.kartik/config/lang.txt")) { - lp = require('fs').readFileSync(require('os').userInfo().homedir + "/.kartik/config/lang.txt").toString(); -} - -function createWindow () { - const win = new BrowserWindow({ - width: 800, - height: 375, - resizeable: false, - resizable: false, - maximizable: false, - bgColor: "#ffffff", - title: "Kartik", - webPreferences: { - nodeIntegration: true, - contextIsolation: false, - enableRemoteModule: true, - webviewTag: true - } - }) - - win.lp = lp; - win.loadFile('crash.html') - win.setMenu(null); -} - -app.whenReady().then(createWindow) - -app.on('window-all-closed', () => { - if (process.platform !== 'darwin') { - app.quit() - } -}) - -app.on('activate', () => { - if (BrowserWindow.getAllWindows().length === 0) { - createWindow() - } +const { app, BrowserWindow } = require('electron')
+
+lp = "en";
+
+function createWindow () {
+ const win = new BrowserWindow({
+ width: 800,
+ height: 375,
+ resizeable: false,
+ resizable: false,
+ maximizable: false,
+ bgColor: "#ffffff",
+ title: "Kartik",
+ webPreferences: {
+ nodeIntegration: true,
+ contextIsolation: false,
+ enableRemoteModule: true,
+ webviewTag: true
+ }
+ })
+
+ win.lp = lp;
+ win.loadFile('crash.html')
+ win.setMenu(null);
+}
+
+app.whenReady().then(createWindow)
+
+app.on('window-all-closed', () => {
+ if (process.platform !== 'darwin') {
+ app.quit()
+ }
+})
+
+app.on('activate', () => {
+ if (BrowserWindow.getAllWindows().length === 0) {
+ createWindow()
+ }
})
\ No newline at end of file diff --git a/discord/client.js b/discord/client.js index 1e98faf..63dd6db 100644 --- a/discord/client.js +++ b/discord/client.js @@ -1,40 +1,40 @@ -const DiscordRPC = require('discord-rpc'); - -// Set this to your Client ID. -const clientId = '821064368535633920'; - -// Only needed if you want to use spectate, join, or ask to join -DiscordRPC.register(clientId); - -const rpc = new DiscordRPC.Client({ transport: 'ipc' }); -const startTimestamp = new Date(); - -async function setActivity() { - if (!rpc) { - return; - } - - //const boops = await mainWindow.webContents.executeJavaScript('window.boops'); - - // You'll need to have snek_large and snek_small assets uploaded to - // https://discord.com/developers/applications/<application_id>/rich-presence/assets - rpc.setActivity({ - details: win.ddetails, - state: win.dstate, - startTimestamp, - largeImageKey: 'kartik', - largeImageText: 'Kartik, ' + lang.game.credits.by + ' Minteck Projects', - smallImageKey: dimg, - smallImageText: dchan, - instance: false, - }); -} - -rpc.on('ready', () => { - // activity can only be set every 15 seconds - setInterval(() => { - setActivity(); - }, 15e3); -}); - +const DiscordRPC = require('discord-rpc');
+
+// Set this to your Client ID.
+const clientId = '821064368535633920';
+
+// Only needed if you want to use spectate, join, or ask to join
+DiscordRPC.register(clientId);
+
+const rpc = new DiscordRPC.Client({ transport: 'ipc' });
+const startTimestamp = new Date();
+
+async function setActivity() {
+ if (!rpc) {
+ return;
+ }
+
+ //const boops = await mainWindow.webContents.executeJavaScript('window.boops');
+
+ // You'll need to have snek_large and snek_small assets uploaded to
+ // https://discord.com/developers/applications/<application_id>/rich-presence/assets
+ rpc.setActivity({
+ details: win.ddetails,
+ state: win.dstate,
+ startTimestamp,
+ largeImageKey: 'kartik',
+ largeImageText: 'Kartik, ' + lang.game.credits.by + ' Minteck',
+ smallImageKey: dimg,
+ smallImageText: dchan,
+ instance: false,
+ });
+}
+
+rpc.on('ready', () => {
+ // activity can only be set every 15 seconds
+ setInterval(() => {
+ setActivity();
+ }, 15e3);
+});
+
rpc.login({ clientId }).catch(console.error);
\ No newline at end of file @@ -1,97 +1,124 @@ -<!DOCTYPE html> -<html lang="en" style="background:#000000;margin:0;height:100%;width:100%;"> -<head> - <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;require('@electron/remote').getCurrentWindow().log(" * Parsing view");}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};</script> - <meta charset="UTF-8"> - <title>Kartik</title> - <script src="./crash/client.js"></script> - <script src="./lang/loader.js"></script> - <link rel="stylesheet" href="./views/common/fonts.css"> - <link rel="stylesheet" href="./views/common/index.css"> - <script src="./views/script/core_head.js"></script> - <script src="./views/script/core_compatlayer.js"></script> - <script src="./views/script/core_fullscreen.js"></script> - <script> - if (native) { - require('@electron/remote').getCurrentWindow().show(); - } - </script> -</head> -<body style="background:#000000;margin:0;height:100%;width:100%;zoom:1.2;"> - <div id="dummyloader" style="display:flex;align-items:center;justify-content:center;position:fixed;z-index:1;inset: 0;height: 100%;background:#fed1ae;overflow:hidden;"> - <img src="logo/itch/banner.jpg" style="height:100%;width:auto;"> - </div> - <div style="height: 64px;position: fixed;bottom: 10px;left: 0;background-image: url(./logo/newloader.svg);width: 100000000px;background-size: contain;animation-name: loading;animation-direction: reverse;animation-fill-mode: forwards;animation-timing-function: linear;animation-duration: 5000s;animation-iteration-count: infinite;opacity: .5;"></div> - <style> - @keyframes loading { - 0% { - left: 0; - } - 100% { - left: -900000px; - } - } - @keyframes logo { - 0% { - transform: rotate3d(1, 1, 1, 0deg); - } - 100% { - transform: rotate3d(1, 1, 1, 360deg); - } - } - </style> - <div id="message" style=" - position: fixed; - display: none; - bottom: 0; - left: 20px; - right: 20px; - height: 48px; - background: rgba(0, 0, 0, .5); - color: white; - border-top-left-radius: 10px; - border-top-right-radius: 10px; - border: 1px solid #2b2b2b; - border-bottom: none; - pointer-events: none; - z-index: 20; - "><span id="message-character" style=" - width: 64px; - height: 64px; - position: fixed; - bottom: 8px; - left: 56px; - background: #3c3c3c; - border-radius: 100%; - border: 1px solid #5f5f5f; -"><img src="./scenario/character/neutral.png" id="message-character-inner" style=" - position: fixed; - bottom: 8px; - width: 66px; - left: 56px; - border-bottom-left-radius: 100px; - border-bottom-right-radius: 100px; - "></span><span id="message-text" style=" - position: fixed; - left: 156px; - width: calc(100% - 220px); - bottom: 11px; - font-size: 14px; - height: 28px; - overflow: hidden; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; -"></span></div> - <script>if (!native) { document.getElementById('titlebar').style.display = "none"; }</script> - <script> - document.write(`<webview id="wb" src="views/loader.html" style="border: 0;z-index:2;top:0;left:0;right:0;bottom:0;position:fixed;" nodeintegration disablewebsecurity allowpopups webpreferences="nodeIntegration,contextIsolation=no"></webview>`); - </script> - </div> - <script src="./views/script/core_chart.js"></script> - <script src="./views/script/core_music.js"></script> - <script src="./views/script/core_viewer.js"></script> - <script src="./views/script/core_stats.js"></script> -<script>info("MainWindow", "Main container up!");if (native){require('@electron/remote').getCurrentWindow().log(" * View loaded, Kartik is now up and running!");}</script> -</body> -</html> +<!DOCTYPE html>
+<html lang="en" style="background:#000000;margin:0;height:100%;width:100%;">
+<head>
+ <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;require('@electron/remote').getCurrentWindow().log(" * Parsing view");}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};</script>
+ <meta charset="UTF-8">
+ <title>Kartik</title>
+ <script src="./crash/client.js"></script>
+ <script src="./lang/loader.js"></script>
+ <link rel="stylesheet" href="./views/common/fonts.css">
+ <link rel="stylesheet" href="./views/common/index.css">
+ <script src="./views/script/core_head.js"></script>
+ <script src="./views/script/core_compatlayer.js"></script>
+ <script src="./views/script/core_fullscreen.js"></script>
+ <script src="./typescript/mainloader.js"></script>
+</head>
+<body style="background:#000000;margin:0;height:100%;width:100%;zoom:1.2;">
+ <div id="dummyloader" style="display:flex;align-items:center;justify-content:center;position:fixed;z-index:1;inset: 0;height: 100%;background:#f4f3f4;overflow:hidden;">
+ </div>
+ <div style="height: 64px;position: fixed;bottom: 10px;left: 0;background-image: url(./logo/newloader.svg);width: 100000000px;background-size: contain;animation-name: loading;animation-direction: reverse;animation-fill-mode: forwards;animation-timing-function: linear;animation-duration: 5000s;animation-iteration-count: infinite;opacity: .5;"></div>
+ <style>
+ @keyframes loading {
+ 0% {
+ left: 0;
+ }
+ 100% {
+ left: -900000px;
+ }
+ }
+ @keyframes logo {
+ 0% {
+ transform: rotate3d(1, 1, 1, 0deg);
+ }
+ 100% {
+ transform: rotate3d(1, 1, 1, 360deg);
+ }
+ }
+ </style>
+ <div id="notification" style="position: fixed; z-index: 9999; background: rgba(0, 0, 0, 0.5); color: white; padding: 10px; width: 256px; right: -300px; top: 20px; opacity: 0; border-radius: 10px; backdrop-filter: blur(10px); transition: right 400ms linear 0s, opacity 400ms linear 0s;">
+ <span id="notification-title" style="
+ font-weight: bold;
+ text-align: left;
+ display: block;
+ padding-bottom: 5px;
+">hello</span>
+ <span id="notification-message" style="
+ display: block;
+ max-width: 256px;
+ text-align: left;
+">goodbye</span>
+ </div>
+ <div id="message" style="
+ position: fixed;
+ display: none;
+ bottom: 0;
+ left: 20px;
+ right: 20px;
+ height: 48px;
+ background: rgba(0, 0, 0, .5);
+ color: white;
+ border-top-left-radius: 10px;
+ border-top-right-radius: 10px;
+ border: 1px solid #2b2b2b;
+ border-bottom: none;
+ pointer-events: none;
+ z-index: 20;
+ "><span id="message-character" style="
+ width: 64px;
+ height: 64px;
+ position: fixed;
+ bottom: 8px;
+ left: 56px;
+ background: #3c3c3c;
+ border-radius: 100%;
+ border: 1px solid #5f5f5f;
+"><img src="./scenario/character/neutral.png" id="message-character-inner" style="
+ position: fixed;
+ bottom: 8px;
+ width: 66px;
+ left: 56px;
+ border-bottom-left-radius: 100px;
+ border-bottom-right-radius: 100px;
+ "></span><span id="message-text" style="
+ position: fixed;
+ left: 156px;
+ width: calc(100% - 220px);
+ bottom: 11px;
+ font-size: 14px;
+ height: 28px;
+ overflow: hidden;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+"></span></div>
+ <script>if (!native) { document.getElementById('titlebar').style.display = "none"; }</script>
+ <script>
+ document.write(`<webview id="wb" src="views/loader.html" style="border: 0;z-index:2;top:0;left:0;right:0;bottom:0;position:fixed;" nodeintegration disablewebsecurity allowpopups webpreferences="nodeIntegration,contextIsolation=no"></webview>`);
+ </script>
+ <script src="./views/script/core_chart.js"></script>
+ <script src="./views/script/core_music.js"></script>
+ <script src="./views/script/core_viewer.js"></script>
+ <script src="./views/script/core_stats.js"></script>
+ <script src="./views/script/core_notification.js"></script>
+<script>info("MainWindow", "Main container up!");if (native){require('@electron/remote').getCurrentWindow().log(" * View loaded, Kartik is now up and running!");}</script>
+
+ <div id="error-outer" style="display:none;background:rgba(0, 0, 0, .5);backdrop-filter: blur(10px);position:fixed;inset:0;align-items:center;justify-content: center;z-index:999;text-align: center;">
+ <div id="error" style="background:#111;border-radius:10px;color:white;max-width:40vw;">
+ <div id="error-title" style="padding:10px;background:#222;border-top-left-radius: 10px;border-top-right-radius: 10px;">Kartik encountered an error</div>
+ <div id="error-details" style="padding:10px;">An error occurred and Kartik couldn't continue running. We collected some info that you can send to the developers so they can fix the problem.<textarea id="crash-dump" disabled="" style="margin: 0;resize: none;background: #171717;color: white;margin-top: 10px;font-family: monospace;font-size: 10px;width: calc(100% - 13px);padding: 5px;border: 2px ridge white;border-radius: 0;height: 180px;overflow-y: scroll;">Nothing there yet!</textarea><div id="error-buttons" style="margin-top: 10px;"><button style="padding: 5px 10px;margin-right: 5px;border-radius: 5px;background: #161616;color: white;border: 1px solid #121212;cursor: pointer !important;outline:none;" class="error-button" onclick="require('open')('https://jetbrains.minteck.ro.lt:1024/youtrack/newIssue?project=KTK&summary=%5BTry%20to%20summarize%20what%20the%20bug%20says%5D&description=%23%20Kartik%20Bug%20Report%0A%0A%23%23%20Crash%20Report%0A%0A%60%60%60text%0A%25replace%25%0A%60%60%60%0A%0A%23%23%20Steps%20to%20reproduce%0A%0A%5BTell%20us%20how%20you%20triggered%20the%20crash%2C%20how%20to%20reproduce%20it%20if%20possible%5D%0A%0A%23%23%20Other%20notes%0A%0A%5BIf%20you%20modified%20your%20version%20of%20Kartik%2C%20tell%20us%20what%20you%20modified.%20All%20the%20rest%20of%20the%20information%20should%20be%20in%20the%20Crash%20Report.%5D'.replace('%25replace%25', encodeURI(document.getElementById('crash-dump').value.split('---------------------------------------------------------------------------------------')[0].trim())));">Open report page</button> <button class="error-button" style="padding: 5px 10px;border-radius: 5px;background: #161616;color: white;border: 1px solid #121212;cursor: pointer !important;outline:none;" onclick="location.reload();">Restart</button></div></div>
+ </div>
+
+ <style>
+ .error-button:hover {
+ background: #212121 !important;
+ }
+
+ .error-button:active, .error-button:focus {
+ background: #252525 !important;
+ }
+ </style>
+ </div>
+
+ <script src="./views/script/core_crash.js"></script>
+</body>
+</html>
diff --git a/kartik-nosandbox.bat b/kartik-nosandbox.bat new file mode 100644 index 0000000..f293a87 --- /dev/null +++ b/kartik-nosandbox.bat @@ -0,0 +1,2 @@ +@echo off
+bin\win32\kartik-core.exe --no-sandbox app.js
\ No newline at end of file @@ -1,2 +1,2 @@ -@echo off +@echo off
bin\win32\kartik-core.exe app.js
\ No newline at end of file diff --git a/lang/de.json b/lang/de.json index f7f2f12..1e18c6f 100644 --- a/lang/de.json +++ b/lang/de.json @@ -2,50 +2,50 @@ "crash": { "title": "Kartik Crash Reporter", "head": "Kartik hat aufgeh\u00f6rt zu arbeiten", - "intro": "Kartik stie\u00df auf ein Problem und hielt unerwartet an. ", + "intro": "Kartik ist auf ein Problem gesto\u00dfen und hat unerwartet angehalten. ", "report": [ - "Zus\u00e4tzlich wurde ein Absturzbericht in \"", - "Damit Sie es an die Entwickler senden k\u00f6nnen, wenn Sie \u00fcber einen Internetzugang verf\u00fcgen." + "Au\u00dferdem wurde ein Absturzbericht in \"", + "Damit Sie es an die Entwickler senden k\u00f6nnen, wenn Sie einen Internetzugang haben." ], "close": "Schlie\u00dfen", "reset": "Kartik zur\u00fccksetzen und schlie\u00dfen" }, "updates": { - "ok": "Auf dem neusten Stand", + "ok": "Auf dem Laufenden", "available": "Spiel-Updates verf\u00fcgbar", "git": "Ausf\u00fchren der Trunk-Version", - "error": "Es kann nicht nach Updates gesucht werden", - "wait": "Nach Updates suchen ...", + "error": "Suche nach Updates nicht m\u00f6glich", + "wait": "Suche nach Updates ...", "warn": [ "Updates sind verf\u00fcgbar", - "Laden Sie die neue Version von Kartik von der offiziellen Website herunter, um von den neuesten Funktionen und Fehlerkorrekturen zu profitieren." + "Laden Sie die neue Version von Kartik von der offiziellen Website herunter, um von den neuesten Funktionen und Fehlerbehebungen zu profitieren." ] }, "scenario": { "intro": [ - "Hey, hi, wie w\u00e4re es mit einem schnellen Lauf?", + "Hey, hallo, wie w\u00e4re es mit einem schnellen Lauf?", "Ah, da bist du wieder! ", - "Was w\u00e4re, wenn wir ein kleines Rennen h\u00e4tten?", - "Sollen wir spazieren gehen?" + "Wie w\u00e4re es mit einem kleinen Rennen?", + "Machen wir einen Spaziergang?" ], "ahead1": [ "Ach nein !", "Verdammt, das ist nicht m\u00f6glich!", - "Aber ich werde nicht dorthin gelangen ...", - "Und Schei\u00dfe ...", + "Aber ich komm da nicht hin...", + "Und Schei\u00dfe...", "Warum du ?" ], "ahead2": [ "Hee hee hee", "Dieser ist f\u00fcr mich!", "Ich werde es haben !", - "Sie ist f\u00fcr mich!", + "Es ist f\u00fcr mich!", "Es geh\u00f6rt mir !" ], "won1": [ "Gute Partie !", - "Schade f\u00fcr mich ...", - "Ich h\u00e4tte hoffen k\u00f6nnen ...", + "Schade f\u00fcr mich...", + "ich h\u00e4tte hoffen k\u00f6nnen...", "Aber es ist nicht sehr sch\u00f6n!", "Gut gemacht !" ], @@ -53,25 +53,25 @@ "Ich habe es dir gesagt !", "Als h\u00e4tte ich dich nicht gewarnt!", "Ich habe gewonnen !", - "Gro\u00dfartig, ich habe es gewonnen!", - "Und noch eine f\u00fcr mich!" + "Super, ich habe gewonnen!", + "Und noch eins f\u00fcr mich!" ], "wall1": [ "Ah ah!", "Na dann, gehen wir nicht richtig?", "Autsch", - "Es muss weh tun ...", - "Splaf, kein Hindernis!" + "Es muss weh tun...", + "Spaf, c't'obstacle!" ], "wall2": [ "Scheisse", - "Poop", + "Kacke", "Nicht m\u00f6glich", "Puti" ], "start": [ "Ich werde Spa\u00df haben!", - "Du wirst sehen, ich werde dich zu einem dieser Rennen machen!", + "Du wirst sehen, ich mache dich zu einer dieser Rassen!", "Erz\u00e4hl mir Neuigkeiten", "Lass uns gehen!", "Auf geht's !", @@ -84,35 +84,35 @@ "Im Abspann" ], "game": [ - "Anteil", + "Eins\u00e4tze", "Solo-Modus", "Versus-Modus", "In der Pause" ], "intro": [ - "In der Warteschleife", - "Zur Einf\u00fchrung" + "Warten", + "\u00dcber die Einf\u00fchrung" ], "settings": [ - "In der Warteschleife", - "In den Parametern" + "Warten", + "In den Einstellungen" ], "win": [ - "Ich habe gerade gewonnen.", - "Hat gerade verloren." + "Gerade gewonnen", + "Gerade verloren" ] }, "intro": [ - "Tippen Sie auf Eingabe zum Starten", - "Dr\u00fccken Sie A, um zu beginnen" + "Dr\u00fccken Sie die Eingabetaste, um zu starten", + "Dr\u00fccke A zum Starten" ], "game": { "credits": { - "by": "durch" + "by": "von" }, "gpause": { - "title": "Spiel in der Pause", - "continueg": "Weiter", + "title": "Spiel pausiert", + "continueg": "Weitermachen", "showhb": "Hitbox anzeigen", "hidehb": "Hitbox ausblenden", "quit": "Verlassen" @@ -121,84 +121,117 @@ "menu": { "titles": [ "Solo", - "Versus", + "Gegen", "Optionen", - "Mittel", + "Credits", "Verlassen" ], "descriptions": [ - "Spielen Sie allein und offline gegen einen Roboter", - "Zu zweit auf dem gleichen Bildschirm spielen", + "Spiele alleine und offline gegen einen Roboter", + "Spielen Sie zwei auf demselben Bildschirm", "Zoom und Einstellungen \u00e4ndern", - "Liste der Autoren des Spiels anzeigen", - "Das Spiel schlie\u00dfen und zur\u00fcck zu" + "Liste der Spieleautoren anzeigen", + "Schlie\u00dfe das Spiel und kehre zur\u00fcck zu" ], - "distribute": "Nicht verteilen" + "distribute": "Nicht st\u00f6ren" }, "settings": { "title": "Optionen", - "back": "Zur\u00fcck", - "size": "Gr\u00f6\u00dfe der Schnittstelle", + "back": "Zur\u00fcckkehren", + "size": "Schnittstellengr\u00f6\u00dfe", "music": "Musik aktivieren", - "lang": "Sprache", + "lang": "Zunge", "voice": "Stimme aktivieren", - "yes": "Ja, ja", - "no": "nein, nein", - "notice": "Die Parameter werden erst nach dem Neustart von Kartik angewendet" + "yes": "Jawohl", + "no": "Nein", + "notice": "Die Einstellungen werden erst nach dem Neustart von Kartik \u00fcbernommen" }, "win": { "solo": { - "win": "Sie haben gewonnen!", - "lose": "Sie haben verloren!" + "win": "Du hast gewonnen !", + "lose": "Du hast verloren !" }, "versus": "Spieler 0 hat gewonnen!", "quit": [ - "Tippen Sie auf \"\u00c9chap\", um zu verlassen", - "Dr\u00fccken Sie B, um zu verlassen" + "Zum Beenden Esc dr\u00fccken", + "Dr\u00fccken Sie B zum Beenden" ] }, "online": { "menu": { "local": "Lokal", - "online": "Online", - "dlocal": "Mit einem Freund auf der gleichen Maschine spielen", - "donline": "Mit einem Freund auf verschiedenen Maschinen spielen" + "online": "In der Reihe", + "dlocal": "Spiele mit einem Freund auf derselben Maschine", + "donline": "Spiele mit einem Freund auf verschiedenen Maschinen" }, "error": { - "connection": "Fehler bei der Kommunikation", - "disconnect": "Offline" + "connection": "Kommunikationsfehler", + "disconnect": "Getrennt" }, "connecting": "Verbindung zum Server...", "intro": { - "create": "Ein Teil erstellen", - "pcreate": "Geben Sie ihrem Partner diesen Code, damit er sich mit Ihrem Teil verbinden kann:", - "join": "Einem Teil beitreten", - "pjoin": "Geben Sie den Code Ihres Teamkollegen ein, um sich seinem Spiel anzuschlie\u00dfen:" + "create": "Erstelle ein Spiel", + "pcreate": "Geben Sie Ihrem Teamkollegen diesen Code, um sich in Ihr Spiel einzuloggen:", + "join": "Mach mit bei einem Spiel", + "pjoin": "Geben Sie den Code Ihres Teamkollegen ein, um an seinem Spiel teilzunehmen:" }, - "disconnected": "Verbindung verloren", - "unable": "Mit dem Server kann keine Verbindung m\u00f6glich sein", - "internal": "Internes Systemfehler", - "loading": "Vorbereitung des Spiels...", - "discord": "Online", - "generate": "Laden Sie das Grundst\u00fcck...", - "discord2": "Trifft auf einen Fehler", - "timeout": "Die Wartezeit wurde \u00fcberschritten", - "aborted": "Der andere Spieler verlie\u00df das Spiel", - "car0": "Ihr Auto", + "disconnected": "Verbindung unterbrochen", + "unable": "Verbindung zum Server nicht m\u00f6glich", + "internal": "Interner Systemfehler", + "loading": "Vorbereitung auf das Spiel...", + "discord": "In der Reihe", + "generate": "Laden des Landes ...", + "discord2": "Auf einen Fehler sto\u00dfen", + "timeout": "Das Timeout wurde \u00fcberschritten", + "aborted": "Der andere Spieler hat das Spiel verlassen", + "car0": "Dein Auto", "car1": "Sein Auto" }, "stats": { - "menu": "Statistik", - "title": "Spielstatistik", + "menu": "Statistiken", + "title": "Spielstatistiken", "items": { - "times.single": "Im Einzelspieler verbrachte Zeit", + "times.single": "Im Einzelspielermodus verbrachte Zeit", "times.local": "Im lokalen Modus verbrachte Zeit", - "times.online": "Online verbrachte Zeit", - "results.wins": "Anzahl der Spiele, die du gewonnen hast", - "results.loses": "Anzahl der Spiele, die du verloren hast", - "ingame.walls": "Anzahl der Kollisionen, die du hattest", - "ingame.laps": " Anzahl der Runden, die Sie gemacht haben", - "ingame.turns": "Anzahl der Umdrehungen, die Sie gemacht haben" + "times.online": "Im Online-Modus verbrachte Zeit", + "results.wins": "Anzahl der gewonnenen Spiele", + "results.loses": "Anzahl der verlorenen Spiele", + "ingame.walls": "Gesamtzahl der Kollisionen", + "ingame.laps": "Gesamtzahl der Runden", + "ingame.turns": "Gesamtzahl der Umdrehungen" } + }, + "polymer": { + "gpu": "GPU-Unterst\u00fctzungsstatus", + "gpuShift": "Dr\u00fccken Sie die Umschalttaste, um mehr zu sehen", + "logging": "Wir verbinden Sie; ", + "loginClose": "Sie k\u00f6nnen nun diese Registerkarte oder dieses Fenster schlie\u00dfen und zu Kartik zur\u00fcckkehren.", + "gatheringLogin": "Wir verifizieren Ihr Konto; ", + "loginIntro": "Dr\u00fccken Sie L, um eine Verbindung herzustellen", + "logout": "L zum Abmelden", + "ktoLevel": "Niveau", + "ktoMaxLevel": "Gott", + "error": [ + "Kommunikation mit Servern nicht m\u00f6glich", + "Sie k\u00f6nnen Kartik Online erst nutzen, wenn wir mit den Servern kommunizieren k\u00f6nnen.", + "Mit dem Internet verbinden" + ], + "updateError": [ + "Suche nach Updates nicht m\u00f6glich", + "Wir k\u00f6nnen derzeit nicht nach Updates suchen. Bitte versuchen Sie es sp\u00e4ter erneut." + ], + "levelup": [ + "H\u00f6heres Level !", + "Du hast das Level erreicht", + "und du gewinnst an Macht! " + ], + "finished": [ + "Du hast das Spiel geschlagen!", + "Fertige Kartik ?! " + ], + "token": [ + "Von woanders getrennt", + "Sie wurden von Kartik Online abgemeldet, weil Ihre Sitzung an anderer Stelle beendet wurde." + ] } }
\ No newline at end of file diff --git a/lang/en.json b/lang/en.json index 6f75c3d..de67819 100644 --- a/lang/en.json +++ b/lang/en.json @@ -1,204 +1,237 @@ -{ - "crash": { - "title": "Kartik Crash Reporter", - "head": "Kartik stopped working", - "intro": "Kartik encountered a problem and exited unexpectedly. We recorded some additional information, and a crash report has been automatically sent to the developers if you were connected to the Internet.", - "report": [ - "Alternately, a crash report has been created in « ", - " », so that you can send it to the developers when you will have Internet access." - ], - "close": "Close", - "reset": "Reset Kartik and close" - }, - "updates": { - "ok": "Up to date", - "available": "Game updates available", - "git": "Running trunk version", - "error": "Unable to check for updates", - "wait": "Checking for updates...", - "warn": [ - "Updates available", - "Download the new version of Kartik from the official website to get the newest features and bug fixes." - ] - }, - "scenario": { - "intro": [ - "Heyo, what about a lil race?", - "Hey, you're back! What 'bout a lil race?", - "Shall we do a lil race?", - "Have a race?" - ], - "ahead1": [ - "Oh no!", - "Aw shit, that's not possible!", - "But I won't get it...", - "Damnit...", - "Why you?" - ], - "ahead2": [ - "Hey hey hey", - "This one's for me!", - "I'll get it!", - "It's for me!", - "For me!" - ], - "won1": [ - "Good game!", - "Nevermind...", - "At least I hoped...", - "But, that's not kind!", - "Congrats!" - ], - "won2": [ - "I told ya!", - "As if I hadn't told you!", - "I won!", - "Great, I won this one!", - "And one more for me!" - ], - "wall1": [ - "Hey hey!", - "Well then, you don't drive well?", - "Ouch", - "That must've hurt...", - "Ouch, in the wall..." - ], - "wall2": [ - "Damnit...", - "Well...", - "Impossible", - "Aw crap" - ], - "start": [ - "Let's get you airborne!", - "You'll see, I'll make you one of those races!", - "You'll tell me what ya think", - "Let's go!", - "And, let's go!", - "Wooo, right away!" - ] - }, - "discord": { - "credits": [ - "Waiting", - "Viewing the credits" - ], - "game": [ - "In game", - "Singleplayer", - "Versus", - "Paused" - ], - "intro": [ - "Waiting", - "On the intro" - ], - "settings": [ - "Waiting", - "In the settings" - ], - "win": [ - "Just won", - "Just lost" - ] - }, - "intro": [ - "Press Enter to start", - "Press A to start" - ], - "game": { - "credits": { - "by": "by" - }, - "gpause": { - "title": "Game Paused", - "continueg": "Continue", - "showhb": "Show hitboxes", - "hidehb": "Hide hitboxes", - "quit": "Quit" - } - }, - "menu": { - "titles": [ - "Singleplayer", - "Versus", - "Settings", - "Credits", - "Quit" - ], - "descriptions": [ - "Play alone and offline against a robot", - "Play with a friend on one screen", - "Change zoom and other settings", - "View game authors list", - "Close the game and return to" - ], - "distribute": "Do not distribute" - }, - "settings": { - "title": "Settings", - "back": "Back", - "size": "Interface size", - "music": "Enable music", - "lang": "Language", - "voice": "Enable voice", - "yes": "yes", - "no": "no", - "notice": "Changed settings won't apply until you restart Kartik" - }, - "win": { - "solo": { - "win": "You win!", - "lose": "You lose!" - }, - "versus": "Player 0 win!", - "quit": [ - "Press Esc to quit", - "Press B to quit" - ] - }, - "online": { - "menu": { - "local": "Local", - "online": "Online", - "dlocal": "Play with a friend on the same computer", - "donline": "Play with a friend on different computers" - }, - "error": { - "connection": "Communication Error", - "disconnect": "Disconnected" - }, - "connecting": "Connecting to server...", - "intro": { - "create": "Create a party", - "join": "Join a party", - "pcreate": "Give this code to your teammate so they can connect to your party:", - "pjoin": "Enter the code your teammate gave to connect to their party:" - }, - "disconnected": "Connection Lost", - "unable": "Unable to connect to server", - "internal": "Internal System Error", - "loading": "Preparing to play...", - "discord": "Online", - "generate": "Loading terrain...", - "discord2": "Facing an error", - "timeout": "The connection timed out", - "aborted": "The other player ended the game", - "car0": "Your car", - "car1": "Their car" - }, - "stats": { - "menu": "Statistics", - "title": "Game Statistics", - "items": { - "times.single": "Time spent in singleplayer", - "times.local": "Time spent in local mode", - "times.online": "Time spent playing online", - "results.wins": "Number of games that you won", - "results.loses": "Number of games that you lost", - "ingame.walls": "Number of collisions you had", - "ingame.laps": "Number of laps you made", - "ingame.turns": "Number of rotations you made" - } - } -} +{
+ "crash": {
+ "title": "Kartik Crash Reporter",
+ "head": "Kartik stopped working",
+ "intro": "Kartik encountered a problem and exited unexpectedly. We recorded some additional information, and a crash report has been automatically sent to the developers if you were connected to the Internet.",
+ "report": [
+ "Alternately, a crash report has been created in « ",
+ " », so that you can send it to the developers when you will have Internet access."
+ ],
+ "close": "Close",
+ "reset": "Reset Kartik and close"
+ },
+ "updates": {
+ "ok": "Up to date",
+ "available": "Game updates available",
+ "git": "Running trunk version",
+ "error": "Unable to check for updates",
+ "wait": "Checking for updates...",
+ "warn": [
+ "Updates available",
+ "Download the new version of Kartik from the official website to get the newest features and bug fixes."
+ ]
+ },
+ "scenario": {
+ "intro": [
+ "Heyo, what about a lil race?",
+ "Hey, you're back! What 'bout a lil race?",
+ "Shall we do a lil race?",
+ "Have a race?"
+ ],
+ "ahead1": [
+ "Oh no!",
+ "Aw shit, that's not possible!",
+ "But I won't get it...",
+ "Damnit...",
+ "Why you?"
+ ],
+ "ahead2": [
+ "Hey hey hey",
+ "This one's for me!",
+ "I'll get it!",
+ "It's for me!",
+ "For me!"
+ ],
+ "won1": [
+ "Good game!",
+ "Nevermind...",
+ "At least I hoped...",
+ "But, that's not kind!",
+ "Congrats!"
+ ],
+ "won2": [
+ "I told ya!",
+ "As if I hadn't told you!",
+ "I won!",
+ "Great, I won this one!",
+ "And one more for me!"
+ ],
+ "wall1": [
+ "Hey hey!",
+ "Well then, you don't drive well?",
+ "Ouch",
+ "That must've hurt...",
+ "Ouch, in the wall..."
+ ],
+ "wall2": [
+ "Damnit...",
+ "Well...",
+ "Impossible",
+ "Aw crap"
+ ],
+ "start": [
+ "Let's get you airborne!",
+ "You'll see, I'll make you one of those races!",
+ "You'll tell me what ya think",
+ "Let's go!",
+ "And, let's go!",
+ "Wooo, right away!"
+ ]
+ },
+ "discord": {
+ "credits": [
+ "Waiting",
+ "Viewing the credits"
+ ],
+ "game": [
+ "In game",
+ "Singleplayer",
+ "Versus",
+ "Paused"
+ ],
+ "intro": [
+ "Waiting",
+ "On the intro"
+ ],
+ "settings": [
+ "Waiting",
+ "In the settings"
+ ],
+ "win": [
+ "Just won",
+ "Just lost"
+ ]
+ },
+ "intro": [
+ "Press Enter to start",
+ "Press A to start"
+ ],
+ "game": {
+ "credits": {
+ "by": "by"
+ },
+ "gpause": {
+ "title": "Game Paused",
+ "continueg": "Continue",
+ "showhb": "Show hitboxes",
+ "hidehb": "Hide hitboxes",
+ "quit": "Quit"
+ }
+ },
+ "menu": {
+ "titles": [
+ "Singleplayer",
+ "Versus",
+ "Settings",
+ "Credits",
+ "Quit"
+ ],
+ "descriptions": [
+ "Play alone and offline against a robot",
+ "Play with a friend on one screen",
+ "Change zoom and other settings",
+ "View game authors list",
+ "Close the game and return to"
+ ],
+ "distribute": "Do not distribute"
+ },
+ "settings": {
+ "title": "Settings",
+ "back": "Back",
+ "size": "Interface size",
+ "music": "Enable music",
+ "lang": "Language",
+ "voice": "Enable voice",
+ "yes": "yes",
+ "no": "no",
+ "notice": "Changed settings won't apply until you restart Kartik"
+ },
+ "win": {
+ "solo": {
+ "win": "You win!",
+ "lose": "You lose!"
+ },
+ "versus": "Player 0 win!",
+ "quit": [
+ "Press Esc to quit",
+ "Press B to quit"
+ ]
+ },
+ "online": {
+ "menu": {
+ "local": "Local",
+ "online": "Online",
+ "dlocal": "Play with a friend on the same computer",
+ "donline": "Play with a friend on different computers"
+ },
+ "error": {
+ "connection": "Communication Error",
+ "disconnect": "Disconnected"
+ },
+ "connecting": "Connecting to server...",
+ "intro": {
+ "create": "Create a party",
+ "join": "Join a party",
+ "pcreate": "Give this code to your teammate so they can connect to your party:",
+ "pjoin": "Enter the code your teammate gave to connect to their party:"
+ },
+ "disconnected": "Connection Lost",
+ "unable": "Unable to connect to server",
+ "internal": "Internal System Error",
+ "loading": "Preparing to play...",
+ "discord": "Online",
+ "generate": "Loading terrain...",
+ "discord2": "Facing an error",
+ "timeout": "The connection timed out",
+ "aborted": "The other player ended the game",
+ "car0": "Your car",
+ "car1": "Their car"
+ },
+ "stats": {
+ "menu": "Statistics",
+ "title": "Game Statistics",
+ "items": {
+ "times.single": "Time spent in singleplayer",
+ "times.local": "Time spent in local mode",
+ "times.online": "Time spent playing online",
+ "results.wins": "Number of games that you won",
+ "results.loses": "Number of games that you lost",
+ "ingame.walls": "Number of collisions you had",
+ "ingame.laps": "Number of laps you made",
+ "ingame.turns": "Number of rotations you made"
+ }
+ },
+ "polymer": {
+ "gpu": "GPU Support Status",
+ "gpuShift": "Press Shift for details",
+ "logging": "We are logging you in ; check for your Web browser window and accept the login.",
+ "loginClose": "You can now close this tab/window and go back to Kartik.",
+ "gatheringLogin": "We are checking your account ; this may take a while.",
+ "loginIntro": "Press L to login",
+ "logout": "L to logout",
+ "ktoLevel": "Level",
+ "ktoMaxLevel": "God",
+ "error": [
+ "Unable to communicate with servers",
+ "You won't be able to use Kartik Online until we can connect to the servers.",
+ "Go online to log in"
+ ],
+ "updateError": [
+ "Unable to check for updates",
+ "We cannot check for new updates right now, please try again later."
+ ],
+ "levelup": [
+ "Level up!",
+ "You have reached level",
+ "and you're gaining power! Continue and try to reach the maximum level."
+ ],
+ "finished": [
+ "You've beaten the game!",
+ "Finished Kartik?! Yes. You've reached the god level!"
+ ],
+ "token": [
+ "Logged out from another place",
+ "You have been logged out from Kartik Online because your session has been terminated from somewhere else."
+ ]
+ }
+}
diff --git a/lang/es.json b/lang/es.json index a3eb308..7eacf11 100644 --- a/lang/es.json +++ b/lang/es.json @@ -1,193 +1,237 @@ { - "updates": { - "ok": "Al día", - "available": "Actualizaciones de juegos disponibles", - "git": "Ejecutando la versión trunk", - "error": "No se puede buscar actualizaciones", - "wait": "Comprobando actualizaciones ...", - "warn": [ - "Hay actualizaciones disponibles", - "Descargue la nueva versión de Kartik del sitio web oficial para beneficiarse de las últimas funciones y correcciones de errores." - ] - }, - "scenario": { - "intro": [ - "Oye, ¿qué tal una pequeña carrera?", - "¡Oye, has vuelto! ¿Qué tal una pequeña carrera?", - "¿Hacemos una pequeña carrera?", - "¿Tenemos una carrera?" - ], - "ahead1": [ - "¡Oh no!", - "¡Oh mierda, eso no es posible!", - "Pero no lo conseguiré ...", - "Maldita sea...", - "¿Por qué tú?" - ], - "ahead2": [ - "Hey hey hey", - "¡Este es para mí!", - "¡Lo conseguiré!", - "¡Es para mi!", - "¡Para mí!" - ], - "won1": [ - "¡Buen juego!", - "No importa...", - "Al menos esperaba ...", - "¡Pero eso no es amable!", - "¡Felicitaciones!" - ], - "won2": [ - "¡Te lo dije!", - "¡Como si no te lo hubiera dicho!", - "¡Gané!", - "¡Genial, gané este!", - "¡Y uno más para mí!" - ], - "wall1": [ - "¡Oye, oye!", - "Bueno entonces, ¿no conduces bien?", - "Ay", - "Eso debe haber dolido ...", - "Ay, en la pared ..." - ], - "wall2": [ - "Maldita sea...", - "Bien...", - "Imposible", - "Oh mierda" - ], - "start": [ - "¡Vamos a ponerte en el aire!", - "¡Ya verás, te haré una de esas carreras!", - "Me dirás lo que piensas", - "¡Vamos!", - "¡Y vamos!", - "¡Wooo, ahora mismo!" - ] - }, - "discord": { - "credits": [ - "Espera", - "Ver los créditos" - ], - "game": [ - "En el juego", - "Un solo jugador", - "Versus", - "Pausado" - ], - "intro": [ - "Espera", - "En la introducción" - ], - "settings": [ - "Espera", - "En la configuración" - ], - "win": [ - "Acaba de ganar", - "Acaba de perder" - ] - }, - "intro": [ - "Presiona Enter para comenzar", - "Presiona A para comenzar" - ], - "game": { - "credits": { - "by": "por" + "crash": { + "title": "Kartik Crash Reportero", + "head": "Kartik ha dejado de funcionar", + "intro": "Kartik se encontr\u00f3 con un problema y se detuvo inesperadamente.Recopilamos informaci\u00f3n adicional y se envi\u00f3 autom\u00e1ticamente un informe de bloqueo a los desarrolladores si estaba conectado a Internet.", + "report": [ + "Adem\u00e1s, se cre\u00f3 un informe de bloqueo en \"", + "\", para que pueda enviarlo a los desarrolladores cuando tenga acceso a Internet." + ], + "close": "cerrar", + "reset": "Reinicializaci\u00f3n Kartik y cierre" }, - "gpause": { - "title": "Juego en pausa", - "continueg": "Continuar", - "showhb": "Mostrar hitboxes", - "hidehb": "Ocultar hitboxes", - "quit": "Salir" - } - }, - "menu": { - "titles": [ - "Solo", - "Versus", - "Ajustes", - "Créditos", - "Renunciar" - ], - "descriptions": [ - "Juega solo y sin conexión contra un robot", - "Juega con un amigo en una pantalla", - "Cambiar el zoom y otras configuraciones", - "Ver lista de autores de juegos", - "Cierra el juego y vuelve a" + "updates": { + "ok": "Hasta la fecha", + "available": "Actualizaciones de juegos disponibles", + "git": "Ejecuci\u00f3n de la versi\u00f3n troncal", + "error": "No se puede comprobar si hay actualizaciones", + "wait": "Buscando actualizaciones...", + "warn": [ + "Las actualizaciones est\u00e1n disponibles", + "Descargue la nueva versi\u00f3n de Kartik desde el sitio web oficial para beneficiarse de las \u00faltimas caracter\u00edsticas y correcciones de errores." + ] + }, + "scenario": { + "intro": [ + "Oye, hola, eso te dice una peque\u00f1a carrera?", + "\u00a1Ah, aqu\u00ed est\u00e1s de nuevo! \u00bfEso te dice un poco de raza?", + "\u00bfY si tuvi\u00e9ramos una peque\u00f1a carrera?", + "\u00bfVamos a dar un paseo?" + ], + "ahead1": [ + "\u00a1No!", + "\u00a1Joder, no es posible!", + "Pero no voy a llegar all\u00ed...", + "oh...", + "\u00bfPor qu\u00e9?" + ], + "ahead2": [ + "Hola hola hola", + "\u00a1Este es para m\u00ed!", + "\u00a1Lo tendr\u00e9!", + "\u00a1Es para m\u00ed!", + "\u00a1Es m\u00edo!" + ], + "won1": [ + "\u00a1Bien hecho!", + "L\u00e1stima para m\u00ed...", + "Podr\u00eda haber esperado...", + "Pero, no es muy agradable!", + "\u00a1Bien hecho!" + ], + "won2": [ + "Te lo hab\u00eda dicho !", + "\u00a1Como si no te lo hubiera advertido!", + "He ganado !", + "\u00a1Genial, lo gan\u00e9!", + "\u00a1Y uno m\u00e1s para m\u00ed!" + ], + "wall1": [ + "\u00a1Ah ah!", + "Bueno, entonces, \u00bfno vamos bien?", + "Ay", + "Debe doler ...", + "\u00a1Splaf, c't'obstacle!" + ], + "wall2": [ + "Mierda", + "Caca", + "No es posible", + "Puti" + ], + "start": [ + "\u00a1Voy a divertirme!", + "Ya ver\u00e1s, \u00a1te har\u00e9 una de esas carreras!", + "Dime alguna noticia", + "\u00a1Vamos!", + "Aqu\u00ed vamos !", + "\u00a1Wooo, adelante!" + ] + }, + "discord": { + "credits": [ + "A la espera", + "En los creditos" + ], + "game": [ + "Apuesta", + "Modo solo", + "Modo Versus", + "Pausa" + ], + "intro": [ + "A la espera", + "Sobre la introducci\u00f3n" + ], + "settings": [ + "A la espera", + "En la configuraci\u00f3n" + ], + "win": [ + "Acaba de ganar", + "Acaba de perder" + ] + }, + "intro": [ + "Presiona enter para comenzar", + "Presione A para comenzar" ], - "distribute": "No distribuir" - }, - "settings": { - "title": "Configuración", - "back": "Atras", - "size": "Tamaño de la interfaz", - "music": "Habilitar música", - "lang": "Idioma", - "voice": "Activar voz", - "yes": "sí", - "no": "no", - "notice": "La configuración modificada no se aplicará hasta que reinicie Kartik" - }, - "win": { - "solo": { - "win": "¡Tú ganas!", - "lose": "¡Tú pierdes!" + "game": { + "credits": { + "by": "por" + }, + "gpause": { + "title": "Juego pausado", + "continueg": "seguir", + "showhb": "Mostrar hitbox", + "hidehb": "Ocultar hitbox", + "quit": "Dejar" + } }, - "versus": "¡El jugador 0 gana!", - "quit": [ - "Presione Esc para salir", - "Presiona B para salir" - ] - }, - "online": { "menu": { - "local": "Local", - "online": "Online", - "dlocal": "Juega con un amigo en la misma máquina", - "donline": "Juega con un amigo en diferentes máquinas" + "titles": [ + "Solo", + "Versus", + "Opciones", + "Cr\u00e9ditos", + "Dejar" + ], + "descriptions": [ + "Juega solo y sin conexi\u00f3n contra un robot", + "Juega dos en la misma pantalla", + "Cambiar el zoom y la configuraci\u00f3n", + "Muestra la lista de autores del juego.", + "Cierra el juego y vuelve a" + ], + "distribute": "No distribuir" + }, + "settings": { + "title": "Opciones", + "back": "Regresar", + "size": "Tama\u00f1o de la interfaz", + "music": "Activar musica", + "lang": "Lengua", + "voice": "Activar voz", + "yes": "s\u00ed", + "no": "No", + "notice": "La configuraci\u00f3n solo se aplicar\u00e1 despu\u00e9s de reiniciar Kartik" + }, + "win": { + "solo": { + "win": "Hab\u00e9is ganado !", + "lose": "Perdiste !" + }, + "versus": "\u00a1El jugador 0 ha ganado!", + "quit": [ + "Presione Esc para salir", + "Presione B para salir" + ] }, - "error": { - "connection": "Error de comunicación", - "disconnect": "Desconectado" + "online": { + "menu": { + "local": "Local", + "online": "En l\u00ednea", + "dlocal": "Juega con un amigo en la misma m\u00e1quina", + "donline": "Juega con un amigo en diferentes m\u00e1quinas." + }, + "error": { + "connection": "Error de comunicaci\u00f3n", + "disconnect": "Desconectado" + }, + "connecting": "Conexi\u00f3n al servidor ...", + "intro": { + "create": "Crea un juego", + "pcreate": "Dale este c\u00f3digo a tu compa\u00f1ero de equipo para que inicie sesi\u00f3n en tu juego:", + "join": "Unirse a un juego", + "pjoin": "Ingrese el c\u00f3digo de su compa\u00f1ero de equipo para unirse a su juego:" + }, + "disconnected": "Conexi\u00f3n perdida", + "unable": "Imposible conectarse al servidor", + "internal": "Error interno del sistema", + "loading": "Prepar\u00e1ndose para el juego ...", + "discord": "En l\u00ednea", + "generate": "Cargando la tierra ...", + "discord2": "Encontrar un error", + "timeout": "Se super\u00f3 el tiempo de espera", + "aborted": "El otro jugador ha dejado el juego.", + "car0": "Tu carro", + "car1": "Su auto" }, - "connecting": "Conexión al servidor ...", - "intro": { - "create": "Crea un juego", - "pcreate": "Dale este código a tu compañero de equipo para que se conecte a tu juego:", - "join": "Únete a un juego", - "pjoin": "Ingresa el código de tu compañero de equipo para unirse a su juego:" + "stats": { + "menu": "Estad\u00edsticas", + "title": "Estad\u00edsticas de juego", + "items": { + "times.single": "Tiempo empleado en el modo de un jugador", + "times.local": "Tiempo empleado en modo local", + "times.online": "Tiempo pasado en modo online", + "results.wins": "Numero de juegos ganados", + "results.loses": "N\u00famero de juegos perdidos", + "ingame.walls": "N\u00famero total de colisiones", + "ingame.laps": "N\u00famero total de vueltas", + "ingame.turns": "N\u00famero total de vueltas" + } }, - "disconnected": "Conexión perdida", - "unable": "No se puede conectar al servidor", - "internal": "Error interno del sistema", - "loading": "Preparación del juego ...", - "discord": "En línea", - "generate": "Cargando el campo ...", - "discord2": "Se encontró un error", - "timeout": "Se ha excedido el tiempo de espera", - "aborted": "El otro jugador ha abandonado el juego", - "car0": "Tu auto", - "car1": "Su auto" - }, - "stats": { - "menu": "Estadísticas", - "title": "Estadísticas del juego", - "items": { - "times.single": "Tiempo en un jugador", - "times.local": "Tiempo en modo local", - "times.online": "Tiempo jugando en línea", - "results.wins": "Número de juegos que ganó", - "results.loses": "Número de juegos que perdió", - "ingame.walls": "Número de colisiones que tuvo", - "ingame.laps": " Número de vueltas que hiciste", - "ingame.turns": "Número de rotaciones que hiciste" + "polymer": { + "gpu": "Estado de soporte de GPU", + "gpuShift": "Presione Shift para ver m\u00e1s", + "logging": "Te conectamos; ", + "loginClose": "Ahora puede cerrar esta pesta\u00f1a o ventana y volver a Kartik.", + "gatheringLogin": "Verificamos su cuenta; ", + "loginIntro": "Presione L para conectarse", + "logout": "L para cerrar la sesi\u00f3n", + "ktoLevel": "Nivel", + "ktoMaxLevel": "Dios", + "error": [ + "No se puede comunicar con los servidores.", + "No podr\u00e1 utilizar Kartik Online hasta que podamos comunicarnos con los servidores.", + "Conectar a internet" + ], + "updateError": [ + "No se puede buscar actualizaciones", + "No podemos buscar actualizaciones en este momento, int\u00e9ntelo de nuevo m\u00e1s tarde." + ], + "levelup": [ + "Nivel Superior !", + "Has alcanzado el nivel", + "y ganas poder! " + ], + "finished": [ + "\u00a1Ganaste el juego!", + "\u00a1\u00bfKartik terminado ?! " + ], + "token": [ + "Desconectado de otro lugar", + "Se ha desconectado de Kartik Online porque su sesi\u00f3n se termin\u00f3 en otro lugar." + ] } - } -} +}
\ No newline at end of file diff --git a/lang/fr.json b/lang/fr.json index 3456ef1..541f733 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -1,204 +1,237 @@ -{ - "crash": { - "title": "Rapporteur de plantages de Kartik", - "head": "Kartik a cessé de fonctionner", - "intro": "Kartik a rencontré un problème et s'est arrêté inopinément. Nous avons collecté des informations supplémentaires, et un rapport de plantage a automatiquement été envoyé aux développeurs si vous étiez connecté à Internet.", - "report": [ - "De plus, un rapport de plantage a été créé dans « ", - " », afin que vous puissiez l'envoyer aux développeurs lorsque vous aurez accès à Internet." - ], - "close": "Fermer", - "reset": "Réinitialiser Kartik et fermer" - }, - "updates": { - "ok": "À jour", - "available": "Mises à jour du jeu disponibles", - "git": "Exécution de la version trunk", - "error": "Impossible de rechercher les mises à jour", - "wait": "Recherche de mises à jour...", - "warn": [ - "Des mises à jour sont disponibles", - "Téléchargez la nouvelle version de Kartik depuis le site officiel pour bénéficier des dernières fonctionnalités et corrections de bugs." - ] - }, - "scenario": { - "intro": [ - "Hey, salut, ça te dit une petite course ?", - "Ah, te revoilà ! Ça te dit une petite course ?", - "Et si on se faisait une petite course ?", - "On fait un tour ?" - ], - "ahead1": [ - "Oh non !", - "Putain, c'est pas possible !", - "Mais je vais pas y arriver...", - "Et merde...", - "Pourquoi toi ?" - ], - "ahead2": [ - "Hi hi hi", - "Celle-là est pour moi !", - "Je l'aurai !", - "Elle est pour moi !", - "C'est à moi !" - ], - "won1": [ - "Bien joué !", - "Tant pis pour moi...", - "J'aurai pu espérer...", - "Mais, c'est pas très sympa !", - "Bravo !" - ], - "won2": [ - "Je te l'avais dit !", - "Comme si je t'avais pas prévenu !", - "J'ai gagné !", - "Génial, je l'ai gagnée !", - "Et une de plus pour moi !" - ], - "wall1": [ - "Ah ah !", - "Bah alors, on va pas droit ?", - "Ouch", - "Ça doit faire mal...", - "Splaf, c't'obstacle !" - ], - "wall2": [ - "Merde", - "Crotte", - "Pas possible", - "Puti" - ], - "start": [ - "Je vais t'éclater !", - "Tu vas voir, je vais t'en faire une de ces courses !", - "Tu m'en diras des nouvelles", - "Allons-y !", - "Et, c'est parti !", - "Wooo, en avant !" - ] - }, - "discord": { - "credits": [ - "En attente", - "Dans les crédits" - ], - "game": [ - "En jeu", - "Mode Solo", - "Mode Versus", - "En pause" - ], - "intro": [ - "En attente", - "Sur l'introduction" - ], - "settings": [ - "En attente", - "Dans les paramètres" - ], - "win": [ - "Vient de gagner", - "Vient de perdre" - ] - }, - "intro": [ - "Appuyez sur Entrée pour commencer", - "Appuyez sur A pour commencer" - ], - "game": { - "credits": { - "by": "par" - }, - "gpause": { - "title": "Jeu en pause", - "continueg": "Continuer", - "showhb": "Afficher hitbox", - "hidehb": "Masquer hitbox", - "quit": "Quitter" - } - }, - "menu": { - "titles": [ - "Solo", - "Versus", - "Options", - "Crédits", - "Quitter" - ], - "descriptions": [ - "Jouer seul et hors ligne contre un robot", - "Jouer à deux sur le même écran", - "Modifier le zoom et les paramètres", - "Afficher la liste des auteurs du jeu", - "Fermer le jeu et retourner à" - ], - "distribute": "Ne pas distribuer" - }, - "settings": { - "title": "Options", - "back": "Retour", - "size": "Taille de l'interface", - "music": "Activer la musique", - "lang": "Langue", - "voice": "Activer la voix", - "yes": "oui", - "no": "non", - "notice": "Les paramètres ne seront appliqués qu'après le redémarrage de Kartik" - }, - "win": { - "solo": { - "win": "Vous avez gagné !", - "lose": "Vous avez perdu !" - }, - "versus": "Joueur 0 a gagné !", - "quit": [ - "Appuyez sur Échap pour quitter", - "Appuyez sur B pour quitter" - ] - }, - "online": { - "menu": { - "local": "Local", - "online": "En ligne", - "dlocal": "Jouer avec un ami sur la même machine", - "donline": "Jouer avec un ami sur des machines différentes" - }, - "error": { - "connection": "Erreur de communication", - "disconnect": "Déconnecté" - }, - "connecting": "Connexion au serveur...", - "intro": { - "create": "Créer une partie", - "pcreate": "Donnez ce code à votre coéquipier pour qu'il se connecte à votre partie :", - "join": "Rejoindre une partie", - "pjoin": "Entrez le code de votre coéquipier pour rejoindre sa partie :" - }, - "disconnected": "Connexion perdue", - "unable": "Impossible de se connecter au serveur", - "internal": "Erreur système interne", - "loading": "Préparation de la partie...", - "discord": "En ligne", - "generate": "Chargement du terrain...", - "discord2": "Rencontre une erreur", - "timeout": "Le délai d'attente a été dépassé", - "aborted": "L'autre joueur à quitté la partie", - "car0": "Votre voiture", - "car1": "Sa voiture" - }, - "stats": { - "menu": "Statistiques", - "title": "Statistiques sur le jeu", - "items": { - "times.single": "Temps passé en mode solo", - "times.local": "Temps passé en mode local", - "times.online": "Temps passé en mode en ligne", - "results.wins": "Nombre de parties gagnées", - "results.loses": "Nombre de parties perdues", - "ingame.walls": "Nombre total de collisions", - "ingame.laps": "Nombre total de tours", - "ingame.turns": "Nombre total de virages" - } - } -} +{
+ "crash": {
+ "title": "Rapporteur de plantages de Kartik",
+ "head": "Kartik a cessé de fonctionner",
+ "intro": "Kartik a rencontré un problème et s'est arrêté inopinément. Nous avons collecté des informations supplémentaires, et un rapport de plantage a automatiquement été envoyé aux développeurs si vous étiez connecté à Internet.",
+ "report": [
+ "De plus, un rapport de plantage a été créé dans « ",
+ " », afin que vous puissiez l'envoyer aux développeurs lorsque vous aurez accès à Internet."
+ ],
+ "close": "Fermer",
+ "reset": "Réinitialiser Kartik et fermer"
+ },
+ "updates": {
+ "ok": "À jour",
+ "available": "Mises à jour du jeu disponibles",
+ "git": "Exécution de la version trunk",
+ "error": "Impossible de rechercher les mises à jour",
+ "wait": "Recherche de mises à jour...",
+ "warn": [
+ "Des mises à jour sont disponibles",
+ "Téléchargez la nouvelle version de Kartik depuis le site officiel pour bénéficier des dernières fonctionnalités et corrections de bugs."
+ ]
+ },
+ "scenario": {
+ "intro": [
+ "Hey, salut, ça te dit une petite course ?",
+ "Ah, te revoilà ! Ça te dit une petite course ?",
+ "Et si on se faisait une petite course ?",
+ "On fait un tour ?"
+ ],
+ "ahead1": [
+ "Oh non !",
+ "Putain, c'est pas possible !",
+ "Mais je vais pas y arriver...",
+ "Et merde...",
+ "Pourquoi toi ?"
+ ],
+ "ahead2": [
+ "Hi hi hi",
+ "Celle-là est pour moi !",
+ "Je l'aurai !",
+ "Elle est pour moi !",
+ "C'est à moi !"
+ ],
+ "won1": [
+ "Bien joué !",
+ "Tant pis pour moi...",
+ "J'aurai pu espérer...",
+ "Mais, c'est pas très sympa !",
+ "Bravo !"
+ ],
+ "won2": [
+ "Je te l'avais dit !",
+ "Comme si je t'avais pas prévenu !",
+ "J'ai gagné !",
+ "Génial, je l'ai gagnée !",
+ "Et une de plus pour moi !"
+ ],
+ "wall1": [
+ "Ah ah !",
+ "Bah alors, on va pas droit ?",
+ "Ouch",
+ "Ça doit faire mal...",
+ "Splaf, c't'obstacle !"
+ ],
+ "wall2": [
+ "Merde",
+ "Crotte",
+ "Pas possible",
+ "Puti"
+ ],
+ "start": [
+ "Je vais t'éclater !",
+ "Tu vas voir, je vais t'en faire une de ces courses !",
+ "Tu m'en diras des nouvelles",
+ "Allons-y !",
+ "Et, c'est parti !",
+ "Wooo, en avant !"
+ ]
+ },
+ "discord": {
+ "credits": [
+ "En attente",
+ "Dans les crédits"
+ ],
+ "game": [
+ "En jeu",
+ "Mode Solo",
+ "Mode Versus",
+ "En pause"
+ ],
+ "intro": [
+ "En attente",
+ "Sur l'introduction"
+ ],
+ "settings": [
+ "En attente",
+ "Dans les paramètres"
+ ],
+ "win": [
+ "Vient de gagner",
+ "Vient de perdre"
+ ]
+ },
+ "intro": [
+ "Appuyez sur Entrée pour commencer",
+ "Appuyez sur A pour commencer"
+ ],
+ "game": {
+ "credits": {
+ "by": "par"
+ },
+ "gpause": {
+ "title": "Jeu en pause",
+ "continueg": "Continuer",
+ "showhb": "Afficher hitbox",
+ "hidehb": "Masquer hitbox",
+ "quit": "Quitter"
+ }
+ },
+ "menu": {
+ "titles": [
+ "Solo",
+ "Versus",
+ "Options",
+ "Crédits",
+ "Quitter"
+ ],
+ "descriptions": [
+ "Jouer seul et hors ligne contre un robot",
+ "Jouer à deux sur le même écran",
+ "Modifier le zoom et les paramètres",
+ "Afficher la liste des auteurs du jeu",
+ "Fermer le jeu et retourner à"
+ ],
+ "distribute": "Ne pas distribuer"
+ },
+ "settings": {
+ "title": "Options",
+ "back": "Retour",
+ "size": "Taille de l'interface",
+ "music": "Activer la musique",
+ "lang": "Langue",
+ "voice": "Activer la voix",
+ "yes": "oui",
+ "no": "non",
+ "notice": "Les paramètres ne seront appliqués qu'après le redémarrage de Kartik"
+ },
+ "win": {
+ "solo": {
+ "win": "Vous avez gagné !",
+ "lose": "Vous avez perdu !"
+ },
+ "versus": "Joueur 0 a gagné !",
+ "quit": [
+ "Appuyez sur Échap pour quitter",
+ "Appuyez sur B pour quitter"
+ ]
+ },
+ "online": {
+ "menu": {
+ "local": "Local",
+ "online": "En ligne",
+ "dlocal": "Jouer avec un ami sur la même machine",
+ "donline": "Jouer avec un ami sur des machines différentes"
+ },
+ "error": {
+ "connection": "Erreur de communication",
+ "disconnect": "Déconnecté"
+ },
+ "connecting": "Connexion au serveur...",
+ "intro": {
+ "create": "Créer une partie",
+ "pcreate": "Donnez ce code à votre coéquipier pour qu'il se connecte à votre partie :",
+ "join": "Rejoindre une partie",
+ "pjoin": "Entrez le code de votre coéquipier pour rejoindre sa partie :"
+ },
+ "disconnected": "Connexion perdue",
+ "unable": "Impossible de se connecter au serveur",
+ "internal": "Erreur système interne",
+ "loading": "Préparation de la partie...",
+ "discord": "En ligne",
+ "generate": "Chargement du terrain...",
+ "discord2": "Rencontre une erreur",
+ "timeout": "Le délai d'attente a été dépassé",
+ "aborted": "L'autre joueur à quitté la partie",
+ "car0": "Votre voiture",
+ "car1": "Sa voiture"
+ },
+ "stats": {
+ "menu": "Statistiques",
+ "title": "Statistiques sur le jeu",
+ "items": {
+ "times.single": "Temps passé en mode solo",
+ "times.local": "Temps passé en mode local",
+ "times.online": "Temps passé en mode en ligne",
+ "results.wins": "Nombre de parties gagnées",
+ "results.loses": "Nombre de parties perdues",
+ "ingame.walls": "Nombre total de collisions",
+ "ingame.laps": "Nombre total de tours",
+ "ingame.turns": "Nombre total de virages"
+ }
+ },
+ "polymer": {
+ "gpu": "État de support GPU",
+ "gpuShift": "Appuyez sur Shift pour voir plus",
+ "logging": "Nous vous connectons ; vérifiez la fenêtre de votre navigateur Web et autorisez la connexion.",
+ "loginClose": "Vous pouvez maintenant fermer cet onglet ou cette fenêtre et retourner à Kartik.",
+ "gatheringLogin": "Nous vérifions votre compte ; cela peut prendre un moment.",
+ "loginIntro": "Appuyez sur L pour vous connecter",
+ "logout": "L pour vous déconnecter",
+ "ktoLevel": "Niveau",
+ "ktoMaxLevel": "Dieu",
+ "error": [
+ "Impossible de communiquer avec les serveurs",
+ "Vous ne pourrez pas utiliser Kartik Online tant que nous n'arrivons pas à communiquer avec les serveurs.",
+ "Connectez-vous à Internet"
+ ],
+ "updateError": [
+ "Impossible de rechercher les mises à jour",
+ "Nous ne pouvons pas rechercher les mises à jour en ce moment, réessayez plus tard."
+ ],
+ "levelup": [
+ "Niveau supérieur !",
+ "Vous avez atteint le niveau",
+ "et vous gagnez du pouvoir ! Continuez et essayez d'atteindre le niveau maximal."
+ ],
+ "finished": [
+ "Vous avez battu le jeu !",
+ "Fini Kartik ?! Oui. Vous avez atteint le niveau Dieu!"
+ ],
+ "token": [
+ "Déconnecté depuis autre part",
+ "Vous avez été déconnecté de Kartik Online parce que votre session a été terminée depuis autre part."
+ ]
+ }
+}
diff --git a/lang/it.json b/lang/it.json index 879f017..4b32d71 100644 --- a/lang/it.json +++ b/lang/it.json @@ -2,99 +2,99 @@ "crash": { "title": "Kartik Crash Reporter", "head": "Kartik ha smesso di funzionare", - "intro": "Kartik ha riscontrato un problema e si \u00e8 fermato inaspettatamente. ", + "intro": "Kartik ha incontrato un problema e si \u00e8 fermato inaspettatamente.Abbiamo raccolto informazioni aggiuntive e un rapporto sull'arresto anomalo \u00e8 stato inviato automaticamente agli sviluppatori se eri connesso a Internet.", "report": [ - "Inoltre, \u00e8 stato creato un rapporto sugli arresti anomali in \"", - "In modo che tu possa inviarlo agli sviluppatori quando hai accesso a Internet." + "Inoltre, \u00e8 stato creato un rapporto sugli arresti anomalo in \"", + "\", in modo da poterlo inviare agli sviluppatori quando si ha accesso a Internet." ], - "close": "Chiudere", - "reset": "Resetta Kartik e chiudi" + "close": "Chiudi", + "reset": "ResetTa Kartik e chiudi" }, "updates": { "ok": "Aggiornato", - "available": "Aggiornamenti del gioco disponibili", - "git": "Esecuzione della versione bagagliaio", - "error": "Impossibile controllare gli aggiornamenti", - "wait": "Verifica aggiornamenti ...", + "available": "Aggiornamenti di gioco disponibili", + "git": "Esecuzione della versione trunk", + "error": "Impossibile verificare la disponibilit\u00e0 di aggiornamenti", + "wait": "Controllo della disponibilit\u00e0 di aggiornamenti in...", "warn": [ - "Sono disponibili aggiornamenti", + "Gli aggiornamenti sono disponibili", "Scarica la nuova versione di Kartik dal sito ufficiale per beneficiare delle ultime funzionalit\u00e0 e correzioni di bug." ] }, "scenario": { "intro": [ - "Ehi, ciao, che ne dici di una corsa veloce?", - "Ah, eccoti di nuovo! ", - "E se facessimo una piccola gara?", - "Facciamo una passeggiata?" + "Ehi, ciao, questo ti dice una piccola gara?", + "Ah, eccoti di nuovo qui! Questo ti dice una piccola gara?", + "E se avessimo una piccola gara?", + "Andiamo a fare un giro?" ], "ahead1": [ "Oh no!", - "Dannazione, non \u00e8 possibile!", - "Ma non ci arriver\u00f2 ...", - "E merda ...", - "Perche tu ?" + "Accidenti, non \u00e8 possibile!", + "Ma non ci andro'...", + "Oh...", + "Perch\u00e9 tu?" ], "ahead2": [ - "Ih ih ih", + "Ciao ciao ciao", "Questo \u00e8 per me!", "Lo avr\u00f2!", - "Lei \u00e8 per me!", - "\u00c8 mio !" + "\u00c8 per me!", + "\u00c8 mio!" ], "won1": [ - "Bel gioco !", - "Peccato per me ...", - "Avrei potuto sperare ...", - "Ma non \u00e8 molto carino!", - "Ben fatto !" + "Ben fatto!", + "Peccato per me...", + "Avrei potuto sperare...", + "Ma non \u00e8 molto bello!", + "Ben fatto!" ], "won2": [ - "Te l'avevo detto !", + "Te l'avevo detto!", "Come se non ti avessi avvertito!", - "Ho vinto !", - "Fantastico, l'ho vinto!", - "E ancora uno per me!" + "Ho vinto!", + "Grandioso, l'ho vinto!", + "E un altro per me!" ], "wall1": [ "Ah ah!", - "Ebbene, non stiamo andando bene?", - "Ahia", - "Deve far male ...", - "Splaf, c't'ostacle!" + "Beh, allora non andremo dritti?", + "ahi", + "Deve far male...", + "Splaf, \u00e8 un ostacolo!" ], "wall2": [ - "Merda", - "Cacca", - "Non possibile", - "Puti" + "dannare", + "merda", + "Assolutamente no", + "" ], "start": [ - "Mi divertir\u00f2!", - "Vedrai, ti far\u00f2 una di quelle gare!", - "Dimmi qualche notizia", + "Mi divertir\u00f2 con te!", + "Vedrai, ti far\u00f2 una di queste gare!", + "Me lo dirai", "Andiamo!", - "Eccoci qui !", + "Ci siamo!", "Wooo, avanti!" ] }, "discord": { "credits": [ - "In attesa", - "Nei titoli di coda" + "In sospeso", + "Nei crediti" ], "game": [ - "Palo", + "a rischio", "Modalit\u00e0 Solo", - "Modalit\u00e0 Versus", - "In pausa" + "Modalit\u00e0 rispetto", + "Pausa" ], "intro": [ - "In attesa", - "Circa l'introduzione" + "In sospeso", + "L'introduzione" ], "settings": [ - "In attesa", + "In sospeso", "Nelle impostazioni" ], "win": [ @@ -103,7 +103,7 @@ ] }, "intro": [ - "Toccare Voce per iniziare", + "Premere INVIO per iniziare", "Premere A per iniziare" ], "game": { @@ -127,10 +127,10 @@ "Lasciare" ], "descriptions": [ - "Giocare da soli e offline contro un robot", + "Gioca da solo e offline contro un robot", "Riproduci due sullo stesso schermo", "Modificare lo zoom e le impostazioni", - "Visualizza elenco di autori di giochi", + "Visualizzare l'elenco degli autori di giochi", "Chiudere la partita e tornare a" ], "distribute": "Non distribuire" @@ -141,10 +141,10 @@ "size": "Dimensioni interfaccia", "music": "Attivare la musica", "lang": "lingua", - "voice": "Attivare la voce", + "voice": "Abilitare la voce", "yes": "s\u00ec", "no": "No", - "notice": "Le impostazioni non verranno applicate fino a dopo il riavvio di Kartik" + "notice": "Le impostazioni verranno applicate solo dopo il riavvio di Kartik" }, "win": { "solo": { @@ -153,7 +153,7 @@ }, "versus": "Giocatore 0 ha vinto!", "quit": [ - "Premere ESC per andarsene", + "Premere ESC per uscire", "Premere B per uscire" ] }, @@ -161,44 +161,77 @@ "menu": { "local": "locale", "online": "in linea", - "dlocal": "Giocare con un amico sulla stessa macchina", - "donline": "Giocare con un amico su macchine diverse" + "dlocal": "Gioca con un amico sulla stessa macchina", + "donline": "Gioca con un amico su macchine diverse" }, "error": { "connection": "Errore di comunicazione", "disconnect": "sconnesso" }, - "connecting": "Connessione al server in corso...", + "connecting": "Connessione al server in linea con il server in...", "intro": { - "create": "Creare un gioco", + "create": "Creare una parte", "pcreate": "Dai questo codice al tuo compagno di squadra per connetterti al tuo gioco:", "join": "Partecipa a una partita", "pjoin": "Inserisci il codice del tuo compagno di squadra per unirti al suo gioco:" }, "disconnected": "Connessione persa", - "unable": "Non \u00e8 possibile connettersi al server", + "unable": "Impossibile connettersi al server", "internal": "Errore interno del sistema", - "loading": "Prepararsi per il gioco...", + "loading": "Preparazione della parte...", "discord": "in linea", "generate": "Caricare il terreno...", - "discord2": "Incontra un errore", - "timeout": "Il tempo di attesa \u00e8 stato superato", + "discord2": "Rileva un errore", + "timeout": "Il timeout \u00e8 stato superato", "aborted": "L'altro giocatore ha lasciato il gioco", "car0": "La tua auto", "car1": "La sua auto" }, "stats": { - "menu": "Statistiche", + "menu": "statistica", "title": "Statistiche di gioco", "items": { - "times.single": "Tempo trascorso in singleplayer", - "times.local": "Tempo trascorso in modalità locale", - "times.online": "Tempo trascorso giocando online", + "times.single": "Tempo trascorso in modalit\u00e0 giocatore singolo", + "times.local": "Tempo trascorso in modalit\u00e0 locale", + "times.online": "Tempo trascorso in modalit\u00e0 online", "results.wins": "Numero di partite vinte", "results.loses": "Numero di partite perse", - "ingame.walls": "Numero di collisioni avute", - "ingame.laps": " Numero di giri effettuati", - "ingame.turns": "Numero di rotazioni effettuate" + "ingame.walls": "Numero totale di collisioni", + "ingame.laps": "Numero totale di turni", + "ingame.turns": "Numero totale di turni" } + }, + "polymer": { + "gpu": "Stato supporto GPU", + "gpuShift": "Toccare MAIUSC per saperne di pi\u00f9", + "logging": "Ti colleghiamo; controllare la finestra del browser Web e consentire la connessione.", + "loginClose": "Ora puoi chiudere questa scheda o finestra e tornare a Kartik.", + "gatheringLogin": "Verifichiamo il tuo account; potrebbe volere un po'.", + "loginIntro": "Premere L per accedere", + "logout": "L per disconnettersi", + "ktoLevel": "livello", + "ktoMaxLevel": "dio", + "error": [ + "Impossibile comunicare con i server", + "Non potrai utilizzare Kartik Online fino a quando non saremo in grado di comunicare con i server.", + "Connettersi a Internet" + ], + "updateError": [ + "Impossibile verificare la disponibilit\u00e0 di aggiornamenti", + "Non \u00e8 possibile verificare la disponibilit\u00e0 di aggiornamenti in questo momento, riprovare pi\u00f9 tardi." + ], + "levelup": [ + "Di alto livello!", + "Hai raggiunto il livello", + "e si ottiene il potere! Vai avanti e cerca di raggiungere il livello massimo." + ], + "finished": [ + "Hai battuto la partita!", + "Niente pi\u00f9 Kartik?! s\u00ec. Avete raggiunto il livello di Dio!" + ], + "token": [ + "Disconnesso da altrove", + "Sei stato disconnesso da Kartik Online perch\u00e9 la tua sessione \u00e8 terminata da altrove." + ] } }
\ No newline at end of file diff --git a/lang/jp.json b/lang/jp.json index b271a1e..ca98eb7 100644 --- a/lang/jp.json +++ b/lang/jp.json @@ -1,121 +1,121 @@ { "crash": { - "title": "\u30ab\u30eb\u30c6\u30a3\u30af\u30af\u30e9\u30c3\u30b7\u30e5\u30ec\u30dd\u30fc\u30bf\u30fc", - "head": "\u30ab\u30eb\u30c6\u30a3\u30af\u306f\u4ed5\u4e8b\u3092\u3084\u3081\u305f", - "intro": "Kartik \u306f\u554f\u984c\u306b\u906d\u9047\u3057\u3001\u4e88\u671f\u305b\u305a\u505c\u6b62\u3057\u307e\u3057\u305f\u3002\u8ffd\u52a0\u60c5\u5831\u3092\u53ce\u96c6\u3057\u3001\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u306b\u63a5\u7d9a\u3057\u3066\u3044\u308b\u5834\u5408\u306f\u3001\u30af\u30e9\u30c3\u30b7\u30e5 \u30ec\u30dd\u30fc\u30c8\u304c\u81ea\u52d5\u7684\u306b\u958b\u767a\u8005\u306b\u9001\u4fe1\u3055\u308c\u307e\u3057\u305f\u3002", + "title": "Kartik\u30af\u30e9\u30c3\u30b7\u30e5\u30ec\u30dd\u30fc\u30bf\u30fc", + "head": "Kartik\u306f\u52d5\u4f5c\u3092\u505c\u6b62\u3057\u307e\u3057\u305f", + "intro": "Kartik\u306f\u554f\u984c\u306b\u906d\u9047\u3057\u3001\u4e88\u671f\u305b\u305a\u505c\u6b62\u3057\u307e\u3057\u305f\u3002", "report": [ - "\u3055\u3089\u306b\u3001\u30af\u30e9\u30c3\u30b7\u30e5 \u30ec\u30dd\u30fc\u30c8\u306f\u3001", - "\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u5834\u5408\u306f\u3001\u958b\u767a\u8005\u306b\u9001\u4fe1\u3067\u304d\u307e\u3059\u3002" + "\u3055\u3089\u306b\u3001\u30af\u30e9\u30c3\u30b7\u30e5\u30ec\u30dd\u30fc\u30c8\u306f\u300c", + "\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u3068\u304d\u306b\u958b\u767a\u8005\u306b\u9001\u4fe1\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002" ], - "close": "\u9589\u3081\u308b", - "reset": "\u30ab\u30eb\u30c6\u30a3\u30c3\u30af\u3092\u30ea\u30bb\u30c3\u30c8\u3057\u3066\u9589\u3058\u308b" + "close": "\u9589\u3058\u308b\u306b\u306f", + "reset": "Kartik\u3092\u30ea\u30bb\u30c3\u30c8\u3057\u3066\u9589\u3058\u307e\u3059" }, "updates": { - "ok": "\u6700\u65b0\u3067\u3059", - "available": "\u5229\u7528\u53ef\u80fd\u306a\u30b2\u30fc\u30e0\u306e\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8", - "git": "\u30c8\u30e9\u30f3\u30af \u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u5b9f\u884c", - "error": "\u66f4\u65b0\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093", - "wait": "\u66f4\u65b0\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u691c\u7d22\u3057\u307e\u3059\u3002", + "ok": "\u6700\u65b0\u306e", + "available": "\u5229\u7528\u53ef\u80fd\u306a\u30b2\u30fc\u30e0\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8", + "git": "\u30c8\u30e9\u30f3\u30af\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u5b9f\u884c", + "error": "\u66f4\u65b0\u3092\u78ba\u8a8d\u3067\u304d\u307e\u305b\u3093", + "wait": "\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u306e\u78ba\u8a8d ...", "warn": [ - "\u66f4\u65b0\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u5229\u7528\u53ef\u80fd\u3067\u3059", - "\u6700\u65b0\u306e\u6a5f\u80fd\u3068\u30d0\u30b0\u4fee\u6b63\u306e\u305f\u3081\u306e\u516c\u5f0f\u30a6\u30a7\u30d6\u30b5\u30a4\u30c8\u304b\u3089Kartik\u306e\u65b0\u3057\u3044\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u304f\u3060\u3055\u3044\u3002" + "\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u304c\u5229\u7528\u53ef\u80fd\u3067\u3059", + "\u6700\u65b0\u306e\u6a5f\u80fd\u3068\u30d0\u30b0\u4fee\u6b63\u3092\u5229\u7528\u3059\u308b\u306b\u306f\u3001\u516c\u5f0fWeb\u30b5\u30a4\u30c8\u304b\u3089\u65b0\u3057\u3044\u30d0\u30fc\u30b8\u30e7\u30f3\u306eKartik\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u304f\u3060\u3055\u3044\u3002" ] }, "scenario": { "intro": [ - "\u306d\u3048\u3001\u3053\u3093\u306b\u3061\u306f\u3001\u5c11\u3057\u8d70\u308b\u306e\u306f\u3069\u3046\u3067\u3059\u304b?", - "\u3042\u3042\u3001\u3053\u3053\u3067\u3042\u306a\u305f\u306f\u518d\u3073\u3067\u3059!\u5c11\u3057\u8d70\u308b\u306e\u306f\u3069\u3046\u3067\u3059\u304b?", - "\u5c11\u3057\u8d70\u308a\u307e\u305b\u3093\u304b\u3002", - "\u79c1\u305f\u3061\u306f\u6563\u6b69\u306b\u884c\u304f\u3064\u3082\u308a\u3067\u3059\u304b?" + "\u306d\u3048\u3001\u3053\u3093\u306b\u3061\u306f\u3001\u30af\u30a4\u30c3\u30af\u30e9\u30f3\u306f\u3069\u3046\u3067\u3059\u304b\uff1f", + "\u3042\u3042\u3001\u307e\u305f\u3044\u308b\u3088\uff01", + "\u3061\u3087\u3063\u3068\u3057\u305f\u30ec\u30fc\u30b9\u306f\u3044\u304b\u304c\u3067\u3059\u304b\uff1f", + "\u6563\u6b69\u3057\u307e\u305b\u3093\u304b\uff1f" ], "ahead1": [ - "\u3042\u3042\u9055\u3044\u307e\u3059\uff01", - "\u5730\u7344\u3001\u305d\u308c\u306f\u4e0d\u53ef\u80fd\u3067\u3059!", - "\u3057\u304b\u3057\u3001\u79c1\u306f\u305d\u308c\u3092\u4f5c\u308b\u3064\u3082\u308a\u306f\u3042\u308a\u307e\u305b\u3093.", - "\u304a\u3084\u3002\u3002\u3002", - "\u3069\u3046\u3057\u3066\u305d\u3093\u306a\u3053\u3068\u3092\u3057\u306a\u306a\u306e?" + "\u5927\u91ce \uff01", + "\u304f\u305d\u30fc\u3001\u305d\u308c\u306f\u4e0d\u53ef\u80fd\u3067\u3059\uff01", + "\u3057\u304b\u3057\u3001\u79c1\u306f\u305d\u3053\u306b\u884c\u304f\u3064\u3082\u308a\u306f\u3042\u308a\u307e\u305b\u3093...", + "\u305d\u3057\u3066\u305f\u308f\u3054\u3068...", + "\u306a\u305c\u3042\u306a\u305f\u306f\uff1f" ], "ahead2": [ - "\u3053\u3093\u306b\u3061\u306f\u3053\u3093\u306b\u3061\u306f", - "\u3053\u308c\u306f\u79c1\u306e\u305f\u3081\u306e\u3082\u306e\u3067\u3059!", - "\u53d6\u3063\u3066\u304d\u307e\u3059\uff01", - "\u305d\u308c\u306f\u79c1\u306e\u305f\u3081\u3067\u3059!", - "\u79c1\u306e\u3058\u3083\u3042\u308a\u307e\u305b\u3093\uff01" + "\u30d2\u30d2\u30d2\u30d2", + "\u3053\u308c\u306f\u79c1\u306e\u305f\u3081\u3067\u3059\uff01", + "\u6301\u3063\u3066\u3044\u304d\u307e\u3059\uff01", + "\u305d\u308c\u306f\u79c1\u306e\u305f\u3081\u3067\u3059\uff01", + "\u305d\u308c\u306f\u79c1\u306e\u3082\u306e\u3067\u3059\uff01" ], "won1": [ - "\u3088\u304f\u3084\u308a\u307e\u3057\u305f\u306d\uff01", - "\u79c1\u306b\u306f\u6b8b\u5ff5\u3067\u3059.", - "\u79c1\u306f\u671b\u3080\u3053\u3068\u304c\u3067\u304d\u305f.", - "\u3057\u304b\u3057\u3001\u305d\u308c\u306f\u975e\u5e38\u306b\u826f\u3044\u3067\u306f\u3042\u308a\u307e\u305b\u3093!", - "\u3088\u304f\u3084\u308a\u307e\u3057\u305f\u306d\uff01" + "\u826f\u3044\u30b2\u30fc\u30e0\u3067\u3059\uff01", + "\u79c1\u306b\u306f\u6b8b\u5ff5\u3067\u3059...", + "\u79c1\u306f\u671b\u3093\u3060\u304b\u3082\u3057\u308c\u306a\u3044...", + "\u3057\u304b\u3057\u3001\u305d\u308c\u306f\u3042\u307e\u308a\u3044\u3044\u3053\u3068\u3067\u306f\u3042\u308a\u307e\u305b\u3093\uff01", + "\u7d20\u6674\u3089\u3057\u3044 \uff01" ], "won2": [ - "\u8a00\u3063\u305f\u3067\u3057\u3087\u3046\uff01", - "\u3042\u305f\u304b\u3082\u79c1\u304c\u3042\u306a\u305f\u306b\u8b66\u544a\u3057\u3066\u3044\u306a\u304b\u3063\u305f\u304b\u306e\u3088\u3046\u306b!", - "\u79c1\u304c\u52dd\u3061\u307e\u3057\u305f\uff01", - "\u7d20\u6674\u3089\u3057\u3044\u3001\u79c1\u306f\u305d\u308c\u3092\u7372\u5f97\u3057\u307e\u3057\u305f!", - "\u305d\u3057\u3066\u3001\u79c1\u306e\u305f\u3081\u306b\u3082\u3046\u4e00\u3064!" + "\u5148\u307b\u3069\u3082\u8a00\u3044\u307e\u3057\u305f \uff01", + "\u79c1\u304c\u3042\u306a\u305f\u306b\u8b66\u544a\u3057\u306a\u304b\u3063\u305f\u304b\u306e\u3088\u3046\u306b\uff01", + "\u52dd\u3063\u305f \uff01", + "\u7d20\u6674\u3089\u3057\u3044\u3001\u79c1\u306f\u305d\u308c\u3092\u52dd\u3061\u53d6\u308a\u307e\u3057\u305f\uff01", + "\u305d\u3057\u3066\u79c1\u306e\u305f\u3081\u306b\u3082\u30461\u3064\uff01" ], "wall1": [ "\u3042\u3042\u3042\u3042\uff01", - "\u3058\u3083\u3042\u3001\u307e\u3063\u3059\u3050\u884c\u304b\u306a\u3044\u306e?", + "\u305d\u308c\u3067\u306f\u3001\u79c1\u305f\u3061\u306f\u6b63\u3057\u304f\u884c\u304b\u306a\u3044\u306e\u3067\u3059\u304b\uff1f", "\u75db\u3044", - "\u305d\u308c\u306f\u50b7\u3064\u304f\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059.", - "\u30b9\u30d7\u30e9\u30d5\u3001\u305d\u308c\u304c\u969c\u5bb3\u3060!" + "\u75db\u3044\u306b\u9055\u3044\u306a\u3044...", + "Splaf\u3001c't'obstacle\uff01" ], "wall2": [ - "\u3061\u304f\u3057\u3087\u3046", - "\u3084\u3070\u3044", - "\u305d\u3093\u306a\u7b48\u306f\u3042\u308a\u307e\u305b\u3093", - "\u30d7\u30fc\u30c6\u30a3" + "\u305f\u308f\u3054\u3068", + "\u3046\u3093\u3053", + "\u3042\u308a\u3048\u306a\u3044", + "\u30d7\u30c6\u30a3" ], "start": [ - "\u79c1\u306f\u3042\u306a\u305f\u3092\u5439\u304d\u98db\u3070\u3059\u3064\u3082\u308a\u3067\u3059!", - "\u3042\u306a\u305f\u304c\u898b\u308b\u3067\u3057\u3087\u3046\u3001\u79c1\u306f\u3042\u306a\u305f\u306b\u305d\u308c\u3089\u306e\u30ec\u30fc\u30b9\u306e\u4e00\u3064\u3092\u4f5c\u308a\u307e\u3059!", - "\u3042\u306a\u305f\u306f\u79c1\u306b\u3044\u304f\u3064\u304b\u306e\u30cb\u30e5\u30fc\u30b9\u3092\u6559\u3048\u3066\u304f\u308c\u307e\u3059", - "\u884c\u304d\u307e\u3057\u3087\u3046\uff01", - "\u3055\u3042\u59cb\u3081\u307e\u3059\uff01", - "\u30a6\u30fc\u3001\u524d\u9032!" + "\u697d\u3057\u307f\u307e\u3059\uff01", + "\u3042\u306a\u305f\u304c\u898b\u308b\u3067\u3057\u3087\u3046\u3001\u79c1\u306f\u3042\u306a\u305f\u3092\u305d\u308c\u3089\u306e\u30ec\u30fc\u30b9\u306e1\u3064\u306b\u3057\u307e\u3059\uff01", + "\u30cb\u30e5\u30fc\u30b9\u3092\u6559\u3048\u3066\u304f\u3060\u3055\u3044", + "\u3055\u3042\u884c\u3053\u3046\uff01", + "\u3069\u3046\u305e \uff01", + "\u3046\u308f\u30fc\u3001\u30d5\u30a9\u30ef\u30fc\u30c9\uff01" ] }, "discord": { "credits": [ - "\u5f85\u3064\u3053\u3068", + "\u5f85\u3063\u3066\u3044\u308b", "\u30af\u30ec\u30b8\u30c3\u30c8\u3067" ], "game": [ - "\u5371\u967a\u306b\u3055\u3089\u3055\u308c\u3066\u3044\u308b", - "\u30e2\u30fc\u30c9\u30bd\u30ed", - "\u30e2\u30fc\u30c9\u5bfe", - "\u4e00\u6642\u505c\u6b62\u4e2d" + "\u30b9\u30c6\u30fc\u30af\u30b9", + "\u30bd\u30ed\u30e2\u30fc\u30c9", + "\u5bfe\u30e2\u30fc\u30c9", + "\u4f11\u3093\u3067" ], "intro": [ - "\u5f85\u3064\u3053\u3068", - "\u5c0e\u5165\u306b\u3064\u3044\u3066" + "\u5f85\u3063\u3066\u3044\u308b", + "\u7d39\u4ecb\u306b\u3064\u3044\u3066" ], "settings": [ - "\u5f85\u3064\u3053\u3068", + "\u5f85\u3063\u3066\u3044\u308b", "\u8a2d\u5b9a\u3067" ], "win": [ - "\u3061\u3087\u3046\u3069\u52dd\u3063\u305f", - "\u3061\u3087\u3046\u3069\u5931\u308f\u308c\u305f" + "\u52dd\u3063\u305f\u3070\u304b\u308a", + "\u8ca0\u3051\u305f\u3070\u304b\u308a" ] }, "intro": [ - "[\u30a8\u30f3\u30c8\u30ea]\u3092\u30bf\u30c3\u30d7\u3057\u3066\u958b\u59cb\u3057\u307e\u3059\u3002", - "\u958b\u59cb\u3059\u308b\u306b\u306f A \u3092\u62bc\u3057\u307e\u3059\u3002" + "Enter\u30ad\u30fc\u3092\u62bc\u3057\u3066\u958b\u59cb\u3057\u307e\u3059", + "A\u3092\u62bc\u3057\u3066\u958b\u59cb\u3057\u307e\u3059" ], "game": { "credits": { - "by": "\u306b\u3088\u3063\u3066" + "by": "\u306b" }, "gpause": { - "title": "\u4e00\u6642\u505c\u6b62\u4e2d\u306e\u30b2\u30fc\u30e0", + "title": "\u30b2\u30fc\u30e0\u304c\u4e00\u6642\u505c\u6b62\u3057\u307e\u3057\u305f", "continueg": "\u7d9a\u3051\u308b", - "showhb": "\u30d2\u30c3\u30c8\u30dc\u30c3\u30af\u30b9\u3092\u8868\u793a\u3059\u308b", - "hidehb": "\u30d2\u30c3\u30c8\u30dc\u30c3\u30af\u30b9\u3092\u975e\u8868\u793a\u306b\u3059\u308b", - "quit": "\u3053\u3053\u3092\u51fa\u307e\u3059" + "showhb": "\u30d2\u30c3\u30c8\u30dc\u30c3\u30af\u30b9\u3092\u8868\u793a", + "hidehb": "\u30d2\u30c3\u30c8\u30dc\u30c3\u30af\u30b9\u3092\u975e\u8868\u793a", + "quit": "\u53bb\u308b\u306b\u306f" } }, "menu": { @@ -124,81 +124,114 @@ "\u5bfe", "\u30aa\u30d7\u30b7\u30e7\u30f3", "\u30af\u30ec\u30b8\u30c3\u30c8", - "\u3053\u3053\u3092\u51fa\u307e\u3059" + "\u53bb\u308b\u306b\u306f" ], "descriptions": [ - "\u30ed\u30dc\u30c3\u30c8\u306b\u5bfe\u3057\u3066\u5358\u72ec\u3067\u30aa\u30d5\u30e9\u30a4\u30f3\u3067\u904a\u3076", - "\u540c\u3058\u753b\u9762\u3067 2 \u3064\u3092\u518d\u751f\u3059\u308b", + "\u30ed\u30dc\u30c3\u30c8\u306b\u5bfe\u3057\u3066\u4e00\u4eba\u3067\u30aa\u30d5\u30e9\u30a4\u30f3\u3067\u904a\u3076", + "\u540c\u3058\u753b\u9762\u30672\u3064\u518d\u751f\u3059\u308b", "\u30ba\u30fc\u30e0\u3068\u8a2d\u5b9a\u3092\u5909\u66f4\u3059\u308b", - "\u30b2\u30fc\u30e0\u4f5c\u6210\u8005\u306e\u4e00\u89a7\u3092\u8868\u793a\u3059\u308b", - "\u30b2\u30fc\u30e0\u3092\u9589\u3058\u3066\u3001\u6b21\u306e\u30da\u30fc\u30b8\u306b\u623b\u308a\u307e\u3059\u3002" + "\u30b2\u30fc\u30e0\u306e\u4f5c\u8005\u306e\u30ea\u30b9\u30c8\u3092\u8868\u793a\u3059\u308b", + "\u30b2\u30fc\u30e0\u3092\u9589\u3058\u3066\u3001\u306b\u623b\u308a\u307e\u3059" ], - "distribute": "\u914d\u5e03\u3057\u306a\u3044" + "distribute": "\u914d\u5e03\u3057\u306a\u3044\u3067\u304f\u3060\u3055\u3044" }, "settings": { "title": "\u30aa\u30d7\u30b7\u30e7\u30f3", - "back": "\u5e30\u308b", + "back": "\u623b\u308b", "size": "\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u30b5\u30a4\u30ba", "music": "\u97f3\u697d\u3092\u30a2\u30af\u30c6\u30a3\u30d6\u306b\u3059\u308b", "lang": "\u820c", "voice": "\u97f3\u58f0\u3092\u30a2\u30af\u30c6\u30a3\u30d6\u306b\u3059\u308b", "yes": "\u306f\u3044", "no": "\u3044\u3044\u3048", - "notice": "\u8a2d\u5b9a\u306fKartik\u306e\u518d\u8d77\u52d5\u5f8c\u307e\u3067\u9069\u7528\u3055\u308c\u307e\u305b\u3093" + "notice": "\u8a2d\u5b9a\u306f\u3001Kartik\u3092\u518d\u8d77\u52d5\u3057\u305f\u5f8c\u306b\u306e\u307f\u9069\u7528\u3055\u308c\u307e\u3059" }, "win": { "solo": { - "win": "\u3042\u306a\u305f\u306f\u52dd\u3063\u305f!", - "lose": "\u3042\u306a\u305f\u306f\u5931\u3044\u307e\u3059\uff01" + "win": "\u3042\u306a\u305f\u306f\u52dd\u3061\u307e\u3057\u305f\uff01", + "lose": "\u3042\u306a\u305f\u304c\u8ca0\u3051\u305f \uff01" }, - "versus": "\u30d7\u30ec\u30a4\u30e4\u30fc0\u304c\u52dd\u3063\u305f!", + "versus": "\u30d7\u30ec\u30a4\u30e4\u30fc0\u304c\u52dd\u3061\u307e\u3057\u305f\uff01", "quit": [ - "\u7d42\u4e86\u3059\u308b\u30a8\u30b9\u30b1\u30fc\u30d7\u3092\u62bc\u3059", - "B \u3092\u62bc\u3057\u3066\u9000\u53bb" + "Esc\u30ad\u30fc\u3092\u62bc\u3057\u3066\u7d42\u4e86\u3057\u307e\u3059", + "B\u3092\u62bc\u3057\u3066\u7d42\u4e86\u3057\u307e\u3059" ] }, "online": { "menu": { - "local": "\u5730\u5143\u306e", - "online": "\u30aa\u30f3\u30e9\u30a4\u30f3", - "dlocal": "\u540c\u3058\u30de\u30b7\u30f3\u4e0a\u306e\u53cb\u4eba\u3068\u904a\u3076", - "donline": "\u7570\u306a\u308b\u30de\u30b7\u30f3\u4e0a\u306e\u53cb\u4eba\u3068\u904a\u3076" + "local": "\u30ed\u30fc\u30ab\u30eb", + "online": "\u5217\u3092\u306a\u3057\u3066", + "dlocal": "\u540c\u3058\u30de\u30b7\u30f3\u3067\u53cb\u9054\u3068\u904a\u3076", + "donline": "\u5225\u306e\u30de\u30b7\u30f3\u3067\u53cb\u9054\u3068\u904a\u3076" }, "error": { - "connection": "\u901a\u4fe1\u30a8\u30e9\u30fc", - "disconnect": "\u9014\u5207\u308c\u9014\u5207\u308c" + "connection": "\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7\u30f3\u30a8\u30e9\u30fc", + "disconnect": "\u5207\u65ad\u3055\u308c\u307e\u3057\u305f" }, - "connecting": "\u30b5\u30fc\u30d0\u30fc\u3078\u306e\u63a5\u7d9a.", + "connecting": "\u30b5\u30fc\u30d0\u30fc\u3078\u306e\u63a5\u7d9a...", "intro": { "create": "\u30b2\u30fc\u30e0\u3092\u4f5c\u6210\u3059\u308b", - "pcreate": "\u3053\u306e\u30b3\u30fc\u30c9\u3092\u30c1\u30fc\u30e0\u30e1\u30a4\u30c8\u306b\u6e21\u3057\u3066\u30b2\u30fc\u30e0\u306b\u63a5\u7d9a\u3057\u307e\u3059\u3002", + "pcreate": "\u3053\u306e\u30b3\u30fc\u30c9\u3092\u30c1\u30fc\u30e0\u30e1\u30a4\u30c8\u306b\u6e21\u3057\u3066\u3001\u30b2\u30fc\u30e0\u306b\u30ed\u30b0\u30a4\u30f3\u3057\u307e\u3059\u3002", "join": "\u30b2\u30fc\u30e0\u306b\u53c2\u52a0\u3059\u308b", - "pjoin": "\u30c1\u30fc\u30e0\u30e1\u30a4\u30c8\u306e\u30b3\u30fc\u30c9\u3092\u5165\u529b\u3057\u3066\u30b2\u30fc\u30e0\u306b\u53c2\u52a0\u3057\u307e\u3059\u3002" + "pjoin": "\u30c1\u30fc\u30e0\u30e1\u30a4\u30c8\u306e\u30b3\u30fc\u30c9\u3092\u5165\u529b\u3057\u3066\u3001\u30b2\u30fc\u30e0\u306b\u53c2\u52a0\u3057\u307e\u3059\u3002" }, - "disconnected": "\u63a5\u7d9a\u304c\u5207\u65ad\u3055\u308c\u305f", + "disconnected": "\u63a5\u7d9a\u5207\u65ad", "unable": "\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093", - "internal": "\u5185\u90e8\u30b7\u30b9\u30c6\u30e0 \u30a8\u30e9\u30fc", - "loading": "\u30b2\u30fc\u30e0\u306e\u6e96\u5099.", - "discord": "\u30aa\u30f3\u30e9\u30a4\u30f3", - "generate": "\u571f\u5730\u3092\u30ed\u30fc\u30c9\u3057\u307e\u3059\u3002", - "discord2": "\u9593\u9055\u3044\u3092\u6e80\u305f\u3059", - "timeout": "\u5f85\u3061\u6642\u9593\u3092\u8d85\u3048\u307e\u3057\u305f", - "aborted": "\u4ed6\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u306f\u30b2\u30fc\u30e0\u3092\u96e2\u308c\u305f", + "internal": "\u5185\u90e8\u30b7\u30b9\u30c6\u30e0\u30a8\u30e9\u30fc", + "loading": "\u30b2\u30fc\u30e0\u306e\u6e96\u5099..\u3002", + "discord": "\u5217\u3092\u306a\u3057\u3066", + "generate": "\u571f\u5730\u306e\u8aad\u307f\u8fbc\u307f..\u3002", + "discord2": "\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f", + "timeout": "\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3092\u8d85\u3048\u307e\u3057\u305f", + "aborted": "\u4ed6\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u304c\u30b2\u30fc\u30e0\u3092\u96e2\u308c\u307e\u3057\u305f", "car0": "\u3042\u306a\u305f\u306e\u8eca", "car1": "\u5f7c\u306e\u8eca" }, "stats": { - "menu": "統計", - "title": "ゲーム統計", + "menu": "\u7d71\u8a08", + "title": "\u30b2\u30fc\u30e0\u7d71\u8a08", "items": { - "times.single": "シングルプレイヤーに費やした時間", - "times.local": "ローカルモードに費やした時間", - "times.online": "オンラインでプレイした時間", - "results.wins": "勝ったゲームの数", - "results.loses": "負けたゲームの数", - "ingame.walls": "衝突した回数", - "ingame.laps": "周回した周回数", - "ingame.turns": "周回した周回数" + "times.single": "\u30b7\u30f3\u30b0\u30eb\u30d7\u30ec\u30a4\u30e4\u30fc\u30e2\u30fc\u30c9\u3067\u8cbb\u3084\u3057\u305f\u6642\u9593", + "times.local": "\u30ed\u30fc\u30ab\u30eb\u30e2\u30fc\u30c9\u3067\u8cbb\u3084\u3057\u305f\u6642\u9593", + "times.online": "\u30aa\u30f3\u30e9\u30a4\u30f3\u30e2\u30fc\u30c9\u3067\u8cbb\u3084\u3057\u305f\u6642\u9593", + "results.wins": "\u52dd\u3063\u305f\u30b2\u30fc\u30e0\u306e\u6570", + "results.loses": "\u5931\u308f\u308c\u305f\u30b2\u30fc\u30e0\u306e\u6570", + "ingame.walls": "\u885d\u7a81\u306e\u7dcf\u6570", + "ingame.laps": "\u7dcf\u5468\u56de\u6570", + "ingame.turns": "\u7dcf\u30bf\u30fc\u30f3\u6570" } + }, + "polymer": { + "gpu": "GPU\u30b5\u30dd\u30fc\u30c8\u30b9\u30c6\u30fc\u30bf\u30b9", + "gpuShift": "Shift\u30ad\u30fc\u3092\u62bc\u3057\u3066\u3001\u8a73\u7d30\u3092\u8868\u793a\u3057\u307e\u3059", + "logging": "\u79c1\u305f\u3061\u306f\u3042\u306a\u305f\u3092\u3064\u306a\u304e\u307e\u3059\u3002 ", + "loginClose": "\u3053\u308c\u3067\u3001\u3053\u306e\u30bf\u30d6\u307e\u305f\u306f\u30a6\u30a3\u30f3\u30c9\u30a6\u3092\u9589\u3058\u3066\u3001Kartik\u306b\u623b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002", + "gatheringLogin": "\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002", + "loginIntro": "L\u3092\u62bc\u3057\u3066\u63a5\u7d9a\u3057\u307e\u3059", + "logout": "\u30ed\u30b0\u30a2\u30a6\u30c8\u3059\u308bL", + "ktoLevel": "\u30ec\u30d9\u30eb", + "ktoMaxLevel": "\u795e\u69d8", + "error": [ + "\u30b5\u30fc\u30d0\u30fc\u3068\u901a\u4fe1\u3067\u304d\u307e\u305b\u3093", + "\u30b5\u30fc\u30d0\u30fc\u3068\u901a\u4fe1\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308b\u307e\u3067\u3001KartikOnline\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002", + "\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u306b\u63a5\u7d9a\u3059\u308b" + ], + "updateError": [ + "\u66f4\u65b0\u3092\u78ba\u8a8d\u3067\u304d\u307e\u305b\u3093", + "\u73fe\u5728\u3001\u66f4\u65b0\u3092\u78ba\u8a8d\u3067\u304d\u307e\u305b\u3093\u3002\u3057\u3070\u3089\u304f\u3057\u3066\u304b\u3089\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002" + ], + "levelup": [ + "\u3088\u308a\u9ad8\u3044\u30ec\u30d9\u30eb\uff01", + "\u30ec\u30d9\u30eb\u306b\u9054\u3057\u307e\u3057\u305f", + "\u305d\u3057\u3066\u3042\u306a\u305f\u306f\u529b\u3092\u5f97\u308b\uff01" + ], + "finished": [ + "\u3042\u306a\u305f\u306f\u30b2\u30fc\u30e0\u306b\u52dd\u3061\u307e\u3057\u305f\uff01", + "\u5b8c\u6210\u3057\u305fKartik \uff1f\uff01" + ], + "token": [ + "\u4ed6\u306e\u5834\u6240\u304b\u3089\u5207\u65ad\u3055\u308c\u307e\u3057\u305f", + "\u30bb\u30c3\u30b7\u30e7\u30f3\u304c\u4ed6\u306e\u5834\u6240\u3067\u7d42\u4e86\u3057\u305f\u305f\u3081\u3001KartikOnline\u304b\u3089\u30ed\u30b0\u30a2\u30a6\u30c8\u3057\u307e\u3057\u305f\u3002" + ] } }
\ No newline at end of file diff --git a/lang/loader.js b/lang/loader.js index fdd5ec2..b28e004 100644 --- a/lang/loader.js +++ b/lang/loader.js @@ -1,46 +1,46 @@ -function getCookie(cname) { - var name = cname + "="; - var decodedCookie = decodeURIComponent(document.cookie); - var ca = decodedCookie.split(';'); - for(var i = 0; i <ca.length; i++) { - var c = ca[i]; - while (c.charAt(0) == ' ') { - c = c.substring(1); - } - if (c.indexOf(name) == 0) { - return c.substring(name.length, c.length); - } - } - return ""; -} - -if (getCookie("kartik_lang").trim() === "") { - document.cookie = "kartik_lang=en; path=/"; -} - -if (typeof native === "boolean" && !native) { - try { - global.lp = getCookie("kartik_lang"); - global.ll_length = getCookie("kartik_i18n_" + lp) - 1 + 2; - global.ll_raw = ""; - - for (i = 1; i <= ll_length; i++) { - global.ll_raw = ll_raw + getCookie("kartik_i18n_" + lp + "_" + (i - 1)); - } - - global.lang = JSON.parse(ll_raw); - } catch (e) { - console.error(e); - global.lp = "en"; - global.lang = JSON.parse(window.fetch("./lang/" + lp + ".json").toString()); - } -} else { - try { - global.lp = require('electron').remote.getCurrentWindow().lp.trim(); - global.lang = JSON.parse(require('fs').readFileSync("./lang/" + lp + ".json").toString()); - } catch (e) { - console.error(e); - global.lp = "en"; - global.lang = JSON.parse(require('fs').readFileSync("./lang/" + lp + ".json").toString()); - } -} +function getCookie(cname) {
+ var name = cname + "=";
+ var decodedCookie = decodeURIComponent(document.cookie);
+ var ca = decodedCookie.split(';');
+ for(var i = 0; i <ca.length; i++) {
+ var c = ca[i];
+ while (c.charAt(0) == ' ') {
+ c = c.substring(1);
+ }
+ if (c.indexOf(name) == 0) {
+ return c.substring(name.length, c.length);
+ }
+ }
+ return "";
+}
+
+if (getCookie("kartik_lang").trim() === "") {
+ document.cookie = "kartik_lang=en; path=/";
+}
+
+if (typeof native === "boolean" && !native) {
+ try {
+ global.lp = getCookie("kartik_lang");
+ global.ll_length = getCookie("kartik_i18n_" + lp) - 1 + 2;
+ global.ll_raw = "";
+
+ for (i = 1; i <= ll_length; i++) {
+ global.ll_raw = ll_raw + getCookie("kartik_i18n_" + lp + "_" + (i - 1));
+ }
+
+ global.lang = JSON.parse(ll_raw);
+ } catch (e) {
+ console.error(e);
+ global.lp = "en";
+ global.lang = JSON.parse(window.fetch("./lang/" + lp + ".json").toString());
+ }
+} else {
+ try {
+ global.lp = require('electron').remote.getCurrentWindow().lp.trim();
+ global.lang = JSON.parse(require('fs').readFileSync("./lang/" + lp + ".json").toString());
+ } catch (e) {
+ console.error(e);
+ global.lp = "en";
+ global.lang = JSON.parse(require('fs').readFileSync("./lang/" + lp + ".json").toString());
+ }
+}
diff --git a/lang/nl.json b/lang/nl.json index 883df7d..916f382 100644 --- a/lang/nl.json +++ b/lang/nl.json @@ -1,121 +1,121 @@ { "crash": { - "title": "Kartik Crash Verslaggever", + "title": "Kartik Crash Reporter", "head": "Kartik werkt niet meer", - "intro": "Kartik ondervond een probleem en stopte onverwacht.We hebben aanvullende informatie verzameld en er is automatisch een crashrapport naar ontwikkelaars verzonden als u verbinding hebt gemaakt met internet.", + "intro": "Kartik ondervond een probleem en stopte onverwachts. ", "report": [ - "Daarnaast is er een crashrapport gemaakt in \"", - "zodat u het naar ontwikkelaars kunt sturen wanneer u toegang hebt tot internet." + "Bovendien is er een crashrapport gemaakt in \"", + "Zodat je het naar de ontwikkelaars kunt sturen als je internettoegang hebt." ], - "close": "Sluiten", + "close": "sluiten", "reset": "Reset Kartik en sluit" }, "updates": { - "ok": "Bijdetijds", + "ok": "Bijgewerkt", "available": "Game-updates beschikbaar", - "git": "De trunkversie uitvoeren", - "error": "Kan geen updates vinden", - "wait": "Zoeken naar updates...", + "git": "De kofferbakversie uitvoeren", + "error": "Kan niet controleren op updates", + "wait": "Controleren op updates...", "warn": [ "Updates zijn beschikbaar", - "Download de nieuwe versie van Kartik van de offici\u00eble website voor de nieuwste functies en bugfixes." + "Download de nieuwe versie van Kartik van de offici\u00eble website om te profiteren van de nieuwste functies en bugfixes." ] }, "scenario": { "intro": [ - "H\u00e9, hallo, wat dacht je van een kleine run?", - "Ah, hier ben je weer! Wat dacht je van een beetje rennen?", - "Waarom gaan we niet even rennen?", - "Gaan we wandelen?" + "H\u00e9, hoi, wat dacht je van een snelle run?", + "Aha, daar ben je weer! ", + "Zullen we een beetje racen?", + "Zullen we gaan wandelen?" ], "ahead1": [ - "Oh nee!", - ", het is niet mogelijk!", - "Maar ik ga het niet halen...", - "Oh...", - "Waarom moet je dat doen?" + "Oh nee !", + "Verdomme, dat kan niet!", + "Maar ik kom er niet...", + "En shit...", + "Waarom jij ?" ], "ahead2": [ - "Hallo hi hi", - "Deze is voor mij.", - "Ik pak het wel.", + "Hee hee hee", + "Deze is voor mij!", + "Ik zal het hebben !", "Het is voor mij!", - "Het is van mij!" + "Het is van mij !" ], "won1": [ - "Goed gedaan!", + "Goed spel !", "Jammer voor mij...", "Ik had kunnen hopen...", - "Maar het is niet erg leuk!", - "Goed gedaan!" + "Maar, het is niet erg leuk!", + "Goed gedaan !" ], "won2": [ - "Zei ik je toch!", - "Alsof ik je niet gewaarschuwd had.", - "Ik heb gewonnen.", - "Geweldig, ik heb gewonnen!", - "En nog eentje voor mij." + "Ik zei het je !", + "Alsof ik je niet gewaarschuwd had!", + "Ik won !", + "Super, ik heb hem gewonnen!", + "En nog eentje voor mij!" ], "wall1": [ - "Ah ah!", - "Gaan we dan niet rechtdoor?", + "Ach ach!", + "Nou, gaan we dan niet goed?", "Ouch", "Het moet pijn doen...", - "Splaf, dat is het obstakel!" + "Splaf, geen obstakel!" ], "wall2": [ - "Verdomd", - "Crap", - "Echt niet", - "Puti" + "Shit", + "Poep", + "Niet mogelijk", + "Zet ik" ], "start": [ - "Ik ga je wegblazen!", - "Je zult zien, ik maak van jou zo'n race!", - "Vertel me wat nieuws.", - "We gaan!", - "Daar gaan we!", - "Wooo, vooruit!" + "Ik zal plezier hebben!", + "Je zult zien, ik zal je een van die races maken!", + "Vertel me nieuws", + "Laten we gaan!", + "Daar gaan we !", + "Wauw, vooruit!" ] }, "discord": { "credits": [ - "Wachten", + "Aan het wachten", "In de aftiteling" ], "game": [ - "in gevaar", - "Modus Solo", - "Modus versus", - "Bij pauze" + "Inzetten", + "Solo-modus", + "Versus-modus", + "op pauze" ], "intro": [ - "Wachten", + "Aan het wachten", "Over de introductie" ], "settings": [ - "Wachten", + "Aan het wachten", "In de instellingen" ], "win": [ - "Net gewonnen", - "Net verdwaald" + "Zojuist gewonnen", + "Net verloren" ] }, "intro": [ - "Tik op Invoeren om aan de slag te gaan", - "Druk op A om aan de slag te gaan" + "Druk op enter om te beginnen", + "Druk op A om te beginnen" ], "game": { "credits": { - "by": "Door" + "by": "door" }, "gpause": { - "title": "Spel op pauze", - "continueg": "Blijven", - "showhb": "Hitbox weergeven", + "title": "Spel gepauzeerd", + "continueg": "doorgaan", + "showhb": "Toon hitbox", "hidehb": "Hitbox verbergen", - "quit": "Om te vertrekken" + "quit": "Verlaten" } }, "menu": { @@ -124,81 +124,114 @@ "Versus", "Opties", "Credits", - "Om te vertrekken" + "Verlaten" ], "descriptions": [ - "Alleen en offline spelen tegen een robot", - "Twee op hetzelfde scherm afspelen", + "Speel alleen en offline tegen een robot", + "Speel twee op hetzelfde scherm", "Zoom en instellingen wijzigen", - "Lijst met gameauteurs weergeven", + "Toon de lijst met game-auteurs", "Sluit het spel en keer terug naar" ], "distribute": "Niet distribueren" }, "settings": { "title": "Opties", - "back": "Terug", - "size": "Interfacegrootte", + "back": "Opbrengst", + "size": "Interfacegrootte:", "music": "Muziek activeren", "lang": "Tong", - "voice": "Activeer de stem", + "voice": "Stem activeren", "yes": "Ja", - "no": "niet", - "notice": "De instellingen worden pas toegepast nadat Kartik opnieuw is opgestart" + "no": "Neen", + "notice": "De instellingen worden pas toegepast nadat Kartik . opnieuw is opgestart" }, "win": { "solo": { - "win": "Je hebt gewonnen.", - "lose": "Jij hebt verloren!" + "win": "Je hebt gewonnen !", + "lose": "Je hebt verloren!" }, "versus": "Speler 0 heeft gewonnen!", "quit": [ - "Druk op Escape om te vertrekken", - "Druk op B om te vertrekken" + "Druk op Esc om af te sluiten", + "Druk op B om af te sluiten" ] }, "online": { "menu": { - "local": "Lokale", - "online": "Online", - "dlocal": "Spelen met een vriend op dezelfde machine", - "donline": "Het spelen met een vriend op verschillende machines" + "local": "lokaal", + "online": "In lijn", + "dlocal": "Speel met een vriend op dezelfde machine", + "donline": "Speel met een vriend op verschillende machines" }, "error": { - "connection": "Communicatiefout", - "disconnect": "Verbroken" + "connection": "Communicatie fout", + "disconnect": "Verbinding verbroken" }, - "connecting": "Verbinding maken met de server...", + "connecting": "Verbinding met de server...", "intro": { - "create": "Een spel maken", - "pcreate": "Geef deze code aan je teamgenoot om verbinding te maken met je spel:", - "join": "Deelnemen aan een spel", - "pjoin": "Voer de code van je teamgenoot in om deel te nemen aan zijn spel:" + "create": "Maak een spel", + "pcreate": "Geef deze code aan je teamgenoot om in te loggen op je game:", + "join": "Doe mee aan een spel", + "pjoin": "Voer de code van je teamgenoot in om deel te nemen aan hun spel:" }, - "disconnected": "Verbroken verbinding", - "unable": "Kan geen verbinding maken met de server", + "disconnected": "Verbinding verbroken", + "unable": "Onmogelijk om verbinding te maken met de server", "internal": "Interne systeemfout", - "loading": "Voorbereiding op het spel...", - "discord": "Online", + "loading": "Voorbereiden op het spel...", + "discord": "In lijn", "generate": "Het land laden...", - "discord2": "Ontmoet een fout", - "timeout": "De wachttijd is overschreden", - "aborted": "De andere speler verliet het spel", - "car0": "Uw auto", + "discord2": "Er is een fout opgetreden", + "timeout": "De time-out is overschreden", + "aborted": "De andere speler heeft het spel verlaten", + "car0": "Jouw auto", "car1": "Zijn auto" }, "stats": { "menu": "Statistieken", "title": "Spelstatistieken", "items": { - "times.single": "Tijd doorgebracht in singleplayer", + "times.single": "Tijd doorgebracht in de modus voor \u00e9\u00e9n speler", "times.local": "Tijd doorgebracht in lokale modus", - "times.online": "Tijd besteed aan online spelen", - "results.wins": "Aantal games dat je hebt gewonnen", - "results.loses": "Aantal games dat je hebt verloren", - "ingame.walls": "Aantal botsingen", - "ingame.laps": " Aantal ronden dat je hebt gemaakt", - "ingame.turns": "Aantal omwentelingen dat je hebt gemaakt" + "times.online": "Tijd doorgebracht in online modus", + "results.wins": "Aantal gewonnen games", + "results.loses": "Aantal verloren games", + "ingame.walls": "Totaal aantal botsingen", + "ingame.laps": "Totaal aantal ronden", + "ingame.turns": "Totaal aantal beurten" } + }, + "polymer": { + "gpu": "GPU-ondersteuningsstatus", + "gpuShift": "Druk op Shift om meer te zien", + "logging": "Wij verbinden u; ", + "loginClose": "U kunt dit tabblad of venster nu sluiten en terugkeren naar Kartik.", + "gatheringLogin": "Wij verifi\u00ebren uw account; ", + "loginIntro": "Druk op L om verbinding te maken", + "logout": "L om uit te loggen", + "ktoLevel": "Niveau", + "ktoMaxLevel": "God", + "error": [ + "Kan niet communiceren met servers", + "U kunt Kartik Online pas gebruiken als we met de servers kunnen communiceren.", + "Verbinden met het internet" + ], + "updateError": [ + "Kan niet controleren op updates", + "We kunnen momenteel niet op updates controleren. Probeer het later opnieuw." + ], + "levelup": [ + "Hoger level !", + "Je hebt het niveau bereikt", + "en je krijgt kracht! " + ], + "finished": [ + "Je hebt het spel verslagen!", + "Afgewerkt Kartik?! " + ], + "token": [ + "Losgekoppeld van elders", + "U bent uitgelogd bij Kartik Online omdat uw sessie ergens anders is be\u00ebindigd." + ] } }
\ No newline at end of file diff --git a/lang/preload.js b/lang/preload.js index 5fbaa65..14f26be 100644 --- a/lang/preload.js +++ b/lang/preload.js @@ -1,2 +1,2 @@ -global.lp = win.lp; +global.lp = win.lp;
global.lang = JSON.parse(require('fs').readFileSync("./lang/" + lp + ".json"));
\ No newline at end of file diff --git a/lang/pt.json b/lang/pt.json index a17eda9..7c144e7 100644 --- a/lang/pt.json +++ b/lang/pt.json @@ -1,11 +1,11 @@ { "crash": { "title": "Kartik Crash Reporter", - "head": "Kartik parou de trabalhar", - "intro": "Kartik encontrou um problema e parou inesperadamente.Coletamos informa\u00e7\u00f5es adicionais, e um relat\u00f3rio de falha foi enviado automaticamente aos desenvolvedores se voc\u00ea estivesse conectado \u00e0 Internet.", + "head": "Kartik parou de trabalhar.", + "intro": "Kartik teve um problema e parou inesperadamente.Coletamos informa\u00e7\u00f5es adicionais, e um relat\u00f3rio de falha foi enviado automaticamente aos desenvolvedores se voc\u00ea estivesse conectado \u00e0 Internet.", "report": [ "Al\u00e9m disso, um relat\u00f3rio de acidente foi criado em \"", - "para que voc\u00ea possa envi\u00e1-lo para desenvolvedores quando voc\u00ea tiver acesso \u00e0 Internet." + "\", para que voc\u00ea possa envi\u00e1-lo para desenvolvedores quando voc\u00ea tiver acesso \u00e0 Internet." ], "close": "fechar", "reset": "Redefinir Kartik e fechar" @@ -14,31 +14,31 @@ "ok": "Atualizado", "available": "Atualiza\u00e7\u00f5es de jogos dispon\u00edveis", "git": "Executando a vers\u00e3o do porta-malas", - "error": "N\u00e3o consigo encontrar atualiza\u00e7\u00f5es", - "wait": "Procure por atualiza\u00e7\u00f5es...", + "error": "N\u00e3o \u00e9 poss\u00edvel verificar se h\u00e1 atualiza\u00e7\u00f5es", + "wait": "Procurando atualiza\u00e7\u00f5es...", "warn": [ "Atualiza\u00e7\u00f5es est\u00e3o dispon\u00edveis", - "Baixe a nova vers\u00e3o de Kartik no site oficial para os recursos mais recentes e corre\u00e7\u00f5es de bugs." + "Baixe a nova vers\u00e3o de Kartik no site oficial para se beneficiar dos recursos mais recentes e corre\u00e7\u00f5es de bugs." ] }, "scenario": { "intro": [ - "Ei, oi, que tal uma pequena corrida?", - "Ah, aqui est\u00e1 voc\u00ea de novo! Que tal uma pequena corrida?", - "Por que n\u00e3o corremos um pouco?", + "Ei, oi, isso te diz uma pequena corrida?", + "Ah, aqui est\u00e1 voc\u00ea de novo! Isso te diz uma pequena corrida?", + "E se tiv\u00e9ssemos uma pequena corrida?", "Vamos dar uma volta?" ], "ahead1": [ "Ah, n\u00e3o!", - "Inferno, n\u00e3o \u00e9 poss\u00edvel!", - "Mas eu n\u00e3o vou conseguir...", + "Droga, n\u00e3o \u00e9 poss\u00edvel!", + "Mas eu n\u00e3o vou chegar l\u00e1...", "ah...", - "Por que voc\u00ea tem que fazer isso?" + "Por que voc\u00ea?" ], "ahead2": [ "Oi oi oi", "Este \u00e9 para mim!", - "Eu vou peg\u00e1-lo!", + "Eu vou t\u00ea-lo!", "\u00c9 para mim!", "\u00c9 meu!" ], @@ -61,18 +61,18 @@ "Bem, ent\u00e3o, n\u00e3o vamos direto?", "ai", "Deve doer...", - "Splaf, esse \u00e9 o obst\u00e1culo!" + "Splaf, \u00e9 um obst\u00e1culo!" ], "wall2": [ "droga", "porcaria", "De maneira nenhuma", - "Puti" + "" ], "start": [ - "Eu vou te surpreender!", + "Vou me divertir com voc\u00ea!", "Voc\u00ea vai ver, eu vou fazer de voc\u00ea uma dessas corridas!", - "Voc\u00ea vai me contar algumas novidades.", + "Voc\u00ea vai me falar sobre isso.", "Vamos!", "Aqui vamos n\u00f3s!", "Wooo, para a frente!" @@ -80,21 +80,21 @@ }, "discord": { "credits": [ - "espera", + "pendente", "Nos cr\u00e9ditos" ], "game": [ "em risco", "Modo Solo", "Modo Versus", - "Em pausa" + "Pausado" ], "intro": [ - "espera", - "Na introdu\u00e7\u00e3o" + "pendente", + "A introdu\u00e7\u00e3o" ], "settings": [ - "espera", + "pendente", "Nas configura\u00e7\u00f5es" ], "win": [ @@ -103,7 +103,7 @@ ] }, "intro": [ - "Toque em Entrar para come\u00e7ar", + "Pressione Enter para come\u00e7ar", "Pressione A para come\u00e7ar" ], "game": { @@ -111,7 +111,7 @@ "by": "por" }, "gpause": { - "title": "Jogo em pausa", + "title": "Jogo pausado", "continueg": "continuar", "showhb": "Show hitbox", "hidehb": "Ocultar caixa de sucesso", @@ -127,24 +127,24 @@ "Sair" ], "descriptions": [ - "Jogando sozinho e offline contra um rob\u00f4", + "Jogue sozinho e offline contra um rob\u00f4", "Jogue dois na mesma tela", "Alterar zoom e configura\u00e7\u00f5es", - "Ver lista de autores de jogos", + "Veja a lista de autores de jogos", "Feche o jogo e volte para" ], - "distribute": "N\u00e3o distribua." + "distribute": "N\u00e3o distribua" }, "settings": { "title": "Op\u00e7\u00f5es", "back": "retornar", "size": "Tamanho da interface", - "music": "Ativar m\u00fasica", + "music": "Ligue a m\u00fasica", "lang": "l\u00edngua", - "voice": "Ativar a voz", + "voice": "Habilitar a voz", "yes": "sim", "no": "N\u00e3o", - "notice": "As configura\u00e7\u00f5es n\u00e3o ser\u00e3o aplicadas at\u00e9 depois da reinicializa\u00e7\u00e3o de Kartik" + "notice": "As configura\u00e7\u00f5es s\u00f3 ser\u00e3o aplicadas ap\u00f3s a reinicializa\u00e7\u00e3o do Kartik" }, "win": { "solo": { @@ -153,7 +153,7 @@ }, "versus": "Jogador 0 ganhou!", "quit": [ - "Pressione Escape para sair", + "Pressione A Esc para sair", "Pressione B para sair" ] }, @@ -161,8 +161,8 @@ "menu": { "local": "local", "online": "online", - "dlocal": "Brincando com um amigo na mesma m\u00e1quina", - "donline": "Brincando com um amigo em diferentes m\u00e1quinas" + "dlocal": "Brinque com um amigo na mesma m\u00e1quina", + "donline": "Brinque com um amigo em diferentes m\u00e1quinas" }, "error": { "connection": "Erro de comunica\u00e7\u00e3o", @@ -170,35 +170,68 @@ }, "connecting": "Conectando-se ao servidor...", "intro": { - "create": "Crie um jogo", + "create": "Crie uma pe\u00e7a", "pcreate": "D\u00ea este c\u00f3digo ao seu companheiro de equipe para se conectar ao seu jogo:", "join": "Participe de um jogo", "pjoin": "Digite o c\u00f3digo do seu companheiro de equipe para participar do jogo dele:" }, "disconnected": "Conex\u00e3o perdida", - "unable": "N\u00e3o pode se conectar ao servidor", + "unable": "Incapaz de se conectar ao servidor", "internal": "Erro interno do sistema", - "loading": "Preparando-se para o jogo...", + "loading": "Prepara\u00e7\u00e3o da pe\u00e7a...", "discord": "online", "generate": "Carregando a terra...", "discord2": "Encontra um erro", - "timeout": "O tempo de espera foi excedido", + "timeout": "O tempo limite foi excedido", "aborted": "O outro jogador deixou o jogo.", "car0": "Seu carro", "car1": "O carro dele." }, "stats": { - "menu": "Estatísticas", - "title": "Estatísticas do jogo", + "menu": "estat\u00edstica", + "title": "Estat\u00edsticas do jogo", "items": { - "times.single": "Tempo gasto no modo singleplayer", + "times.single": "Tempo gasto no modo single player", "times.local": "Tempo gasto no modo local", - "times.online": "Tempo gasto jogando online", - "results.wins": "Número de jogos que você ganhou", - "results.loses": "Número de jogos que você perdeu", - "ingame.walls": "Número de colisões que você teve", - "ingame.laps": " Número de voltas que você deu", - "ingame.turns": "Número de rotações que você fez" + "times.online": "Tempo gasto no modo online", + "results.wins": "N\u00famero de jogos ganhos", + "results.loses": "N\u00famero de jogos perdidos", + "ingame.walls": "N\u00famero total de colis\u00f5es", + "ingame.laps": "N\u00famero total de rodadas", + "ingame.turns": "N\u00famero total de curvas" } + }, + "polymer": { + "gpu": "Status de suporte a GPU", + "gpuShift": "Toque em Shift para ver mais", + "logging": "N\u00f3s conectamos voc\u00ea; verifique a janela do seu navegador da Web e permita a conex\u00e3o.", + "loginClose": "Agora voc\u00ea pode fechar esta guia ou janela e retornar para Kartik.", + "gatheringLogin": "Verificamos sua conta; pode demorar um pouco.", + "loginIntro": "Pressione L para fazer login", + "logout": "L para sair", + "ktoLevel": "n\u00edvel", + "ktoMaxLevel": "deus", + "error": [ + "Incapaz de se comunicar com servidores", + "Voc\u00ea n\u00e3o poder\u00e1 usar o Kartik Online at\u00e9 que possamos nos comunicar com os servidores.", + "Conecte-se \u00e0 Internet" + ], + "updateError": [ + "N\u00e3o \u00e9 poss\u00edvel verificar se h\u00e1 atualiza\u00e7\u00f5es", + "N\u00e3o podemos verificar se h\u00e1 atualiza\u00e7\u00f5es agora, tentar novamente mais tarde." + ], + "levelup": [ + "N\u00edvel superior!", + "Voc\u00ea atingiu o n\u00edvel", + "e voc\u00ea ganha poder! V\u00e1 em frente e tente alcan\u00e7ar o n\u00edvel m\u00e1ximo." + ], + "finished": [ + "Voc\u00ea venceu o jogo!", + "Chega de Kartik? sim. Voc\u00ea atingiu o n\u00edvel de Deus!" + ], + "token": [ + "Desconectado de outro lugar", + "Voc\u00ea foi logado fora do Kartik Online porque sua sess\u00e3o foi encerrada desde outro lugar." + ] } }
\ No newline at end of file diff --git a/lang/ru.json b/lang/ru.json index 10cc206..da158b9 100644 --- a/lang/ru.json +++ b/lang/ru.json @@ -1,100 +1,100 @@ { "crash": { - "title": "Kartik \u0410\u0432\u0430\u0440\u0438\u0438 \u0420\u0435\u043f\u043e\u0440\u0442\u0435\u0440", + "title": "Kartik Crash Reporter", "head": "\u041a\u0430\u0440\u0442\u0438\u043a \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c", - "intro": "\u041a\u0430\u0440\u0442\u0438\u043a \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0438 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0441\u044f.\u041c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0438 \u043e\u0442\u0447\u0435\u0442 \u043e \u0441\u0431\u043e\u044f\u0445 \u0431\u044b\u043b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u0435\u0441\u043b\u0438 \u0432\u044b \u0431\u044b\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043a \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443.", + "intro": "\u041a\u0430\u0440\u0442\u0438\u043a \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0438 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0441\u044f. ", "report": [ - "\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432 \"", - "\u0442\u0430\u043a \u0447\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443." + "\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043e\u0442\u0447\u0435\u0442 \u043e \u0441\u0431\u043e\u0435 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0432 \"", + "\u0427\u0442\u043e\u0431\u044b \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442." ], - "close": "\u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c", - "reset": "\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c Kartik \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044c" + "close": "\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c", + "reset": "\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u041a\u0430\u0440\u0442\u0438\u043a \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044c" }, "updates": { - "ok": "\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439", - "available": "\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0433\u0440", - "git": "\u0417\u0430\u043f\u0443\u0441\u043a \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0430\u0433\u0430\u0436\u043d\u0438\u043a\u0430", - "error": "\u041d\u0435 \u043c\u043e\u0433\u0443 \u043d\u0430\u0439\u0442\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f", - "wait": "\u041f\u043e\u0438\u0441\u043a \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439...", + "ok": "\u0421\u0432\u043e\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e", + "available": "\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u044b", + "git": "\u0417\u0430\u043f\u0443\u0441\u043a \u043c\u0430\u0433\u0438\u0441\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438", + "error": "\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439", + "wait": "\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 ...", "warn": [ "\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f", - "\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e Kartik \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430 \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u043e\u0448\u0438\u0431\u043e\u043a." + "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e Kartik \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u043e\u0448\u0438\u0431\u043e\u043a." ] }, "scenario": { "intro": [ - "\u042d\u0439, \u043f\u0440\u0438\u0432\u0435\u0442, \u043a\u0430\u043a \u043d\u0430\u0441\u0447\u0435\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0431\u0435\u0436\u043a\u0438?", - ", \u0432\u043e\u0442 \u0432\u044b \u0441\u043d\u043e\u0432\u0430! \u041a\u0430\u043a \u043d\u0430\u0441\u0447\u0435\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0431\u0435\u0436\u043a\u0438?", - "\u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0430\u043c \u043d\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0431\u0435\u0433\u0430\u0442\u044c?", - "\u041c\u044b \u0438\u0434\u0435\u043c \u0433\u0443\u043b\u044f\u0442\u044c?" + "\u042d\u0439, \u043f\u0440\u0438\u0432\u0435\u0442, \u043a\u0430\u043a \u043d\u0430\u0441\u0447\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u043f\u0440\u043e\u0431\u0435\u0436\u043a\u0438?", + "\u0410, \u0432\u043e\u0442 \u0438 \u0442\u044b! ", + "\u041a\u0430\u043a \u043d\u0430\u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0433\u043e\u043d\u043a\u0443?", + "\u041c\u043e\u0436\u0435\u0442, \u043f\u0440\u043e\u0433\u0443\u043b\u044f\u0435\u043c\u0441\u044f?" ], "ahead1": [ - "\u041e, \u043d\u0435\u0442!", - "\u0427\u0435\u0440\u0442, \u044d\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e!", - "\u041d\u043e \u044f \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e ...", - "\u041e,...", - "\u0417\u0430\u0447\u0435\u043c \u0442\u044b \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0448\u044c?" + "\u041e, \u043d\u0435\u0442 !", + "\u0411\u043b\u0438\u043d, \u044d\u0442\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e!", + "\u041d\u043e \u044f \u0442\u0443\u0434\u0430 \u043d\u0435 \u0434\u043e\u0431\u0435\u0440\u0443\u0441\u044c ...", + "\u0418 \u0447\u0435\u0440\u0442 ...", + "\u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u044b ?" ], "ahead2": [ - "\u041f\u0440\u0438\u0432\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0442", + "\u0425\u0438 \u0445\u0438 \u0445\u0438", "\u042d\u0442\u043e \u0434\u043b\u044f \u043c\u0435\u043d\u044f!", - "\u042f \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u043d\u0443!", + "\u042f \u0431\u0443\u0434\u0443 \u0438\u043c\u0435\u0442\u044c \u044d\u0442\u043e!", "\u042d\u0442\u043e \u0434\u043b\u044f \u043c\u0435\u043d\u044f!", - "\u042d\u0442\u043e \u043c\u043e\u0451!" + "\u042d\u0442\u043e \u043c\u043e\u0435 !" ], "won1": [ - "\u041f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e!", - "\u0421\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u043b\u043e\u0445\u043e \u0434\u043b\u044f \u043c\u0435\u043d\u044f ...", - "\u042f, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u0434\u0435\u044f\u043b\u0441\u044f...", - "\u041d\u043e, \u044d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u043e!", - "\u041f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e!" + "\u0425\u043e\u0440\u043e\u0448\u0430\u044f \u0438\u0433\u0440\u0430 !", + "\u0416\u0430\u043b\u043a\u043e \u0434\u043b\u044f \u043c\u0435\u043d\u044f ...", + "\u042f \u043c\u043e\u0433 \u043d\u0430\u0434\u0435\u044f\u0442\u044c\u0441\u044f ...", + "\u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u043e!", + "\u041e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 !" ], "won2": [ - "\u042f \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0442\u0435\u0431\u0435!", - "\u041a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u044f \u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u043b \u0442\u0435\u0431\u044f!", - "\u042f \u043f\u043e\u0431\u0435\u0434\u0438\u043b!", - "\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u044f \u0432\u044b\u0438\u0433\u0440\u0430\u043b\u0430!", + "\u042f \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0442\u0435\u0431\u0435 !", + "\u041a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u044f \u0442\u0435\u0431\u044f \u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u043b!", + "\u042f \u0432\u044b\u0438\u0433\u0440\u0430\u043b !", + "\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u044f \u043f\u043e\u0431\u0435\u0434\u0438\u043b!", "\u0418 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0434\u043b\u044f \u043c\u0435\u043d\u044f!" ], "wall1": [ - "\u0430\u0445!", - "\u041d\u0443, \u0442\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u044f\u043c\u043e?", - "\u043e\u0439", - "\u042d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u043d\u043e ...", - "\u0421\u043f\u043b\u0430\u0444, \u044d\u0442\u043e \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0435!" + "\u0410\u0445 \u0430\u0445!", + "\u0427\u0442\u043e \u0436, \u043c\u044b \u043d\u0435 \u043f\u043e\u0439\u0434\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e?", + "\u041e\u0439", + "\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0431\u043e\u043b\u044c\u043d\u043e ...", + "\u0421\u043f\u043b\u0430\u0444, \u043d\u0435 \u043c\u0435\u0448\u0430\u0439!" ], "wall2": [ - "\u043f\u0440\u043e\u043a\u043b\u0438\u043d\u0430\u0442\u044c", - "\u0434\u0435\u0440\u044c\u043c\u043e", - "\u0412\u044b \u0448\u0443\u0442\u0438\u0442\u0435", + "\u0414\u0435\u0440\u044c\u043c\u043e", + "\u041a\u0430\u043a\u0430\u0442\u044c", + "\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e", "\u041f\u0443\u0442\u0438" ], "start": [ - "\u042f \u0442\u0435\u0431\u044f \u0432\u0437\u043e\u0440\u0432\u0443!", - "\u0412\u043e\u0442 \u0443\u0432\u0438\u0434\u0438\u0448\u044c, \u044f \u0441\u0434\u0435\u043b\u0430\u044e \u0442\u0435\u0431\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0440\u0430\u0441!", - "\u0412\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442\u0435 \u043c\u043d\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438", - "\u041f\u043e\u0435\u0445\u0430\u043b\u0438!", - "\u0432\u043e\u0442 \u0442\u0430\u043a!", - "\u0412\u0443, \u0432\u043f\u0435\u0440\u0435\u0434!" + "\u042f \u0431\u0443\u0434\u0443 \u0432\u0435\u0441\u0435\u043b\u0438\u0442\u044c\u0441\u044f!", + "\u0412\u043e\u0442 \u0443\u0432\u0438\u0434\u0438\u0448\u044c, \u044f \u0441\u0434\u0435\u043b\u0430\u044e \u0442\u0435\u0431\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0442\u0435\u0445 \u0433\u043e\u043d\u043e\u043a!", + "\u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0438 \u043c\u043d\u0435 \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u043e\u0432\u043e\u0441\u0442\u0438", + "\u041f\u043e\u0439\u0434\u0435\u043c!", + "\u0412\u043e\u0442 \u0442\u0430\u043a !", + "\u0423\u0443\u0443\u0443, \u0432\u043f\u0435\u0440\u0435\u0434!" ] }, "discord": { "credits": [ - "\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435", + "\u041e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0439", "\u0412 \u0442\u0438\u0442\u0440\u0430\u0445" ], "game": [ - "\u0432 \u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438", - "\u0420\u0435\u0436\u0438\u043c \u0421\u043e\u043b\u043e", - "\u0420\u0435\u0436\u0438\u043c \u043f\u0440\u043e\u0442\u0438\u0432", - "\u041d\u0430 \u043f\u0430\u0443\u0437\u0435" + "\u0421\u0442\u0430\u0432\u043a\u0438", + "\u0421\u043e\u043b\u043e \u0440\u0435\u0436\u0438\u043c", + "\u0420\u0435\u0436\u0438\u043c Versus", + "\u0412 \u043f\u0435\u0440\u0435\u0440\u044b\u0432\u0435" ], "intro": [ - "\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435", + "\u041e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0439", "\u041e \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0438" ], "settings": [ - "\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435", + "\u041e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0439", "\u0412 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445" ], "win": [ @@ -103,102 +103,135 @@ ] }, "intro": [ - "\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u0412\u0445\u043e\u0434, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443", - "\u041d\u0430\u0436\u043c\u0438\u0442\u0435 A, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443" + "\u041d\u0430\u0436\u043c\u0438\u0442\u0435 Enter, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c", + "\u041d\u0430\u0436\u043c\u0438\u0442\u0435 A, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c" ], "game": { "credits": { - "by": "\u043e\u043a\u043e\u043b\u043e" + "by": "\u043f\u043e" }, "gpause": { - "title": "\u0418\u0433\u0440\u0430 \u043d\u0430 \u043f\u0430\u0443\u0437\u0435", - "continueg": "\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c", + "title": "\u0418\u0433\u0440\u0430 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430", + "continueg": "\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c", "showhb": "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0445\u0438\u0442\u0431\u043e\u043a\u0441", "hidehb": "\u0421\u043a\u0440\u044b\u0442\u044c \u0445\u0438\u0442\u0431\u043e\u043a\u0441", - "quit": "\u0423\u0435\u0437\u0436\u0430\u0442\u044c" + "quit": "\u041f\u043e\u043a\u0438\u0434\u0430\u0442\u044c, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c" } }, "menu": { "titles": [ - "\u0441\u043e\u043b\u043e", - "\u043f\u0440\u043e\u0442\u0438\u0432", - "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b", - "\u043a\u0440\u0435\u0434\u0438\u0442\u044b", - "\u0423\u0435\u0437\u0436\u0430\u0442\u044c" + "\u0421\u043e\u043b\u043e", + "\u041f\u0440\u043e\u0442\u0438\u0432", + "\u041e\u043f\u0446\u0438\u0438", + "\u041a\u0440\u0435\u0434\u0438\u0442\u044b", + "\u041f\u043e\u043a\u0438\u0434\u0430\u0442\u044c, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c" ], "descriptions": [ - "\u0418\u0433\u0440\u0430\u044f \u0432 \u043e\u0434\u0438\u043d\u043e\u0447\u043a\u0443 \u0438 \u0432 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u0440\u043e\u0442\u0438\u0432 \u0440\u043e\u0431\u043e\u0442\u0430", - "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435", - "\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a", - "\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0432\u0442\u043e\u0440\u043e\u0432 \u0438\u0433\u0440", - "\u0417\u0430\u043a\u0440\u043e\u0439\u0442\u0435 \u0438\u0433\u0440\u0443 \u0438 \u0432\u0435\u0440\u043d\u0438\u0442\u0435\u0441\u044c \u043a" + "\u0418\u0433\u0440\u0430\u0439\u0442\u0435 \u0432 \u043e\u0434\u0438\u043d\u043e\u0447\u043a\u0443 \u0438 \u0432 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u0440\u043e\u0442\u0438\u0432 \u0440\u043e\u0431\u043e\u0442\u0430", + "\u0418\u0433\u0440\u0430\u0439\u0442\u0435 \u0432\u0434\u0432\u043e\u0435\u043c \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435", + "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438", + "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0432\u0442\u043e\u0440\u043e\u0432 \u0438\u0433\u0440\u044b", + "\u0417\u0430\u043a\u0440\u043e\u0439\u0442\u0435 \u0438\u0433\u0440\u0443 \u0438 \u0432\u0435\u0440\u043d\u0438\u0442\u0435\u0441\u044c \u0432" ], - "distribute": "\u041d\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0439\u0442\u0435" + "distribute": "\u041d\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c" }, "settings": { - "title": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b", - "back": "\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c", + "title": "\u041e\u043f\u0446\u0438\u0438", + "back": "\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435", "size": "\u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430", "music": "\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0443\u0437\u044b\u043a\u0443", - "lang": "\u044f\u0437\u044b\u043a", + "lang": "\u042f\u0437\u044b\u043a", "voice": "\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0441", - "yes": "\u0414\u0430", - "no": "\u041d\u0435\u0442", - "notice": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 Kartik" + "yes": "\u0434\u0430", + "no": "\u043d\u0435\u0442", + "notice": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u0441\u0442\u0443\u043f\u044f\u0442 \u0432 \u0441\u0438\u043b\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u041a\u0430\u0440\u0442\u0438\u043a\u0430." }, "win": { "solo": { - "win": "\u0422\u044b \u0432\u044b\u0438\u0433\u0440\u0430\u043b\u0430!", - "lose": "\u0422\u044b \u043f\u0440\u043e\u0438\u0433\u0440\u0430\u043b!" + "win": "\u0412\u044b \u0432\u044b\u0438\u0433\u0440\u0430\u043b\u0438 !", + "lose": "\u0422\u044b \u043f\u0440\u043e\u0438\u0433\u0440\u0430\u043b\u0430 !" }, "versus": "\u0418\u0433\u0440\u043e\u043a 0 \u0432\u044b\u0438\u0433\u0440\u0430\u043b!", "quit": [ - "\u041f\u0440\u0435\u0441\u0441 \u041f\u043e\u0431\u0435\u0433 \u0443\u0439\u0442\u0438", - "\u041d\u0430\u0436\u043c\u0438\u0442\u0435 B, \u0447\u0442\u043e\u0431\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c" + "\u041d\u0430\u0436\u043c\u0438\u0442\u0435 Esc \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u0430", + "\u041d\u0430\u0436\u043c\u0438\u0442\u0435 B, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0439\u0442\u0438" ] }, "online": { "menu": { - "local": "\u043c\u0435\u0441\u0442\u043d\u044b\u0439", - "online": "\u041e\u043d\u043b\u0430\u0439\u043d", - "dlocal": "\u0418\u0433\u0440\u0430 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435", - "donline": "\u0418\u0433\u0440\u0430 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445" + "local": "\u041c\u0435\u0441\u0442\u043d\u044b\u0439", + "online": "\u0412 \u043e\u0447\u0435\u0440\u0435\u0434\u0438", + "dlocal": "\u0418\u0433\u0440\u0430\u0439\u0442\u0435 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435", + "donline": "\u0418\u0433\u0440\u0430\u0439\u0442\u0435 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445" }, "error": { "connection": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u0432\u044f\u0437\u0438", - "disconnect": "\u0431\u0435\u0441\u0441\u0432\u044f\u0437\u043d\u044b\u0439" + "disconnect": "\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d" }, - "connecting": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443...", + "connecting": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 ...", "intro": { - "create": "\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0438\u0433\u0440\u0443", - "pcreate": "\u0414\u0430\u0439\u0442\u0435 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432\u0430\u0448\u0435\u043c\u0443 \u0442\u043e\u0432\u0430\u0440\u0438\u0449\u0443 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0432\u0430\u0448\u0435\u0439 \u0438\u0433\u0440\u0435:", - "join": "\u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043a \u0438\u0433\u0440\u0435", - "pjoin": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043e\u0434 \u0432\u0430\u0448\u0435\u0433\u043e \u0442\u043e\u0432\u0430\u0440\u0438\u0449\u0430 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043a \u0435\u0433\u043e \u0438\u0433\u0440\u0435:" + "create": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u0433\u0440\u0443", + "pcreate": "\u0414\u0430\u0439\u0442\u0435 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0441\u0432\u043e\u0435\u043c\u0443 \u0442\u043e\u0432\u0430\u0440\u0438\u0449\u0443 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0439\u0442\u0438 \u0432 \u0432\u0430\u0448\u0443 \u0438\u0433\u0440\u0443:", + "join": "\u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u043a \u0438\u0433\u0440\u0435", + "pjoin": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043e\u0434 \u0441\u0432\u043e\u0435\u0433\u043e \u0442\u043e\u0432\u0430\u0440\u0438\u0449\u0430 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043a \u0435\u0433\u043e \u0438\u0433\u0440\u0435:" }, - "disconnected": "\u041f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435", - "unable": "\u041d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443", - "internal": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b", - "loading": "\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u0438\u0433\u0440\u0435...", - "discord": "\u041e\u043d\u043b\u0430\u0439\u043d", - "generate": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0437\u0435\u043c\u043b\u0438...", - "discord2": "\u0412\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443", - "timeout": "\u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u043e", + "disconnected": "\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043e", + "unable": "\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443", + "internal": "\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430", + "loading": "\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u0438\u0433\u0440\u0435 ...", + "discord": "\u0412 \u043e\u0447\u0435\u0440\u0435\u0434\u0438", + "generate": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0437\u0435\u043c\u043b\u0438 ...", + "discord2": "\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443", + "timeout": "\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d \u0442\u0430\u0439\u043c-\u0430\u0443\u0442", "aborted": "\u0414\u0440\u0443\u0433\u043e\u0439 \u0438\u0433\u0440\u043e\u043a \u043f\u043e\u043a\u0438\u043d\u0443\u043b \u0438\u0433\u0440\u0443", - "car0": "\u0412\u0430\u0448 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044c", + "car0": "\u0422\u0432\u043e\u044f \u043c\u0430\u0448\u0438\u043d\u0430", "car1": "\u0415\u0433\u043e \u043c\u0430\u0448\u0438\u043d\u0430" }, "stats": { - "menu": "Статистика", - "title": "Статистика игры", + "menu": "\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430", + "title": "\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u0438\u0433\u0440", "items": { - "times.single": "Время, проведенное в одиночной игре", - "times.local": "Время, проведенное в локальном режиме", - "times.online": "Время, проведенное в сети", - "results.wins": "Количество выигранных игр", - "results.loses": "Количество проигранных игр", - "ingame.walls": "Количество столкновений, которые у вас были", - "ingame.laps": " Количество сделанных вами кругов", - "ingame.turns": "Количество сделанных вами вращений" + "times.single": "\u0412\u0440\u0435\u043c\u044f, \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0435 \u0432 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435", + "times.local": "\u0412\u0440\u0435\u043c\u044f, \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0435 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435", + "times.online": "\u0412\u0440\u0435\u043c\u044f, \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0435 \u0432 \u043e\u043d\u043b\u0430\u0439\u043d-\u0440\u0435\u0436\u0438\u043c\u0435", + "results.wins": "\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u0438\u0433\u0440\u0430\u043d\u043d\u044b\u0445 \u0438\u0433\u0440", + "results.loses": "\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0438\u0433\u0440\u0430\u043d\u043d\u044b\u0445 \u0438\u0433\u0440", + "ingame.walls": "\u041e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439", + "ingame.laps": "\u041e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0440\u0443\u0433\u043e\u0432", + "ingame.turns": "\u041e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0438\u0442\u043a\u043e\u0432" } + }, + "polymer": { + "gpu": "\u0421\u0442\u0430\u0442\u0443\u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 GPU", + "gpuShift": "\u041d\u0430\u0436\u043c\u0438\u0442\u0435 Shift, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435", + "logging": "\u041c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0432\u0430\u0441; ", + "loginClose": "\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u044d\u0442\u0443 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0438\u043b\u0438 \u043e\u043a\u043d\u043e \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u0432 Kartik.", + "gatheringLogin": "\u041c\u044b \u0432\u0435\u0440\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0432\u0430\u0448\u0443 \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c; ", + "loginIntro": "\u041d\u0430\u0436\u043c\u0438\u0442\u0435 L, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f", + "logout": "L \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u0430", + "ktoLevel": "\u0423\u0440\u043e\u0432\u0435\u043d\u044c", + "ktoMaxLevel": "\u0411\u043e\u0433", + "error": [ + "\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438", + "\u0412\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Kartik Online, \u043f\u043e\u043a\u0430 \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u0441\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438.", + "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443" + ], + "updateError": [ + "\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439", + "\u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0437\u0436\u0435." + ], + "levelup": [ + "\u0412\u044b\u0441\u0448\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c !", + "\u0412\u044b \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0438 \u0443\u0440\u043e\u0432\u043d\u044f", + "\u0438 \u0442\u044b \u043e\u0431\u0440\u0435\u0442\u0430\u0435\u0448\u044c \u0441\u0438\u043b\u0443! " + ], + "finished": [ + "\u0412\u044b \u043f\u0440\u043e\u0448\u043b\u0438 \u0438\u0433\u0440\u0443!", + "\u0414\u043e\u0434\u0435\u043b\u0430\u043b \u041a\u0430\u0440\u0442\u0438\u043a ?! " + ], + "token": [ + "\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445", + "\u0412\u044b \u0432\u044b\u0448\u043b\u0438 \u0438\u0437 Kartik Online, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0430\u0448 \u0441\u0435\u0430\u043d\u0441 \u0431\u044b\u043b \u043f\u0440\u0435\u0440\u0432\u0430\u043d \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435." + ] } }
\ No newline at end of file diff --git a/lang/zh.json b/lang/zh.json index 2934235..f921ddb 100644 --- a/lang/zh.json +++ b/lang/zh.json @@ -1,81 +1,81 @@ { "crash": { - "title": "\u5361\u8482\u514b\u5d29\u6e83\u8bb0\u8005", - "head": "\u5361\u8482\u514b\u505c\u6b62\u5de5\u4f5c", - "intro": "\u5361\u8482\u514b\u9047\u5230\u4e86\u95ee\u9898\uff0c\u610f\u5916\u5730\u505c\u4e86\u4e0b\u6765\u3002\u6211\u4eec\u6536\u96c6\u4e86\u5176\u4ed6\u4fe1\u606f\uff0c\u5982\u679c\u60a8\u8fde\u63a5\u5230 Internet\uff0c\u5219\u4f1a\u81ea\u52a8\u5411\u5f00\u53d1\u4eba\u5458\u53d1\u9001\u5d29\u6e83\u62a5\u544a\u3002", + "title": "Kartik \u5d29\u6e83\u62a5\u544a\u5668", + "head": "Kartik \u5df2\u505c\u6b62\u5de5\u4f5c", + "intro": "Kartik \u9047\u5230\u95ee\u9898\uff0c\u610f\u5916\u505c\u6b62\u3002", "report": [ - "\u6b64\u5916\uff0c\u5728\"", - "\u56e0\u6b64\uff0c\u60a8\u53ef\u4ee5\u5728\u8bbf\u95ee\u4e92\u8054\u7f51\u65f6\u5c06\u5176\u53d1\u9001\u7ed9\u5f00\u53d1\u4eba\u5458\u3002" + "\u6b64\u5916\uff0c\u5728\u201c", + "\u4ee5\u4fbf\u60a8\u53ef\u4ee5\u5728\u53ef\u4ee5\u8bbf\u95ee Internet \u65f6\u5c06\u5176\u53d1\u9001\u7ed9\u5f00\u53d1\u4eba\u5458\u3002" ], "close": "\u5173\u95ed", - "reset": "\u91cd\u7f6e\u5361\u63d0\u514b\u5e76\u5173\u95ed" + "reset": "\u91cd\u7f6e Kartik \u5e76\u5173\u95ed" }, "updates": { - "ok": "\u6700\u65b0\u7684", + "ok": "\u6700\u65b0", "available": "\u53ef\u7528\u7684\u6e38\u620f\u66f4\u65b0", "git": "\u8fd0\u884c\u4e3b\u5e72\u7248\u672c", - "error": "\u627e\u4e0d\u5230\u66f4\u65b0", - "wait": "\u641c\u7d22\u66f4\u65b0...", + "error": "\u65e0\u6cd5\u68c0\u67e5\u66f4\u65b0", + "wait": "\u67e5\u8be2\u66f4\u65b0 ...", "warn": [ - "\u63d0\u4f9b\u66f4\u65b0", - "\u4ece\u5b98\u65b9\u7f51\u7ad9\u4e0b\u8f7d\u65b0\u7248\u672c\u7684 Kartik\uff0c\u4e86\u89e3\u6700\u65b0\u529f\u80fd\u548c\u9519\u8bef\u4fee\u590d\u3002" + "\u6709\u66f4\u65b0\u53ef\u7528", + "\u4ece\u5b98\u65b9\u7f51\u7ad9\u4e0b\u8f7d\u65b0\u7248 Kartik \u4ee5\u53d7\u76ca\u4e8e\u6700\u65b0\u529f\u80fd\u548c\u9519\u8bef\u4fee\u590d\u3002" ] }, "scenario": { "intro": [ - "\u563f\uff0c\u55e8\uff0c\u8dd1\u4e00\u4f1a\u513f\u600e\u4e48\u6837\uff1f", - "\u554a\uff0c\u4f60\u53c8\u6765\u4e86\uff01\u8dd1\u4e00\u4f1a\u513f\u600e\u4e48\u6837\uff1f", - "\u6211\u4eec\u4e3a\u4ec0\u4e48\u4e0d\u8dd1\u4e00\u5c0f\u8dd1\u5462\uff1f", - "\u6211\u4eec\u8981\u53bb\u6563\u6b65\u5417\uff1f" + "\u563f\uff0c\u55e8\uff0c\u5feb\u8dd1\u600e\u4e48\u6837\uff1f", + "\u554a\uff0c\u4f60\u53c8\u6765\u4e86\uff01", + "\u6211\u4eec\u6765\u4e00\u573a\u5c0f\u6bd4\u8d5b\u600e\u4e48\u6837\uff1f", + "\u6211\u4eec\u53bb\u6563\u6563\u6b65\u5427\uff1f" ], "ahead1": [ - "\u54e6\u4e0d\uff01", - "\u89c1\u9b3c\uff0c\u8fd9\u662f\u4e0d\u53ef\u80fd\u7684\uff01", - "\u4f46\u6211\u4e0d\u4f1a\u6210\u529f\u3002\u3002\u3002", - "\u54e6\u3002\u3002\u3002", - "\u4f60\u4e3a\u4ec0\u4e48\u8981\u8fd9\u4e48\u505a\uff1f" + "\u4e0d\u597d\u4e86 \uff01", + "\u53ef\u6076\uff0c\u8fd9\u4e0d\u53ef\u80fd\uff01", + "\u4f46\u6211\u4e0d\u4f1a\u53bb\u90a3\u91cc......", + "\u8fd8\u6709\u5988\u7684...", + "\u4e3a\u4ec0\u4e48\u4f60 \uff1f" ], "ahead2": [ - "\u55e8\u55e8\u55e8\u55e8", + "\u563b\u563b\u563b", "\u8fd9\u4e2a\u662f\u7ed9\u6211\u7684\uff01", - "\u6211\u4f1a\u62ff\u5230\u7684\uff01", - "\u662f\u7ed9\u6211\u7684\uff01", - "\u662f\u6211\u7684\uff01" + "\u6211\u4f1a\u7684\uff01", + "\u8fd9\u662f\u7ed9\u6211\u7684\uff01", + "\u8fd9\u662f\u6211\u7684 \uff01" ], "won1": [ - "\u5e72\u7684\u597d\uff01", - "\u5bf9\u6211\u6765\u8bf4\u592a\u7cdf\u7cd5\u4e86\u3002\u3002\u3002", - "\u6211\u672c\u6765\u5e0c\u671b\u3002\u3002\u3002", - "\u4f46\u662f\uff0c\u5b83\u4e0d\u662f\u5f88\u597d\uff01", - "\u5e72\u7684\u597d\uff01" + "\u597d\u6e38\u620f \uff01", + "\u5bf9\u6211\u6765\u8bf4\u592a\u7cdf\u7cd5\u4e86...", + "\u6211\u672c\u6765\u53ef\u4ee5\u5e0c\u671b...", + "\u4f46\u662f\uff0c\u4e0d\u662f\u5f88\u597d\u770b\uff01", + "\u505a\u5f97\u597d \uff01" ], "won2": [ - "\u6211\u544a\u8bc9\u8fc7\u4f60\uff01", - "\u597d\u50cf\u6211\u6ca1\u8b66\u544a\u8fc7\u4f60\uff01", - "\u6211\u8d62\u4e86\uff01", + "\u6211\u544a\u8bc9\u4f60\u4e86 \uff01", + "\u597d\u50cf\u6211\u6ca1\u6709\u8b66\u544a\u8fc7\u4f60\uff01", + "\u6211\u8d62\u4e86 \uff01", "\u592a\u597d\u4e86\uff0c\u6211\u8d62\u4e86\uff01", - "\u518d\u7ed9\u6211\u4e00\u4e2a\uff01" + "\u8fd8\u6709\u4e00\u4e2a\u7ed9\u6211\uff01" ], "wall1": [ "\u554a\u554a\uff01", - "\u90a3\u6211\u4eec\u5c31\u4e0d\u76f4\u4e86\uff1f", + "\u90a3\u4e48\uff0c\u6211\u4eec\u662f\u4e0d\u662f\u8d70\u5bf9\u4e86\uff1f", "\u54ce\u54df", - "\u4e00\u5b9a\u5f88\u75db\u3002\u3002\u3002", - "\u65af\u666e\u62c9\u592b\uff0c\u8fd9\u5c31\u662f\u969c\u788d\uff01" + "\u4e00\u5b9a\u5f88\u75db...", + "\u65af\u666e\u62c9\u592b\uff0c\u6ca1\u6709\u969c\u788d\uff01" ], "wall2": [ - "\u8be5\u6b7b\u7684", - "\u5e9f\u8bdd", + "\u62c9\u5c4e", + "\u8239\u5c3e", "\u4e0d\u53ef\u80fd", - "\u666e\u8482" + "\u8386\u7530" ], "start": [ - "\u6211\u8981\u628a\u4f60\u5439\u8d70\uff01", - "\u4f60\u4f1a\u770b\u5230\uff0c\u6211\u4f1a\u8ba9\u4f60\u7684\u90a3\u4e9b\u6bd4\u8d5b\u4e4b\u4e00\uff01", - "\u4f60\u4f1a\u544a\u8bc9\u6211\u4e00\u4e9b\u6d88\u606f", + "\u6211\u4f1a\u73a9\u5f97\u5f88\u5f00\u5fc3\uff01", + "\u4f60\u4f1a\u770b\u5230\uff0c\u6211\u4f1a\u8ba9\u4f60\u6210\u4e3a\u90a3\u4e9b\u79cd\u65cf\u4e4b\u4e00\uff01", + "\u6709\u4ec0\u4e48\u6d88\u606f\u544a\u8bc9\u6211", "\u6211\u4eec\u8d70\u5427\uff01", - "\u6765\u5427\uff01", - "\u54c7\uff0c\u5411\u524d\uff01" + "\u5f00\u59cb\u4e86 \uff01", + "\u545c\uff0c\u524d\u8fdb\uff01" ] }, "discord": { @@ -84,10 +84,10 @@ "\u5728\u5b66\u5206\u4e2d" ], "game": [ - "\u5904\u4e8e\u5371\u9669\u4e4b\u4e2d", - "\u6a21\u5f0f\u72ec\u594f", - "\u6a21\u5f0f\u4e0e", - "\u6682\u505c" + "\u8d4c\u6ce8", + "\u5355\u4eba\u6a21\u5f0f", + "\u5bf9\u6218\u6a21\u5f0f", + "\u4f11\u606f\u65f6" ], "intro": [ "\u7b49\u5f85", @@ -98,107 +98,140 @@ "\u5728\u8bbe\u7f6e\u4e2d" ], "win": [ - "\u521a\u8d62\u4e86", - "\u53ea\u662f\u8f93\u4e86" + "\u521a\u8d62", + "\u521a\u521a\u5931\u53bb\u4e86" ] }, "intro": [ - "\u70b9\u51fb\u8fdb\u5165\u5f00\u59cb", - "\u6309 A \u5f00\u59cb" + "\u6309\u56de\u8f66\u5f00\u59cb", + "\u6309A\u5f00\u59cb" ], "game": { "credits": { - "by": "\u7531" + "by": "\u7ecf\u8fc7" }, "gpause": { - "title": "\u6682\u505c\u6e38\u620f", - "continueg": "\u7ee7\u7eed", + "title": "\u6e38\u620f\u6682\u505c", + "continueg": "\u63a5\u7740\u8bf4", "showhb": "\u663e\u793a\u547d\u4e2d\u6846", - "hidehb": "\u9690\u85cf\u547d\u4e2d\u6846", + "hidehb": "\u9690\u85cf\u78b0\u649e\u7bb1", "quit": "\u79bb\u5f00" } }, "menu": { "titles": [ "\u72ec\u594f", - "\u5bf9", + "\u76f8\u5bf9", "\u9009\u9879", "\u5b66\u5206", "\u79bb\u5f00" ], "descriptions": [ - "\u5355\u72ec\u548c\u79bb\u7ebf\u4e0e\u673a\u5668\u4eba\u6bd4\u8d5b", + "\u5355\u72ec\u548c\u79bb\u7ebf\u5bf9\u6297\u673a\u5668\u4eba", "\u5728\u540c\u4e00\u5c4f\u5e55\u4e0a\u64ad\u653e\u4e24\u4e2a", - "\u66f4\u6539\u53d8\u7126\u548c\u8bbe\u7f6e", - "\u67e5\u770b\u6e38\u620f\u4f5c\u8005\u5217\u8868", - "\u5173\u95ed\u6e38\u620f\u5e76\u8fd4\u56de\u5230" + "\u66f4\u6539\u7f29\u653e\u548c\u8bbe\u7f6e", + "\u663e\u793a\u6e38\u620f\u4f5c\u8005\u5217\u8868", + "\u5173\u95ed\u6e38\u620f\u5e76\u8fd4\u56de" ], - "distribute": "\u4e0d\u5206\u53d1" + "distribute": "\u4e0d\u8981\u6253\u6270" }, "settings": { "title": "\u9009\u9879", "back": "\u8fd4\u56de", - "size": "\u63a5\u53e3\u5927\u5c0f", + "size": "\u63a5\u53e3\u5c3a\u5bf8", "music": "\u6fc0\u6d3b\u97f3\u4e50", - "lang": "\u820c", + "lang": "\u820c\u5934", "voice": "\u6fc0\u6d3b\u8bed\u97f3", "yes": "\u662f\u7684", "no": "\u4e0d", - "notice": "\u8fd9\u4e9b\u8bbe\u7f6e\u8981\u5230\u5361\u63d0\u514b\u91cd\u65b0\u542f\u52a8\u540e\u624d\u4f1a\u5e94\u7528" + "notice": "\u8bbe\u7f6e\u5c06\u4ec5\u5728\u91cd\u65b0\u542f\u52a8 Kartik \u540e\u5e94\u7528" }, "win": { "solo": { "win": "\u4f60\u8d62\u4e86\uff01", - "lose": "\u4f60\u4e22\u5931\uff01" + "lose": "\u4f60\u8f93\u4e86 \uff01" }, - "versus": "\u73a9\u5bb60\u8d62\u4e86\uff01", + "versus": "0\u53f7\u73a9\u5bb6\u8d62\u4e86\uff01", "quit": [ - "\u6309\u4e0b\u9003\u751f\u79bb\u5f00", - "\u6309 B \u79bb\u5f00" + "\u6309 Esc \u9000\u51fa", + "\u6309B\u9000\u51fa" ] }, "online": { "menu": { - "local": "\u5f53\u5730", - "online": "\u5728\u7ebf", - "dlocal": "\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u4e0e\u670b\u53cb\u73a9\u800d", - "donline": "\u5728\u4e0d\u540c\u7684\u673a\u5668\u4e0a\u4e0e\u670b\u53cb\u73a9\u800d" + "local": "\u5f53\u5730\u7684", + "online": "\u6392\u961f", + "dlocal": "\u548c\u670b\u53cb\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u73a9", + "donline": "\u5728\u4e0d\u540c\u7684\u673a\u5668\u4e0a\u4e0e\u670b\u53cb\u4e00\u8d77\u73a9" }, "error": { - "connection": "\u901a\u4fe1\u9519\u8bef", - "disconnect": "\u65ad\u5f00" + "connection": "\u901a\u4fe1\u6545\u969c", + "disconnect": "\u65ad\u5f00\u8fde\u63a5" }, - "connecting": "\u8fde\u63a5\u5230\u670d\u52a1\u5668\u3002\u3002\u3002", + "connecting": "\u8fde\u63a5\u5230\u670d\u52a1\u5668...", "intro": { "create": "\u521b\u5efa\u6e38\u620f", - "pcreate": "\u5c06\u6b64\u4ee3\u7801\u4ea4\u7ed9\u60a8\u7684\u961f\u53cb\u4ee5\u8fde\u63a5\u5230\u60a8\u7684\u6e38\u620f\uff1a", + "pcreate": "\u5c06\u6b64\u4ee3\u7801\u63d0\u4f9b\u7ed9\u60a8\u7684\u961f\u53cb\u4ee5\u767b\u5f55\u60a8\u7684\u6e38\u620f\uff1a", "join": "\u52a0\u5165\u6e38\u620f", - "pjoin": "\u8f93\u5165\u961f\u53cb\u7684\u4ee3\u7801\u4ee5\u52a0\u5165\u4ed6\u7684\u6e38\u620f\uff1a" + "pjoin": "\u8f93\u5165\u60a8\u961f\u53cb\u7684\u4ee3\u7801\u4ee5\u52a0\u5165\u4ed6\u4eec\u7684\u6e38\u620f\uff1a" }, "disconnected": "\u8fde\u63a5\u4e22\u5931", "unable": "\u65e0\u6cd5\u8fde\u63a5\u5230\u670d\u52a1\u5668", "internal": "\u5185\u90e8\u7cfb\u7edf\u9519\u8bef", - "loading": "\u51c6\u5907\u6bd4\u8d5b\u3002\u3002\u3002", - "discord": "\u5728\u7ebf", - "generate": "\u88c5\u8f7d\u571f\u5730...", + "loading": "\u51c6\u5907\u6bd4\u8d5b...", + "discord": "\u6392\u961f", + "generate": "\u52a0\u8f7d\u571f\u5730...", "discord2": "\u9047\u5230\u9519\u8bef", - "timeout": "\u7b49\u5f85\u65f6\u95f4\u5df2\u8fc7", - "aborted": "\u53e6\u4e00\u4e2a\u73a9\u5bb6\u79bb\u5f00\u4e86\u6e38\u620f", + "timeout": "\u5df2\u8d85\u8fc7\u8d85\u65f6", + "aborted": "\u5176\u4ed6\u73a9\u5bb6\u5df2\u79bb\u5f00\u6e38\u620f", "car0": "\u4f60\u7684\u8f66", "car1": "\u4ed6\u7684\u8f66" }, "stats": { - "menu": "统计", - "title": "游戏统计", + "menu": "\u7edf\u8ba1\u6570\u636e", + "title": "\u6bd4\u8d5b\u7edf\u8ba1", "items": { - "times.single": "单人游戏时间", - "times.local": "本地模式时间", - "times.online": "在线游戏时间", - "results.wins": "您赢得的游戏数量", - "results.loses": "您输掉的游戏数量", - "ingame.walls": "您的碰撞次数", - "ingame.laps": "您完成的圈数", - "ingame.turns": "您完成的旋转次数" + "times.single": "\u5728\u5355\u4eba\u6a21\u5f0f\u4e2d\u82b1\u8d39\u7684\u65f6\u95f4", + "times.local": "\u5728\u672c\u5730\u6a21\u5f0f\u4e0b\u82b1\u8d39\u7684\u65f6\u95f4", + "times.online": "\u5728\u7ebf\u6a21\u5f0f\u82b1\u8d39\u7684\u65f6\u95f4", + "results.wins": "\u80dc\u573a\u6570", + "results.loses": "\u8f93\u7403\u6570", + "ingame.walls": "\u78b0\u649e\u603b\u6570", + "ingame.laps": "\u603b\u5708\u6570", + "ingame.turns": "\u603b\u531d\u6570" } + }, + "polymer": { + "gpu": "GPU \u652f\u6301\u72b6\u6001", + "gpuShift": "\u6309 Shift \u67e5\u770b\u66f4\u591a", + "logging": "\u6211\u4eec\u4e0e\u60a8\u8054\u7cfb\uff1b", + "loginClose": "\u60a8\u73b0\u5728\u53ef\u4ee5\u5173\u95ed\u6b64\u9009\u9879\u5361\u6216\u7a97\u53e3\u5e76\u8fd4\u56de Kartik\u3002", + "gatheringLogin": "\u6211\u4eec\u9a8c\u8bc1\u60a8\u7684\u5e10\u6237\uff1b", + "loginIntro": "\u6309L\u8fde\u63a5", + "logout": "L \u9000\u51fa", + "ktoLevel": "\u7b49\u7ea7", + "ktoMaxLevel": "\u4e0a\u5e1d", + "error": [ + "\u65e0\u6cd5\u4e0e\u670d\u52a1\u5668\u901a\u4fe1", + "\u5728\u6211\u4eec\u80fd\u591f\u4e0e\u670d\u52a1\u5668\u901a\u4fe1\u4e4b\u524d\uff0c\u60a8\u5c06\u65e0\u6cd5\u4f7f\u7528 Kartik Online\u3002", + "\u8fde\u63a5\u5230\u4e92\u8054\u7f51" + ], + "updateError": [ + "\u65e0\u6cd5\u68c0\u67e5\u66f4\u65b0", + "\u6211\u4eec\u76ee\u524d\u65e0\u6cd5\u68c0\u67e5\u66f4\u65b0\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\u3002" + ], + "levelup": [ + "\u66f4\u9ad8\u5c42\u6b21 \uff01", + "\u4f60\u5df2\u7ecf\u8fbe\u5230\u4e86\u6c34\u5e73", + "\u4f60\u83b7\u5f97\u4e86\u529b\u91cf\uff01" + ], + "finished": [ + "\u4f60\u8d62\u4e86\u6bd4\u8d5b\uff01", + "\u5b8c\u6210\u5361\u8482\u514b\uff1f\uff01" + ], + "token": [ + "\u4e0e\u522b\u5904\u65ad\u5f00\u8fde\u63a5", + "\u60a8\u5df2\u4ece Kartik Online \u6ce8\u9500\uff0c\u56e0\u4e3a\u60a8\u7684\u4f1a\u8bdd\u5df2\u5728\u522b\u5904\u7ec8\u6b62\u3002" + ] } }
\ No newline at end of file diff --git a/logo/itch/banner.jpg b/logo/itch/banner.jpg Binary files differindex 61c56d9..c7d5500 100644 --- a/logo/itch/banner.jpg +++ b/logo/itch/banner.jpg diff --git a/logo/itch/cover.jpg b/logo/itch/cover.jpg Binary files differindex b397af5..f850c47 100644 --- a/logo/itch/cover.jpg +++ b/logo/itch/cover.jpg diff --git a/logo/vendor.png b/logo/vendor.png Binary files differindex dc44aaa..fbcc643 100644 --- a/logo/vendor.png +++ b/logo/vendor.png diff --git a/modding/compiler.js b/modding/compiler.js new file mode 100644 index 0000000..693a1e3 --- /dev/null +++ b/modding/compiler.js @@ -0,0 +1,17 @@ +class BuildError extends Error {
+ constructor(orig, ...params) {
+ super(...params);
+ this.name = "BuildError";
+ this.stack = this.stack + "\n" + orig.stack;
+ }
+}
+
+const tsbuild = require('../typescript/builder');
+
+for (file of importedTypeScriptFiles) {
+ try {
+ tsbuild(file.file, homedir + "/.kartik/build/" + file.output);
+ } catch (e) {
+ throw new BuildError(e, "Error while building " + file.file + " from package " + file.pkg)
+ }
+}
\ No newline at end of file diff --git a/modding/hooks.js b/modding/hooks.js index d0ee779..8e189d2 100644 --- a/modding/hooks.js +++ b/modding/hooks.js @@ -1,14 +1,17 @@ +const { dialog } = require('electron'); +const fs = require('fs'); + function hook_Music(mod, type, hname) { hook = mod["Hook"][hname]; names = Object.keys(hook); for (i in names) { name = names[i]; - if (name !== "Music.Start" && name !== "Music.Prepare" && name !== "Music.Title" && name !== "Music.Credits" && name !== "Music.Win" && name !== "Music.Game1" && name !== "Music.Game2" && name !== "Music.Game3" && name !== "Music.Game4" && name !== "Music.Game5" && name !== "Music.Game6" && name !== "Music.Game7" && name !== "Music.Game8" && name !== "Music.Game9") { + if (name !== "Music.Start" && name !== "Music.Prepare" && name !== "Music.Title" && name !== "Music.Credits" && name !== "Music.Win" && name !== "Music.Game1" && name !== "Music.Game2" && name !== "Music.Game3" && name !== "Music.Game4" && name !== "Music.Game5" && name !== "Music.Game6" && name !== "Music.Game7" && name !== "Music.Game8" && name !== "Music.Game9" && name !== "Music.Menu") { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": hook " + hname + " (" + type + "): invalid hook data, EXITING" } ) @@ -23,6 +26,10 @@ function hook_Music(mod, type, hname) { resources.music['title'].file = mod["_Path"] + "/" + mod["Hook"][hname][name]; resources.music['title'].original = false; break; + case "Music.Menu": + resources.music['title'].file = mod["_Path"] + "/" + mod["Hook"][hname][name]; + resources.music['title'].original = false; + break; case "Music.Credits": resources.music['credits'].file = mod["_Path"] + "/" + mod["Hook"][hname][name]; resources.music['credits'].original = false; @@ -86,7 +93,7 @@ function hook_SoundFX(mod, type, hname) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": hook " + hname + " (" + type + "): invalid hook data, EXITING" } ) @@ -138,7 +145,7 @@ function hook_Car(mod, type, hname) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": hook " + hname + " (" + type + "): invalid hook data, EXITING" } ) @@ -160,7 +167,58 @@ function hook_Circuit(mod, type, hname) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", + message: "On package " + item + ": hook " + hname + " (" + type + "): invalid hook data, EXITING" + } + ) + process.exit(2); + } + } +} + +function hook_API(mod, type, hname) { + console.log(" * KMP-API TypeScript engine: " + item + "$" + hname) + hook = mod["Hook"][hname]; + names = Object.keys(hook); + + for (i in names) { + name = names[i]; + + if (name === "API.Includes") { + if (fs.existsSync(mod["_Path"] + "/" + mod["Hook"][hname][name])) { + if (fs.statSync(mod["_Path"] + "/" + mod["Hook"][hname][name]).isDirectory()) { + flist = fs.readdirSync(mod["_Path"] + "/" + mod["Hook"][hname][name]); + for (file of flist) { + if (file.endsWith(".ts")) { + importedTypeScriptFiles.push({ + file: mod["_Path"] + "/" + mod["Hook"][hname][name] + "/" + file, + pkg: item, + output: item + "--" + file + ".js" + }); + } + } + } else { + importedTypeScriptFiles.push({ + file: mod["_Path"] + "/" + mod["Hook"][hname][name], + pkg: item, + output: item + "--" + mod["Hook"][hname][name] + ".js" + }); + } + } else { + dialog.showMessageBoxSync( + { + type: "error", + title: "KMP Mod Loader", + message: "On package " + item + ": KMP-API includes " + mod["Hook"][hname][name] + " (" + mod["_Path"] + "/" + mod["Hook"][hname][name] + "): no such file or directory, EXITING" + } + ) + process.exit(2); + } + } else { + dialog.showMessageBoxSync( + { + type: "error", + title: "KMP Mod Loader", message: "On package " + item + ": hook " + hname + " (" + type + "): invalid hook data, EXITING" } ) @@ -172,11 +230,11 @@ function hook_Circuit(mod, type, hname) { module.exports = (mod, type, name) => { hook = mod["Hook"][name]; - if (type !== "Kartik.Music" && type !== "Kartik.SoundFX" && type !== "Kartik.Circuit" && type !== "Kartik.Car") { + if (type !== "Kartik.Music" && type !== "Kartik.SoundFX" && type !== "Kartik.Circuit" && type !== "Kartik.Car" && type !== "Kartik.API") { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": invalid hook type, EXITING" } ) @@ -193,9 +251,11 @@ module.exports = (mod, type, name) => { case "Kartik.Car": hook_Car(mod, type, name); break; - break; case "Kartik.Circuit": hook_Circuit(mod, type, name); break; + case "Kartik.API": + hook_API(mod, type, name); + break; } } diff --git a/modding/parser.js b/modding/parser.js index 26f5320..2c39055 100644 --- a/modding/parser.js +++ b/modding/parser.js @@ -26,7 +26,7 @@ for (index in list) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": no kartik.ini or kartik.yml file found" } ) @@ -37,13 +37,13 @@ for (index in list) { item = list[index]; parts = item.split("."); - if (parts.length < 2 || parts[0].length > 5 || item.length > 49 || parts.length > 5 || !/^[a-zA-Z0-9.]*$/gm.test(item)) { + if (parts.length < 2 || parts[0].length > 5 || item.length > 49 || parts.length > 7 || !/^[a-zA-Z0-9.]*$/gm.test(item)) { unload(list, item); if (parts.length < 2) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": invalid package name: not enough parts" } ) @@ -52,7 +52,7 @@ for (index in list) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": invalid package name: tld too long" } ) @@ -61,16 +61,16 @@ for (index in list) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": invalid package name: too long" } ) } - if (parts.length > 5) { + if (parts.length > 7) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": invalid package name: too many parts" } ) @@ -79,7 +79,7 @@ for (index in list) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": invalid package name: invalid format" } ) @@ -95,7 +95,7 @@ for (index in list) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": both kartik.ini and kartik.yml found" } ) @@ -114,7 +114,7 @@ for (index in list) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": ini parser error" } ) @@ -128,7 +128,7 @@ for (index in list) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": yaml parser error" } ) @@ -149,7 +149,7 @@ for (index in list) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": invalid root section: " + r } ) @@ -163,7 +163,7 @@ for (index in list) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": invalid meta section: " + r } ) @@ -175,7 +175,7 @@ for (index in list) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": meta sections incomplete" } ) @@ -190,7 +190,7 @@ for (index in list) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": invalid property: " + r } ) @@ -202,7 +202,7 @@ for (index in list) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": properties incomplete" } ) @@ -218,7 +218,7 @@ for (index in list) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": mod made for another version of Kartik" } ) @@ -229,7 +229,7 @@ for (index in list) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": invalid game version" } ) @@ -248,7 +248,7 @@ for (index in list) { dialog.showMessageBoxSync( { type: "error", - title: "Illegal Instruction", + title: "KMP Mod Loader", message: "On package " + item + ": block " + hook + " required by hook " + hookn + " not found" } ) @@ -270,6 +270,7 @@ for (index in list) { mod["_Path"] = homedir + "/.kartik/mods/" + item; + console.log(" * KMP hook: " + item + "$" + hookn) require('./hooks')(mod, hookn, hook); } } diff --git a/music/credits.mp3 b/music/credits.mp3 Binary files differindex 68297c6..5186fbd 100644 --- a/music/credits.mp3 +++ b/music/credits.mp3 diff --git a/music/prepare.mp3 b/music/prepare.mp3 Binary files differindex 6e84627..13f4ded 100644 --- a/music/prepare.mp3 +++ b/music/prepare.mp3 diff --git a/music/title.mp3 b/music/title.mp3 Binary files differindex bc2cbc7..a4e0f29 100644 --- a/music/title.mp3 +++ b/music/title.mp3 diff --git a/music/win.mp3 b/music/win.mp3 Binary files differindex 636a78d..1447d14 100644 --- a/music/win.mp3 +++ b/music/win.mp3 diff --git a/nest/abi.js b/nest/abi.js new file mode 100644 index 0000000..e3396dc --- /dev/null +++ b/nest/abi.js @@ -0,0 +1,76 @@ +const fs = require('fs');
+var zlib = require('zlib');
+
+console.log("\n\nKartik Fox Nest, a compressed and simple data storage for Kartik.\n(c) Minteck, All Rights Reserved\n\n")
+
+module.exports = {
+ export(file, obj) {
+ fs.writeFileSync(file, zlib.deflateSync(Buffer.from(Buffer.from(JSON.stringify(obj)).toString("base64")).toString("base64")))
+ },
+
+ load(file) {
+ data = fs.readFileSync(file)
+ uncomp = zlib.inflateSync(data);
+
+ b1 = Buffer.from(uncomp, "base64").toString("utf-8");
+ b2 = Buffer.from(b1, "base64").toString("utf-8");
+
+ item = Buffer.from(b2, "base64").toString("utf-8");
+ decoded = JSON.parse(item);
+
+ return decoded;
+ },
+
+ generate(file) {
+ o = {
+ "_version": "<unknown>",
+ "stats": {
+ "times": {
+ "single": 0,
+ "local": 0,
+ "online": 0
+ },
+ "results": {
+ "wins": 0,
+ "loses": 0
+ },
+ "ingame": {
+ "walls": 0,
+ "laps": 0,
+ "turns": 0
+ }
+ },
+ "auth": null,
+ "config": {
+ "lang": "en",
+ "music": true,
+ "online": true,
+ "voice": false
+ }
+ }
+
+ this.export(file, o);
+ },
+
+ convert(file, dotkartik) {
+ if (fs.existsSync(dotkartik + "/authentication.json")) {
+ auth = JSON.parse(fs.readFileSync(dotkartik + "/authentication.json"));
+ } else {
+ auth = null;
+ }
+
+ o = {
+ "_version": "<unknown>",
+ "stats": JSON.parse(fs.readFileSync(dotkartik + "/stats.json").toString()),
+ "auth": auth,
+ "config": {
+ "lang": fs.readFileSync(dotkartik + "/config/lang.txt").toString().trim(),
+ "music": fs.readFileSync(dotkartik + "/config/music.txt").toString().trim() === "1",
+ "online": fs.readFileSync(dotkartik + "/config/online.txt").toString().trim() === "1",
+ "voice": fs.readFileSync(dotkartik + "/config/voice.txt").toString().trim() === "1"
+ }
+ }
+
+ this.export(file, o);
+ }
+}
\ No newline at end of file diff --git a/online/global.js b/online/global.js index 0e4fe32..febe8ab 100644 --- a/online/global.js +++ b/online/global.js @@ -357,7 +357,7 @@ function checkOnlineLogin() { } $("#theirid").keydown(function(e) { - if (e.keyCode === 27 || e.keyCode === 8) { // esc + if (e.keyCode === 27) { // esc $("body").fadeOut(200); setTimeout(() => { location.href = "menu.html?back"; diff --git a/online/levels.txt b/online/levels.txt new file mode 100644 index 0000000..8c951a7 --- /dev/null +++ b/online/levels.txt @@ -0,0 +1,200 @@ +1:1
+2:2
+3:3
+4:4
+5:5
+6:7
+7:9
+8:11
+9:13
+10:16
+11:19
+12:22
+13:25
+14:29
+15:33
+16:37
+17:41
+18:46
+19:51
+20:56
+21:61
+22:67
+23:73
+24:79
+25:85
+26:92
+27:99
+28:106
+29:113
+30:121
+31:129
+32:137
+33:145
+34:154
+35:163
+36:172
+37:181
+38:191
+39:201
+40:211
+41:221
+42:232
+43:243
+44:254
+45:265
+46:277
+47:289
+48:301
+49:313
+50:326
+51:339
+52:352
+53:365
+54:379
+55:393
+56:407
+57:421
+58:436
+59:451
+60:466
+61:481
+62:497
+63:513
+64:529
+65:545
+66:562
+67:579
+68:596
+69:613
+70:631
+71:649
+72:667
+73:685
+74:704
+75:723
+76:742
+77:761
+78:781
+79:801
+80:821
+81:841
+82:862
+83:883
+84:904
+85:925
+86:947
+87:969
+88:991
+89:1013
+90:1036
+91:1059
+92:1082
+93:1105
+94:1129
+95:1153
+96:1177
+97:1201
+98:1226
+99:1251
+100:1276
+101:1301
+102:1327
+103:1353
+104:1379
+105:1405
+106:1432
+107:1459
+108:1486
+109:1513
+110:1541
+111:1569
+112:1597
+113:1625
+114:1654
+115:1683
+116:1712
+117:1741
+118:1771
+119:1801
+120:1831
+121:1861
+122:1892
+123:1923
+124:1954
+125:1985
+126:2017
+127:2049
+128:2081
+129:2113
+130:2146
+131:2179
+132:2212
+133:2245
+134:2279
+135:2313
+136:2347
+137:2381
+138:2416
+139:2451
+140:2486
+141:2521
+142:2557
+143:2593
+144:2629
+145:2665
+146:2702
+147:2739
+148:2776
+149:2813
+150:2851
+151:2889
+152:2927
+153:2965
+154:3004
+155:3043
+156:3082
+157:3121
+158:3161
+159:3201
+160:3241
+161:3281
+162:3322
+163:3363
+164:3404
+165:3445
+166:3487
+167:3529
+168:3571
+169:3613
+170:3656
+171:3699
+172:3742
+173:3785
+174:3829
+175:3873
+176:3917
+177:3961
+178:4006
+179:4051
+180:4096
+181:4141
+182:4187
+183:4233
+184:4279
+185:4325
+186:4372
+187:4419
+188:4466
+189:4513
+190:4561
+191:4609
+192:4657
+193:4705
+194:4754
+195:4803
+196:4852
+197:4901
+198:4951
+199:5001
+200:5051
\ No newline at end of file diff --git a/package.json b/package.json index 8dbdbb4..e7d5843 100644 --- a/package.json +++ b/package.json @@ -1 +1 @@ -{"name":"kartik","version":"f3e78ef","channel":"git","description":"A multiplatform 2D karting game","main":"app.js","dependencies":{"@electron/remote":"^1.0.4","discord-rpc":"^3.2.0","electron":"^12.0.1","ini":"^1.3.8","jquery":"^3.6.0","os-locale":"^5.0.0","systeminformation":"^5.7.7","uuid":"^8.3.2","yaml":"^1.10.2"},"scripts":{"test":"node_modules\\electron\\dist\\electron.exe app.js"},"author":"Minteck Projects","license":"GPL-3.0-or-later","serial":"XXX99999999999"}
\ No newline at end of file +{"name":"kartik","version":"79edea3","channel":"git","description":"A multiplatform 2D karting game","main":"app.js","dependencies":{"@electron/remote":"^1.0.4","discord-rpc":"^3.2.0","electron":"^12.0.1","ini":"^1.3.8","jquery":"^3.6.0","open":"^8.2.1","os-locale":"^5.0.0","systeminformation":"^5.7.7","typescript":"^4.3.5","uuid":"^8.3.2","yaml":"^1.10.2"},"scripts":{"test":"node_modules\\electron\\dist\\electron.exe app.js"},"author":"Minteck","license":"GPL-3.0-or-later","serial":"XXX99999999999"}
\ No newline at end of file diff --git a/race/circuits/furry.html b/race/_archived/furry.html index 01a4d16..c812916 100644 --- a/race/circuits/furry.html +++ b/race/_archived/furry.html @@ -1,115 +1,115 @@ -<!-- Manifest version 5 (breaking with version 4) --> - -<!-- Metadata --> -<circuit> - { - "name": { - "fr": "Les petites pattes", - "en": "The Little Paws" - }, - "author": "Minteck Projects" - } -</circuit> - -<!-- Cars --> -<div id="car0" style="display: inline-block;position: fixed;top: 42.9px;left: 428px;transform: rotate(0deg);"><img id="car0-img" style=" - width: 36px; -"></div> -<div id="car1" style="display: inline-block;position: fixed;top: 79.4px;left: 388.9px;transform: rotate(0deg);"><span id="aibox-far" style=" - position: absolute; - display: block; - top: -7px; - bottom: -7px; - left: 0px; - right: -30px; - animation-name: aibox; - animation-duration: 2s; - animation-iteration-count: infinite; - animation-timing-function: linear; - animation-direction: alternate-reverse; -"></span><span id="aibox-near" style=" - position: absolute; - display: block; - top: -7px; - bottom: -7px; - left: -7px; - right: -7px; -"></span><span id="aibox-nearest" style=" - position: absolute; - display: block; - top: -3px; - bottom: -3px; - left: -3px; - right: -3px; -"></span><img id="car1-img" style=" - width: 36px;"></div> - -<!-- Oils --> -<div id="oil"> - <img src="../race/oil.png" id="oil0" style="top: 278px; left: 634px; transform: rotate(68deg);"> - <img src="../race/oil.png" id="oil1" style="top: 22px; left: 457px; transform: rotate(217deg);"> - <img src="../race/oil.png" id="oil2" style="top: 26px; left: 531px; transform: rotate(82deg);"> - <img src="../race/oil.png" id="oil3" style="top: 155px; left: 425px; transform: rotate(120deg);"> - <img src="../race/oil.png" id="oil4" style="top: 137px; left: 121px; transform: rotate(178deg);"> -</div> - -<!-- Elements --> -<div id="elements"> - - <!-- Walls --> - - <div class="wall" style=" - height: 8px; - position: fixed; - width: 315px; - top: 110px; - left: 193px; -"></div><div class="wall" style=" - height: 8px; - position: fixed; - width: 498px; - top: 24px; - left: 107px; -"></div><div class="wall" style="height: 8px;position: fixed;width: 51px;top: 412px;left: 455px;"></div><div class="wall" style=" - height: 8px; - position: fixed; - width: 498px; - top: 501px; - left: 107px; -"></div><div class="wall" style=" - height: 310px; - position: fixed; - width: 8px; - top: 111px; - left: 211px; -"></div><div class="wall" style=" - height: 484px; - position: fixed; - width: 8px; - top: 25px; - left: 106px; -"></div><div class="wall" style="height: 310px;position: fixed;width: 8px;top: 110px;left: 498px;"></div><div class="wall" style="height: 8px;position: fixed;width: 57px;top: 413px;left: 211px;"></div><div class="wall" style="height: 8px;position: fixed;width: 248px;top: 151px;left: 235px;"></div><div class="wall" style="height: 24px;position: fixed;width: 8px;top: 485px;left: 261px;"></div><div class="wall" style="height: 8px;position: fixed;width: 24px;top: 236px;left: 347px;"></div><div class="wall" style="height: 270px;position: fixed;width: 8px;top: 236px;left: 361px;"></div><div class="wall" style="height: 113px;position: fixed;width: 8px;top: 151px;left: 235px;"></div><div class="wall" style="height: 32px;position: fixed;width: 8px;top: 151px;left: 370px;"></div><div class="wall" style="height: 32px;position: fixed;width: 8px;top: 151px;left: 340px;"></div><div class="wall" style="height: 28px;position: fixed;width: 8px;top: 236px;left: 370px;"></div><div class="wall" style="height: 8px;position: fixed;width: 24px;top: 255px;left: 325px;"></div><div class="wall" style="height: 9px;position: fixed;width: 24px;top: 351px;left: 498px;"></div><div class="wall" style="height: 9px;position: fixed;width: 24px;top: 249px;left: 106px;"></div><div class="wall" style="height: 9px;position: fixed;width: 46px;top: 249px;left: 173px;"></div><div class="wall" style="height: 9px;position: fixed;width: 46px;top: 246px;left: 498px;"></div><div class="wall" style="height: 9px;position: fixed;width: 46px;top: 351px;left: 566px;"></div><div class="wall" style="height: 9px;position: fixed;width: 46px;top: 255px;left: 234px;"></div><div class="wall" style="height: 9px;position: fixed;width: 46px;top: 257px;left: 439px;"></div><div class="wall" style="height: 9px;position: fixed;width: 46px;top: 353px;left: 106px;"></div><div class="wall" style="height: 9px;position: fixed;width: 75px;top: 302px;left: 328px;"></div><div class="wall" style="height: 9px;position: fixed;width: 23px;top: 302px;left: 441px;"></div><div class="wall" style="height: 9px;position: fixed;width: 23px;top: 302px;left: 260px;"></div><div class="wall" style="height: 9px;position: fixed;width: 24px;top: 352px;left: 195px;"></div><div class="wall" style="height: 8px;position: fixed;width: 24px;top: 246px;left: 589px;"></div><div class="wall" style="height: 8px;position: fixed;width: 24px;top: 256px;left: 367px;"></div><div class="wall" style="height: 28px;position: fixed;width: 8px;top: 236px;left: 340px;"></div><div class="wall" style="height: 113px;position: fixed;width: 8px;top: 151px;left: 475px;"></div><div class="wall" style="height: 166px;position: fixed;width: 8px;top: 255px;left: 260px;"></div><div class="wall" style="height: 118px;position: fixed;width: 8px;top: 302px;left: 456px;"></div><div class="wall" style="height: 24px;position: fixed;width: 8px;top: 485px;left: 457px;"></div><div class="wall" style=" - height: 485px; - position: fixed; - width: 8px; - top: 24px; - left: 602px; -"></div> - - <!-- Arrival Line --> - <div style=" - height: 127px; - position: fixed; - width: 8px; - top: 0px; - left: 346px; -" id="arrival"></div> - - <!-- Anti-reverse wall (codename Barrier) --> - <div style=" - height: 127px; - position: fixed; - width: 20px; - top: 0; - left: 355px; -" id="barrier"></div></div>
\ No newline at end of file +<!-- Manifest version 5 (breaking with version 4) -->
+
+<!-- Metadata -->
+<circuit>
+ {
+ "name": {
+ "fr": "Les petites pattes",
+ "en": "The Little Paws"
+ },
+ "author": "Minteck"
+ }
+</circuit>
+
+<!-- Cars -->
+<div id="car0" style="display: inline-block;position: fixed;top: 42.9px;left: 428px;transform: rotate(0deg);"><img id="car0-img" style="
+ width: 36px;
+"></div>
+<div id="car1" style="display: inline-block;position: fixed;top: 79.4px;left: 388.9px;transform: rotate(0deg);"><span id="aibox-far" style="
+ position: absolute;
+ display: block;
+ top: -7px;
+ bottom: -7px;
+ left: 0px;
+ right: -40px;
+ animation-name: aibox;
+ animation-duration: 2s;
+ animation-iteration-count: infinite;
+ animation-timing-function: linear;
+ animation-direction: alternate-reverse;
+"></span><span id="aibox-near" style="
+ position: absolute;
+ display: block;
+ top: -7px;
+ bottom: -7px;
+ left: -7px;
+ right: -7px;
+"></span><span id="aibox-nearest" style="
+ position: absolute;
+ display: block;
+ top: -3px;
+ bottom: -3px;
+ left: -3px;
+ right: -3px;
+"></span><img id="car1-img" style="
+ width: 36px;"></div>
+
+<!-- Oils -->
+<div id="oil">
+ <img src="../race/oil.png" id="oil0" style="top: 278px; left: 634px; transform: rotate(68deg);">
+ <img src="../race/oil.png" id="oil1" style="top: 22px; left: 457px; transform: rotate(217deg);">
+ <img src="../race/oil.png" id="oil2" style="top: 26px; left: 531px; transform: rotate(82deg);">
+ <img src="../race/oil.png" id="oil3" style="top: 155px; left: 425px; transform: rotate(120deg);">
+ <img src="../race/oil.png" id="oil4" style="top: 137px; left: 121px; transform: rotate(178deg);">
+</div>
+
+<!-- Elements -->
+<div id="elements">
+
+ <!-- Walls -->
+
+ <div class="wall" style="
+ height: 8px;
+ position: fixed;
+ width: 315px;
+ top: 110px;
+ left: 193px;
+"></div><div class="wall" style="
+ height: 8px;
+ position: fixed;
+ width: 498px;
+ top: 24px;
+ left: 107px;
+"></div><div class="wall" style="height: 8px;position: fixed;width: 51px;top: 412px;left: 455px;"></div><div class="wall" style="
+ height: 8px;
+ position: fixed;
+ width: 498px;
+ top: 501px;
+ left: 107px;
+"></div><div class="wall" style="
+ height: 310px;
+ position: fixed;
+ width: 8px;
+ top: 111px;
+ left: 211px;
+"></div><div class="wall" style="
+ height: 484px;
+ position: fixed;
+ width: 8px;
+ top: 25px;
+ left: 106px;
+"></div><div class="wall" style="height: 310px;position: fixed;width: 8px;top: 110px;left: 498px;"></div><div class="wall" style="height: 8px;position: fixed;width: 57px;top: 413px;left: 211px;"></div><div class="wall" style="height: 8px;position: fixed;width: 248px;top: 151px;left: 235px;"></div><div class="wall" style="height: 24px;position: fixed;width: 8px;top: 485px;left: 261px;"></div><div class="wall" style="height: 8px;position: fixed;width: 24px;top: 236px;left: 347px;"></div><div class="wall" style="height: 270px;position: fixed;width: 8px;top: 236px;left: 361px;"></div><div class="wall" style="height: 113px;position: fixed;width: 8px;top: 151px;left: 235px;"></div><div class="wall" style="height: 32px;position: fixed;width: 8px;top: 151px;left: 370px;"></div><div class="wall" style="height: 32px;position: fixed;width: 8px;top: 151px;left: 340px;"></div><div class="wall" style="height: 28px;position: fixed;width: 8px;top: 236px;left: 370px;"></div><div class="wall" style="height: 8px;position: fixed;width: 24px;top: 255px;left: 325px;"></div><div class="wall" style="height: 9px;position: fixed;width: 24px;top: 351px;left: 498px;"></div><div class="wall" style="height: 9px;position: fixed;width: 24px;top: 249px;left: 106px;"></div><div class="wall" style="height: 9px;position: fixed;width: 46px;top: 249px;left: 173px;"></div><div class="wall" style="height: 9px;position: fixed;width: 46px;top: 246px;left: 498px;"></div><div class="wall" style="height: 9px;position: fixed;width: 46px;top: 351px;left: 587px;"></div><div class="wall" style="height: 9px;position: fixed;width: 46px;top: 255px;left: 234px;"></div><div class="wall" style="height: 9px;position: fixed;width: 46px;top: 257px;left: 439px;"></div><div class="wall" style="height: 9px;position: fixed;width: 46px;top: 353px;left: 106px;"></div><div class="wall" style="height: 9px;position: fixed;width: 75px;top: 302px;left: 328px;"></div><div class="wall" style="height: 9px;position: fixed;width: 23px;top: 302px;left: 441px;"></div><div class="wall" style="height: 9px;position: fixed;width: 23px;top: 302px;left: 260px;"></div><div class="wall" style="height: 9px;position: fixed;width: 24px;top: 352px;left: 195px;"></div><div class="wall" style="height: 8px;position: fixed;width: 24px;top: 246px;left: 589px;"></div><div class="wall" style="height: 8px;position: fixed;width: 24px;top: 256px;left: 367px;"></div><div class="wall" style="height: 28px;position: fixed;width: 8px;top: 236px;left: 340px;"></div><div class="wall" style="height: 113px;position: fixed;width: 8px;top: 151px;left: 475px;"></div><div class="wall" style="height: 166px;position: fixed;width: 8px;top: 255px;left: 260px;"></div><div class="wall" style="height: 118px;position: fixed;width: 8px;top: 302px;left: 456px;"></div><div class="wall" style="height: 24px;position: fixed;width: 8px;top: 485px;left: 457px;"></div><div class="wall" style="
+ height: 485px;
+ position: fixed;
+ width: 8px;
+ top: 24px;
+ left: 602px;
+"></div>
+
+ <!-- Arrival Line -->
+ <div style="
+ height: 127px;
+ position: fixed;
+ width: 8px;
+ top: 0px;
+ left: 346px;
+" id="arrival"></div>
+
+ <!-- Anti-reverse wall (codename Barrier) -->
+ <div style="
+ height: 127px;
+ position: fixed;
+ width: 20px;
+ top: 0;
+ left: 355px;
+" id="barrier"></div></div>
diff --git a/race/_archived/furry.png b/race/_archived/furry.png Binary files differnew file mode 100644 index 0000000..0e2dc77 --- /dev/null +++ b/race/_archived/furry.png diff --git a/race/_archived/triangle.html b/race/_archived/triangle.html index a1cb13e..55f65b1 100644 --- a/race/_archived/triangle.html +++ b/race/_archived/triangle.html @@ -1,127 +1,127 @@ -<!-- Manifest version 5 (breaking with version 4) --> - -<!-- Metadata --> -<circuit> - { - "name": { - "fr": "Le triangle des Bermudes", - "en": "The Bermuda Triangle" - }, - "author": "Minteck Projects" - } -</circuit> - -<!-- Cars --> -<div id="car0" style="display: inline-block;position: fixed;top: 42.9px;left: 428px;transform: rotate(0deg);"><img id="car0-img" style=" - width: 36px; -"></div> -<div id="car1" style="display: inline-block;position: fixed;top: 79.4px;left: 388.9px;transform: rotate(0deg);"><span id="aibox-far" style=" - position: absolute; - display: block; - top: -7px; - bottom: -7px; - left: 0px; - right: -30px; - animation-name: aibox; - animation-duration: 2s; - animation-iteration-count: infinite; - animation-timing-function: linear; - animation-direction: alternate-reverse; -"></span><span id="aibox-near" style=" - position: absolute; - display: block; - top: -7px; - bottom: -7px; - left: -7px; - right: -7px; -"></span><span id="aibox-nearest" style=" - position: absolute; - display: block; - top: -3px; - bottom: -3px; - left: -3px; - right: -3px; -"></span><img id="car1-img" style=" - width: 36px;"></div> - -<!-- Oils --> -<div id="oil"> - <img src="../race/oil.png" id="oil0" style="top: 278px; left: 634px; transform: rotate(68deg);"> - <img src="../race/oil.png" id="oil1" style="top: 22px; left: 457px; transform: rotate(217deg);"> - <img src="../race/oil.png" id="oil2" style="top: 26px; left: 531px; transform: rotate(82deg);"> - <img src="../race/oil.png" id="oil3" style="top: 155px; left: 425px; transform: rotate(120deg);"> - <img src="../race/oil.png" id="oil4" style="top: 137px; left: 121px; transform: rotate(178deg);"> -</div> - -<!-- Elements --> -<div id="elements"> - - <!-- Walls --> - - <div class="wall" style=" - height: 8px; - position: fixed; - width: 20px; - top: 111px; - left: 110px; -"></div><div class="wall" style=" - height: 8px; - position: fixed; - width: 20px; - top: 111px; - left: 590px; -"></div><div class="wall" style=" - height: 8px; - position: fixed; - width: 256px; - top: 110px; - left: 228px; -"></div><div class="wall" style=" - height: 8px; - position: fixed; - width: 498px; - top: 24px; - left: 107px; -"></div><div class="wall" style=" - height: 8px; - position: fixed; - width: 498px; - top: 492px; - left: 107px; -"></div><div class="wall" style="height: 277px;position: fixed;width: 8px;top: 100px;left: 293px;transform: rotate( --28deg -);"></div><div class="wall" style="height: 468px;position: fixed;width: 8px;top: 80px;left: 242px;transform: rotate( --31deg -);"></div><div class="wall" style="height: 468px;position: fixed;width: 8px;top: 80px;left: 470px;transform: rotate( -31.5deg -);"></div><div class="wall" style=" - height: 472px; - position: fixed; - width: 8px; - top: 25px; - left: 106px; -"></div><div class="wall" style="height: 277px;position: fixed;width: 8px;top: 100px;left: 417px;transform: rotate(26.5deg);"></div><div class="wall" style=" - height: 472px; - position: fixed; - width: 8px; - top: 24px; - left: 602px; -"></div> - - <!-- Arrival Line --> - <div style=" - height: 127px; - position: fixed; - width: 8px; - top: 0px; - left: 346px; -" id="arrival"></div> - - <!-- Anti-reverse wall (codename Barrier) --> - <div style=" - height: 127px; - position: fixed; - width: 20px; - top: 0; - left: 355px; +<!-- Manifest version 5 (breaking with version 4) -->
+
+<!-- Metadata -->
+<circuit>
+ {
+ "name": {
+ "fr": "Le triangle des Bermudes",
+ "en": "The Bermuda Triangle"
+ },
+ "author": "Minteck"
+ }
+</circuit>
+
+<!-- Cars -->
+<div id="car0" style="display: inline-block;position: fixed;top: 42.9px;left: 428px;transform: rotate(0deg);"><img id="car0-img" style="
+ width: 36px;
+"></div>
+<div id="car1" style="display: inline-block;position: fixed;top: 79.4px;left: 388.9px;transform: rotate(0deg);"><span id="aibox-far" style="
+ position: absolute;
+ display: block;
+ top: -7px;
+ bottom: -7px;
+ left: 0px;
+ right: -40px;
+ animation-name: aibox;
+ animation-duration: 2s;
+ animation-iteration-count: infinite;
+ animation-timing-function: linear;
+ animation-direction: alternate-reverse;
+"></span><span id="aibox-near" style="
+ position: absolute;
+ display: block;
+ top: -7px;
+ bottom: -7px;
+ left: -7px;
+ right: -7px;
+"></span><span id="aibox-nearest" style="
+ position: absolute;
+ display: block;
+ top: -3px;
+ bottom: -3px;
+ left: -3px;
+ right: -3px;
+"></span><img id="car1-img" style="
+ width: 36px;"></div>
+
+<!-- Oils -->
+<div id="oil">
+ <img src="../race/oil.png" id="oil0" style="top: 278px; left: 634px; transform: rotate(68deg);">
+ <img src="../race/oil.png" id="oil1" style="top: 22px; left: 457px; transform: rotate(217deg);">
+ <img src="../race/oil.png" id="oil2" style="top: 26px; left: 531px; transform: rotate(82deg);">
+ <img src="../race/oil.png" id="oil3" style="top: 155px; left: 425px; transform: rotate(120deg);">
+ <img src="../race/oil.png" id="oil4" style="top: 137px; left: 121px; transform: rotate(178deg);">
+</div>
+
+<!-- Elements -->
+<div id="elements">
+
+ <!-- Walls -->
+
+ <div class="wall" style="
+ height: 8px;
+ position: fixed;
+ width: 20px;
+ top: 111px;
+ left: 110px;
+"></div><div class="wall" style="
+ height: 8px;
+ position: fixed;
+ width: 20px;
+ top: 111px;
+ left: 590px;
+"></div><div class="wall" style="
+ height: 8px;
+ position: fixed;
+ width: 256px;
+ top: 110px;
+ left: 228px;
+"></div><div class="wall" style="
+ height: 8px;
+ position: fixed;
+ width: 498px;
+ top: 24px;
+ left: 107px;
+"></div><div class="wall" style="
+ height: 8px;
+ position: fixed;
+ width: 498px;
+ top: 492px;
+ left: 107px;
+"></div><div class="wall" style="height: 277px;position: fixed;width: 8px;top: 100px;left: 293px;transform: rotate(
+-28deg
+);"></div><div class="wall" style="height: 468px;position: fixed;width: 8px;top: 80px;left: 242px;transform: rotate(
+-31deg
+);"></div><div class="wall" style="height: 468px;position: fixed;width: 8px;top: 80px;left: 470px;transform: rotate(
+31.5deg
+);"></div><div class="wall" style="
+ height: 472px;
+ position: fixed;
+ width: 8px;
+ top: 25px;
+ left: 106px;
+"></div><div class="wall" style="height: 277px;position: fixed;width: 8px;top: 100px;left: 417px;transform: rotate(26.5deg);"></div><div class="wall" style="
+ height: 472px;
+ position: fixed;
+ width: 8px;
+ top: 24px;
+ left: 602px;
+"></div>
+
+ <!-- Arrival Line -->
+ <div style="
+ height: 127px;
+ position: fixed;
+ width: 8px;
+ top: 0px;
+ left: 346px;
+" id="arrival"></div>
+
+ <!-- Anti-reverse wall (codename Barrier) -->
+ <div style="
+ height: 127px;
+ position: fixed;
+ width: 20px;
+ top: 0;
+ left: 355px;
" id="barrier"></div></div>
\ No newline at end of file diff --git a/race/cars/car0.js b/race/cars/car0.js index ad1c227..9210448 100644 --- a/race/cars/car0.js +++ b/race/cars/car0.js @@ -1,216 +1,216 @@ -startHooks.push(() => { - car0speed = 16; - car0cspeed = 0; - if (online && role === "guest") { - car0startx = 388.9; - car0starty = 79.4; - } else { - car0startx = 428; - car0starty = 42.9; - } - car0collisionon = true; - car0enableOOBChecker = false; - -// Collision Manager - function car0collision() { - if (!keysEnabled) { return; } - - if (started) { - carshb = document.getElementById("car0").getBoundingClientRect(); - hitbox = document.getElementById("barrier").getBoundingClientRect(); - - var overlap = !(carshb.right < hitbox.left || - carshb.left > hitbox.right || - carshb.bottom < hitbox.top || - carshb.top > hitbox.bottom) - - if (overlap) { - info("CarManager:car0", "Reversal prevented at X " + document.getElementById("car0").style.left + ", Y " + document.getElementById("car0").style.top); - document.getElementById("car0").style.left = car0startx + "px"; - document.getElementById("car0").style.top = car0starty + "px"; - document.getElementById("car0").style.transform = "rotate(0deg)"; - car0cspeed = 0; - } - } - - if (!car0collisionon) { return; } - - walls = Array.from(document.getElementsByClassName("wall")); - - walls.forEach((wall) => { - carshb = document.getElementById("car0").getBoundingClientRect(); - hitbox = wall.getBoundingClientRect(); - - var overlap = !(carshb.right < hitbox.left || - carshb.left > hitbox.right || - carshb.bottom < hitbox.top || - carshb.top > hitbox.bottom) - - if (overlap) { - info("CarManager:car0", "Wall collision at X " + document.getElementById("car0").style.left + ", Y " + document.getElementById("car0").style.top); - if (location.search === "?sp") { - scenar("wall1", "happy"); - } - Sound.crash() - document.getElementById("car0").style.left = car0startx + "px"; - document.getElementById("car0").style.top = car0starty + "px"; - require('electron').ipcRenderer.send('addstats', { catalog: "ingame", key: "walls", add: 1 }); - Array.from(document.getElementById('oil').children).forEach((item) => { - spreadOil(item); - }) - document.getElementById("car0").style.transform = "rotate(0deg)"; - car0cspeed = 0; - } - }) - - Array.from(document.getElementById('oil').children).forEach((item) => { - carshb = document.getElementById("car0").getBoundingClientRect(); - hitbox = item.getBoundingClientRect(); - - var overlap = !(carshb.right < hitbox.left || - carshb.left > hitbox.right || - carshb.bottom < hitbox.top || - carshb.top > hitbox.bottom) - - if (overlap) { - car0cspeed = 7; - } - }) - - carshb = document.getElementById("car0").getBoundingClientRect(); - hitbox = document.getElementById("arrival").getBoundingClientRect(); - - var overlap = !(carshb.right < hitbox.left || - carshb.left > hitbox.right || - carshb.bottom < hitbox.top || - carshb.top > hitbox.bottom) - - if (overlap && started) { - started = false; - if ((document.getElementById('laps-car0').innerText.split("/")[0] - 1 + 1) < 4) { - info("CarManager:car0", "New lap"); - Array.from(document.getElementById('oil').children).forEach((item) => { - spreadOil(item); - }) - if ((document.getElementById('laps-car0').innerText.split("/")[0] - 1 + 1) < 3) { - Sound.pass() - } else { - Sound.last() - } - require('electron').ipcRenderer.send('addstats', { catalog: "ingame", key: "laps", add: 1 }); - document.getElementById('laps-car0').innerText = (document.getElementById('laps-car0').innerText.split("/")[0] - 1 + 2).toString(); - if (location.search === "?sp") { - if ((document.getElementById('laps-car0').innerText.split("/")[0] - 1 + 1) > (document.getElementById('laps-car1').innerText.split("/")[0] - 1 + 1)) { - scenar("ahead1", "angry"); - } else { - scenar("ahead2", "happy"); - } - } - } else { - info("CarManager:car0", "Car won the game"); - require('electron').ipcRenderer.send('addstats', { catalog: "results", key: "wins", add: 1 }); - if (location.search === "?sp") { - scenar("won1", "sad"); - } - try { document.getElementById('music').src = "about:blank"; } catch (e) { console.error(e); } - Sound.win(); - keysEnabled = false; - car0cspeed = 0; - car0speed = 0; - document.getElementById('laps-car0').innerText = (document.getElementById('laps-car0').innerText.split("/")[0] - 1 + 2).toString(); - $("#box").fadeOut(500); - setTimeout(() => { - if (online) { - clientWriter(JSON.stringify({ - _type: "ipc", - action: "progressLose", - message: null - }) + "|") - } - if (location.search === "?sp" || online) { - location.href = "win.html?sp#car0"; - } else { - location.href = "win.html#car0"; - } - }, 3500) - } - document.getElementById("car0").style.left = car0startx + "px"; - document.getElementById("car0").style.top = car0starty + "px"; - document.getElementById("car0").style.transform = "rotate(0deg)"; - Array.from(document.getElementById('oil').children).forEach((item) => { - spreadOil(item); - }) - car0cspeed = 0; - setTimeout(() => { - started = true; - }, 150) - } - - carshb = document.getElementById("car0").getBoundingClientRect(); - hitbox = document.getElementById("car1").getBoundingClientRect(); - - var overlap = !(carshb.right < hitbox.left || - carshb.left > hitbox.right || - carshb.bottom < hitbox.top || - carshb.top > hitbox.bottom) - - if (overlap) { - if (location.search === "?sp") { - scenar("wall1", "happy"); - } - Sound.crash(); - require('electron').ipcRenderer.send('addstats', { catalog: "ingame", key: "walls", add: 1 }); - document.getElementById("car0").style.left = car0startx + "px"; - document.getElementById("car0").style.top = car0starty + "px"; - Array.from(document.getElementById('oil').children).forEach((item) => { - spreadOil(item); - }) - document.getElementById("car0").style.transform = "rotate(0deg)"; - car0cspeed = 0; - } - } - -// General Movements - setInterval(() => { - if (!paused) { - if (car0cspeed > 0) { - car0cspeed = car0cspeed - 0.1; - } - switch (document.getElementById("car0").style.transform) { - case "rotate(0deg)": - document.getElementById("car0").style.left = ((document.getElementById("car0").style.left.split("p")[0] - 1) + (1 + car0cspeed)) + "px"; - break; - case "rotate(180deg)": - document.getElementById("car0").style.left = ((document.getElementById("car0").style.left.split("p")[0] - 1) - (1 + car0cspeed)) + "px"; - break; - case "rotate(90deg)": - document.getElementById("car0").style.top = ((document.getElementById("car0").style.top.split("p")[0] - 1) + (1 + car0cspeed)) + "px"; - break; - case "rotate(-90deg)": - document.getElementById("car0").style.top = ((document.getElementById("car0").style.top.split("p")[0] - 1) - (1 + car0cspeed)) + "px"; - break; - } - if (document.getElementById("car0").style.left.split("p")[0] - 1 + 1 > (window.innerWidth - 30)) { - warn("CarManager:car0", "Colliding with screen border"); - document.getElementById("car0").style.left = (window.innerWidth - 30) + "px"; - } - if (document.getElementById("car0").style.top.split("p")[0] - 1 + 1 > (window.innerHeight - 30)) { - warn("CarManager:car0", "Colliding with screen border"); - document.getElementById("car0").style.top = (window.innerHeight - 30) + "px"; - } - if (document.getElementById("car0").style.top.split("p")[0] - 1 + 1 < 30) { - warn("CarManager:car0", "Colliding with screen border"); - document.getElementById("car0").style.top = "30px"; - } - if (document.getElementById("car0").style.left.split("p")[0] - 1 + 1 < 30) { - warn("CarManager:car0", "Colliding with screen border"); - document.getElementById("car0").style.left = "30px"; - } - if (car0cspeed > -0.1 && car0cspeed < 0) { - car0cspeed = 0; - } - car0collision(); - } - }, 200) - +startHooks.push(() => {
+ car0speed = 16;
+ car0cspeed = 0;
+ if (online && role === "guest") {
+ car0startx = 388.9;
+ car0starty = 79.4;
+ } else {
+ car0startx = 428;
+ car0starty = 42.9;
+ }
+ car0collisionon = true;
+ car0enableOOBChecker = false;
+
+// Collision Manager
+ function car0collision() {
+ if (!keysEnabled) { return; }
+
+ if (started) {
+ carshb = document.getElementById("car0").getBoundingClientRect();
+ hitbox = document.getElementById("barrier").getBoundingClientRect();
+
+ var overlap = !(carshb.right < hitbox.left ||
+ carshb.left > hitbox.right ||
+ carshb.bottom < hitbox.top ||
+ carshb.top > hitbox.bottom)
+
+ if (overlap) {
+ info("CarManager:car0", "Reversal prevented at X " + document.getElementById("car0").style.left + ", Y " + document.getElementById("car0").style.top);
+ document.getElementById("car0").style.left = car0startx + "px";
+ document.getElementById("car0").style.top = car0starty + "px";
+ document.getElementById("car0").style.transform = "rotate(0deg)";
+ car0cspeed = 0;
+ }
+ }
+
+ if (!car0collisionon) { return; }
+
+ walls = Array.from(document.getElementsByClassName("wall"));
+
+ walls.forEach((wall) => {
+ carshb = document.getElementById("car0").getBoundingClientRect();
+ hitbox = wall.getBoundingClientRect();
+
+ var overlap = !(carshb.right < hitbox.left ||
+ carshb.left > hitbox.right ||
+ carshb.bottom < hitbox.top ||
+ carshb.top > hitbox.bottom)
+
+ if (overlap) {
+ info("CarManager:car0", "Wall collision at X " + document.getElementById("car0").style.left + ", Y " + document.getElementById("car0").style.top);
+ if (location.search === "?sp") {
+ scenar("wall1", "happy");
+ }
+ Sound.crash()
+ document.getElementById("car0").style.left = car0startx + "px";
+ document.getElementById("car0").style.top = car0starty + "px";
+ require('electron').ipcRenderer.send('addstats', { catalog: "ingame", key: "walls", add: 1 });
+ Array.from(document.getElementById('oil').children).forEach((item) => {
+ spreadOil(item);
+ })
+ document.getElementById("car0").style.transform = "rotate(0deg)";
+ car0cspeed = 0;
+ }
+ })
+
+ Array.from(document.getElementById('oil').children).forEach((item) => {
+ carshb = document.getElementById("car0").getBoundingClientRect();
+ hitbox = item.getBoundingClientRect();
+
+ var overlap = !(carshb.right < hitbox.left ||
+ carshb.left > hitbox.right ||
+ carshb.bottom < hitbox.top ||
+ carshb.top > hitbox.bottom)
+
+ if (overlap) {
+ car0cspeed = 7;
+ }
+ })
+
+ carshb = document.getElementById("car0").getBoundingClientRect();
+ hitbox = document.getElementById("arrival").getBoundingClientRect();
+
+ var overlap = !(carshb.right < hitbox.left ||
+ carshb.left > hitbox.right ||
+ carshb.bottom < hitbox.top ||
+ carshb.top > hitbox.bottom)
+
+ if (overlap && started) {
+ started = false;
+ if ((document.getElementById('laps-car0').innerText.split("/")[0] - 1 + 1) < 4) {
+ info("CarManager:car0", "New lap");
+ Array.from(document.getElementById('oil').children).forEach((item) => {
+ spreadOil(item);
+ })
+ if ((document.getElementById('laps-car0').innerText.split("/")[0] - 1 + 1) < 3) {
+ Sound.pass()
+ } else {
+ Sound.last()
+ }
+ require('electron').ipcRenderer.send('addstats', { catalog: "ingame", key: "laps", add: 1 });
+ document.getElementById('laps-car0').innerText = (document.getElementById('laps-car0').innerText.split("/")[0] - 1 + 2).toString();
+ if (location.search === "?sp") {
+ if ((document.getElementById('laps-car0').innerText.split("/")[0] - 1 + 1) > (document.getElementById('laps-car1').innerText.split("/")[0] - 1 + 1)) {
+ scenar("ahead1", "angry");
+ } else {
+ scenar("ahead2", "happy");
+ }
+ }
+ } else {
+ info("CarManager:car0", "Car won the game");
+ require('electron').ipcRenderer.send('addstats', { catalog: "results", key: "wins", add: 1 });
+ if (location.search === "?sp") {
+ scenar("won1", "sad");
+ }
+ try { document.getElementById('music').src = "about:blank"; } catch (e) { console.error(e); }
+ Sound.win();
+ keysEnabled = false;
+ car0cspeed = 0;
+ car0speed = 0;
+ document.getElementById('laps-car0').innerText = (document.getElementById('laps-car0').innerText.split("/")[0] - 1 + 2).toString();
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ if (online) {
+ clientWriter(JSON.stringify({
+ _type: "ipc",
+ action: "progressLose",
+ message: null
+ }) + "|")
+ }
+ if (location.search === "?sp" || online) {
+ location.href = "win.html?sp#car0";
+ } else {
+ location.href = "win.html#car0";
+ }
+ }, 3500)
+ }
+ document.getElementById("car0").style.left = car0startx + "px";
+ document.getElementById("car0").style.top = car0starty + "px";
+ document.getElementById("car0").style.transform = "rotate(0deg)";
+ Array.from(document.getElementById('oil').children).forEach((item) => {
+ spreadOil(item);
+ })
+ car0cspeed = 0;
+ setTimeout(() => {
+ started = true;
+ }, 150)
+ }
+
+ carshb = document.getElementById("car0").getBoundingClientRect();
+ hitbox = document.getElementById("car1").getBoundingClientRect();
+
+ var overlap = !(carshb.right < hitbox.left ||
+ carshb.left > hitbox.right ||
+ carshb.bottom < hitbox.top ||
+ carshb.top > hitbox.bottom)
+
+ if (overlap) {
+ if (location.search === "?sp") {
+ scenar("wall1", "happy");
+ }
+ Sound.crash();
+ require('electron').ipcRenderer.send('addstats', { catalog: "ingame", key: "walls", add: 1 });
+ document.getElementById("car0").style.left = car0startx + "px";
+ document.getElementById("car0").style.top = car0starty + "px";
+ Array.from(document.getElementById('oil').children).forEach((item) => {
+ spreadOil(item);
+ })
+ document.getElementById("car0").style.transform = "rotate(0deg)";
+ car0cspeed = 0;
+ }
+ }
+
+// General Movements
+ setInterval(() => {
+ if (!paused) {
+ if (car0cspeed > 0) {
+ car0cspeed = car0cspeed - 0.1;
+ }
+ switch (document.getElementById("car0").style.transform) {
+ case "rotate(0deg)":
+ document.getElementById("car0").style.left = ((document.getElementById("car0").style.left.split("p")[0] - 1) + (1 + car0cspeed)) + "px";
+ break;
+ case "rotate(180deg)":
+ document.getElementById("car0").style.left = ((document.getElementById("car0").style.left.split("p")[0] - 1) - (1 + car0cspeed)) + "px";
+ break;
+ case "rotate(90deg)":
+ document.getElementById("car0").style.top = ((document.getElementById("car0").style.top.split("p")[0] - 1) + (1 + car0cspeed)) + "px";
+ break;
+ case "rotate(-90deg)":
+ document.getElementById("car0").style.top = ((document.getElementById("car0").style.top.split("p")[0] - 1) - (1 + car0cspeed)) + "px";
+ break;
+ }
+ if (document.getElementById("car0").style.left.split("p")[0] - 1 + 1 > (window.innerWidth - 30)) {
+ warn("CarManager:car0", "Colliding with screen border");
+ document.getElementById("car0").style.left = (window.innerWidth - 30) + "px";
+ }
+ if (document.getElementById("car0").style.top.split("p")[0] - 1 + 1 > (window.innerHeight - 30)) {
+ warn("CarManager:car0", "Colliding with screen border");
+ document.getElementById("car0").style.top = (window.innerHeight - 30) + "px";
+ }
+ if (document.getElementById("car0").style.top.split("p")[0] - 1 + 1 < 30) {
+ warn("CarManager:car0", "Colliding with screen border");
+ document.getElementById("car0").style.top = "30px";
+ }
+ if (document.getElementById("car0").style.left.split("p")[0] - 1 + 1 < 30) {
+ warn("CarManager:car0", "Colliding with screen border");
+ document.getElementById("car0").style.left = "30px";
+ }
+ if (car0cspeed > -0.1 && car0cspeed < 0) {
+ car0cspeed = 0;
+ }
+ car0collision();
+ }
+ }, 200)
+
})
\ No newline at end of file diff --git a/race/cars/car1.js b/race/cars/car1.js index 448008c..93469ed 100644 --- a/race/cars/car1.js +++ b/race/cars/car1.js @@ -1,239 +1,239 @@ -startHooks.push(() => { - car1speed = 16; - car1cspeed = 0; - if (online && role === "guest") { - car1startx = 428; - car1starty = 42.9; - } else { - car1startx = 388.9; - car1starty = 79.4; - } - car1collisionon = !online; - car1enableOOBChecker = false; - -// Collision Manager - function car1collision() { - if (!keysEnabled) { return; } - - if (started) { - carshb = document.getElementById("car1").getBoundingClientRect(); - hitbox = document.getElementById("barrier").getBoundingClientRect(); - - var overlap = !(carshb.right < hitbox.left || - carshb.left > hitbox.right || - carshb.bottom < hitbox.top || - carshb.top > hitbox.bottom) - - if (overlap && car1collisionon) { - info("CarManager:car0", "Reversal prevented at X " + document.getElementById("car1").style.left + ", Y " + document.getElementById("car1").style.top); - car1collisionon = false; - document.getElementById("car1").style.left = car1startx + "px"; - document.getElementById("car1").style.top = car1starty + "px"; - document.getElementById("car1").style.transform = "rotate(0deg)"; - car1cspeed = 0; - setTimeout(() => { - car1collisionon = true; - }, 500) - } - } - - if (!car1collisionon) { return; } - - walls = Array.from(document.getElementsByClassName("wall")); - - walls.forEach((wall) => { - carshb = document.getElementById("car1").getBoundingClientRect(); - hitbox = wall.getBoundingClientRect(); - - var overlap = !(carshb.right < hitbox.left || - carshb.left > hitbox.right || - carshb.bottom < hitbox.top || - carshb.top > hitbox.bottom) - - if (overlap) { - info("CarManager:car1", "Wall collision at X " + document.getElementById("car1").style.left + ", Y " + document.getElementById("car1").style.top); - if (location.search === "?sp") { - scenar("wall2", "angry"); - } - car1collisionon = false; - Sound.crash(); - document.getElementById("car1").style.left = car1startx + "px"; - document.getElementById("car1").style.top = car1starty + "px"; - document.getElementById("car1").style.transform = "rotate(0deg)"; - Array.from(document.getElementById('oil').children).forEach((item) => { - spreadOil(item); - }) - car1cspeed = 0; - setTimeout(() => { - car1collisionon = true; - }, 500) - } - }) - - Array.from(document.getElementById('oil').children).forEach((item) => { - carshb = document.getElementById("car1").getBoundingClientRect(); - hitbox = item.getBoundingClientRect(); - - var overlap = !(carshb.right < hitbox.left || - carshb.left > hitbox.right || - carshb.bottom < hitbox.top || - carshb.top > hitbox.bottom) - - if (overlap) { - car1cspeed = 5; - } - }) - - carshb = document.getElementById("car1").getBoundingClientRect(); - hitbox = document.getElementById("car0").getBoundingClientRect(); - - var overlap = !(carshb.right < hitbox.left || - carshb.left > hitbox.right || - carshb.bottom < hitbox.top || - carshb.top > hitbox.bottom) - - if (overlap) { - if (location.search === "?sp") { - scenar("wall2", "angry"); - } - car1collisionon = false; - Sound.crash(); - document.getElementById("car1").style.left = car1startx + "px"; - document.getElementById("car1").style.top = car1starty + "px"; - document.getElementById("car1").style.transform = "rotate(0deg)"; - Array.from(document.getElementById('oil').children).forEach((item) => { - spreadOil(item); - }) - car1cspeed = 0; - setTimeout(() => { - car1collisionon = true; - }, 500) - } - } - -// General Movements - setInterval(() => { - if (!paused) { - if (car1cspeed > 0) { - car1cspeed = car1cspeed - 0.1; - } - switch (document.getElementById("car1").style.transform) { - case "rotate(0deg)": - document.getElementById("car1").style.left = ((document.getElementById("car1").style.left.split("p")[0] - 1) + (1 + car1cspeed)) + "px"; - break; - case "rotate(180deg)": - document.getElementById("car1").style.left = ((document.getElementById("car1").style.left.split("p")[0] - 1) - (1 + car1cspeed)) + "px"; - break; - case "rotate(90deg)": - document.getElementById("car1").style.top = ((document.getElementById("car1").style.top.split("p")[0] - 1) + (1 + car1cspeed)) + "px"; - break; - case "rotate(-90deg)": - document.getElementById("car1").style.top = ((document.getElementById("car1").style.top.split("p")[0] - 1) - (1 + car1cspeed)) + "px"; - break; - } - if (document.getElementById("car1").style.left.split("p")[0] - 1 + 1 > (window.innerWidth - 30)) { - warn("CarManager:car1", "Colliding with screen border"); - if (car1enableOOBChecker) { - document.getElementById("car1").style.left = (window.innerWidth - 30) + "px"; - } - } - if (document.getElementById("car1").style.top.split("p")[0] - 1 + 1 > (window.innerHeight - 30)) { - warn("CarManager:car1", "Colliding with screen border"); - if (car1enableOOBChecker) { - document.getElementById("car1").style.top = (window.innerHeight - 30) + "px"; - } - } - if (document.getElementById("car1").style.top.split("p")[0] - 1 + 1 < 30) { - warn("CarManager:car1", "Colliding with screen border"); - if (car1enableOOBChecker) { - document.getElementById("car1").style.top = "30px"; - } - } - if (document.getElementById("car1").style.left.split("p")[0] - 1 + 1 < 30) { - warn("CarManager:car1", "Colliding with screen border"); - if (car1enableOOBChecker) { - document.getElementById("car1").style.left = "30px"; - } - } - if (car1cspeed > -0.1 && car1cspeed < 0) { - car1cspeed = 0; - } - car1collision(); - } - }, 200) - - setInterval(() => { - if (!car1collisionon) { return; } - - carshb = document.getElementById("car1").getBoundingClientRect(); - hitbox = document.getElementById("arrival").getBoundingClientRect(); - - var overlap = !(carshb.right < hitbox.left || - carshb.left > hitbox.right || - carshb.bottom < hitbox.top || - carshb.top > hitbox.bottom) - - if (overlap && started) { - started = false; - if ((document.getElementById('laps-car1').innerText.split("/")[0] - 1 + 1) < 4) { - info("CarManager:car1", "New lap"); - Array.from(document.getElementById('oil').children).forEach((item) => { - spreadOil(item); - }) - if ((document.getElementById('laps-car1').innerText.split("/")[0] - 1 + 1) < 3) { - Sound.pass() - } else { - Sound.last() - } - document.getElementById('laps-car1').innerText = (document.getElementById('laps-car1').innerText.split("/")[0] - 1 + 2).toString(); - if (location.search === "?sp") { - if ((document.getElementById('laps-car0').innerText.split("/")[0] - 1 + 1) > (document.getElementById('laps-car1').innerText.split("/")[0] - 1 + 1)) { - scenar("ahead1", "angry"); - } else { - scenar("ahead2", "happy"); - } - } - } else { - info("CarManager:car1", "Car won the game"); - if (location.search === "?sp") { - scenar("won2", "happy"); - } - require('electron').ipcRenderer.send('addstats', { catalog: "results", key: "loses", add: 1 }); - try { document.getElementById('music').src = "about:blank"; } catch (e) { console.error(e); } - Sound.win(); - keysEnabled = false; - car1cspeed = 0; - car1speed = 0; - document.getElementById('laps-car1').innerText = (document.getElementById('laps-car1').innerText.split("/")[0] - 1 + 2).toString(); - $("#box").fadeOut(500); - setTimeout(() => { - setTimeout(() => { - if (location.search === "?sp" || (online && role === "guest")) { - if (online) {} else { - location.href = "win.html?sp#car1"; - } - } else { - location.href = "win.html#car1"; - } - }, 3500) - }, 3000) - } - car1collisionon = false; - Sound.crash(); - document.getElementById("car1").style.left = car1startx + "px"; - document.getElementById("car1").style.top = car1starty + "px"; - document.getElementById("car1").style.transform = "rotate(0deg)"; - Array.from(document.getElementById('oil').children).forEach((item) => { - spreadOil(item); - }) - car1cspeed = 0; - setTimeout(() => { - car1collisionon = true; - }, 500) - setTimeout(() => { - started = true; - }, 150) - } - }, 20) - +startHooks.push(() => {
+ car1speed = 16;
+ car1cspeed = 0;
+ if (online && role === "guest") {
+ car1startx = 428;
+ car1starty = 42.9;
+ } else {
+ car1startx = 388.9;
+ car1starty = 79.4;
+ }
+ car1collisionon = !online;
+ car1enableOOBChecker = false;
+
+// Collision Manager
+ function car1collision() {
+ if (!keysEnabled) { return; }
+
+ if (started) {
+ carshb = document.getElementById("car1").getBoundingClientRect();
+ hitbox = document.getElementById("barrier").getBoundingClientRect();
+
+ var overlap = !(carshb.right < hitbox.left ||
+ carshb.left > hitbox.right ||
+ carshb.bottom < hitbox.top ||
+ carshb.top > hitbox.bottom)
+
+ if (overlap && car1collisionon) {
+ info("CarManager:car0", "Reversal prevented at X " + document.getElementById("car1").style.left + ", Y " + document.getElementById("car1").style.top);
+ car1collisionon = false;
+ document.getElementById("car1").style.left = car1startx + "px";
+ document.getElementById("car1").style.top = car1starty + "px";
+ document.getElementById("car1").style.transform = "rotate(0deg)";
+ car1cspeed = 0;
+ setTimeout(() => {
+ car1collisionon = true;
+ }, 500)
+ }
+ }
+
+ if (!car1collisionon) { return; }
+
+ walls = Array.from(document.getElementsByClassName("wall"));
+
+ walls.forEach((wall) => {
+ carshb = document.getElementById("car1").getBoundingClientRect();
+ hitbox = wall.getBoundingClientRect();
+
+ var overlap = !(carshb.right < hitbox.left ||
+ carshb.left > hitbox.right ||
+ carshb.bottom < hitbox.top ||
+ carshb.top > hitbox.bottom)
+
+ if (overlap) {
+ info("CarManager:car1", "Wall collision at X " + document.getElementById("car1").style.left + ", Y " + document.getElementById("car1").style.top);
+ if (location.search === "?sp") {
+ scenar("wall2", "angry");
+ }
+ car1collisionon = false;
+ Sound.crash();
+ document.getElementById("car1").style.left = car1startx + "px";
+ document.getElementById("car1").style.top = car1starty + "px";
+ document.getElementById("car1").style.transform = "rotate(0deg)";
+ Array.from(document.getElementById('oil').children).forEach((item) => {
+ spreadOil(item);
+ })
+ car1cspeed = 0;
+ setTimeout(() => {
+ car1collisionon = true;
+ }, 500)
+ }
+ })
+
+ Array.from(document.getElementById('oil').children).forEach((item) => {
+ carshb = document.getElementById("car1").getBoundingClientRect();
+ hitbox = item.getBoundingClientRect();
+
+ var overlap = !(carshb.right < hitbox.left ||
+ carshb.left > hitbox.right ||
+ carshb.bottom < hitbox.top ||
+ carshb.top > hitbox.bottom)
+
+ if (overlap) {
+ car1cspeed = 5;
+ }
+ })
+
+ carshb = document.getElementById("car1").getBoundingClientRect();
+ hitbox = document.getElementById("car0").getBoundingClientRect();
+
+ var overlap = !(carshb.right < hitbox.left ||
+ carshb.left > hitbox.right ||
+ carshb.bottom < hitbox.top ||
+ carshb.top > hitbox.bottom)
+
+ if (overlap) {
+ if (location.search === "?sp") {
+ scenar("wall2", "angry");
+ }
+ car1collisionon = false;
+ Sound.crash();
+ document.getElementById("car1").style.left = car1startx + "px";
+ document.getElementById("car1").style.top = car1starty + "px";
+ document.getElementById("car1").style.transform = "rotate(0deg)";
+ Array.from(document.getElementById('oil').children).forEach((item) => {
+ spreadOil(item);
+ })
+ car1cspeed = 0;
+ setTimeout(() => {
+ car1collisionon = true;
+ }, 500)
+ }
+ }
+
+// General Movements
+ setInterval(() => {
+ if (!paused) {
+ if (car1cspeed > 0) {
+ car1cspeed = car1cspeed - 0.1;
+ }
+ switch (document.getElementById("car1").style.transform) {
+ case "rotate(0deg)":
+ document.getElementById("car1").style.left = ((document.getElementById("car1").style.left.split("p")[0] - 1) + (1 + car1cspeed)) + "px";
+ break;
+ case "rotate(180deg)":
+ document.getElementById("car1").style.left = ((document.getElementById("car1").style.left.split("p")[0] - 1) - (1 + car1cspeed)) + "px";
+ break;
+ case "rotate(90deg)":
+ document.getElementById("car1").style.top = ((document.getElementById("car1").style.top.split("p")[0] - 1) + (1 + car1cspeed)) + "px";
+ break;
+ case "rotate(-90deg)":
+ document.getElementById("car1").style.top = ((document.getElementById("car1").style.top.split("p")[0] - 1) - (1 + car1cspeed)) + "px";
+ break;
+ }
+ if (document.getElementById("car1").style.left.split("p")[0] - 1 + 1 > (window.innerWidth - 30)) {
+ warn("CarManager:car1", "Colliding with screen border");
+ if (car1enableOOBChecker) {
+ document.getElementById("car1").style.left = (window.innerWidth - 30) + "px";
+ }
+ }
+ if (document.getElementById("car1").style.top.split("p")[0] - 1 + 1 > (window.innerHeight - 30)) {
+ warn("CarManager:car1", "Colliding with screen border");
+ if (car1enableOOBChecker) {
+ document.getElementById("car1").style.top = (window.innerHeight - 30) + "px";
+ }
+ }
+ if (document.getElementById("car1").style.top.split("p")[0] - 1 + 1 < 30) {
+ warn("CarManager:car1", "Colliding with screen border");
+ if (car1enableOOBChecker) {
+ document.getElementById("car1").style.top = "30px";
+ }
+ }
+ if (document.getElementById("car1").style.left.split("p")[0] - 1 + 1 < 30) {
+ warn("CarManager:car1", "Colliding with screen border");
+ if (car1enableOOBChecker) {
+ document.getElementById("car1").style.left = "30px";
+ }
+ }
+ if (car1cspeed > -0.1 && car1cspeed < 0) {
+ car1cspeed = 0;
+ }
+ car1collision();
+ }
+ }, 200)
+
+ setInterval(() => {
+ if (!car1collisionon) { return; }
+
+ carshb = document.getElementById("car1").getBoundingClientRect();
+ hitbox = document.getElementById("arrival").getBoundingClientRect();
+
+ var overlap = !(carshb.right < hitbox.left ||
+ carshb.left > hitbox.right ||
+ carshb.bottom < hitbox.top ||
+ carshb.top > hitbox.bottom)
+
+ if (overlap && started) {
+ started = false;
+ if ((document.getElementById('laps-car1').innerText.split("/")[0] - 1 + 1) < 4) {
+ info("CarManager:car1", "New lap");
+ Array.from(document.getElementById('oil').children).forEach((item) => {
+ spreadOil(item);
+ })
+ if ((document.getElementById('laps-car1').innerText.split("/")[0] - 1 + 1) < 3) {
+ Sound.pass()
+ } else {
+ Sound.last()
+ }
+ document.getElementById('laps-car1').innerText = (document.getElementById('laps-car1').innerText.split("/")[0] - 1 + 2).toString();
+ if (location.search === "?sp") {
+ if ((document.getElementById('laps-car0').innerText.split("/")[0] - 1 + 1) > (document.getElementById('laps-car1').innerText.split("/")[0] - 1 + 1)) {
+ scenar("ahead1", "angry");
+ } else {
+ scenar("ahead2", "happy");
+ }
+ }
+ } else {
+ info("CarManager:car1", "Car won the game");
+ if (location.search === "?sp") {
+ scenar("won2", "happy");
+ }
+ require('electron').ipcRenderer.send('addstats', { catalog: "results", key: "loses", add: 1 });
+ try { document.getElementById('music').src = "about:blank"; } catch (e) { console.error(e); }
+ Sound.win();
+ keysEnabled = false;
+ car1cspeed = 0;
+ car1speed = 0;
+ document.getElementById('laps-car1').innerText = (document.getElementById('laps-car1').innerText.split("/")[0] - 1 + 2).toString();
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ setTimeout(() => {
+ if (location.search === "?sp" || (online && role === "guest")) {
+ if (online) {} else {
+ location.href = "win.html?sp#car1";
+ }
+ } else {
+ location.href = "win.html#car1";
+ }
+ }, 3500)
+ }, 3000)
+ }
+ car1collisionon = false;
+ Sound.crash();
+ document.getElementById("car1").style.left = car1startx + "px";
+ document.getElementById("car1").style.top = car1starty + "px";
+ document.getElementById("car1").style.transform = "rotate(0deg)";
+ Array.from(document.getElementById('oil').children).forEach((item) => {
+ spreadOil(item);
+ })
+ car1cspeed = 0;
+ setTimeout(() => {
+ car1collisionon = true;
+ }, 500)
+ setTimeout(() => {
+ started = true;
+ }, 150)
+ }
+ }, 20)
+
})
\ No newline at end of file diff --git a/race/cars/car1ai.js b/race/cars/car1ai.js index 25e1819..4d3e1b9 100644 --- a/race/cars/car1ai.js +++ b/race/cars/car1ai.js @@ -1,160 +1,160 @@ -aiorient = "right"; -elem = 10; - -function enableAI() { - car1enableOOBChecker = false; - setInterval(() => { - if (aiorient === "top") { - ai_up(); - } else if (aiorient === "right") { - ai_right(); - } else if (aiorient === "bottom") { - ai_down(); - } else if (aiorient === "left") { - ai_left(); - } - }, 100) - setInterval(() => { - carshb = document.getElementById("aibox-near").getBoundingClientRect(); - hitbox = document.getElementById('barrier').getBoundingClientRect(); - - var overlap = !(carshb.right < hitbox.left || - carshb.left > hitbox.right || - carshb.bottom < hitbox.top || - carshb.top > hitbox.bottom) - - if (overlap) { - aiorient = "right"; - } - - if (elem < 10) { elem++; } - if (elem !== 10) { return; } - - walls = Array.from(document.getElementsByClassName("wall")); - - walls.forEach((wall) => { - carshb = document.getElementById("aibox-far").getBoundingClientRect(); - hitbox = wall.getBoundingClientRect(); - - var overlap = !(carshb.right < hitbox.left || - carshb.left > hitbox.right || - carshb.bottom < hitbox.top || - carshb.top > hitbox.bottom) - - carshb2 = document.getElementById("aibox-near").getBoundingClientRect(); - - var overlap2 = !(carshb2.right < hitbox.left || - carshb2.left > hitbox.right || - carshb2.bottom < hitbox.top || - carshb2.top > hitbox.bottom) - - if (overlap2) { - car1speed = 8; - } else if (overlap) { - car1speed = 9; - } else { - car1speed = 10; - } - - carshb = document.getElementById("aibox-far").getBoundingClientRect(); - hitbox = wall.getBoundingClientRect(); - - var overlap = !(carshb.right < hitbox.left || - carshb.left > hitbox.right || - carshb.bottom < hitbox.top || - carshb.top > hitbox.bottom) - - if (overlap) { - if (aiorient === "top") { - aiorient = "right"; - elem = 0; - } else if (aiorient === "right") { - aiorient = "bottom"; - elem = 0; - } else if (aiorient === "bottom") { - aiorient = "left"; - elem = 0; - } else if (aiorient === "left") { - aiorient = "top"; - elem = 0; - } - } - - carshb = document.getElementById("aibox-near").getBoundingClientRect(); - hitbox = document.getElementById('car0').getBoundingClientRect(); - - var overlap = !(carshb.right < hitbox.left || - carshb.left > hitbox.right || - carshb.bottom < hitbox.top || - carshb.top > hitbox.bottom) - - if (overlap) { - if (aiorient === "top") { - aiorient = "bottom"; - elem = 0; - } else if (aiorient === "right") { - aiorient = "left"; - elem = 0; - } else if (aiorient === "bottom") { - aiorient = "top"; - elem = 0; - } else if (aiorient === "left") { - aiorient = "right"; - elem = 0; - } - } - }) - }, 50) -} - -function ai_up() { - if (car1cspeed < car1speed) { - car1cspeed = car1cspeed + 0.2; - } - if (document.getElementById("car1").style.transform !== "rotate(-90deg)") { - document.getElementById("car1").style.transform = "rotate(-90deg)"; - car1collisionon = false; - setTimeout(() => { - car1collisionon = true; - }, 500) - } -} - -function ai_down() { - if (car1cspeed < car1speed) { - car1cspeed = car1cspeed + 0.2; - } - if (document.getElementById("car1").style.transform !== "rotate(90deg)") { - document.getElementById("car1").style.transform = "rotate(90deg)"; - car1collisionon = false; - setTimeout(() => { - car1collisionon = true; - }, 500) - } -} - -function ai_left() { - if (car1cspeed < car1speed) { - car1cspeed = car1cspeed + 0.2; - } - if (document.getElementById("car1").style.transform !== "rotate(180deg)") { - document.getElementById("car1").style.transform = "rotate(180deg)"; - car1collisionon = false; - setTimeout(() => { - car1collisionon = true; - }, 500) - } -} - -function ai_right() { - if (car1cspeed < car1speed) { - car1cspeed = car1cspeed + 0.2; - } - if (document.getElementById("car1").style.transform !== "rotate(0deg)") { - document.getElementById("car1").style.transform = "rotate(0deg)"; - car1collisionon = false; - setTimeout(() => { - car1collisionon = true; - }, 500) - } +aiorient = "right";
+elem = 10;
+
+function enableAI() {
+ car1enableOOBChecker = false;
+ setInterval(() => {
+ if (aiorient === "top") {
+ ai_up();
+ } else if (aiorient === "right") {
+ ai_right();
+ } else if (aiorient === "bottom") {
+ ai_down();
+ } else if (aiorient === "left") {
+ ai_left();
+ }
+ }, 100)
+ setInterval(() => {
+ carshb = document.getElementById("aibox-near").getBoundingClientRect();
+ hitbox = document.getElementById('barrier').getBoundingClientRect();
+
+ var overlap = !(carshb.right < hitbox.left ||
+ carshb.left > hitbox.right ||
+ carshb.bottom < hitbox.top ||
+ carshb.top > hitbox.bottom)
+
+ if (overlap) {
+ aiorient = "right";
+ }
+
+ if (elem < 10) { elem++; }
+ if (elem !== 10) { return; }
+
+ walls = Array.from(document.getElementsByClassName("wall"));
+
+ walls.forEach((wall) => {
+ carshb = document.getElementById("aibox-far").getBoundingClientRect();
+ hitbox = wall.getBoundingClientRect();
+
+ var overlap = !(carshb.right < hitbox.left ||
+ carshb.left > hitbox.right ||
+ carshb.bottom < hitbox.top ||
+ carshb.top > hitbox.bottom)
+
+ carshb2 = document.getElementById("aibox-near").getBoundingClientRect();
+
+ var overlap2 = !(carshb2.right < hitbox.left ||
+ carshb2.left > hitbox.right ||
+ carshb2.bottom < hitbox.top ||
+ carshb2.top > hitbox.bottom)
+
+ if (overlap2) {
+ car1speed = 8;
+ } else if (overlap) {
+ car1speed = 9;
+ } else {
+ car1speed = 16;
+ }
+
+ carshb = document.getElementById("aibox-far").getBoundingClientRect();
+ hitbox = wall.getBoundingClientRect();
+
+ var overlap = !(carshb.right < hitbox.left ||
+ carshb.left > hitbox.right ||
+ carshb.bottom < hitbox.top ||
+ carshb.top > hitbox.bottom)
+
+ if (overlap) {
+ if (aiorient === "top") {
+ aiorient = "right";
+ elem = 0;
+ } else if (aiorient === "right") {
+ aiorient = "bottom";
+ elem = 0;
+ } else if (aiorient === "bottom") {
+ aiorient = "left";
+ elem = 0;
+ } else if (aiorient === "left") {
+ aiorient = "top";
+ elem = 0;
+ }
+ }
+
+ carshb = document.getElementById("aibox-near").getBoundingClientRect();
+ hitbox = document.getElementById('car0').getBoundingClientRect();
+
+ var overlap = !(carshb.right < hitbox.left ||
+ carshb.left > hitbox.right ||
+ carshb.bottom < hitbox.top ||
+ carshb.top > hitbox.bottom)
+
+ if (overlap) {
+ if (aiorient === "top") {
+ aiorient = "bottom";
+ elem = 0;
+ } else if (aiorient === "right") {
+ aiorient = "left";
+ elem = 0;
+ } else if (aiorient === "bottom") {
+ aiorient = "top";
+ elem = 0;
+ } else if (aiorient === "left") {
+ aiorient = "right";
+ elem = 0;
+ }
+ }
+ })
+ }, 50)
+}
+
+function ai_up() {
+ if (car1cspeed < car1speed) {
+ car1cspeed = car1cspeed + 0.2;
+ }
+ if (document.getElementById("car1").style.transform !== "rotate(-90deg)") {
+ document.getElementById("car1").style.transform = "rotate(-90deg)";
+ car1collisionon = false;
+ setTimeout(() => {
+ car1collisionon = true;
+ }, 500)
+ }
+}
+
+function ai_down() {
+ if (car1cspeed < car1speed) {
+ car1cspeed = car1cspeed + 0.2;
+ }
+ if (document.getElementById("car1").style.transform !== "rotate(90deg)") {
+ document.getElementById("car1").style.transform = "rotate(90deg)";
+ car1collisionon = false;
+ setTimeout(() => {
+ car1collisionon = true;
+ }, 500)
+ }
+}
+
+function ai_left() {
+ if (car1cspeed < car1speed) {
+ car1cspeed = car1cspeed + 0.2;
+ }
+ if (document.getElementById("car1").style.transform !== "rotate(180deg)") {
+ document.getElementById("car1").style.transform = "rotate(180deg)";
+ car1collisionon = false;
+ setTimeout(() => {
+ car1collisionon = true;
+ }, 500)
+ }
+}
+
+function ai_right() {
+ if (car1cspeed < car1speed) {
+ car1cspeed = car1cspeed + 0.2;
+ }
+ if (document.getElementById("car1").style.transform !== "rotate(0deg)") {
+ document.getElementById("car1").style.transform = "rotate(0deg)";
+ car1collisionon = false;
+ setTimeout(() => {
+ car1collisionon = true;
+ }, 500)
+ }
}
\ No newline at end of file diff --git a/race/circuits/furry.png b/race/circuits/furry.png Binary files differdeleted file mode 100644 index c1d5d46..0000000 --- a/race/circuits/furry.png +++ /dev/null diff --git a/race/circuits/main.html b/race/circuits/main.html index 8285085..f8e484e 100644 --- a/race/circuits/main.html +++ b/race/circuits/main.html @@ -1,115 +1,115 @@ -<!-- Manifest version 5 (breaking with version 4) --> - -<!-- Metadata --> -<circuit> - { - "name": { - "fr": "Un simple carré", - "en": "A Simple Square" - }, - "author": "Minteck Projects" - } -</circuit> - -<!-- Cars --> -<div id="car0" style="display: inline-block;position: fixed;top: 42.9px;left: 428px;transform: rotate(0deg);"><img id="car0-img" style=" - width: 36px; -"></div> -<div id="car1" style="display: inline-block;position: fixed;top: 79.4px;left: 388.9px;transform: rotate(0deg);"><span id="aibox-far" style=" - position: absolute; - display: block; - top: -7px; - bottom: -7px; - left: 0px; - right: -30px; - animation-name: aibox; - animation-duration: 2s; - animation-iteration-count: infinite; - animation-timing-function: linear; - animation-direction: alternate-reverse; -"></span><span id="aibox-near" style=" - position: absolute; - display: block; - top: -7px; - bottom: -7px; - left: -7px; - right: -7px; -"></span><span id="aibox-nearest" style=" - position: absolute; - display: block; - top: -3px; - bottom: -3px; - left: -3px; - right: -3px; -"></span><img id="car1-img" style=" - width: 36px;"></div> - -<!-- Oils --> -<div id="oil"> - <img src="../race/oil.png" id="oil0" style="top: 278px; left: 634px; transform: rotate(68deg);"> - <img src="../race/oil.png" id="oil1" style="top: 22px; left: 457px; transform: rotate(217deg);"> - <img src="../race/oil.png" id="oil2" style="top: 26px; left: 531px; transform: rotate(82deg);"> - <img src="../race/oil.png" id="oil3" style="top: 155px; left: 425px; transform: rotate(120deg);"> - <img src="../race/oil.png" id="oil4" style="top: 137px; left: 121px; transform: rotate(178deg);"> -</div> - -<!-- Elements --> -<div id="elements"> - - <!-- Walls --> - - <div class="wall" style=" - height: 8px; - position: fixed; - width: 325px; - top: 110px; - left: 193px; -"></div><div class="wall" style=" - height: 8px; - position: fixed; - width: 498px; - top: 24px; - left: 107px; -"></div><div class="wall" style="height: 8px;position: fixed;width: 325px;top: 404px;left: 193px;"></div><div class="wall" style=" - height: 8px; - position: fixed; - width: 498px; - top: 492px; - left: 107px; -"></div><div class="wall" style=" - height: 300px; - position: fixed; - width: 8px; - top: 111px; - left: 194px; -"></div><div class="wall" style=" - height: 472px; - position: fixed; - width: 8px; - top: 25px; - left: 106px; -"></div><div class="wall" style="height: 300px;position: fixed;width: 8px;top: 110px;left: 515px;"></div><div class="wall" style=" - height: 472px; - position: fixed; - width: 8px; - top: 24px; - left: 602px; -"></div> - - <!-- Arrival Line --> - <div style=" - height: 127px; - position: fixed; - width: 8px; - top: 0px; - left: 346px; -" id="arrival"></div> - - <!-- Anti-reverse wall (codename Barrier) --> - <div style=" - height: 127px; - position: fixed; - width: 20px; - top: 0; - left: 355px; +<!-- Manifest version 5 (breaking with version 4) -->
+
+<!-- Metadata -->
+<circuit>
+ {
+ "name": {
+ "fr": "Un simple carré",
+ "en": "A Simple Square"
+ },
+ "author": "Minteck"
+ }
+</circuit>
+
+<!-- Cars -->
+<div id="car0" style="display: inline-block;position: fixed;top: 42.9px;left: 428px;transform: rotate(0deg);"><img id="car0-img" style="
+ width: 36px;
+"></div>
+<div id="car1" style="display: inline-block;position: fixed;top: 79.4px;left: 388.9px;transform: rotate(0deg);"><span id="aibox-far" style="
+ position: absolute;
+ display: block;
+ top: -7px;
+ bottom: -7px;
+ left: 0px;
+ right: -40px;
+ animation-name: aibox;
+ animation-duration: 2s;
+ animation-iteration-count: infinite;
+ animation-timing-function: linear;
+ animation-direction: alternate-reverse;
+"></span><span id="aibox-near" style="
+ position: absolute;
+ display: block;
+ top: -7px;
+ bottom: -7px;
+ left: -7px;
+ right: -7px;
+"></span><span id="aibox-nearest" style="
+ position: absolute;
+ display: block;
+ top: -3px;
+ bottom: -3px;
+ left: -3px;
+ right: -3px;
+"></span><img id="car1-img" style="
+ width: 36px;"></div>
+
+<!-- Oils -->
+<div id="oil">
+ <img src="../race/oil.png" id="oil0" style="top: 278px; left: 634px; transform: rotate(68deg);">
+ <img src="../race/oil.png" id="oil1" style="top: 22px; left: 457px; transform: rotate(217deg);">
+ <img src="../race/oil.png" id="oil2" style="top: 26px; left: 531px; transform: rotate(82deg);">
+ <img src="../race/oil.png" id="oil3" style="top: 155px; left: 425px; transform: rotate(120deg);">
+ <img src="../race/oil.png" id="oil4" style="top: 137px; left: 121px; transform: rotate(178deg);">
+</div>
+
+<!-- Elements -->
+<div id="elements">
+
+ <!-- Walls -->
+
+ <div class="wall" style="
+ height: 8px;
+ position: fixed;
+ width: 325px;
+ top: 110px;
+ left: 193px;
+"></div><div class="wall" style="
+ height: 8px;
+ position: fixed;
+ width: 498px;
+ top: 24px;
+ left: 107px;
+"></div><div class="wall" style="height: 8px;position: fixed;width: 325px;top: 404px;left: 193px;"></div><div class="wall" style="
+ height: 8px;
+ position: fixed;
+ width: 498px;
+ top: 492px;
+ left: 107px;
+"></div><div class="wall" style="
+ height: 300px;
+ position: fixed;
+ width: 8px;
+ top: 111px;
+ left: 194px;
+"></div><div class="wall" style="
+ height: 472px;
+ position: fixed;
+ width: 8px;
+ top: 25px;
+ left: 106px;
+"></div><div class="wall" style="height: 300px;position: fixed;width: 8px;top: 110px;left: 515px;"></div><div class="wall" style="
+ height: 472px;
+ position: fixed;
+ width: 8px;
+ top: 24px;
+ left: 602px;
+"></div>
+
+ <!-- Arrival Line -->
+ <div style="
+ height: 127px;
+ position: fixed;
+ width: 8px;
+ top: 0px;
+ left: 346px;
+" id="arrival"></div>
+
+ <!-- Anti-reverse wall (codename Barrier) -->
+ <div style="
+ height: 127px;
+ position: fixed;
+ width: 20px;
+ top: 0;
+ left: 355px;
" id="barrier"></div></div>
\ No newline at end of file diff --git a/race/circuits/snowy.html b/race/circuits/snowy.html index 3fea303..4b9cc64 100644 --- a/race/circuits/snowy.html +++ b/race/circuits/snowy.html @@ -1,115 +1,115 @@ -<!-- Manifest version 5 (breaking with version 4) --> - -<!-- Metadata --> -<circuit> - { - "name": { - "fr": "La montagne enneigée", - "en": "The Snowy Mountain" - }, - "author": "Minteck Projects" - } -</circuit> - -<!-- Cars --> -<div id="car0" style="display: inline-block;position: fixed;top: 42.9px;left: 428px;transform: rotate(0deg);"><img id="car0-img" style=" - width: 36px; -"></div> -<div id="car1" style="display: inline-block;position: fixed;top: 79.4px;left: 388.9px;transform: rotate(0deg);"><span id="aibox-far" style=" - position: absolute; - display: block; - top: -7px; - bottom: -7px; - left: 0px; - right: -30px; - animation-name: aibox; - animation-duration: 2s; - animation-iteration-count: infinite; - animation-timing-function: linear; - animation-direction: alternate-reverse; -"></span><span id="aibox-near" style=" - position: absolute; - display: block; - top: -7px; - bottom: -7px; - left: -7px; - right: -7px; -"></span><span id="aibox-nearest" style=" - position: absolute; - display: block; - top: -3px; - bottom: -3px; - left: -3px; - right: -3px; -"></span><img id="car1-img" style=" - width: 36px;"></div> - -<!-- Oils --> -<div id="oil"> - <img src="../race/oil.png" id="oil0" style="top: 278px; left: 634px; transform: rotate(68deg);"> - <img src="../race/oil.png" id="oil1" style="top: 22px; left: 457px; transform: rotate(217deg);"> - <img src="../race/oil.png" id="oil2" style="top: 26px; left: 531px; transform: rotate(82deg);"> - <img src="../race/oil.png" id="oil3" style="top: 155px; left: 425px; transform: rotate(120deg);"> - <img src="../race/oil.png" id="oil4" style="top: 137px; left: 121px; transform: rotate(178deg);"> -</div> - -<!-- Elements --> -<div id="elements"> - - <!-- Walls --> - - <div class="wall" style=" - height: 8px; - position: fixed; - width: 325px; - top: 110px; - left: 197px; -"></div><div class="wall" style=" - height: 8px; - position: fixed; - width: 498px; - top: 24px; - left: 112px; -"></div><div class="wall" style="height: 8px;position: fixed;width: 335px;top: 401px;left: 200px;"></div><div class="wall" style="height: 8px;position: fixed;width: 335px;top: 370px;left: 205px;"></div><div class="wall" style="height: 8px;position: fixed;width: 315px;top: 170px;left: 210px;"></div><div class="wall" style="height: 8px;position: fixed;width: 250px;top: 257px;left: 422px;"></div><div class="wall" style="height: 8px;position: fixed;width: 250px;top: 300px;left: 422px;"></div><div class="wall" style=" - height: 8px; - position: fixed; - width: 498px; - top: 471px; - left: 117px; -"></div><div class="wall" style=" - height: 300px; - position: fixed; - width: 8px; - top: 111px; - left: 197px; -"></div><div class="wall" style=" - height: 472px; - position: fixed; - width: 8px; - top: 25px; - left: 111px; -"></div><div class="wall" style="height: 70px;position: fixed;width: 8px;top: 110px;left: 520px;"></div><div class="wall" style="height: 210px;position: fixed;width: 8px;top: 170px;left: 335px;"></div><div class="wall" style="height: 45px;position: fixed;width: 8px;top: 260px;left: 422px;"></div><div class="wall" style=" - height: 472px; - position: fixed; - width: 8px; - top: 24px; - left: 608px; -"></div> - - <!-- Arrival Line --> - <div style=" - height: 127px; - position: fixed; - width: 8px; - top: 0px; - left: 346px; -" id="arrival"></div> - - <!-- Anti-reverse wall (codename Barrier) --> - <div style=" - height: 127px; - position: fixed; - width: 20px; - top: 0; - left: 355px; +<!-- Manifest version 5 (breaking with version 4) -->
+
+<!-- Metadata -->
+<circuit>
+ {
+ "name": {
+ "fr": "La montagne enneigée",
+ "en": "The Snowy Mountain"
+ },
+ "author": "Minteck"
+ }
+</circuit>
+
+<!-- Cars -->
+<div id="car0" style="display: inline-block;position: fixed;top: 42.9px;left: 428px;transform: rotate(0deg);"><img id="car0-img" style="
+ width: 36px;
+"></div>
+<div id="car1" style="display: inline-block;position: fixed;top: 79.4px;left: 388.9px;transform: rotate(0deg);"><span id="aibox-far" style="
+ position: absolute;
+ display: block;
+ top: -7px;
+ bottom: -7px;
+ left: 0px;
+ right: -40px;
+ animation-name: aibox;
+ animation-duration: 2s;
+ animation-iteration-count: infinite;
+ animation-timing-function: linear;
+ animation-direction: alternate-reverse;
+"></span><span id="aibox-near" style="
+ position: absolute;
+ display: block;
+ top: -7px;
+ bottom: -7px;
+ left: -7px;
+ right: -7px;
+"></span><span id="aibox-nearest" style="
+ position: absolute;
+ display: block;
+ top: -3px;
+ bottom: -3px;
+ left: -3px;
+ right: -3px;
+"></span><img id="car1-img" style="
+ width: 36px;"></div>
+
+<!-- Oils -->
+<div id="oil">
+ <img src="../race/oil.png" id="oil0" style="top: 278px; left: 634px; transform: rotate(68deg);">
+ <img src="../race/oil.png" id="oil1" style="top: 22px; left: 457px; transform: rotate(217deg);">
+ <img src="../race/oil.png" id="oil2" style="top: 26px; left: 531px; transform: rotate(82deg);">
+ <img src="../race/oil.png" id="oil3" style="top: 155px; left: 425px; transform: rotate(120deg);">
+ <img src="../race/oil.png" id="oil4" style="top: 137px; left: 121px; transform: rotate(178deg);">
+</div>
+
+<!-- Elements -->
+<div id="elements">
+
+ <!-- Walls -->
+
+ <div class="wall" style="
+ height: 8px;
+ position: fixed;
+ width: 325px;
+ top: 110px;
+ left: 197px;
+"></div><div class="wall" style="
+ height: 8px;
+ position: fixed;
+ width: 498px;
+ top: 24px;
+ left: 112px;
+"></div><div class="wall" style="height: 8px;position: fixed;width: 335px;top: 401px;left: 200px;"></div><div class="wall" style="height: 8px;position: fixed;width: 335px;top: 370px;left: 205px;"></div><div class="wall" style="height: 8px;position: fixed;width: 315px;top: 170px;left: 210px;"></div><div class="wall" style="height: 8px;position: fixed;width: 250px;top: 257px;left: 422px;"></div><div class="wall" style="height: 8px;position: fixed;width: 250px;top: 300px;left: 422px;"></div><div class="wall" style="
+ height: 8px;
+ position: fixed;
+ width: 498px;
+ top: 471px;
+ left: 117px;
+"></div><div class="wall" style="
+ height: 300px;
+ position: fixed;
+ width: 8px;
+ top: 111px;
+ left: 197px;
+"></div><div class="wall" style="
+ height: 472px;
+ position: fixed;
+ width: 8px;
+ top: 25px;
+ left: 111px;
+"></div><div class="wall" style="height: 70px;position: fixed;width: 8px;top: 110px;left: 520px;"></div><div class="wall" style="height: 210px;position: fixed;width: 8px;top: 170px;left: 335px;"></div><div class="wall" style="height: 45px;position: fixed;width: 8px;top: 260px;left: 422px;"></div><div class="wall" style="
+ height: 472px;
+ position: fixed;
+ width: 8px;
+ top: 24px;
+ left: 608px;
+"></div>
+
+ <!-- Arrival Line -->
+ <div style="
+ height: 127px;
+ position: fixed;
+ width: 8px;
+ top: 0px;
+ left: 346px;
+" id="arrival"></div>
+
+ <!-- Anti-reverse wall (codename Barrier) -->
+ <div style="
+ height: 127px;
+ position: fixed;
+ width: 20px;
+ top: 0;
+ left: 355px;
" id="barrier"></div></div>
\ No newline at end of file diff --git a/race/circuits/water.html b/race/circuits/water.html index 1c6166a..791ffb3 100644 --- a/race/circuits/water.html +++ b/race/circuits/water.html @@ -1,133 +1,133 @@ -<!-- Manifest version 5 (breaking with version 4) --> - -<!-- Metadata --> -<circuit> - { - "name": { - "fr": "Attention à l'eau", - "en": "Keep out the water" - }, - "author": "Minteck Projects" - } -</circuit> - -<!-- Cars --> -<div id="car0" style="display: inline-block;position: fixed;top: 42.9px;left: 428px;transform: rotate(0deg);"><img id="car0-img" style=" - width: 36px; -"></div> -<div id="car1" style="display: inline-block;position: fixed;top: 79.4px;left: 388.9px;transform: rotate(0deg);"><span id="aibox-far" style=" - position: absolute; - display: block; - top: -7px; - bottom: -7px; - left: 0px; - right: -30px; - animation-name: aibox; - animation-duration: 2s; - animation-iteration-count: infinite; - animation-timing-function: linear; - animation-direction: alternate-reverse; -"></span><span id="aibox-near" style=" - position: absolute; - display: block; - top: -7px; - bottom: -7px; - left: -7px; - right: -7px; -"></span><span id="aibox-nearest" style=" - position: absolute; - display: block; - top: -3px; - bottom: -3px; - left: -3px; - right: -3px; -"></span><img id="car1-img" style=" - width: 36px;"></div> - -<!-- Oils --> -<div id="oil"> - <img src="../race/oil.png" id="oil0" style="top: 278px; left: 634px; transform: rotate(68deg);"> - <img src="../race/oil.png" id="oil1" style="top: 22px; left: 457px; transform: rotate(217deg);"> - <img src="../race/oil.png" id="oil2" style="top: 26px; left: 531px; transform: rotate(82deg);"> - <img src="../race/oil.png" id="oil3" style="top: 155px; left: 425px; transform: rotate(120deg);"> - <img src="../race/oil.png" id="oil4" style="top: 137px; left: 121px; transform: rotate(178deg);"> -</div> - -<!-- Elements --> -<div id="elements"> - - <!-- Walls --> - - <div class="wall" style=" - height: 8px; - position: fixed; - width: 325px; - top: 110px; - left: 193px; -"></div><div class="wall" style=" - height: 8px; - position: fixed; - width: 498px; - top: 24px; - left: 107px; -"></div><div class="wall" style="height: 8px;position: fixed;width: 325px;top: 288px;left: 193px;"></div><div class="wall" style=" - height: 8px; - position: fixed; - width: 302px; - top: 469px; - left: 107px; -"></div><div class="wall" style=" - height: 186px; - position: fixed; - width: 8px; - top: 111px; - left: 194px; -"></div><div class="wall" style=" - height: 452px; - position: fixed; - width: 8px; - top: 25px; - left: 106px; -"></div><div class="wall" style="height: 186px;position: fixed;width: 8px;top: 110px;left: 515px;"></div><div class="wall" style=" - height: 346px; - position: fixed; - width: 8px; - top: 24px; - left: 602px; -"></div> - - <div class="wall" style=" - height: 8px; - position: fixed; - width: 210px; - top: 363px; - left: 401px; -"></div><div class="wall" style=" - height: 110px; - position: fixed; - width: 8px; - top: 363px; - left: 401px; -"></div><div class="wall" style=" - height: 145px; - position: fixed; - width: 180px; - top: 369px; - left: 187px; -"></div><!-- Arrival Line --> - <div style=" - height: 127px; - position: fixed; - width: 8px; - top: 0px; - left: 346px; -" id="arrival"></div> - - <!-- Anti-reverse wall (codename Barrier) --> - <div style=" - height: 127px; - position: fixed; - width: 20px; - top: 0; - left: 355px; +<!-- Manifest version 5 (breaking with version 4) -->
+
+<!-- Metadata -->
+<circuit>
+ {
+ "name": {
+ "fr": "Attention à l'eau",
+ "en": "Keep out the water"
+ },
+ "author": "Minteck"
+ }
+</circuit>
+
+<!-- Cars -->
+<div id="car0" style="display: inline-block;position: fixed;top: 42.9px;left: 428px;transform: rotate(0deg);"><img id="car0-img" style="
+ width: 36px;
+"></div>
+<div id="car1" style="display: inline-block;position: fixed;top: 79.4px;left: 388.9px;transform: rotate(0deg);"><span id="aibox-far" style="
+ position: absolute;
+ display: block;
+ top: -7px;
+ bottom: -7px;
+ left: 0px;
+ right: -40px;
+ animation-name: aibox;
+ animation-duration: 2s;
+ animation-iteration-count: infinite;
+ animation-timing-function: linear;
+ animation-direction: alternate-reverse;
+"></span><span id="aibox-near" style="
+ position: absolute;
+ display: block;
+ top: -7px;
+ bottom: -7px;
+ left: -7px;
+ right: -7px;
+"></span><span id="aibox-nearest" style="
+ position: absolute;
+ display: block;
+ top: -3px;
+ bottom: -3px;
+ left: -3px;
+ right: -3px;
+"></span><img id="car1-img" style="
+ width: 36px;"></div>
+
+<!-- Oils -->
+<div id="oil">
+ <img src="../race/oil.png" id="oil0" style="top: 278px; left: 634px; transform: rotate(68deg);">
+ <img src="../race/oil.png" id="oil1" style="top: 22px; left: 457px; transform: rotate(217deg);">
+ <img src="../race/oil.png" id="oil2" style="top: 26px; left: 531px; transform: rotate(82deg);">
+ <img src="../race/oil.png" id="oil3" style="top: 155px; left: 425px; transform: rotate(120deg);">
+ <img src="../race/oil.png" id="oil4" style="top: 137px; left: 121px; transform: rotate(178deg);">
+</div>
+
+<!-- Elements -->
+<div id="elements">
+
+ <!-- Walls -->
+
+ <div class="wall" style="
+ height: 8px;
+ position: fixed;
+ width: 325px;
+ top: 110px;
+ left: 193px;
+"></div><div class="wall" style="
+ height: 8px;
+ position: fixed;
+ width: 498px;
+ top: 24px;
+ left: 107px;
+"></div><div class="wall" style="height: 8px;position: fixed;width: 325px;top: 288px;left: 193px;"></div><div class="wall" style="
+ height: 8px;
+ position: fixed;
+ width: 302px;
+ top: 469px;
+ left: 107px;
+"></div><div class="wall" style="
+ height: 186px;
+ position: fixed;
+ width: 8px;
+ top: 111px;
+ left: 194px;
+"></div><div class="wall" style="
+ height: 452px;
+ position: fixed;
+ width: 8px;
+ top: 25px;
+ left: 106px;
+"></div><div class="wall" style="height: 186px;position: fixed;width: 8px;top: 110px;left: 515px;"></div><div class="wall" style="
+ height: 346px;
+ position: fixed;
+ width: 8px;
+ top: 24px;
+ left: 602px;
+"></div>
+
+ <div class="wall" style="
+ height: 8px;
+ position: fixed;
+ width: 210px;
+ top: 363px;
+ left: 401px;
+"></div><div class="wall" style="
+ height: 110px;
+ position: fixed;
+ width: 8px;
+ top: 363px;
+ left: 401px;
+"></div><div class="wall" style="
+ height: 145px;
+ position: fixed;
+ width: 180px;
+ top: 369px;
+ left: 187px;
+"></div><!-- Arrival Line -->
+ <div style="
+ height: 127px;
+ position: fixed;
+ width: 8px;
+ top: 0px;
+ left: 346px;
+" id="arrival"></div>
+
+ <!-- Anti-reverse wall (codename Barrier) -->
+ <div style="
+ height: 127px;
+ position: fixed;
+ width: 20px;
+ top: 0;
+ left: 355px;
" id="barrier"></div></div>
\ No newline at end of file diff --git a/race/pause.js b/race/pause.js index 92a78a6..2de1d3a 100644 --- a/race/pause.js +++ b/race/pause.js @@ -1,100 +1,100 @@ -global.quitting = false; - -startHooks.push(() => { - global.pause = (stat) => { - if (stat) { - if (location.search === "?sp") { - require('@electron/remote').getCurrentWindow().dstate = lang.discord.game[3]; - require('@electron/remote').getCurrentWindow().ddetails = lang.discord.game[1]; - } else { - require('@electron/remote').getCurrentWindow().dstate = lang.discord.game[3]; - require('@electron/remote').getCurrentWindow().ddetails = lang.discord.game[2]; - } - warn("Suspend", "Game paused"); - Sound.pause(); - if (require('@electron/remote').getCurrentWindow().music) { - shouldMusicPlay = false; - require('electron').ipcRenderer.send('prefademusic', ""); - } - if (typeof e !== "undefined") { - if (e.currentTime < e.duration) { - e.pause(); - } - } - if (typeof b !== "undefined") { - b.pause(); - } - paused = true; - document.getElementById('box').classList.add('paused'); - $("#paused").show(); - } else { - if (location.search === "?sp") { - require('@electron/remote').getCurrentWindow().dstate = lang.discord.game[0]; - require('@electron/remote').getCurrentWindow().ddetails = lang.discord.game[1]; - } else { - require('@electron/remote').getCurrentWindow().dstate = lang.discord.game[0]; - require('@electron/remote').getCurrentWindow().ddetails = lang.discord.game[2]; - } - warn("Suspend", "Game resumed"); - Sound.pause(); - if (require('@electron/remote').getCurrentWindow().music) { - shouldMusicPlay = true; - require('electron').ipcRenderer.send('preunfademusic', ""); - } - if (typeof me !== "undefined") { - if (me.currentTime < me.duration) { - me.play(); - } - } - if (typeof b !== "undefined") { - b.play(); - } - paused = false; - document.getElementById('box').classList.remove('paused'); - $("#paused").hide(); - } - } - - global.selectOption = () => { - item = document.querySelector(".selected a").id; - Sound.click(); - - switch (item) { - case 'continue': - pause(false); - break; - case 'hitboxes': - if (hitshow) { - hitshow = false; - document.getElementById("circuit").classList.remove("hitboxes"); - document.getElementById('hitboxes').innerText = lang.game.gpause.showhb; - info("GameWindow", "Hitboxes hidden"); - } else { - hitshow = true; - document.getElementById("circuit").classList.add("hitboxes"); - document.getElementById('hitboxes').innerText = lang.game.gpause.hidehb; - info("GameWindow", "Hitboxes shown"); - } - break; - case 'quit': - if (online) { - global.quitting = true; - clientWriter(JSON.stringify({ - _type: "ipc", - action: "abort", - message: null - }) + "|") - } - keysEnabled = false; - require('electron').ipcRenderer.send('prefademusic', ""); - $("#box").fadeOut(500); - $("#bg").fadeOut(500); - $("#paused").fadeOut(500); - setTimeout(() => { - info("GameWindow", "Switching control to MenuWindow"); - location.href = "menu.html?back"; - }, 1000) - break; - } - } +global.quitting = false;
+
+startHooks.push(() => {
+ global.pause = (stat) => {
+ if (stat) {
+ if (location.search === "?sp") {
+ require('@electron/remote').getCurrentWindow().dstate = lang.discord.game[3];
+ require('@electron/remote').getCurrentWindow().ddetails = lang.discord.game[1];
+ } else {
+ require('@electron/remote').getCurrentWindow().dstate = lang.discord.game[3];
+ require('@electron/remote').getCurrentWindow().ddetails = lang.discord.game[2];
+ }
+ warn("Suspend", "Game paused");
+ Sound.pause();
+ if (require('@electron/remote').getCurrentWindow().music) {
+ shouldMusicPlay = false;
+ require('electron').ipcRenderer.send('prefademusic', "");
+ }
+ if (typeof e !== "undefined") {
+ if (e.currentTime < e.duration) {
+ e.pause();
+ }
+ }
+ if (typeof b !== "undefined") {
+ b.pause();
+ }
+ paused = true;
+ document.getElementById('box').classList.add('paused');
+ $("#paused").show();
+ } else {
+ if (location.search === "?sp") {
+ require('@electron/remote').getCurrentWindow().dstate = lang.discord.game[0];
+ require('@electron/remote').getCurrentWindow().ddetails = lang.discord.game[1];
+ } else {
+ require('@electron/remote').getCurrentWindow().dstate = lang.discord.game[0];
+ require('@electron/remote').getCurrentWindow().ddetails = lang.discord.game[2];
+ }
+ warn("Suspend", "Game resumed");
+ Sound.pause();
+ if (require('@electron/remote').getCurrentWindow().music) {
+ shouldMusicPlay = true;
+ require('electron').ipcRenderer.send('preunfademusic', "");
+ }
+ if (typeof me !== "undefined") {
+ if (me.currentTime < me.duration) {
+ me.play();
+ }
+ }
+ if (typeof b !== "undefined") {
+ b.play();
+ }
+ paused = false;
+ document.getElementById('box').classList.remove('paused');
+ $("#paused").hide();
+ }
+ }
+
+ global.selectOption = () => {
+ item = document.querySelector(".selected a").id;
+ Sound.click();
+
+ switch (item) {
+ case 'continue':
+ pause(false);
+ break;
+ case 'hitboxes':
+ if (hitshow) {
+ hitshow = false;
+ document.getElementById("circuit").classList.remove("hitboxes");
+ document.getElementById('hitboxes').innerText = lang.game.gpause.showhb;
+ info("GameWindow", "Hitboxes hidden");
+ } else {
+ hitshow = true;
+ document.getElementById("circuit").classList.add("hitboxes");
+ document.getElementById('hitboxes').innerText = lang.game.gpause.hidehb;
+ info("GameWindow", "Hitboxes shown");
+ }
+ break;
+ case 'quit':
+ if (online) {
+ global.quitting = true;
+ clientWriter(JSON.stringify({
+ _type: "ipc",
+ action: "abort",
+ message: null
+ }) + "|")
+ }
+ keysEnabled = false;
+ require('electron').ipcRenderer.send('prefademusic', "");
+ $("#box").fadeOut(500);
+ $("#bg").fadeOut(500);
+ $("#paused").fadeOut(500);
+ setTimeout(() => {
+ info("GameWindow", "Switching control to MenuWindow");
+ location.href = "menu.html?back";
+ }, 1000)
+ break;
+ }
+ }
})
\ No newline at end of file diff --git a/runtime/kartik-crash.bat b/runtime/kartik-crash.bat index f7c85b0..6b4141d 100644 --- a/runtime/kartik-crash.bat +++ b/runtime/kartik-crash.bat @@ -1,2 +1,2 @@ -@echo off +@echo off
bin\win32\kartik-core.exe crash\wrapper.js %1
\ No newline at end of file diff --git a/runtime/kartik-debug.bat b/runtime/kartik-debug.bat index 475547d..89b1f42 100644 --- a/runtime/kartik-debug.bat +++ b/runtime/kartik-debug.bat @@ -1,2 +1,2 @@ -@echo off +@echo off
bin\win32\kartik-core.exe app.js d
\ No newline at end of file diff --git a/runtime/kartik-launcher.bat b/runtime/kartik-launcher.bat index e7775a8..401267c 100644 --- a/runtime/kartik-launcher.bat +++ b/runtime/kartik-launcher.bat @@ -1,2 +1,2 @@ -cd %localappdata%\Kartik +cd %localappdata%\Kartik
kartik.bat
\ No newline at end of file diff --git a/runtime/kartik-launcher.sed b/runtime/kartik-launcher.sed index 13c6d5e..c6df556 100644 --- a/runtime/kartik-launcher.sed +++ b/runtime/kartik-launcher.sed @@ -1,37 +1,37 @@ -[Version] -Class=IEXPRESS -SEDVersion=3 -[Options] -PackagePurpose=InstallApp -ShowInstallProgramWindow=1 -HideExtractAnimation=1 -UseLongFileName=1 -InsideCompressed=0 -CAB_FixedSize=0 -CAB_ResvCodeSigning=0 -RebootMode=N -InstallPrompt=%InstallPrompt% -DisplayLicense=%DisplayLicense% -FinishMessage=%FinishMessage% -TargetName=%TargetName% -FriendlyName=%FriendlyName% -AppLaunched=%AppLaunched% -PostInstallCmd=%PostInstallCmd% -AdminQuietInstCmd=%AdminQuietInstCmd% -UserQuietInstCmd=%UserQuietInstCmd% -SourceFiles=SourceFiles -[Strings] -InstallPrompt= -DisplayLicense= -FinishMessage= -TargetName=X:\Projets\Kartik\kartik-launcher.exe -FriendlyName=Kartik -AppLaunched=cmd /c kartik-launcher.bat -PostInstallCmd=<None> -AdminQuietInstCmd= -UserQuietInstCmd= -FILE0="kartik-launcher.bat" -[SourceFiles] -SourceFiles0=X:\Projets\Kartik\ -[SourceFiles0] -%FILE0%= +[Version]
+Class=IEXPRESS
+SEDVersion=3
+[Options]
+PackagePurpose=InstallApp
+ShowInstallProgramWindow=1
+HideExtractAnimation=1
+UseLongFileName=1
+InsideCompressed=0
+CAB_FixedSize=0
+CAB_ResvCodeSigning=0
+RebootMode=N
+InstallPrompt=%InstallPrompt%
+DisplayLicense=%DisplayLicense%
+FinishMessage=%FinishMessage%
+TargetName=%TargetName%
+FriendlyName=%FriendlyName%
+AppLaunched=%AppLaunched%
+PostInstallCmd=%PostInstallCmd%
+AdminQuietInstCmd=%AdminQuietInstCmd%
+UserQuietInstCmd=%UserQuietInstCmd%
+SourceFiles=SourceFiles
+[Strings]
+InstallPrompt=
+DisplayLicense=
+FinishMessage=
+TargetName=X:\Projets\Kartik\kartik-launcher.exe
+FriendlyName=Kartik
+AppLaunched=cmd /c kartik-launcher.bat
+PostInstallCmd=<None>
+AdminQuietInstCmd=
+UserQuietInstCmd=
+FILE0="kartik-launcher.bat"
+[SourceFiles]
+SourceFiles0=X:\Projets\Kartik\
+[SourceFiles0]
+%FILE0%=
diff --git a/runtime/kartik-mitigation.bat b/runtime/kartik-mitigation.bat index b7e3d53..17ccdba 100644 --- a/runtime/kartik-mitigation.bat +++ b/runtime/kartik-mitigation.bat @@ -1,2 +1,2 @@ -@echo off -bin\win32\kartik-core.exe app.js m +@echo off
+bin\win32\kartik-core.exe app.js m
diff --git a/scenario/client.js b/scenario/client.js index 38412c5..68203e3 100644 --- a/scenario/client.js +++ b/scenario/client.js @@ -1,9 +1,9 @@ -function scenar(ns, emote, cb) { - if (!require('@electron/remote').getCurrentWindow().voice) { return; }; - - min = 0; - max = lang.scenario[ns].length - 1; - id = Math.floor(Math.random() * (max - min + 1) + min); - - require('@electron/remote').getCurrentWindow().webContents.send("scenario", {message:lang.scenario[ns][id],lang:lp,namespace:ns,id:id,emote:emote,callback:cb}); -} +function scenar(ns, emote, cb) {
+ if (!require('@electron/remote').getCurrentWindow().voice) { return; };
+
+ min = 0;
+ max = lang.scenario[ns].length - 1;
+ id = Math.floor(Math.random() * (max - min + 1) + min);
+
+ require('@electron/remote').getCurrentWindow().webContents.send("scenario", {message:lang.scenario[ns][id],lang:lp,namespace:ns,id:id,emote:emote,callback:cb});
+}
diff --git a/sfx/click.mp3 b/sfx/click.mp3 Binary files differindex 710c85b..20feda0 100644 --- a/sfx/click.mp3 +++ b/sfx/click.mp3 diff --git a/sfx/crash.mp3 b/sfx/crash.mp3 Binary files differindex 1ce02e9..c68bb1f 100644 --- a/sfx/crash.mp3 +++ b/sfx/crash.mp3 diff --git a/sfx/gamecrash.wav b/sfx/gamecrash.wav Binary files differnew file mode 100644 index 0000000..4f42092 --- /dev/null +++ b/sfx/gamecrash.wav diff --git a/sfx/intro.mp3 b/sfx/intro.mp3 Binary files differindex 5d90f31..39eeae8 100644 --- a/sfx/intro.mp3 +++ b/sfx/intro.mp3 diff --git a/sfx/last.mp3 b/sfx/last.mp3 Binary files differindex 2595f73..ff00ddf 100644 --- a/sfx/last.mp3 +++ b/sfx/last.mp3 diff --git a/sfx/menu.mp3 b/sfx/menu.mp3 Binary files differindex f48daa8..626a82e 100644 --- a/sfx/menu.mp3 +++ b/sfx/menu.mp3 diff --git a/sfx/notification.mp3 b/sfx/notification.mp3 Binary files differnew file mode 100644 index 0000000..09f548a --- /dev/null +++ b/sfx/notification.mp3 diff --git a/sfx/pass.mp3 b/sfx/pass.mp3 Binary files differindex 04caca0..e4fc004 100644 --- a/sfx/pass.mp3 +++ b/sfx/pass.mp3 diff --git a/sfx/pause.mp3 b/sfx/pause.mp3 Binary files differindex aedcd13..76d0634 100644 --- a/sfx/pause.mp3 +++ b/sfx/pause.mp3 @@ -1,60 +1,60 @@ -const Sound = { - pass: () => { - new Audio(kresources.sfx['pass']).play() - }, - last: () => { - new Audio(kresources.sfx['last']).play() - }, - crash: () => { - new Audio(kresources.sfx['crash']).play() - }, - win: () => { - new Audio(kresources.sfx['win']).play() - }, - click: () => { - new Audio(kresources.sfx['click']).play() - }, - menu: () => { - new Audio(kresources.sfx['menu']).play() - }, - pause: () => { - new Audio(kresources.sfx['pause']).play() - }, - start: () => { - new Audio(kresources.sfx['start']).play() - }, - intro: () => { - new Audio(kresources.music['start'].file).play() - }, -} - -shouldMusicPlay = true; - -setInterval(() => { - try { - if (typeof document.getElementById('music') !== "undefined" && typeof document.getElementById('music') !== "null") { - if (shouldMusicPlay) { - document.getElementById('music').play(); - } - if (!shouldMusicPlay) { - document.getElementById('music').pause(); - } - } - if (typeof b !== "undefined" && typeof b !== "null") { - if (shouldMusicPlay) { - b.play(); - } - if (!shouldMusicPlay) { - b.pause(); - } - } - if (typeof me !== "undefined" && typeof me !== "null") { - if (me.currentTime < me.duration) { - me.play(); - } - if (me.currentTime >= me.duration) { - me.pause(); - } - } - } catch (e) {} +const Sound = {
+ pass: () => {
+ new Audio(kresources.sfx['pass']).play()
+ },
+ last: () => {
+ new Audio(kresources.sfx['last']).play()
+ },
+ crash: () => {
+ new Audio(kresources.sfx['crash']).play()
+ },
+ win: () => {
+ new Audio(kresources.sfx['win']).play()
+ },
+ click: () => {
+ new Audio(kresources.sfx['click']).play()
+ },
+ menu: () => {
+ new Audio(kresources.sfx['menu']).play()
+ },
+ pause: () => {
+ new Audio(kresources.sfx['pause']).play()
+ },
+ start: () => {
+ new Audio(kresources.sfx['start']).play()
+ },
+ intro: () => {
+ new Audio(kresources.music['start'].file).play()
+ },
+}
+
+shouldMusicPlay = true;
+
+setInterval(() => {
+ try {
+ if (typeof document.getElementById('music') !== "undefined" && typeof document.getElementById('music') !== "null") {
+ if (shouldMusicPlay) {
+ document.getElementById('music').play();
+ }
+ if (!shouldMusicPlay) {
+ document.getElementById('music').pause();
+ }
+ }
+ if (typeof b !== "undefined" && typeof b !== "null") {
+ if (shouldMusicPlay) {
+ b.play();
+ }
+ if (!shouldMusicPlay) {
+ b.pause();
+ }
+ }
+ if (typeof me !== "undefined" && typeof me !== "null") {
+ if (me.currentTime < me.duration) {
+ me.play();
+ }
+ if (me.currentTime >= me.duration) {
+ me.pause();
+ }
+ }
+ } catch (e) {}
}, 200)
\ No newline at end of file diff --git a/sfx/win.mp3 b/sfx/win.mp3 Binary files differindex 9a7ae56..d3c3b89 100644 --- a/sfx/win.mp3 +++ b/sfx/win.mp3 diff --git a/signing/sign.js b/signing/sign.js index 2e1c23d..aa91be3 100644 --- a/signing/sign.js +++ b/signing/sign.js @@ -1,33 +1,33 @@ -const fs = require('fs'); -const crypto = require('crypto'); -global.sdb = { - "v1": {}, - "v2": {}, - "v3": {} -}; - -function scan(start) { - rt = fs.readdirSync(start); - for (file of rt) { - if (file !== ".git" && file !== "build" && file !== "signatures.json" && file !== "staging" && file !== "node_modules" && !file.endsWith(".staging") && !file.endsWith(".old") && file !== "_translate") { - if (fs.lstatSync(start + "/" + file).isDirectory()) { - scan(start + "/" + file); - } else { - sign = crypto.createHash('sha512').update(fs.readFileSync(start + "/" + file)).digest('base64') - console.log("Signed (SHA-512): " + start + "/" + file + ": " + sign); - sdb["v1"][(start + "/" + file).substr(1)] = sign; - - sign = crypto.createHash('sha1').update(fs.readFileSync(start + "/" + file)).digest('base64') - console.log("Signed (SHA-1): " + start + "/" + file + ": " + sign); - sdb["v2"][(start + "/" + file).substr(1)] = sign; - - sign = crypto.createHash('md5').update(fs.readFileSync(start + "/" + file)).digest('base64') - console.log("Signed (MD5): " + start + "/" + file + ": " + sign); - sdb["v3"][(start + "/" + file).substr(1)] = sign; - } - } - } -} - -scan(".."); -fs.writeFileSync("../bin/signatures.json", JSON.stringify(sdb));
\ No newline at end of file +const fs = require('fs');
+const crypto = require('crypto');
+global.sdb = {
+ "v1": {},
+ "v2": {},
+ "v3": {}
+};
+
+function scan(start) {
+ rt = fs.readdirSync(start);
+ for (file of rt) {
+ if (file !== ".git" && file !== "build" && file !== "signatures.json" && file !== "staging" && file !== "node_modules" && !file.endsWith(".staging") && !file.endsWith(".old") && file !== "_translate" && file !== "macos") {
+ if (fs.lstatSync(start + "/" + file).isDirectory()) {
+ scan(start + "/" + file);
+ } else {
+ sign = crypto.createHash('sha512').update(fs.readFileSync(start + "/" + file)).digest('base64')
+ console.log("Signed (SHA-512): " + start + "/" + file + ": " + sign);
+ sdb["v1"][(start + "/" + file).substr(1)] = sign;
+
+ sign = crypto.createHash('sha1').update(fs.readFileSync(start + "/" + file)).digest('base64')
+ console.log("Signed (SHA-1): " + start + "/" + file + ": " + sign);
+ sdb["v2"][(start + "/" + file).substr(1)] = sign;
+
+ sign = crypto.createHash('md5').update(fs.readFileSync(start + "/" + file)).digest('base64')
+ console.log("Signed (MD5): " + start + "/" + file + ": " + sign);
+ sdb["v3"][(start + "/" + file).substr(1)] = sign;
+ }
+ }
+ }
+}
+
+scan("..");
+fs.writeFileSync("../bin/signatures.json", JSON.stringify(sdb));
diff --git a/typescript/builder.js b/typescript/builder.js new file mode 100644 index 0000000..d021fb2 --- /dev/null +++ b/typescript/builder.js @@ -0,0 +1,50 @@ +const os = require('os');
+const fs = require('fs');
+const { dialog } = require('electron');
+
+if (os.platform() === "win32") {
+ cmd = "typescript\\engine-win32.exe";
+} else {
+ cmd = "./typescript/engine-" + os.platform();
+}
+
+fs.copyFileSync("./typescript/interface.ts", homedir + "/.kartik/build/kartik.ts");
+
+cp = require('child_process').spawnSync(cmd, [ "./node_modules/typescript/bin/tsc", "--skipLibCheck", "--removeComments", "--sourceMap", "-m", "commonjs", "--target", "es6", homedir + "/.kartik/build/kartik.ts" ], { cwd: KartikRoot });
+if (cp.status !== 0) {
+ console.error(cp.stdout.toString());
+ throw new Error("Subprocess exited with code " + cp.status);
+}
+
+fs.unlinkSync(homedir + "/.kartik/build/kartik.ts");
+
+module.exports = (source, destination) => {
+ if (os.platform() === "win32") {
+ source = source.replaceAll("/", "\\");
+ destination = destination.replaceAll("/", "\\");
+ }
+
+ console.log(destination.substr(0, destination.length - 3));
+ fs.copyFileSync(source, destination.substr(0, destination.length - 3));
+ fs.writeFileSync(destination.substr(0, destination.length - 3), fs.readFileSync(destination.substr(0, destination.length - 3)).toString().replaceAll("$KARTIK:", homedir.replaceAll("\\", "\\\\") + "/.kartik/build/kartik.js"))
+ cp = require('child_process').spawnSync(cmd, [ "./node_modules/typescript/bin/tsc", "--skipLibCheck", "--removeComments", "--sourceMap", "-m", "commonjs", "--target", "es5", destination.substr(0, destination.length - 3) ], { cwd: KartikRoot });
+ if (cp.status !== 0) {
+ if (cp.stdout !== undefined) {
+ dialog.showMessageBoxSync(
+ {
+ type: "error",
+ title: "KMP Mod Loader",
+ message: "On package " + item + ": KMP-API building " + source + ":\n\n" + cp.stdout.toString().trim() + "\n\nEXITING."
+ }
+ )
+ process.exit(2);
+ } else {
+ throw new Error("Subprocess exited with code " + cp.status);
+ }
+ }
+ compiledTypeScriptFiles.push(destination.substr(0, destination.length - 6) + ".js");
+
+ lines = fs.readFileSync(destination.substr(0, destination.length - 6) + ".js").toString().split("\n");
+ lines[1] = "";
+ fs.writeFileSync(destination.substr(0, destination.length - 6) + ".js", lines.join("\n"));
+}
\ No newline at end of file diff --git a/typescript/engine-darwin b/typescript/engine-darwin Binary files differnew file mode 100644 index 0000000..a09cf1e --- /dev/null +++ b/typescript/engine-darwin diff --git a/typescript/engine-linux b/typescript/engine-linux Binary files differnew file mode 100644 index 0000000..9a7aa3e --- /dev/null +++ b/typescript/engine-linux diff --git a/typescript/engine-win32.exe b/typescript/engine-win32.exe Binary files differnew file mode 100644 index 0000000..9c32378 --- /dev/null +++ b/typescript/engine-win32.exe diff --git a/typescript/interface.ts b/typescript/interface.ts new file mode 100644 index 0000000..18821c1 --- /dev/null +++ b/typescript/interface.ts @@ -0,0 +1,23 @@ +// @ts-nocheck
+
+let item = {
+ context: null,
+
+ dom: {
+ document: null,
+ window: null,
+ },
+
+};
+
+if (typeof HTML !== "undefined") {
+ if (typeof HTML.document !== "undefined") {
+ item.dom.document = HTML.document;
+ }
+
+ if (typeof window !== "undefined") {
+ item.dom.window = HTML.window;
+ }
+}
+
+module.exports = item;
\ No newline at end of file diff --git a/typescript/mainloader.js b/typescript/mainloader.js new file mode 100644 index 0000000..32c1144 --- /dev/null +++ b/typescript/mainloader.js @@ -0,0 +1,10 @@ +window.addEventListener("load", () => {
+ files = require('@electron/remote').getCurrentWindow().modsfiles;
+ global.HTML = window;
+
+ for (file of files) {
+ var script = document.createElement('script');
+ script.src = "file://" + file.replaceAll("\\", "/");
+ document.head.appendChild(script)
+ }
+})
\ No newline at end of file diff --git a/typescript/preloader.js b/typescript/preloader.js new file mode 100644 index 0000000..d5d9129 --- /dev/null +++ b/typescript/preloader.js @@ -0,0 +1,5 @@ +files = compiledTypeScriptFiles;
+
+for (file of files) {
+ require(file);
+}
\ No newline at end of file diff --git a/views/background.jpg b/views/background.jpg Binary files differindex d3e959a..1129efc 100644 --- a/views/background.jpg +++ b/views/background.jpg diff --git a/views/common/blur.css b/views/common/blur.css index f904c12..1b0dbfc 100644 --- a/views/common/blur.css +++ b/views/common/blur.css @@ -1,3 +1,3 @@ -#intro, #laps-inner-car0, #laps-inner-car1, #paused, #credits, #gpuinfo, #warning { - backdrop-filter: blur(10px); +#intro, #laps-inner-car0, #laps-inner-car1, #paused, #credits, #gpuinfo, #warning {
+ backdrop-filter: blur(10px);
}
\ No newline at end of file diff --git a/views/common/compatibilityMode.css b/views/common/compatibilityMode.css index a436549..39fb642 100644 --- a/views/common/compatibilityMode.css +++ b/views/common/compatibilityMode.css @@ -1,10 +1,8 @@ -*:not(#gpuinfo-outer):not(#gpuinfo-inner) { - backdrop-filter: none !important; - transition: none !important; - opacity: 1 !important; - animation: none !important; -} - -.rain { - display: none !important; +*:not(#gpuinfo-outer):not(#gpuinfo-inner) {
+ backdrop-filter: none !important;
+ opacity: 1 !important;
+}
+
+.rain {
+ display: none !important;
}
\ No newline at end of file diff --git a/views/common/fonts.css b/views/common/fonts.css index 5aa99e0..a7d81d5 100644 --- a/views/common/fonts.css +++ b/views/common/fonts.css @@ -1,23 +1,23 @@ -@font-face { - font-family: "Comfortaa"; - src: url("regular.ttf"); - font-weight: normal; -} - -@font-face { - font-family: "Comfortaa"; - src: url("bold.ttf"); - font-weight: bold; -} - -*, body, html, div { - font-family: "Comfortaa", -apple-system, sans-serif; -} - -#gpuinfo-inner, #gpuinfo-inner * { - font-family: monospace !important; -} - -body, * { - cursor: default !important; +@font-face {
+ font-family: "Comfortaa";
+ src: url("regular.ttf");
+ font-weight: normal;
+}
+
+@font-face {
+ font-family: "Comfortaa";
+ src: url("bold.ttf");
+ font-weight: bold;
+}
+
+*, body, html, div {
+ font-family: "Comfortaa", -apple-system, sans-serif;
+}
+
+#gpuinfo-inner, #gpuinfo-inner * {
+ font-family: monospace !important;
+}
+
+body, * {
+ cursor: default !important;
}
\ No newline at end of file diff --git a/views/common/index.css b/views/common/index.css index f9ff24e..71bc233 100644 --- a/views/common/index.css +++ b/views/common/index.css @@ -1,29 +1,29 @@ -#titlebar-minimize, #titlebar-close { - background-color: transparent; - transition: background-color 200ms; - border-radius: 10px; -} - -#titlebar-minimize:hover { - background-color: rgba(99, 99, 99, .5); -} - -#titlebar-minimize:focus, #titlebar-minimize:active { - background-color: rgba(99, 99, 99, .75); -} - -#titlebar-close:hover { - background-color: rgba(255, 0, 0, .5); -} - -#titlebar-close:focus, #titlebar-close:active { - background-color: rgba(255, 0, 0, .75); -} - -*::selection { - background-color: transparent; -} - -*::inactive-selection { - background-color: transparent; +#titlebar-minimize, #titlebar-close {
+ background-color: transparent;
+ transition: background-color 200ms;
+ border-radius: 10px;
+}
+
+#titlebar-minimize:hover {
+ background-color: rgba(99, 99, 99, .5);
+}
+
+#titlebar-minimize:focus, #titlebar-minimize:active {
+ background-color: rgba(99, 99, 99, .75);
+}
+
+#titlebar-close:hover {
+ background-color: rgba(255, 0, 0, .5);
+}
+
+#titlebar-close:focus, #titlebar-close:active {
+ background-color: rgba(255, 0, 0, .75);
+}
+
+*::selection {
+ background-color: transparent;
+}
+
+*::inactive-selection {
+ background-color: transparent;
}
\ No newline at end of file diff --git a/views/common/load-new.ttf b/views/common/load-new.ttf Binary files differnew file mode 100644 index 0000000..d2a94dc --- /dev/null +++ b/views/common/load-new.ttf diff --git a/views/credits.html b/views/credits.html index ece63a3..017f9a8 100644 --- a/views/credits.html +++ b/views/credits.html @@ -1,203 +1,212 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};</script> - <script src="../lang/loader.js"></script> - <script src="../scenario/client.js"></script> - <meta charset="UTF-8"> - <link rel="stylesheet" href="common/fonts.css"> - <link rel="stylesheet" href="common/blur.css"> - <link rel="stylesheet" href="menu.css"> - <title>Kartik</title> - <script src="../crash/client.js"></script> - <script src="./script/global_compatlayer.js"></script> - <script src="../sfx/sfx.js"></script> - <script> - require('@electron/remote').getCurrentWindow().dstate = lang.discord.credits[0]; - require('@electron/remote').getCurrentWindow().ddetails = lang.discord.credits[1]; - </script> - <script> - if (!require('@electron/remote').getCurrentWindow().debug) { - document.write('<link rel="stylesheet" href="common/mouse.css">'); - } - </script> - <style> - body::-webkit-scrollbar { - display: none; - } - </style> -</head> -<body style="color:white;text-align:center;"> - <script>info("MainWindow", "Rendering initial frame..."); - - if (native) { - scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale; - } - - </script> - - <div style="position:fixed;inset:0;background:black;display:none;z-index:-1;" id="box"></div> - <div style="height:100vh;"></div> - - <!-- START credits --> - - <h2>Kartik, a 2D car racing game</h2> - <p>© Minteck Projects/Cutefox Studios. All assets are licensed under their original license rather than Kartik's license.</p> - <p class="technical"><script src="./script/credits_technical.js"></script></p> - - made by<br> - <img id="banner" src="common/banner.gif" style="width:380px;"> - - <p class="cred-title">Lead</p> - <p class="cred-content">Minteck</p> - - <p class="cred-title">Base Assets</p> - <p class="cred-content">Minteck<br>Redman 054</p> - - <p class="cred-title">Narrator Character</p> - <p class="cred-content"><b>Averi</b> by fiddle (@fiddleafox on Twitter)</p> - - <p class="cred-title">Sound Effects, Music and Additional Assets</p> - <div class="cred-content" style="display:grid;grid-template-columns: 1fr 1fr 1fr; text-align:center;"> - <div>Prosta4okua</div> - <div>Felix Corvus</div> - <div>Vanguard</div> - <div>Timmeey86</div> - <div>Epowerj</div> - <div>Baltazár Radics</div> - <div>Dexapnow</div> - <div>Milinai</div> - <div>키에르</div> - <div>skybldev</div> - <div>Leone25</div> - <div>Gureumi</div> - <div>VizardAlpha</div> - <div>LQ</div> - <div>Commodore64x</div> - <div>iczero</div> - <div>Krzysztof Skrzętnicki</div> - <div>Baramos666</div> - <div>theshadowknight</div> - <div>elmenda452</div> - <div>Predator127</div> - <div>Sonnicon</div> - <div>CinExPL</div> - <div>toushangyouxiang</div> - <div>xgamezs</div> - <div>William So</div> - <div>beito</div> - <div>BeefEX</div> - <div>Lorex</div> - <div>老滑稽</div> - <div>Spico The Spirit Guy</div> - <div>TunacanGamer</div> - <div>kemalinanc13</div> - <div>Zachary</div> - <div>Fenr1r</div> - <div>Jaiun Lee</div> - <div>Gab_351</div> - <div>Carter Gale</div> - <div>Jan Polák</div> - <div>JustYanns</div> - <div>BasedUser</div> - <div>BLucky-gh</div> - <div>DinoWattz</div> - <div>Jae</div> - <div>angelickite</div> - <div>ScriptHosT12</div> - <div>Senventise</div> - <div>SkeptiC</div> - <div>Deyvid67</div> - <div>Damlon</div> - <div>DaGamerFiles</div> - <div>Trigg</div> - <div>Uriel</div> - <div>VXF</div> - <div>Valen. H</div> - <div>Valentin Sonin</div> - <div>Clarence "Sparr" Risher</div> - <div>bei2</div> - <div>AceEllysium</div> - <div>Cedric L'homme</div> - <div>Michał “Neoqueto”</div> - <div>indielm</div> - <div>Ameb</div> - <div>player20033</div> - <div>Ignacy</div> - <div>J-VdS</div> - <div>Kenny</div> - <div>Franciszek Zaranowicz</div> - <div>Andreas Heiskanen</div> - <div>Doyoung Gwak</div> - <div>MMG</div> - <div>Math2128</div> - <div>Michael Plotke</div> - <div>Niko</div> - <div>Paul T</div> - <div>Dominik</div> - <div>Arkanic</div> - <div>Potion</div> - <div>Markus G</div> - <div>itskatt</div> - <div>Agent-Laevain</div> - <div>AzariasB</div> - <div>amrsoll</div> - <div>ねらひかだ</div> - <div>Draco</div> - <div>Quezler</div> - <div>killall -q</div> - <div>Alicila</div> - <div>Daniel Dusek</div> - <div>DeltaNedas</div> - <div>GioIacca9</div> - <div>SnakkiZXZ</div> - <div>sk7725</div> - <div>The Slaylord</div> - <div>ThePlayerA</div> - <div>YellOw139</div> - <div>NgLamVN</div> - <div>JINODK</div> - <div>PetrGasparik</div> - <div>LeoDog896</div> - <div>Summet</div> - <div>MEEP of Faith</div> - <div>jalastram (freesound.org)</div> - <div>newlocknew (freesound.org)</div> - <div>dsmolenaers (freesound.org)</div> - <div>Headphaze (freesound.org)</div> - <div>Nikolass</div> - <div>VolasYouKnow</div> - <div>Quick-Korx</div> - <div>Ángel Rodríguez Aguilera</div> - <div>Catchears</div> - <div>younggam</div> - <div>simba-fs</div> - <div>RedRadiation</div> - <div>Marko Zajc</div> - <div>CPX MC</div> - <div>Phinner</div> - <div>BTA_Susideur</div> - <div>nilq</div> - <div>AsgerHB</div> - <div>AzCraft</div> - <div>foo</div> - <div>Skat</div> - <div>WilloIzCitron</div> - </div> - - <p class="cred-title">Testing</p> - <p class="cred-content">Minteck<br>Romain<br>Redman 054<br>Oxymillion</p> - - <p class="cred-title">Libraries</p> - <div class="cred-content" style="display:grid;grid-template-columns: 1fr 1fr 1fr; text-align:center;"><script src="./script/credits_libs.js"></script></div> - - <!-- END credits --> - - <div style="height:100vh;"></div> - - <script src="./script/credits_music.js"></script> -<script>info("OptnWindow", "Menu opened");</script> -</body> -<script src="./script/credits_global.js"></script> -<script src="./script/client_fullscreen.js"></script> -</html> +<!DOCTYPE html>
+<html lang="en">
+<head>
+ <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};const Nest = require("../nest/abi");currentNest = require('@electron/remote').getCurrentWindow().nest;</script>
+ <script src="../lang/loader.js"></script>
+ <script src="../scenario/client.js"></script>
+ <meta charset="UTF-8">
+ <link rel="stylesheet" href="common/fonts.css">
+ <link rel="stylesheet" href="common/blur.css">
+ <link rel="stylesheet" href="menu.css">
+ <title>Kartik</title>
+ <script src="../crash/client.js"></script>
+ <script src="./script/global_compatlayer.js"></script><script src="../typescript/mainloader.js"></script>
+ <script src="../sfx/sfx.js"></script>
+ <script>
+ require('@electron/remote').getCurrentWindow().dstate = lang.discord.credits[0];
+ require('@electron/remote').getCurrentWindow().ddetails = lang.discord.credits[1];
+ </script>
+ <script>
+ if (!require('@electron/remote').getCurrentWindow().debug) {
+ document.write('<link rel="stylesheet" href="common/mouse.css">');
+ }
+ </script>
+ <style>
+ body::-webkit-scrollbar {
+ display: none;
+ }
+ </style>
+</head>
+<body style="color:white;text-align:center;font-size:20px;">
+ <script>info("MainWindow", "Rendering initial frame...");
+
+ if (native) {
+ scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale;
+ }
+
+ </script>
+
+ <div style="position:fixed;inset:0;background:black;display:none;z-index:-1;" id="box"></div>
+ <div style="height:100vh;"></div>
+
+ <!-- START credits -->
+
+ <h2>Kartik, a 2D car racing game</h2>
+ <p>© Minteck. All assets are licensed under their original license rather than Kartik's license.</p>
+ <p class="technical"><script src="./script/credits_technical.js"></script></p>
+
+ made by<br>
+ <img id="banner" src="../logo/vendor.png" style="width:128px;">
+
+ <p class="cred-title">Project Lead</p>
+ <p class="cred-content">Minteck</p>
+
+ <p class="cred-title">Base Assets</p>
+ <p class="cred-content">Minteck<br>redman 054</p>
+
+ <p class="cred-title">Narrator Character</p>
+ <p class="cred-content"><b>Averi</b> by fiddle (@fiddleafox on Twitter)</p>
+
+ <p class="cred-title">Music</p>
+ <p class="cred-content">Anuke<br>YonKaGor</p>
+
+ <p class="cred-title">Sound Effects and Additional Assets</p>
+ <div class="cred-content" style="display:grid;grid-template-columns: 1fr 1fr 1fr; text-align:center;">
+ <div>Prosta4okua</div>
+ <div>Felix Corvus</div>
+ <div>Vanguard</div>
+ <div>Timmeey86</div>
+ <div>Epowerj</div>
+ <div>Baltazár Radics</div>
+ <div>Dexapnow</div>
+ <div>Milinai</div>
+ <div>키에르</div>
+ <div>skybldev</div>
+ <div>Leone25</div>
+ <div>Gureumi</div>
+ <div>VizardAlpha</div>
+ <div>LQ</div>
+ <div>Commodore64x</div>
+ <div>iczero</div>
+ <div>Krzysztof Skrzętnicki</div>
+ <div>Baramos666</div>
+ <div>theshadowknight</div>
+ <div>elmenda452</div>
+ <div>Predator127</div>
+ <div>Sonnicon</div>
+ <div>CinExPL</div>
+ <div>toushangyouxiang</div>
+ <div>xgamezs</div>
+ <div>William So</div>
+ <div>beito</div>
+ <div>BeefEX</div>
+ <div>Lorex</div>
+ <div>老滑稽</div>
+ <div>Spico The Spirit Guy</div>
+ <div>TunacanGamer</div>
+ <div>kemalinanc13</div>
+ <div>Zachary</div>
+ <div>Fenr1r</div>
+ <div>Jaiun Lee</div>
+ <div>Gab_351</div>
+ <div>Carter Gale</div>
+ <div>Jan Polák</div>
+ <div>JustYanns</div>
+ <div>BasedUser</div>
+ <div>BLucky-gh</div>
+ <div>DinoWattz</div>
+ <div>Jae</div>
+ <div>angelickite</div>
+ <div>ScriptHosT12</div>
+ <div>Senventise</div>
+ <div>SkeptiC</div>
+ <div>Deyvid67</div>
+ <div>Damlon</div>
+ <div>DaGamerFiles</div>
+ <div>Trigg</div>
+ <div>Uriel</div>
+ <div>VXF</div>
+ <div>Valen. H</div>
+ <div>Valentin Sonin</div>
+ <div>Clarence "Sparr" Risher</div>
+ <div>bei2</div>
+ <div>AceEllysium</div>
+ <div>Cedric L'homme</div>
+ <div>Michał “Neoqueto”</div>
+ <div>indielm</div>
+ <div>Ameb</div>
+ <div>player20033</div>
+ <div>Ignacy</div>
+ <div>J-VdS</div>
+ <div>Kenny</div>
+ <div>Franciszek Zaranowicz</div>
+ <div>Andreas Heiskanen</div>
+ <div>Doyoung Gwak</div>
+ <div>MMG</div>
+ <div>Math2128</div>
+ <div>Michael Plotke</div>
+ <div>Niko</div>
+ <div>Paul T</div>
+ <div>Dominik</div>
+ <div>Arkanic</div>
+ <div>Potion</div>
+ <div>Markus G</div>
+ <div>itskatt</div>
+ <div>Agent-Laevain</div>
+ <div>AzariasB</div>
+ <div>amrsoll</div>
+ <div>ねらひかだ</div>
+ <div>Draco</div>
+ <div>Quezler</div>
+ <div>killall -q</div>
+ <div>Alicila</div>
+ <div>Daniel Dusek</div>
+ <div>DeltaNedas</div>
+ <div>GioIacca9</div>
+ <div>SnakkiZXZ</div>
+ <div>sk7725</div>
+ <div>The Slaylord</div>
+ <div>ThePlayerA</div>
+ <div>YellOw139</div>
+ <div>NgLamVN</div>
+ <div>JINODK</div>
+ <div>PetrGasparik</div>
+ <div>LeoDog896</div>
+ <div>Summet</div>
+ <div>MEEP of Faith</div>
+ <div>jalastram (freesound.org)</div>
+ <div>newlocknew (freesound.org)</div>
+ <div>dsmolenaers (freesound.org)</div>
+ <div>Headphaze (freesound.org)</div>
+ <div>Nikolass</div>
+ <div>VolasYouKnow</div>
+ <div>Quick-Korx</div>
+ <div>Ángel Rodríguez Aguilera</div>
+ <div>Catchears</div>
+ <div>younggam</div>
+ <div>simba-fs</div>
+ <div>RedRadiation</div>
+ <div>Marko Zajc</div>
+ <div>CPX MC</div>
+ <div>Phinner</div>
+ <div>BTA_Susideur</div>
+ <div>nilq</div>
+ <div>AsgerHB</div>
+ <div>AzCraft</div>
+ <div>foo</div>
+ <div>Skat</div>
+ <div>WilloIzCitron</div>
+ <div>Nintendo</div>
+ <div>Unsplash</div>
+ <div>Google</div>
+ </div>
+
+ <p class="cred-title">Testing</p>
+ <p class="cred-content">Minteck<br>Romain<br>Oxymillion</p>
+
+ <p class="cred-title">Early Access Testing</p>
+ <p class="cred-content">Ayann<br>Retsuno<br>Amirus66</p>
+
+ <p class="cred-title">Libraries</p>
+ <div class="cred-content" style="display:grid;grid-template-columns: 1fr 1fr 1fr; text-align:center;"><script src="./script/credits_libs.js"></script></div>
+
+ <!-- END credits -->
+
+ <div style="height:100vh;"></div>
+
+ <script src="./script/credits_music.js"></script>
+<script>info("OptnWindow", "Menu opened");</script>
+</body>
+<script src="./script/credits_global.js"></script>
+<script src="./script/client_fullscreen.js"></script>
+</html>
diff --git a/views/game.css b/views/game.css index e72a786..87c0e2a 100644 --- a/views/game.css +++ b/views/game.css @@ -1,152 +1,152 @@ -#paused { - z-index: 5; - position: fixed; - inset: 0; - display: flex; - align-items: center; - justify-content: center; -} - -#paused > div { - background: #262626; - border-radius: 10px; - padding: 20px; - box-shadow: 1px 1px 12px rgba(0, 0, 0, 0.25); -} - -#paused * { - color: white; -} - -.services li { - padding: 10px; - font-size: 28px; - width: 256px; - list-style: none; - color: transparent; - margin-top: 10px; - margin-bottom: 10px; - border-radius: 10px; -} - -.services li a { - color: white !important; - text-decoration: none; - transition: color 200ms; -} - -.services li.selected a { - color: black !important; - text-decoration: none; -} - -.services li.selected { - background-color: #00ff99; -} - -.services li { - background-color: #383838; - transition: margin-left 200ms, background-color 200ms; -} - -#circuit.hitboxes, #circuit.hitboxes * { - outline: 1px dashed blue; -} - -#car0, #car1 { - transition: top 600ms, bottom 600ms, left 600ms, right 600ms, transform 500ms; -} - -#box.paused { - opacity: .5; -} - -circuit { - display: none; -} - -#credits-inner { - position: fixed; - z-index: 9; - background: #171717; - color: white; - padding: 20px; - display: grid; - font-size: 11px; - top: 200px; - left: 0; - right: 0; -} - -#credits .big { - font-size: 15px; - font-weight: bold; -} - -#credits #race, #credits #musicb { - display: grid; - grid-template-columns: 48px 1fr; -} - -#credits-inner > * > * { - vertical-align: middle; -} - -#credits img { - filter: invert(100%); -} - -#credits .cbox { - width: max-content; -} - -#laps-inner-car0 { - background: rgba(0, 0, 0, .5); - position: fixed; - bottom: 20px; - left: 20px; - z-index: 9; - border-radius: 9999px; - width: 40px; - height: 43px; - text-align: center; - color: white; - padding: 7px 10px 10px; -} - -#laps-inner-car1 { - background: rgba(0, 0, 0, .5); - position: fixed; - bottom: 20px; - right: 20px; - z-index: 9; - border-radius: 9999px; - width: 40px; - height: 43px; - text-align: center; - color: white; - padding: 7px 10px 10px; -} - -.laps-inner-sep { - margin: 5px; - border: none; - border-top: 2px solid white; -} - -#oil img { - position: fixed; - width: 32px; - z-index: 5; - opacity: .9; -} - -#credits { - background: rgba(0, 0, 0, .5); - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: 9999; +#paused {
+ z-index: 5;
+ position: fixed;
+ inset: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+#paused > div {
+ background: #262626;
+ border-radius: 10px;
+ padding: 20px;
+ box-shadow: 1px 1px 12px rgba(0, 0, 0, 0.25);
+}
+
+#paused * {
+ color: white;
+}
+
+.services li {
+ padding: 10px;
+ font-size: 28px;
+ width: 256px;
+ list-style: none;
+ color: transparent;
+ margin-top: 10px;
+ margin-bottom: 10px;
+ border-radius: 10px;
+}
+
+.services li a {
+ color: white !important;
+ text-decoration: none;
+ transition: color 200ms;
+}
+
+.services li.selected a {
+ color: black !important;
+ text-decoration: none;
+}
+
+.services li.selected {
+ background-color: #00ff99;
+}
+
+.services li {
+ background-color: #383838;
+ transition: margin-left 200ms, background-color 200ms;
+}
+
+#circuit.hitboxes, #circuit.hitboxes * {
+ outline: 1px dashed blue;
+}
+
+#car0, #car1 {
+ transition: top 600ms, bottom 600ms, left 600ms, right 600ms, transform 500ms;
+}
+
+#box.paused {
+ opacity: .5;
+}
+
+circuit {
+ display: none;
+}
+
+#credits-inner {
+ position: fixed;
+ z-index: 9;
+ background: #171717;
+ color: white;
+ padding: 20px;
+ display: grid;
+ font-size: 11px;
+ top: 200px;
+ left: 0;
+ right: 0;
+}
+
+#credits .big {
+ font-size: 15px;
+ font-weight: bold;
+}
+
+#credits #race, #credits #musicb {
+ display: grid;
+ grid-template-columns: 48px 1fr;
+}
+
+#credits-inner > * > * {
+ vertical-align: middle;
+}
+
+#credits img {
+ filter: invert(100%);
+}
+
+#credits .cbox {
+ width: max-content;
+}
+
+#laps-inner-car0 {
+ background: rgba(0, 0, 0, .5);
+ position: fixed;
+ bottom: 20px;
+ left: 20px;
+ z-index: 9;
+ border-radius: 9999px;
+ width: 40px;
+ height: 43px;
+ text-align: center;
+ color: white;
+ padding: 7px 10px 10px;
+}
+
+#laps-inner-car1 {
+ background: rgba(0, 0, 0, .5);
+ position: fixed;
+ bottom: 20px;
+ right: 20px;
+ z-index: 9;
+ border-radius: 9999px;
+ width: 40px;
+ height: 43px;
+ text-align: center;
+ color: white;
+ padding: 7px 10px 10px;
+}
+
+.laps-inner-sep {
+ margin: 5px;
+ border: none;
+ border-top: 2px solid white;
+}
+
+#oil img {
+ position: fixed;
+ width: 32px;
+ z-index: 5;
+ opacity: .9;
+}
+
+#credits {
+ background: rgba(0, 0, 0, .5);
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 9999;
}
\ No newline at end of file diff --git a/views/game.html b/views/game.html index ca402a5..91a3173 100644 --- a/views/game.html +++ b/views/game.html @@ -1,164 +1,164 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};</script> - <script src="../lang/loader.js"></script> - <script src="../scenario/client.js"></script> - <meta charset="UTF-8"> - <link rel="stylesheet" href="common/fonts.css"> - <link rel="stylesheet" href="common/blur.css"> - <link rel="stylesheet" href="game.css"> - <title>Kartik</title> - <script src="../crash/client.js"></script> - <script src="./script/global_compatlayer.js"></script> - <script src="../sfx/sfx.js"></script> - <script> - require('@electron/remote').getCurrentWindow().dstate = lang.discord.game[0]; - if (location.search === "?sp") { - require('@electron/remote').getCurrentWindow().ddetails = lang.discord.game[1]; - } else if (location.search === "?online") { - require('@electron/remote').getCurrentWindow().ddetails = lang.discord.game[2]; - } else { - require('@electron/remote').getCurrentWindow().ddetails = lang.online.discord; - } - - global.online = false; - global.paused = false; - global.keysEnabled = true; - global.started = false; - global.startHooks = []; - </script> - <script> - _sfx = false; - - if (!require('@electron/remote').getCurrentWindow().debug) { - document.write('<link rel="stylesheet" href="common/mouse.css">'); - } - </script> -</head> -<body> - <script>info("MainWindow", "Rendering initial frame..."); - - if (native) { - scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale; - } - - </script> - <div id="bg" style="display: none;background:black;position:fixed;top:0;left:0;right:0;bottom:0;z-index:1;"> - <div id="box" style="display: none;background-color: #545454;position:fixed;top:0;left:0;right:0;bottom:0;z-index:2;"> - - <div id="online-login" style="display: none;position: fixed;top: 0;left: 0;bottom: 0;right: 0;background: transparent;z-index: 99999;padding: 50px;color: white;text-align: center;background:#111;"> - <p id="connecting"><script id="pf1">document.write(lang.online.connecting);document.getElementById('pf1').outerHTML='';</script></p> - <p id="loading" style="display:none;"><script id="pf2">document.write(lang.online.loading);document.getElementById('pf2').outerHTML='';</script></p> - <div id="intro" style="display:none;"> - <h2><script>document.write(lang.online.intro.create);</script></h2> - <p><script>document.write(lang.online.intro.pcreate);</script></p> - <span id="yourid" style="font-family:monospace;font-size:48px;">########</span> - - <hr style="border-bottom: 0;"> - - <h2><script>document.write(lang.online.intro.join);</script></h2> - <p><script>document.write(lang.online.intro.pjoin);</script></p> - <input onchange="checkOnlineLogin();" onkeyup="checkOnlineLogin();" onkeydown="checkOnlineLogin();" id="theirid" style="font-family:monospace;font-size:48px;border:1px solid black;width: 5em;padding: 0;margin: 0;background: transparent;color: white;outline: none;" maxlength="8" placeholder="--------" length="8" spellcheck="false"> - <script>document.getElementById('theirid').focus(); global.focuser = setInterval(() => { document.getElementById('theirid').focus(); }, 1);</script> - </div> - </div> - - <div id="ping-chart" style="position: fixed;top: 4px;left: 4px;z-index: 9999999998;display: flex;width: 70px;height: 50px;justify-content: flex-end;align-items: flex-end;"></div> - <div id="ping-outer" style="position: fixed;top: 4px;left: 4px;z-index: 9999999999;display: flex;width: 70px;height: 50px;align-items: center;justify-content: center;"> - <div id="ping" style="font-family:monospace;color: white;text-shadow: 1px 1px 5px black;font-size: 8px;">- ms</div> - </div> - - <script> - if (!require('@electron/remote').getCurrentWindow().online || require('@electron/remote').getCurrentWindow().update === "stable") { - document.getElementById('ping-chart').style.display = "none"; - document.getElementById('ping-outer').style.display = "none"; - } - </script> - - <div id="laps"> - <span id="laps-inner-car0"><span id="laps-car0">0</span><hr class="laps-inner-sep">5</span> - <span id="laps-inner-car1"><span id="laps-car1">0</span><hr class="laps-inner-sep">5</span> - </div> - <div id="credits"><div id="credits-inner"> - <div id="credits-race" style=" - display: grid; - grid-template-columns: 1fr; - text-align: center; -"><div id="race"> - <img src="common/race.svg" style="vertical-align: middle;"> - <div class="cbox"><span><span class="big" id="race-title">...</span><br><script>document.write(lang.game.credits.by);</script> <span id="race-author">...</span></span></div> - </div> - </div><div id="credits-cars" style=" - display: grid; - grid-template-columns: 1fr 1fr; - margin-top: 16px; - text-align: center; -"><div id="cars-p1" style=" - display: grid; - grid-template-columns: 48px 1fr; -"> - <img src="../icons/gamepad.svg" style="vertical-align: middle;filter: brightness(0) invert(1) !important;width: 24px;"> - <div class="cbox"><span><span class="big" id="cars-n1">1</span><br><img src="/" style=" - width: 72px; - filter: none !important; -" id="cars-p1-inner"></span></div> - </div><div style=" - display: grid; - grid-template-columns: 48px 1fr; -"> - <img src="../icons/gamepad.svg" style="vertical-align: middle;filter: brightness(0) invert(1) !important;width: 24px;"> - <div class="cbox"><span><span class="big" id="cars-n2">2</span><br><img src="/" style=" - width: 72px; - filter: none !important; -" id="cars-p2-inner"></span></div> - </div></div></div></div> - <div id="circuit" style="background-size: cover;background-position: center center;position: fixed;inset: 0;z-index: 2;background-color: rgb(255, 255, 255);width: 720px;height: 540px;"> - ... - </div> - - <script src="./script/game_select.js"></script> - </div> - - <div id="paused" style="z-index:5;display:none;"> - <div> - <h2 style="text-align:center;"><!--<script>document.write(lang.game.gpause.title);</script>--><img alt="full-logo" src="../logo/full.png" style="height: 96px;"></h2> - <div class="services"> - <div class="items"> - <ul style="padding:0;"> - <li class="selected"><a href="#" id="continue"><script>document.write(lang.game.gpause.continueg);</script></a></li> - <li><a href="#" id="hitboxes"><script>document.write(lang.game.gpause.showhb);</script></a></li> - <li><a href="#" id="quit"><script>document.write(lang.game.gpause.quit);</script></a></li> - </ul> - </div> - </div> - </div> - </div> - <script src="../race/pause.js"></script> - - <div id="debug" style="z-index:99999999999999999;position: fixed;display:none;font-family: 'Source Code Pro', 'JetBrains Mono', 'Ubuntu Mono', 'Consolas', 'Lucida Console', 'Courier New', monospace;"> - <span id="debug-left" style="position:fixed;left:2px;top:2px;text-align:left;color:white;font-size:10px;"> - Kartik - </span> - <span id="debug-right" style="position:fixed;right:2px;top:2px;text-align:right;color:white;font-size:10px;"> - Kartik - </span> - </div> - - <script src="./script/game_music.js"></script> - <script>info("GameWindow", "Game started");</script> - - </div> -</body> -<script src="../race/cars/car0.js"></script> -<script src="../race/cars/car1.js"></script> -<script src="../race/cars/car1ai.js"></script> -<script src="../race/cars/keymap.js"></script> - -<script src="./script/game_global.js"></script> -<script src="./script/game_debug.js"></script> -<script src="./script/game_online.js"></script> - -<script src="./script/client_fullscreen.js"></script> - -</html> +<!DOCTYPE html>
+<html lang="en">
+<head>
+ <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};const Nest = require("../nest/abi");currentNest = require('@electron/remote').getCurrentWindow().nest;</script>
+ <script src="../lang/loader.js"></script>
+ <script src="../scenario/client.js"></script>
+ <meta charset="UTF-8">
+ <link rel="stylesheet" href="common/fonts.css">
+ <link rel="stylesheet" href="common/blur.css">
+ <link rel="stylesheet" href="game.css">
+ <title>Kartik</title>
+ <script src="../crash/client.js"></script>
+ <script src="./script/global_compatlayer.js"></script><script src="../typescript/mainloader.js"></script>
+ <script src="../sfx/sfx.js"></script>
+ <script>
+ require('@electron/remote').getCurrentWindow().dstate = lang.discord.game[0];
+ if (location.search === "?sp") {
+ require('@electron/remote').getCurrentWindow().ddetails = lang.discord.game[1];
+ } else if (location.search === "?online") {
+ require('@electron/remote').getCurrentWindow().ddetails = lang.discord.game[2];
+ } else {
+ require('@electron/remote').getCurrentWindow().ddetails = lang.online.discord;
+ }
+
+ global.online = false;
+ global.paused = false;
+ global.keysEnabled = true;
+ global.started = false;
+ global.startHooks = [];
+ </script>
+ <script>
+ _sfx = false;
+
+ if (!require('@electron/remote').getCurrentWindow().debug) {
+ document.write('<link rel="stylesheet" href="common/mouse.css">');
+ }
+ </script>
+</head>
+<body>
+ <script>info("MainWindow", "Rendering initial frame...");
+
+ if (native) {
+ scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale;
+ }
+
+ </script>
+ <div id="bg" style="display: none;background:black;position:fixed;top:0;left:0;right:0;bottom:0;z-index:1;">
+ <div id="box" style="display: none;background-color: #545454;position:fixed;top:0;left:0;right:0;bottom:0;z-index:2;">
+
+ <div id="online-login" style="display: none;position: fixed;top: 0;left: 0;bottom: 0;right: 0;background: transparent;z-index: 99999;padding: 50px;color: white;text-align: center;background:#111;">
+ <p id="connecting"><script id="pf1">document.write(lang.online.connecting);document.getElementById('pf1').outerHTML='';</script></p>
+ <p id="loading" style="display:none;"><script id="pf2">document.write(lang.online.loading);document.getElementById('pf2').outerHTML='';</script></p>
+ <div id="intro" style="display:none;">
+ <h2><script>document.write(lang.online.intro.create);</script></h2>
+ <p><script>document.write(lang.online.intro.pcreate);</script></p>
+ <span id="yourid" style="font-family:monospace;font-size:48px;">########</span>
+
+ <hr style="border-bottom: 0;">
+
+ <h2><script>document.write(lang.online.intro.join);</script></h2>
+ <p><script>document.write(lang.online.intro.pjoin);</script></p>
+ <input onchange="checkOnlineLogin();" onkeyup="checkOnlineLogin();" onkeydown="checkOnlineLogin();" id="theirid" style="font-family:monospace;font-size:48px;border:1px solid black;width: 5em;padding: 0;margin: 0;background: transparent;color: white;outline: none;" maxlength="8" placeholder="--------" length="8" spellcheck="false">
+ <script>document.getElementById('theirid').focus(); global.focuser = setInterval(() => { document.getElementById('theirid').focus(); }, 1);</script>
+ </div>
+ </div>
+
+ <div id="ping-chart" style="position: fixed;top: 4px;left: 4px;z-index: 9999999998;display: flex;width: 70px;height: 50px;justify-content: flex-end;align-items: flex-end;"></div>
+ <div id="ping-outer" style="position: fixed;top: 4px;left: 4px;z-index: 9999999999;display: flex;width: 70px;height: 50px;align-items: center;justify-content: center;">
+ <div id="ping" style="font-family:monospace;color: white;text-shadow: 1px 1px 5px black;font-size: 8px;">- ms</div>
+ </div>
+
+ <script>
+ if (!require('@electron/remote').getCurrentWindow().online || require('@electron/remote').getCurrentWindow().update === "stable") {
+ document.getElementById('ping-chart').style.display = "none";
+ document.getElementById('ping-outer').style.display = "none";
+ }
+ </script>
+
+ <div id="laps">
+ <span id="laps-inner-car0"><span id="laps-car0">0</span><hr class="laps-inner-sep">5</span>
+ <span id="laps-inner-car1"><span id="laps-car1">0</span><hr class="laps-inner-sep">5</span>
+ </div>
+ <div id="credits"><div id="credits-inner">
+ <div id="credits-race" style="
+ display: grid;
+ grid-template-columns: 1fr;
+ text-align: center;
+"><div id="race">
+ <img src="common/race.svg" style="vertical-align: middle;">
+ <div class="cbox"><span><span class="big" id="race-title">...</span><br><script>document.write(lang.game.credits.by);</script> <span id="race-author">...</span></span></div>
+ </div>
+ </div><div id="credits-cars" style="
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ margin-top: 16px;
+ text-align: center;
+"><div id="cars-p1" style="
+ display: grid;
+ grid-template-columns: 48px 1fr;
+">
+ <img src="../icons/gamepad.svg" style="vertical-align: middle;filter: brightness(0) invert(1) !important;width: 24px;">
+ <div class="cbox"><span><span class="big" id="cars-n1">1</span><br><img src="/" style="
+ width: 72px;
+ filter: none !important;
+" id="cars-p1-inner"></span></div>
+ </div><div style="
+ display: grid;
+ grid-template-columns: 48px 1fr;
+">
+ <img src="../icons/gamepad.svg" style="vertical-align: middle;filter: brightness(0) invert(1) !important;width: 24px;">
+ <div class="cbox"><span><span class="big" id="cars-n2">2</span><br><img src="/" style="
+ width: 72px;
+ filter: none !important;
+" id="cars-p2-inner"></span></div>
+ </div></div></div></div>
+ <div id="circuit" style="background-size: cover;background-position: center center;position: fixed;inset: 0;z-index: 2;background-color: rgb(255, 255, 255);width: 720px;height: 540px;">
+ ...
+ </div>
+
+ <script src="./script/game_select.js"></script>
+ </div>
+
+ <div id="paused" style="z-index:5;display:none;">
+ <div>
+ <h2 style="text-align:center;"><!--<script>document.write(lang.game.gpause.title);</script>--><img alt="full-logo" src="../logo/full.png" style="height: 96px;"></h2>
+ <div class="services">
+ <div class="items">
+ <ul style="padding:0;">
+ <li class="selected"><a href="#" id="continue"><script>document.write(lang.game.gpause.continueg);</script></a></li>
+ <li><a href="#" id="hitboxes"><script>document.write(lang.game.gpause.showhb);</script></a></li>
+ <li><a href="#" id="quit"><script>document.write(lang.game.gpause.quit);</script></a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+ <script src="../race/pause.js"></script>
+
+ <div id="debug" style="z-index:99999999999999999;position: fixed;display:none;font-family: 'Source Code Pro', 'JetBrains Mono', 'Ubuntu Mono', 'Consolas', 'Lucida Console', 'Courier New', monospace;">
+ <span id="debug-left" style="position:fixed;left:2px;top:2px;text-align:left;color:white;font-size:10px;">
+ Kartik
+ </span>
+ <span id="debug-right" style="position:fixed;right:2px;top:2px;text-align:right;color:white;font-size:10px;">
+ Kartik
+ </span>
+ </div>
+
+ <script src="./script/game_music.js"></script>
+ <script>info("GameWindow", "Game started");</script>
+
+ </div>
+</body>
+<script src="../race/cars/car0.js"></script>
+<script src="../race/cars/car1.js"></script>
+<script src="../race/cars/car1ai.js"></script>
+<script src="../race/cars/keymap.js"></script>
+
+<script src="./script/game_global.js"></script>
+<script src="./script/game_debug.js"></script>
+<script src="./script/game_online.js"></script>
+
+<script src="./script/client_fullscreen.js"></script>
+
+</html>
diff --git a/views/intro.html b/views/intro.html index 6d4b721..1dba9a1 100644 --- a/views/intro.html +++ b/views/intro.html @@ -1,53 +1,44 @@ -<!DOCTYPE html> -<html lang="en" style="background:#000000;margin:0;height:100%;width:100%;"> -<head> - <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};</script> - <script src="../lang/loader.js"></script> - <script src="../scenario/client.js"></script> - <meta charset="UTF-8"> - <title>Kartik</title> - <link rel="stylesheet" href="common/fonts.css"> - <link rel="stylesheet" href="common/blur.css"> - <link rel="stylesheet" href="intro.css"> - <script src="../crash/client.js"></script> - <script src="./script/global_compatlayer.js"></script> - <script> - require('@electron/remote').getCurrentWindow().dstate = lang.discord.intro[0]; - require('@electron/remote').getCurrentWindow().ddetails = lang.discord.intro[1]; - </script> - <script> - if (!require('@electron/remote').getCurrentWindow().debug) { - document.write('<link rel="stylesheet" href="common/mouse.css">'); - } - </script> -</head> -<body style="background:#000000;margin:0;height:100%;width:100%;"> - <script>info("MainWindow", "Rendering initial frame..."); - - if (native) { - scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale; - } - - </script> - <script src="./script/intro_media.js"></script> - <div id="box" style="display:none;position:fixed;inset:0;"> - <div class="hero"> - <div class="hero-inner"></div> - </div> - <div style="margin-left: auto;margin-right: auto;width: max-content;margin-top: 100px;"> - <img alt="full-logo" src="../logo/full.png" style="height: 96px;"> - </div> - <div id="intro" style="position: fixed;bottom: 0;height: 120px;width: 100%;background: rgba(0, 0, 0, .5);" class="clickable" onclick="ev = document.createEvent('Event');ev.initEvent('keypress');ev.which = ev.keyCode = 13;document.body.dispatchEvent(ev);"> - <span id="progress" style="color: white;position: fixed;left: 0;right: 0;text-align: center;bottom: 50px;"> - <script>document.write(lang.intro[0]);</script> - </span> - <script src="./script/intro_message.js"></script> - </div> - </div> - - <script src="./script/intro_global.js"></script> - <script>info("LoadWindow", "Launching start-up procedure");</script> - - <script src="./script/client_fullscreen.js"></script> -</body> -</html> +<!DOCTYPE html>
+<html lang="en" style="background:#000000;margin:0;height:100%;width:100%;">
+<head>
+ <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};const Nest = require("../nest/abi");currentNest = require('@electron/remote').getCurrentWindow().nest;</script>
+ <script src="../lang/loader.js"></script>
+ <script src="../scenario/client.js"></script>
+ <meta charset="UTF-8">
+ <title>Kartik</title>
+ <link rel="stylesheet" href="common/fonts.css">
+ <link rel="stylesheet" href="common/blur.css">
+ <link rel="stylesheet" href="intro.css">
+ <script src="../crash/client.js"></script>
+ <script src="./script/global_compatlayer.js"></script><script src="../typescript/mainloader.js"></script>
+ <script>
+ require('@electron/remote').getCurrentWindow().dstate = lang.discord.intro[0];
+ require('@electron/remote').getCurrentWindow().ddetails = lang.discord.intro[1];
+ </script>
+ <script>
+ if (!require('@electron/remote').getCurrentWindow().debug) {
+ document.write('<link rel="stylesheet" href="common/mouse.css">');
+ }
+ </script>
+</head>
+<body style="background:#000000;margin:0;height:100%;width:100%;">
+ <script>info("MainWindow", "Rendering initial frame...");
+
+ if (native) {
+ scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale;
+ }
+
+ </script>
+ <script src="./script/intro_media.js"></script>
+ <div id="box" style="display:none;position:fixed;inset:0;">
+ </div>
+
+ <script src="./script/intro_global.js"></script>
+ <script>info("LoadWindow", "Launching start-up procedure");</script>
+
+ <script src="./script/client_fullscreen.js"></script>
+ <script>
+ location.href = "menu.html";
+ </script>
+</body>
+</html>
diff --git a/views/intro.mp4 b/views/intro.mp4 Binary files differnew file mode 100644 index 0000000..e947f0a --- /dev/null +++ b/views/intro.mp4 diff --git a/views/load.html b/views/load.html index c6e45bf..c08f55e 100644 --- a/views/load.html +++ b/views/load.html @@ -1,66 +1,52 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="UTF-8"> - <title>Kartik</title> - <style> - - * { - -webkit-app-region: drag !important; - } - - @font-face { - font-family: "Milliard SB"; - src: url("./common/load-version.otf"); - font-weight: normal; - } - - @font-face { - font-family: "Milliard"; - src: url("./common/load-channel.otf"); - font-weight: normal; - } - - </style> - <script> - document.addEventListener('keydown', function(e) { - if (e.key === "F1" || e.key === "F10" || e.key === "F11") { // F11/F1/F10 - e.preventDefault(); - return false; - } - }) - </script> -</head> -<body style="overflow:hidden;margin:0;padding:0;background-color:#4b4e50;"> - <img src="splash.png" style="width:100%;"> - <div id="bar" style="position:fixed;top:300px;left:0;width:0;background:white;z-index:99999;height:4px;"></div> - <span style="position: fixed;color: white;z-index: 99;top: 122px;font-size: 18px;display: inline-block;right: 309px;font-family: 'Milliard SB', sans-serif;"> - <script> - var ipcRenderer = require('electron').ipcRenderer; - ipcRenderer.on('progress', function (event, progress) { - document.getElementById("bar").style.width = progress + "%"; - }); - - switch (require('../package.json').channel) { - case "git": - document.write(`<span style="font-family: 'Milliard', sans-serif;">TRUNK </span>`); - break; - case "nightly": - document.write(`<span style="font-family: 'Milliard', sans-serif;">NIGHTLY </span>`); - break; - case "beta": - document.write(`<span style="font-family: 'Milliard', sans-serif;">BETA </span>`); - break; - case "eap": - document.write(`<span style="font-family: 'Milliard', sans-serif;">EAP </span>`); - break; - default: - break; - } - </script> - <script> - document.write(require('../package.json').version.toUpperCase()); - </script> - </span> -</body> -</html> +<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <title>Kartik</title>
+ <style>
+
+ * {
+ -webkit-app-region: drag !important;
+ }
+
+ @font-face {
+ font-family: "Milliard SB";
+ src: url("./common/load-version.otf");
+ font-weight: normal;
+ }
+
+ @font-face {
+ font-family: "Milliard";
+ src: url("./common/load-channel.otf");
+ font-weight: normal;
+ }
+
+ @font-face {
+ font-family: "HomepageBaukasten-Bold";
+ src: url("./common/load-new.ttf");
+ }
+
+ </style>
+ <script>
+ document.addEventListener('keydown', function(e) {
+ if (e.key === "F1" || e.key === "F10" || e.key === "F11") { // F11/F1/F10
+ e.preventDefault();
+ return false;
+ }
+ })
+ </script>
+</head>
+<body style="overflow:hidden;margin:0;padding:0;background-color:#4b4e50;">
+ <script>
+ document.write(require('fs').readFileSync("./views/loader.svg").toString().replaceAll("%version%", require('../package.json').version.toUpperCase()));
+
+ var ipcRenderer = require('electron').ipcRenderer;
+ ipcRenderer.on('progress', function (event, progress) {
+ document.getElementById("bar").style.width = progress + "%";
+ });
+ </script>
+ <div id="bar-container">
+ <div id="bar" style="position:fixed;bottom:0;left:0;width:0;background:white;z-index:99999;height:4px;"></div>
+ </div>
+</body>
+</html>
diff --git a/views/loader.html b/views/loader.html index df008d4..25124bb 100644 --- a/views/loader.html +++ b/views/loader.html @@ -1,39 +1,46 @@ -<!DOCTYPE html> -<html lang="en" style="background:#000000;margin:0;height:100%;width:100%;"> -<head> - <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};</script> - <script src="../lang/loader.js"></script> - <script src="../scenario/client.js"></script> - <meta charset="UTF-8"> - <title>Kartik</title> - <link rel="stylesheet" href="common/fonts.css"> - <link rel="stylesheet" href="common/blur.css"> - <script> - if (!require('@electron/remote').getCurrentWindow().debug) { - document.write('<link rel="stylesheet" href="common/mouse.css">'); - } - </script> -</head> -<body style="background:#000000;margin:0;height:100%;width:100%;"> - <script>info("MainWindow", "Rendering initial frame..."); - - if (native) { - scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale; - } - - </script> - <img id="imgpreload" src="common/banner.gif" style="height:100%;width:auto;opacity:0;position:fixed;pointer-events:none;"> - <div style="display:flex;align-items:center;justify-content:center;inset: 0;height: 100%;background:#fed1ae;overflow:hidden;"> - <img id="banner" src="../logo/itch/banner.jpg" style="height:100%;width:auto;"> - </div> - <script> - document.write(`<div style="position: fixed;bottom: 20px;right: 20px;font-size: 12px;padding: 10px 20px;background: lightblue;border-radius: 5px;transition: all 200ms;display:none;" id="updates">${lang.updates.wait}</div>`); - </script> - <div id="warning" style="opacity:0;transition:opacity 200ms;position: fixed;background: rgba(139,0,0,0.5);color: white;padding: 20px 10px;max-width: 40vw;text-align: center;border-radius: 10px;left: 20vw;top: 30vh;"><h2><script>document.write(lang.updates.warn[0]);</script></h2><p><script>document.write(lang.updates.warn[1]);</script></p></div> - - <script src="./script/loader_global.js"></script> - <script>info("LoadWindow", "Launching start-up procedure");</script> - - <script src="./script/client_fullscreen.js"></script> -</body> -</html> +<!DOCTYPE html>
+<html lang="en" style="background:#000000;margin:0;height:100%;width:100%;">
+<head>
+ <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};const Nest = require("../nest/abi");currentNest = require('@electron/remote').getCurrentWindow().nest;</script>
+ <script src="../lang/loader.js"></script>
+ <script src="../scenario/client.js"></script>
+ <script src="./script/global_compatlayer.js"></script><script src="../typescript/mainloader.js"></script>
+ <meta charset="UTF-8">
+ <title>Kartik</title>
+ <link rel="stylesheet" href="common/fonts.css">
+ <link rel="stylesheet" href="common/blur.css">
+ <script>
+ if (!require('@electron/remote').getCurrentWindow().debug) {
+ document.write('<link rel="stylesheet" href="common/mouse.css">');
+ }
+ </script>
+</head>
+<body style="background:#f4f3f4;margin:0;height:100%;width:100%;">
+ <script>info("MainWindow", "Rendering initial frame...");
+
+ if (native) {
+ scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale;
+ }
+
+ </script>
+ <div id="banner-outer" style="display:flex;align-items:center;justify-content:center;inset: 0;height: 100%;background:#f4f3f4;overflow:hidden;">
+ <img id="banner" src="../logo/full-alt.png" alt="" style="display:none;height:auto;width:380px;">
+ <script>
+ const $ = require('jquery');
+ $("#banner").fadeIn(200);
+ </script>
+ </div>
+ <video style="display: none;position:fixed;inset:0;width: 100%;height: 100%;background: #f4f3f4;" id="intro-video">
+ <source src="intro.mp4">
+ </video>
+ <script>
+ document.write(`<div style="position: fixed;bottom: 20px;right: 20px;font-size: 12px;padding: 10px 20px;background: lightblue;border-radius: 5px;transition: all 200ms;display:none;" id="updates">${lang.updates.wait}</div>`);
+ </script>
+ <div id="warning" style="opacity:0;transition:opacity 200ms;position: fixed;background: rgba(139,0,0,0.5);color: white;padding: 20px 10px;max-width: 40vw;text-align: center;border-radius: 10px;left: 20vw;top: 30vh;"><h2><script>document.write(lang.updates.warn[0]);</script></h2><p><script>document.write(lang.updates.warn[1]);</script></p></div>
+
+ <script src="./script/loader_global.js"></script>
+ <script>info("LoadWindow", "Launching start-up procedure");</script>
+
+ <script src="./script/client_fullscreen.js"></script>
+</body>
+</html>
diff --git a/views/loader.svg b/views/loader.svg new file mode 100644 index 0000000..a088172 --- /dev/null +++ b/views/loader.svg @@ -0,0 +1,128 @@ +<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 25.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 640 400" style="enable-background:new 0 0 640 400;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#FFFFFF;}
+ .st1{font-family:'HomepageBaukasten-Bold';}
+ .st2{font-size:38.6753px;}
+ .st3{font-size:12.9px;}
+ .st4{fill:#504B4B;}
+</style>
+<font horiz-adv-x="1000">
+<!-- 2016 Copyright Webme GmbH -->
+<!-- Copyright: Copyright 2021 Adobe System Incorporated. All rights reserved. -->
+<font-face font-family="HomepageBaukasten-Bold" units-per-em="1000" underline-position="-123" underline-thickness="20"/>
+<missing-glyph horiz-adv-x="500"/>
+<glyph unicode=" " horiz-adv-x="300"/>
+<glyph unicode="!" horiz-adv-x="324" d="M95,665C95,674 99,682 106,689C113,695 123,698 134,698l61,0C206,698 215,695 222,689C229,682 233,674 233,665l0,-31l-138,0M95,615l138,0l0,-266l-138,0M141,378l0,213l-16,0l0,-213M172,378l0,213l-16,0l0,-213M202,378l0,213l-15,0l0,-213M96,331l135,0l-36,-60l-62,0M141,251l44,0l-21,-37M81,160l162,0l0,-160l-162,0z"/>
+<glyph unicode=""" horiz-adv-x="520" d="M243,700l0,-5l-109,-314l-77,0l18,319M479,700l0,-5l-109,-314l-77,0l18,319z"/>
+<glyph unicode="#" horiz-adv-x="700" d="M542,278l88,0l0,-128l-110,0l-26,-150l-132,0l26,150l-145,0l-26,-150l-132,0l26,150l-76,0l0,128l98,0l25,148l-88,0l0,128l110,0l25,146l132,0l-25,-146l145,0l25,146l132,0l-25,-146l76,0l0,-128l-98,0M265,278l145,0l25,148l-145,0z"/>
+<glyph unicode="$" horiz-adv-x="646" d="M384,1l0,-99l-104,0l0,101C237,8 196,19 155,36C114,52 77,73 44,98l78,114C151,190 178,173 204,160C230,147 257,137 285,131l0,159C210,310 156,336 122,369C87,401 70,446 70,503C70,558 89,603 127,638C165,673 216,693 280,700l0,58l104,0l0,-60C451,689 513,664 570,624l-67,-117C460,536 419,555 379,566l0,-151C455,394 510,367 545,334C579,300 596,255 596,199C596,144 577,100 539,65C500,30 449,8 384,1M216,512C216,495 221,482 231,471C241,460 259,449 285,440l0,135C262,572 244,565 233,554C222,543 216,529 216,512M379,266l0,-140C426,133 450,155 450,191C450,208 445,223 435,234C424,245 406,256 379,266z"/>
+<glyph unicode="%" horiz-adv-x="860" d="M214,350C181,350 152,358 127,374C101,389 81,411 67,438C52,465 45,495 45,528C45,561 52,592 67,619C81,646 101,668 127,684C153,700 183,708 216,708C249,708 278,700 304,685C329,669 349,647 364,620C378,593 385,563 385,530C385,497 378,466 364,439C349,412 329,390 303,374C277,358 247,350 214,350M115,0l511,700l119,0l-511,-700M214,617C194,617 178,609 167,592C156,575 150,555 150,530C150,505 156,484 169,467C181,450 197,441 216,441C236,441 252,449 263,466C274,483 280,503 280,528C280,553 274,574 262,591C249,608 233,617 214,617M644,-8C611,-8 582,0 557,16C531,31 511,53 497,80C482,107 475,137 475,170C475,203 482,234 497,261C511,288 531,310 557,326C583,342 613,350 646,350C679,350 708,342 734,327C759,311 779,289 794,262C808,235 815,205 815,172C815,139 808,108 794,81C779,54 759,32 733,16C707,0 677,-8 644,-8M644,259C624,259 608,251 597,234C586,217 580,197 580,172C580,147 586,126 599,109C611,92 627,83 646,83C666,83 682,91 693,108C704,125 710,145 710,170C710,195 704,216 692,233C679,250 663,259 644,259z"/>
+<glyph unicode="&" horiz-adv-x="696" d="M474,68C411,16 342,-10 269,-10C224,-10 184,-2 149,15C113,32 85,55 65,86C44,117 34,152 34,193C34,280 79,345 170,386C153,411 140,434 133,457C125,479 121,502 121,527C121,560 130,590 147,619C164,647 188,670 220,687C252,704 290,712 333,712C372,712 406,704 436,689C466,674 489,653 506,626C522,599 530,568 530,535C530,490 517,452 492,423C466,393 430,369 383,351l93,-93C498,293 521,333 544,378l113,-62C622,253 592,204 565,168l103,-103l-113,-79M330,592C309,592 293,585 281,572C268,559 262,541 262,520C262,505 265,490 272,477C278,464 288,449 303,432C335,444 359,457 374,472C389,486 396,504 396,526C396,547 390,563 378,575C366,586 350,592 330,592M189,199C189,174 198,154 217,139C235,124 258,116 287,116C320,116 354,129 388,156l-134,136C232,281 216,267 205,251C194,235 189,218 189,199z"/>
+<glyph unicode="’" horiz-adv-x="286" d="M129,540l-62,0l0,160l162,0l0,-135C229,501 214,454 183,425C152,395 105,379 44,378l-13,63C66,444 91,455 108,472C125,489 132,511 129,540z"/>
+<glyph unicode="(" horiz-adv-x="445" d="M210,287C210,217 225,157 256,107C286,56 335,7 403,-40l-67,-101C243,-90 174,-30 128,40C82,109 59,192 59,287C59,382 82,465 128,535C174,604 243,664 336,715l67,-101C335,567 286,518 256,468C225,417 210,357 210,287z"/>
+<glyph unicode=")" horiz-adv-x="445" d="M109,-141l-67,101C110,7 159,56 190,107C220,157 235,217 235,287C235,357 220,417 190,468C159,518 110,567 42,614l67,101C202,664 271,604 317,535C363,465 386,382 386,287C386,192 363,109 317,40C271,-30 202,-90 109,-141z"/>
+<glyph unicode="*" horiz-adv-x="430" d="M240,492l16,-120l-82,0l16,120l-97,-74l-42,72l112,47l-112,47l42,72l97,-74l-16,120l82,0l-16,-120l97,74l42,-72l-112,-47l112,-47l-42,-72z"/>
+<glyph unicode="+" horiz-adv-x="640" d="M391,601l0,-180l181,0l0,-138l-181,0l0,-180l-142,0l0,180l-181,0l0,138l181,0l0,180z"/>
+<glyph unicode="," horiz-adv-x="286" d="M124,0l-62,0l0,160l162,0l0,-135C224,-39 209,-86 178,-115C147,-145 100,-161 39,-162l-13,63C61,-96 86,-85 103,-68C120,-51 127,-29 124,0z"/>
+<glyph unicode="-" horiz-adv-x="408" d="M50,383l308,0l0,-146l-308,0z"/>
+<glyph unicode="." horiz-adv-x="286" d="M62,160l162,0l0,-160l-162,0z"/>
+<glyph unicode="/" horiz-adv-x="530" d="M101,-128l-129,0l443,926l129,0z"/>
+<glyph unicode="0" horiz-adv-x="730" d="M364,-12C303,-12 249,4 202,36C155,67 118,110 93,165C67,220 54,281 54,349C54,417 67,479 93,534C119,589 156,632 203,664C250,696 305,712 366,712C427,712 482,696 529,665C576,633 612,590 638,535C663,480 676,419 676,351C676,283 663,222 637,167C611,112 574,68 527,36C480,4 425,-12 364,-12M364,573C333,573 307,564 284,545C261,526 243,499 231,466C218,432 212,394 212,351C212,308 218,270 231,236C244,202 262,175 285,156C308,137 335,127 366,127C397,127 424,137 447,156C470,175 487,201 500,235C512,268 518,306 518,349C518,392 512,430 499,464C486,498 468,525 445,544C422,563 395,573 364,573z"/>
+<glyph unicode="1" horiz-adv-x="422" d="M330,705l0,-705l-152,0l0,549l-122,-30l-32,126l201,60z"/>
+<glyph unicode="2" horiz-adv-x="623" d="M166,478l-108,87C95,615 133,652 172,675C211,698 260,710 319,710C368,710 411,701 448,683C484,665 512,640 531,607C550,574 560,536 560,493C560,455 554,422 541,393C528,364 508,338 483,313C458,288 422,257 376,221l-114,-88l305,0l0,-133l-518,0l0,122l233,191C328,351 360,382 377,405C394,428 403,453 403,481C403,510 394,532 377,548C360,564 337,572 309,572C283,572 260,565 239,551C218,536 193,512 166,478z"/>
+<glyph unicode="3" horiz-adv-x="621" d="M79,700l473,0l0,-116l-177,-169C430,406 476,386 511,355C546,324 563,278 563,218C563,174 553,135 533,100C512,65 483,37 445,18C406,-2 362,-12 311,-12C197,-12 106,28 38,109l106,101C169,182 195,161 222,147C249,133 279,126 313,126C342,126 366,134 385,150C403,165 412,186 412,212C412,241 400,263 377,279C353,294 319,302 275,302l-64,0l-24,98l167,168l-275,0z"/>
+<glyph unicode="4" horiz-adv-x="689" d="M545,276l94,0l0,-125l-94,0l0,-151l-147,0l0,151l-342,0l-25,109l384,445l130,0M212,276l186,0l0,218z"/>
+<glyph unicode="5" horiz-adv-x="630" d="M540,700l0,-135l-298,0l-8,-121C266,452 297,456 326,456C399,456 459,438 504,401C549,364 571,307 571,231C571,182 560,139 538,102C516,65 485,37 445,18C405,-2 358,-12 305,-12C251,-12 203,-3 161,15C118,33 79,59 43,93l93,111C164,179 191,160 218,147C245,134 273,128 303,128C340,128 368,137 389,154C410,171 420,195 420,226C420,256 409,280 387,297C364,314 334,322 296,322C259,322 220,313 179,296l-89,59l20,345z"/>
+<glyph unicode="6" horiz-adv-x="662" d="M356,572C315,572 282,557 259,528C235,498 220,459 215,410C236,424 258,435 280,443C302,451 329,455 360,455C407,455 450,446 487,429C524,412 553,386 574,353C595,319 606,278 606,231C606,184 594,142 571,105C548,68 516,40 475,19C434,-2 389,-12 339,-12C294,-12 256,-6 224,7C191,19 162,38 137,63C110,90 89,125 75,167C61,208 54,262 54,329C54,403 65,469 88,527C111,584 145,630 191,663C237,696 294,712 361,712C406,712 446,706 480,693C514,680 547,661 580,635l-81,-119C474,535 451,550 430,559C409,568 384,572 356,572M331,327C294,327 264,318 243,299C222,280 211,256 211,225C211,194 222,168 244,149C266,130 296,120 333,120C370,120 400,130 421,149C442,168 453,193 453,224C453,255 442,280 420,299C398,318 368,327 331,327z"/>
+<glyph unicode="7" horiz-adv-x="619" d="M572,700l0,-116l-314,-584l-174,0l313,567l-329,0l0,133z"/>
+<glyph unicode="8" horiz-adv-x="630" d="M315,-10C264,-10 218,-2 177,15C136,32 103,56 80,87C57,118 45,153 45,193C45,235 54,270 73,297C92,324 120,346 158,363C129,380 107,401 92,426C77,451 69,481 69,517C69,553 79,586 100,615C121,644 150,668 187,685C224,702 267,710 315,710C363,710 406,702 443,685C480,668 509,644 530,615C551,586 561,553 561,517C561,481 553,451 538,426C523,401 501,380 472,363C510,343 538,320 557,295C576,270 585,237 585,197C585,154 573,117 550,86C527,55 495,31 454,15C413,-2 367,-10 315,-10M315,583C284,583 260,575 242,559C224,543 215,524 215,501C215,476 224,455 243,439C261,422 285,414 315,414C345,414 369,422 388,438C406,454 415,475 415,500C415,523 406,543 388,559C370,575 346,583 315,583M315,292C279,292 250,284 228,269C205,253 194,232 194,205C194,180 205,159 227,142C248,125 278,117 315,117C352,117 382,125 404,142C425,159 436,180 436,205C436,232 425,253 403,269C380,284 351,292 315,292z"/>
+<glyph unicode="9" horiz-adv-x="662" d="M302,-12C254,-12 212,-5 175,10C138,24 104,44 72,71l81,117C179,167 204,151 228,142C251,133 277,128 306,128C347,128 380,142 404,171C428,200 443,238 448,287C411,255 363,239 306,239C229,239 169,259 124,300C79,340 56,395 56,466C56,513 67,555 90,592C113,629 144,659 185,680C225,701 271,712 323,712C369,712 408,706 439,694C470,682 498,663 525,636C552,609 572,575 587,533C601,491 608,437 608,371C608,294 596,227 573,170C549,112 514,67 469,36C423,4 367,-12 302,-12M328,580C291,580 262,570 241,551C220,531 209,505 209,473C209,441 220,415 242,396C264,377 294,367 331,367C368,367 398,377 419,396C440,415 451,441 451,472C451,504 440,530 418,550C396,570 366,580 328,580z"/>
+<glyph unicode=":" horiz-adv-x="296" d="M67,536l162,0l0,-160l-162,0M67,160l162,0l0,-160l-162,0z"/>
+<glyph unicode=";" horiz-adv-x="296" d="M67,536l162,0l0,-160l-162,0M129,0l-62,0l0,160l162,0l0,-135C229,-39 214,-86 183,-115C152,-145 105,-161 44,-162l-13,63C66,-96 91,-85 108,-68C125,-51 132,-29 129,0z"/>
+<glyph unicode="<" horiz-adv-x="640" d="M552,492l-338,-139l338,-139l0,-143l-484,212l0,138l484,212z"/>
+<glyph unicode="=" horiz-adv-x="640" d="M557,413l-474,0l0,138l474,0M557,153l-474,0l0,138l474,0z"/>
+<glyph unicode=">" horiz-adv-x="640" d="M88,212l338,139l-338,139l0,143l484,-212l0,-138l-484,-212z"/>
+<glyph unicode="?" horiz-adv-x="544" d="M354,497C354,520 346,537 330,550C314,563 291,569 262,569C208,569 158,546 112,500l-92,101C85,673 167,709 265,709C338,709 397,691 441,655C485,618 507,567 507,501C507,442 489,396 454,365C419,333 371,311 310,299l-11,-61l-102,0l-23,162l5,5C240,408 285,417 313,432C340,447 354,469 354,497M164,160l162,0l0,-160l-162,0z"/>
+<glyph unicode="@" horiz-adv-x="980" d="M728,65C691,65 660,71 635,82C610,93 590,108 575,125C531,85 482,65 427,65C393,65 362,73 334,89C306,104 284,127 268,156C252,185 244,219 244,258C244,304 255,346 276,385C297,423 324,453 359,476C393,498 429,509 468,509C527,509 573,486 606,441l11,53l118,-19l-47,-269C686,196 685,186 685,175C685,156 692,141 705,130C718,118 735,112 758,112C795,112 825,130 849,166C873,202 885,252 885,316C885,377 868,435 833,490C798,545 751,589 691,622C630,655 564,672 491,672C417,672 350,654 290,619C229,583 182,535 147,474C112,413 95,346 95,274C95,201 112,135 147,74C182,13 230,-34 291,-69C352,-104 422,-122 499,-122C547,-122 590,-116 628,-105C666,-94 705,-78 744,-55l20,-32C724,-112 682,-130 639,-143C596,-156 549,-162 499,-162C416,-162 340,-142 272,-103C204,-64 151,-11 112,56C73,123 53,195 53,274C53,353 73,426 112,493C151,560 204,613 271,653C338,692 411,712 491,712C570,712 644,694 711,657C778,620 830,571 869,510C908,449 927,384 927,316C927,262 918,216 901,179C883,141 859,113 829,94C799,75 765,65 728,65M488,406C467,406 447,400 429,388C410,375 396,358 385,337C374,315 368,291 368,265C368,234 377,211 394,194C411,177 434,168 462,168C483,168 502,174 521,187C539,200 554,217 565,239C576,261 581,285 581,312C581,340 572,363 555,380C538,397 515,406 488,406z"/>
+<glyph unicode="A" horiz-adv-x="790" d="M541,157l-296,0l-64,-157l-157,0l300,705l142,0l300,-705l-161,0M300,293l186,0l-93,227z"/>
+<glyph unicode="B" horiz-adv-x="722" d="M417,0l-333,0l0,700l325,0C480,700 537,684 578,651C619,618 640,574 640,519l0,-2C640,451 609,401 548,366C591,349 624,328 646,301C668,274 679,239 679,194l0,-2C679,129 656,82 609,49C562,16 498,0 417,0M386,565l-152,0l0,-148l142,0C411,417 439,423 458,435C477,447 487,466 487,491l0,2C487,516 478,534 461,547C444,559 419,565 386,565M412,289l-178,0l0,-154l183,0C452,135 479,141 498,154C517,167 526,186 526,211l0,2C526,237 517,256 498,269C479,282 451,289 412,289z"/>
+<glyph unicode="C" horiz-adv-x="738" d="M412,-12C345,-12 284,4 229,36C174,68 131,112 100,167C69,222 53,282 53,348l0,2C53,416 69,477 100,532C131,587 174,631 230,664C285,696 348,712 418,712C480,712 533,703 576,685C619,666 659,639 694,604l-98,-113C567,517 539,537 510,550C481,563 450,570 417,570C378,570 344,560 313,541C282,521 257,495 240,462C223,429 214,392 214,352l0,-2C214,310 223,273 240,240C257,206 281,179 312,160C343,140 378,130 417,130C454,130 487,137 514,150C541,163 570,184 601,212l98,-99C660,72 619,41 575,20C530,-1 476,-12 412,-12z"/>
+<glyph unicode="D" horiz-adv-x="782" d="M357,0l-273,0l0,700l273,0C429,700 493,685 550,655C606,624 650,583 682,530C713,477 729,417 729,352l0,-2C729,285 713,225 682,172C650,119 606,77 550,46C493,15 429,0 357,0M357,561l-119,0l0,-422l119,0C398,139 435,148 467,166C499,183 524,208 542,240C559,271 568,307 568,348l0,2C568,391 559,427 542,459C524,491 499,516 467,534C435,552 398,561 357,561z"/>
+<glyph unicode="E" horiz-adv-x="670" d="M84,700l528,0l0,-137l-375,0l0,-142l330,0l0,-137l-330,0l0,-147l380,0l0,-137l-533,0z"/>
+<glyph unicode="F" horiz-adv-x="656" d="M238,411l334,0l0,-140l-334,0l0,-271l-154,0l0,700l533,0l0,-140l-379,0z"/>
+<glyph unicode="G" horiz-adv-x="784" d="M421,-12C350,-12 286,4 230,35C174,66 131,108 100,163C69,218 53,279 53,348l0,2C53,416 69,477 101,532C132,587 176,631 232,664C288,696 351,712 420,712C481,712 532,704 574,689C616,673 656,649 695,616l-97,-117C569,524 540,542 513,553C486,564 453,570 415,570C378,570 345,560 314,541C283,521 259,494 241,461C223,428 214,391 214,352l0,-2C214,308 223,270 241,236C259,202 284,176 317,157C349,138 385,128 426,128C484,128 532,142 571,170l0,100l-155,0l0,133l304,0l0,-304C633,25 533,-12 421,-12z"/>
+<glyph unicode="H" horiz-adv-x="760" d="M522,281l-284,0l0,-281l-154,0l0,700l154,0l0,-277l284,0l0,277l154,0l0,-700l-154,0z"/>
+<glyph unicode="I" horiz-adv-x="336" d="M91,700l154,0l0,-700l-154,0z"/>
+<glyph unicode="J" horiz-adv-x="564" d="M243,-10C149,-10 73,25 14,95l97,108C132,180 153,162 174,151C194,139 216,133 239,133C269,133 292,143 309,162C325,181 333,210 333,249l0,451l158,0l0,-458C491,159 469,97 425,54C380,11 320,-10 243,-10z"/>
+<glyph unicode="K" horiz-adv-x="730" d="M319,298l-81,-84l0,-214l-154,0l0,700l154,0l0,-306l284,306l186,0l-285,-297l298,-403l-185,0z"/>
+<glyph unicode="L" horiz-adv-x="619" d="M84,700l154,0l0,-560l349,0l0,-140l-503,0z"/>
+<glyph unicode="M" horiz-adv-x="868" d="M631,457l-197,-299l-4,0l-195,296l0,-454l-151,0l0,700l166,0l184,-296l184,296l166,0l0,-700l-153,0z"/>
+<glyph unicode="N" horiz-adv-x="790" d="M236,445l0,-445l-152,0l0,700l142,0l328,-431l0,431l152,0l0,-700l-131,0z"/>
+<glyph unicode="O" horiz-adv-x="850" d="M424,-12C353,-12 290,4 234,36C177,68 133,112 101,167C69,222 53,282 53,348l0,2C53,416 69,477 102,532C134,587 178,631 235,664C292,696 355,712 426,712C497,712 560,696 617,664C673,632 717,589 749,534C781,479 797,418 797,352l0,-2C797,284 781,223 749,168C716,113 672,69 615,37C558,4 495,-12 424,-12M424,570C383,570 347,560 316,541C284,522 259,495 241,462C223,429 214,392 214,352l0,-2C214,310 223,273 242,240C260,206 285,179 317,160C349,140 385,130 426,130C467,130 503,140 535,159C566,178 591,205 609,238C627,271 636,308 636,348l0,2C636,390 627,427 609,461C590,494 565,521 533,541C501,560 465,570 424,570z"/>
+<glyph unicode="P" horiz-adv-x="668" d="M355,210l-117,0l0,-210l-154,0l0,700l286,0C425,700 472,690 513,670C553,649 584,621 606,584C627,547 638,505 638,458l0,-2C638,404 626,359 601,322C576,285 542,257 499,238C456,219 408,210 355,210M357,561l-119,0l0,-214l122,0C397,347 427,357 449,377C471,397 482,422 482,453l0,2C482,489 471,515 449,534C427,552 396,561 357,561z"/>
+<glyph unicode="Q" horiz-adv-x="850" d="M632,48C570,8 501,-12 424,-12C353,-12 290,4 234,36C177,68 133,112 101,167C69,222 53,282 53,348l0,2C53,416 69,477 102,532C134,587 178,631 235,664C292,696 355,712 426,712C497,712 560,696 617,664C673,632 717,589 749,534C781,479 797,418 797,352l0,-2C797,313 792,278 781,244C770,210 755,178 735,149l72,-61l-98,-109M424,570C383,570 347,560 316,541C284,522 259,495 241,462C223,429 214,392 214,352l0,-2C214,310 223,273 242,240C260,206 285,179 317,160C349,140 385,130 426,130C459,130 489,136 518,149l-114,97l98,110l115,-104C630,280 636,312 636,348l0,2C636,390 627,427 609,461C590,494 565,521 533,541C501,560 465,570 424,570z"/>
+<glyph unicode="R" horiz-adv-x="723" d="M359,224l-121,0l0,-224l-154,0l0,700l320,0C487,700 551,680 598,639C645,598 668,541 668,469l0,-2C668,412 655,367 628,331C601,294 565,267 518,250l171,-250l-180,0M391,561l-153,0l0,-201l156,0C431,360 460,369 481,387C502,405 512,429 512,459l0,2C512,494 501,519 480,536C459,553 429,561 391,561z"/>
+<glyph unicode="S" horiz-adv-x="640" d="M333,-10C279,-10 226,0 175,19C124,38 77,65 36,102l91,109C160,184 194,163 228,148C262,133 298,126 336,126C367,126 392,132 410,144C428,155 437,171 437,192l0,2C437,208 433,220 426,229C419,238 405,247 385,256C364,264 335,273 296,283C243,297 200,312 168,327C135,342 110,363 92,390C73,417 64,452 64,497l0,2C64,541 75,578 96,610C117,641 146,666 183,684C220,701 262,710 309,710C408,710 495,680 569,621l-80,-116C423,551 362,574 307,574C278,574 256,568 241,557C225,546 217,531 217,513l0,-2C217,496 221,483 230,474C238,464 252,455 273,447C294,439 325,430 368,419C444,399 500,374 536,343C572,312 590,267 590,209l0,-2C590,139 567,86 520,48C473,9 410,-10 333,-10z"/>
+<glyph unicode="T" horiz-adv-x="648" d="M401,0l-154,0l0,558l-213,0l0,142l580,0l0,-142l-213,0z"/>
+<glyph unicode="U" horiz-adv-x="756" d="M376,-11C281,-11 206,16 153,69C100,122 73,199 73,300l0,400l154,0l0,-396C227,248 240,205 267,176C293,146 330,131 378,131C426,131 463,145 490,174C516,203 529,244 529,299l0,401l154,0l0,-395C683,201 656,122 602,69C547,16 472,-11 376,-11z"/>
+<glyph unicode="V" horiz-adv-x="750" d="M307,-5l-283,705l170,0l183,-493l183,493l166,0l-283,-705z"/>
+<glyph unicode="W" horiz-adv-x="1122" d="M719,-5l-158,458l-158,-458l-134,0l-239,705l165,0l145,-474l157,476l132,0l157,-476l145,474l161,0l-239,-705z"/>
+<glyph unicode="X" horiz-adv-x="732" d="M364,240l-158,-240l-175,0l244,356l-234,344l180,0l147,-227l148,227l175,0l-234,-342l244,-358l-180,0z"/>
+<glyph unicode="Y" horiz-adv-x="716" d="M435,0l-154,0l0,276l-269,424l180,0l167,-281l170,281l175,0l-269,-421z"/>
+<glyph unicode="Z" horiz-adv-x="708" d="M63,117l385,448l-373,0l0,135l571,0l0,-117l-385,-448l385,0l0,-135l-583,0z"/>
+<glyph unicode="\" horiz-adv-x="530" d="M429,-128l-443,926l129,0l443,-926z"/>
+<glyph unicode="^" horiz-adv-x="500" d="M50,493l148,207l104,0l148,-207l-110,0l-91,117l-91,-117z"/>
+<glyph unicode="_" horiz-adv-x="600" d="M602,-160l-604,0l0,116l604,0z"/>
+<glyph unicode="‘" horiz-adv-x="286" d="M157,543l62,0l0,-160l-162,0l0,135C57,582 73,629 104,659C135,688 181,704 242,705l13,-63C220,639 195,629 178,612C161,595 154,572 157,543z"/>
+<glyph unicode="a" horiz-adv-x="592" d="M382,58C341,13 287,-10 220,-10C167,-10 124,5 89,34C54,63 36,103 36,154l0,2C36,213 56,255 95,284C134,313 186,327 252,327C297,327 340,320 383,305l0,9C383,346 373,370 354,387C335,404 306,412 268,412C241,412 216,410 194,405C171,400 147,393 120,383l-38,116C115,514 147,525 179,532C210,539 247,542 290,542C371,542 432,522 471,483C510,443 529,386 529,311l0,-311l-147,0M288,236C255,236 230,230 211,217C192,204 183,186 183,162l0,-2C183,140 191,124 206,113C221,101 241,95 266,95C301,95 330,104 352,122C374,139 385,162 385,189l0,27C356,229 324,236 288,236z"/>
+<glyph unicode="b" horiz-adv-x="675" d="M387,-10C350,-10 318,-3 291,12C264,26 241,45 220,70l0,-70l-152,0l0,730l152,0l0,-271C263,517 318,546 387,546C430,546 470,535 507,514C544,492 574,460 597,418C620,376 631,326 631,269l0,-2C631,210 620,160 598,118C575,76 545,44 508,23C471,1 430,-10 387,-10M348,417C324,417 302,411 283,399C263,386 247,369 236,346C224,323 218,298 218,269l0,-2C218,238 224,213 236,190C247,167 263,150 283,138C302,125 324,119 348,119C372,119 394,125 414,138C434,150 450,167 462,190C473,212 479,238 479,267l0,2C479,298 473,323 462,346C450,369 434,386 414,399C394,411 372,417 348,417z"/>
+<glyph unicode="c" horiz-adv-x="571" d="M321,-12C268,-12 221,0 179,25C136,50 103,83 79,126C54,168 42,214 42,265l0,2C42,318 54,364 78,407C102,450 136,484 179,509C222,534 270,546 323,546C372,546 413,538 447,523C480,508 510,485 537,456l-93,-100C425,376 407,391 388,401C369,410 347,415 322,415C297,415 275,408 256,395C236,382 220,364 209,342C198,319 192,295 192,269l0,-2C192,225 205,190 230,162C255,133 287,119 328,119C352,119 374,124 393,133C412,142 431,157 451,176l89,-90C511,54 479,30 446,13C413,-4 371,-12 321,-12z"/>
+<glyph unicode="d" horiz-adv-x="675" d="M455,77C412,19 357,-10 288,-10C245,-10 205,1 168,23C131,44 101,76 78,118C55,160 44,210 44,267l0,2C44,326 55,376 78,418C100,460 130,492 167,514C204,535 245,546 288,546C325,546 357,539 384,525C411,510 434,491 455,466l0,264l152,0l0,-730l-152,0M327,417C303,417 281,411 261,399C241,386 225,369 214,347C202,324 196,298 196,269l0,-2C196,238 202,213 214,190C225,167 241,150 261,138C281,125 303,119 327,119C351,119 373,125 393,138C412,150 428,167 440,190C451,213 457,238 457,267l0,2C457,298 451,323 440,346C428,369 412,386 393,399C373,411 351,417 327,417z"/>
+<glyph unicode="e" horiz-adv-x="613" d="M566,215l-373,0C200,181 215,155 238,137C261,119 289,110 324,110C349,110 372,114 392,123C412,132 433,146 454,165l87,-77C487,21 414,-12 322,-12C269,-12 221,0 179,23C136,46 103,79 79,121C54,163 42,211 42,265l0,2C42,318 53,364 76,407C99,450 130,484 171,509C211,534 256,546 307,546C364,546 413,533 452,506C491,479 520,444 539,400C558,356 568,308 568,255l0,-2C568,246 567,234 566,215M307,424C276,424 251,414 231,394C210,373 197,345 191,310l229,0C415,345 403,372 384,393C364,414 338,424 307,424z"/>
+<glyph unicode="f" horiz-adv-x="382" d="M299,609C262,609 244,590 244,551l0,-21l123,0l0,-124l-121,0l0,-406l-152,0l0,406l-63,0l0,125l63,0l0,34C94,680 149,737 260,737C301,737 337,732 368,722l0,-126C344,605 321,609 299,609z"/>
+<glyph unicode="g" horiz-adv-x="675" d="M308,-162C221,-162 142,-143 71,-106l52,114C152,-8 181,-20 210,-28C239,-37 270,-41 304,-41C406,-41 457,8 457,105l0,26C433,102 408,80 381,66C354,51 321,44 282,44C239,44 200,54 164,74C127,94 98,123 77,161C55,198 44,243 44,294l0,2C44,347 55,392 77,430C99,467 128,496 165,516C201,536 240,546 282,546C321,546 353,539 380,525C407,511 432,491 455,466l0,70l152,0l0,-415C607,22 583,-50 534,-95C485,-140 409,-162 308,-162M326,420C289,420 258,408 233,385C208,362 196,332 196,296l0,-2C196,257 208,228 233,205C258,182 289,170 326,170C363,170 395,182 420,205C445,228 457,258 457,294l0,2C457,332 445,362 420,385C395,408 363,420 326,420z"/>
+<glyph unicode="h" horiz-adv-x="623" d="M407,299C407,334 399,361 383,380C367,399 344,408 315,408C286,408 263,399 246,380C229,361 220,334 220,299l0,-299l-152,0l0,730l152,0l0,-270C241,487 263,508 288,523C312,538 342,546 377,546C434,546 479,528 511,493C543,458 559,409 559,347l0,-347l-152,0z"/>
+<glyph unicode="i" horiz-adv-x="302" d="M71,730l160,0l0,-135l-160,0M75,536l152,0l0,-536l-152,0z"/>
+<glyph unicode="j" horiz-adv-x="302" d="M71,730l160,0l0,-135l-160,0M55,-163C32,-163 10,-161 -11,-157l0,119C1,-40 12,-41 21,-41C57,-41 75,-20 75,21l0,515l152,0l0,-527C227,-106 170,-163 55,-163z"/>
+<glyph unicode="k" horiz-adv-x="592" d="M273,219l-53,-56l0,-163l-152,0l0,730l152,0l0,-389l178,195l182,0l-204,-211l211,-325l-174,0z"/>
+<glyph unicode="l" horiz-adv-x="302" d="M75,730l152,0l0,-730l-152,0z"/>
+<glyph unicode="m" horiz-adv-x="950" d="M734,299C734,335 726,362 711,381C696,399 674,408 645,408C616,408 594,399 578,380C561,361 553,334 553,299l0,-299l-152,0l0,299C401,335 393,362 378,381C363,399 341,408 312,408C283,408 261,399 245,380C228,361 220,334 220,299l0,-299l-152,0l0,536l152,0l0,-76C241,487 263,508 288,523C313,538 343,546 378,546C413,546 443,539 469,524C495,509 515,488 529,461C578,518 636,546 705,546C762,546 807,529 839,496C870,462 886,413 886,349l0,-349l-152,0z"/>
+<glyph unicode="n" horiz-adv-x="623" d="M407,299C407,334 399,361 383,380C367,399 344,408 315,408C286,408 263,399 246,380C229,361 220,334 220,299l0,-299l-152,0l0,536l152,0l0,-76C241,487 263,508 288,523C312,538 342,546 377,546C434,546 479,528 511,493C543,458 559,409 559,347l0,-347l-152,0z"/>
+<glyph unicode="o" horiz-adv-x="664" d="M331,-12C277,-12 228,0 184,25C139,50 105,83 80,126C55,168 42,214 42,265l0,2C42,318 55,364 80,407C105,450 140,484 185,509C229,534 278,546 333,546C387,546 436,534 481,509C525,484 560,451 585,409C610,366 622,320 622,269l0,-2C622,216 609,170 584,127C559,84 524,51 480,26C435,1 386,-12 331,-12M331,415C289,415 255,401 230,373C205,345 192,310 192,269l0,-2C192,240 198,216 210,194C222,171 239,153 260,140C281,126 306,119 333,119C375,119 409,133 434,161C459,189 472,224 472,265l0,2C472,294 466,318 454,341C442,363 425,381 404,395C383,408 358,415 331,415z"/>
+<glyph unicode="p" horiz-adv-x="675" d="M387,-10C350,-10 318,-3 291,12C264,26 241,45 220,70l0,-230l-152,0l0,696l152,0l0,-77C263,517 318,546 387,546C430,546 470,535 507,514C544,492 574,460 597,418C620,376 631,326 631,269l0,-2C631,210 620,160 598,118C575,76 545,44 508,23C471,1 430,-10 387,-10M348,417C324,417 302,411 283,399C263,386 247,369 236,346C224,323 218,298 218,269l0,-2C218,238 224,213 236,190C247,167 263,150 283,138C302,125 324,119 348,119C372,119 394,125 414,138C434,150 450,167 462,190C473,212 479,238 479,267l0,2C479,298 473,323 462,346C450,369 434,386 414,399C394,411 372,417 348,417z"/>
+<glyph unicode="q" horiz-adv-x="675" d="M455,77C412,19 357,-10 288,-10C245,-10 205,1 168,23C131,44 101,76 78,118C55,160 44,210 44,267l0,2C44,326 55,376 78,418C100,460 130,492 167,514C204,535 245,546 288,546C325,546 357,539 384,525C411,510 434,491 455,466l0,70l152,0l0,-696l-152,0M327,417C303,417 281,411 261,399C241,386 225,369 214,347C202,324 196,298 196,269l0,-2C196,238 202,213 214,190C225,167 241,150 261,138C281,125 303,119 327,119C351,119 373,125 393,138C412,150 428,167 440,190C451,213 457,238 457,267l0,2C457,298 451,323 440,346C428,369 412,386 393,399C373,411 351,417 327,417z"/>
+<glyph unicode="r" horiz-adv-x="418" d="M220,198l0,-198l-152,0l0,536l152,0l0,-108C237,467 259,497 286,518C313,539 348,548 391,546l0,-159l-8,0C331,387 291,371 263,340C234,308 220,261 220,198z"/>
+<glyph unicode="s" horiz-adv-x="502" d="M256,-10C217,-10 177,-3 137,10C97,23 60,44 26,71l65,100C120,150 149,135 178,124C207,113 235,107 260,107C281,107 297,111 308,118C319,125 324,134 324,147l0,2C324,162 317,172 303,180C288,187 265,196 233,205l-20,6C164,225 126,244 97,267C68,290 53,325 53,372l0,2C53,409 62,440 79,466C96,491 120,511 150,524C179,537 212,544 249,544C283,544 318,539 353,528C388,517 420,501 449,482l-58,-105C364,393 338,405 313,414C288,423 265,427 246,427C228,427 214,424 205,417C195,410 190,401 190,390l0,-2C190,379 195,371 204,364C213,357 227,350 245,343C262,336 280,330 299,324C348,307 388,288 417,265C446,242 461,208 461,165l0,-2C461,106 442,63 405,34C367,5 317,-10 256,-10z"/>
+<glyph unicode="t" horiz-adv-x="415" d="M249,-9C199,-9 161,3 134,28C107,52 93,93 93,152l0,254l-64,0l0,130l64,0l0,137l152,0l0,-137l126,0l0,-130l-126,0l0,-229C245,160 249,147 257,138C265,129 277,125 294,125C321,125 346,131 369,144l0,-122C334,1 294,-9 249,-9z"/>
+<glyph unicode="u" horiz-adv-x="623" d="M403,76C382,49 360,28 336,13C311,-2 281,-10 246,-10C189,-10 144,8 112,43C80,78 64,127 64,189l0,347l152,0l0,-299C216,202 224,175 240,156C256,137 279,128 308,128C337,128 361,137 378,156C395,175 403,202 403,237l0,299l152,0l0,-536l-152,0z"/>
+<glyph unicode="v" horiz-adv-x="600" d="M231,-4l-211,540l161,0l120,-359l121,359l158,0l-211,-540z"/>
+<glyph unicode="w" horiz-adv-x="861" d="M533,-4l-103,329l-105,-329l-136,0l-165,540l154,0l86,-325l101,327l131,0l102,-328l88,326l151,0l-167,-540z"/>
+<glyph unicode="x" horiz-adv-x="584" d="M290,167l-108,-167l-159,0l188,272l-181,264l163,0l100,-156l101,156l159,0l-181,-261l189,-275l-163,0z"/>
+<glyph unicode="y" horiz-adv-x="600" d="M196,-163C170,-163 146,-160 125,-153C103,-147 82,-138 61,-126l51,110C135,-30 157,-37 177,-37C190,-37 201,-34 209,-29C216,-24 223,-15 230,-2l-210,538l161,0l122,-365l117,365l158,0l-206,-549C351,-68 328,-107 302,-129C276,-152 241,-163 196,-163z"/>
+<glyph unicode="z" horiz-adv-x="563" d="M50,107l277,306l-268,0l0,123l457,0l0,-107l-278,-306l278,0l0,-123l-466,0z"/>
+<glyph unicode="~" horiz-adv-x="510" d="M337,234C322,234 308,236 295,240C282,243 265,249 242,257C217,268 199,273 187,273C172,273 161,269 154,262C146,254 138,241 130,224l-81,25C62,295 77,330 96,353C115,376 140,387 173,387C188,387 202,385 215,382C228,378 245,372 268,364C293,353 311,348 323,348C338,348 349,352 357,360C364,367 372,380 380,397l81,-25C448,326 433,292 414,269C395,246 370,234 337,234z"/>
+<glyph unicode="£" horiz-adv-x="644" d="M373,710C426,710 470,700 505,680C540,660 571,632 598,595l-117,-94C463,524 446,541 430,552C414,562 396,567 375,567C350,567 330,559 315,542C300,525 292,501 292,471l0,-77l228,0l0,-127l-228,0l0,-134l304,0l0,-133l-536,0l0,101l76,25l0,141l-76,0l0,127l76,0l0,81C136,549 157,607 198,648C239,689 298,710 373,710z"/>
+<glyph unicode="'" horiz-adv-x="286" d="M245,700l0,-5l-109,-314l-79,0l18,319z"/>
+<glyph unicode="“" horiz-adv-x="540" d="M157,543l62,0l0,-160l-162,0l0,135C57,582 73,629 104,659C135,688 181,704 242,705l13,-63C220,639 195,629 178,612C161,595 154,572 157,543M411,543l62,0l0,-160l-162,0l0,135C311,582 327,629 358,659C389,688 435,704 496,705l13,-63C474,639 449,629 432,612C415,595 408,572 411,543z"/>
+<glyph unicode="•" horiz-adv-x="500" d="M250,203C223,203 199,210 176,223C153,236 134,255 121,278C108,301 101,325 101,352C101,379 108,404 121,427C134,450 153,468 176,481C199,494 223,501 250,501C277,501 302,494 325,481C348,468 366,450 379,427C392,404 399,379 399,352C399,325 392,301 379,278C366,255 348,236 325,223C302,210 277,203 250,203z"/>
+<glyph unicode="”" horiz-adv-x="540" d="M129,540l-62,0l0,160l162,0l0,-135C229,501 214,454 183,425C152,395 105,379 44,378l-13,63C66,444 91,455 108,472C125,489 132,511 129,540M383,540l-62,0l0,160l162,0l0,-135C483,501 468,454 437,425C406,395 359,379 298,378l-13,63C320,444 345,455 362,472C379,489 386,511 383,540z"/>
+<glyph unicode="™" horiz-adv-x="690" d="M118,392l0,246l-92,0l0,62l254,0l0,-62l-92,0l0,-246M496,465l-85,135l0,-208l-66,0l0,308l74,0l81,-130l81,130l72,0l0,-308l-66,0l0,208l-85,-135z"/>
+<glyph unicode="©" horiz-adv-x="830" d="M414,-12C347,-12 287,4 232,37C177,69 133,113 101,168C69,223 53,284 53,349C53,414 69,475 102,531C134,586 178,630 233,663C288,696 349,712 416,712C483,712 544,696 599,664C654,631 697,587 729,532C761,477 777,416 777,351C777,286 761,225 729,170C696,114 652,70 597,37C542,4 481,-12 414,-12M416,672C356,672 302,658 253,629C204,600 165,560 137,511C109,462 95,408 95,349C95,290 109,237 137,188C165,139 203,100 252,71C301,42 355,28 414,28C474,28 529,43 578,72C627,101 665,140 693,189C721,238 735,292 735,351C735,410 721,464 693,513C665,562 627,600 578,629C529,658 475,672 416,672M419,156C382,156 348,165 318,182C288,199 265,223 248,254C231,284 222,317 222,354C222,391 231,424 248,455C265,485 288,509 319,527C349,545 383,554 422,554C456,554 485,549 509,539C532,529 554,514 574,495l-55,-64C487,460 455,474 422,474C391,474 365,463 344,440C323,417 312,388 312,355C312,322 322,294 343,271C364,248 390,236 422,236C442,236 459,240 474,247C488,254 504,266 521,281l56,-56C556,202 533,184 509,173C484,162 454,156 419,156z"/>
+<glyph unicode="®" horiz-adv-x="830" d="M414,-12C347,-12 287,4 232,37C177,69 133,113 101,168C69,223 53,284 53,349C53,414 69,475 102,531C134,586 178,630 233,663C288,696 349,712 416,712C483,712 544,696 599,664C654,631 697,587 729,532C761,477 777,416 777,351C777,286 761,225 729,170C696,114 652,70 597,37C542,4 481,-12 414,-12M416,672C356,672 302,658 253,629C204,600 165,560 137,511C109,462 95,408 95,349C95,290 109,237 137,188C165,139 203,100 252,71C301,42 355,28 414,28C474,28 529,43 578,72C627,101 665,140 693,189C721,238 735,292 735,351C735,410 721,464 693,513C665,562 627,600 578,629C529,658 475,672 416,672M505,306l94,-138l-99,0l-82,124l-67,0l0,-124l-85,0l0,385l171,0C484,553 521,542 548,520C575,497 588,466 588,426C588,396 581,371 566,351C551,330 531,315 505,306M434,478l-83,0l0,-113l85,0C457,365 474,370 485,381C496,391 502,404 502,421C502,440 496,454 484,464C472,473 455,478 434,478z"/>
+<glyph unicode=" " horiz-adv-x="300"/>
+</font>
+
+ <image style="overflow:visible;" width="787" height="443" xlink:href="./loader/back.png" transform="matrix(0.9974 0 0 0.9977 1 1)">
+</image>
+<text transform="matrix(1 0 0 1 59.7305 138.855)" class="st0 st1 st2">Kartik</text>
+<text transform="matrix(1 0 0 1 61.7622 159.8193)" class="st0 st1 st3">%version%</text>
+<rect x="-8.8" y="392" class="st4" width="711.8" height="153.5"/>
+<rect x="638" y="0" class="st4" width="43.4" height="443"/>
+<rect x="-709.8" y="0" class="st4" width="711.8" height="443"/>
+<rect x="-42" y="-441" class="st4" width="711.8" height="443"/>
+<image style="overflow:visible;" width="1080" height="1080" xlink:href="./loader/logo.png" transform="matrix(4.612159e-02 0 0 4.612159e-02 540.8679 295.5552)">
+</image>
+</svg>
diff --git a/views/loader/back.png b/views/loader/back.png Binary files differnew file mode 100644 index 0000000..4d268cc --- /dev/null +++ b/views/loader/back.png diff --git a/views/loader/logo.png b/views/loader/logo.png Binary files differnew file mode 100644 index 0000000..09112ca --- /dev/null +++ b/views/loader/logo.png diff --git a/views/menu.css b/views/menu.css index d6fc60e..dea591c 100644 --- a/views/menu.css +++ b/views/menu.css @@ -1,150 +1,248 @@ -.services li .item { - padding: 4px; - font-size: 20px; - width: 300px; - border-color: transparent; - margin-right: auto !important; - display: block; - text-align: left; - border-left-width: 3px; - border-left-style: solid; - border-color: transparent; -} - -.services { - position: fixed; - left: 0; - bottom: 0; - right: 0; - top: 150px; - padding-top: 50px; -} - -.services li { - color: transparent; - margin-top: 5px; - margin-bottom: 5px; -} - -.services li .item a { - color: white !important; - text-decoration: none; - transition: color 200ms; -} - -.services li.selected .item a { - text-decoration: none; -} - -.services:not(.services-settings) li.selected .item { - border-color: #00ff99; - animation-direction: alternate-reverse; - animation-duration: 3s; - animation-name: border-overlay; - animation-fill-mode: both; - animation-iteration-count: infinite; -} - -.services.services-settings li.selected .item { - border-color: #00ff99; - background-color: rgba(0, 255, 153, 0.25); - animation-direction: alternate-reverse; - animation-duration: 3s; - animation-name: border-overlay2; - animation-fill-mode: both; - animation-iteration-count: infinite; - border-top-right-radius: 10px; - border-bottom-right-radius: 10px; -} - -@keyframes border-overlay { - 0% { - border-color: #00ff66; - } - 100% { - border-color: #00ccff; - } -} - -@keyframes border-overlay2 { - 0% { - border-color: #00ff66; - background-color: rgba(0, 255, 102, 0.25); - } - 100% { - border-color: #00ccff; - background-color: rgba(0, 204, 255, 0.25); - } -} - -.services li .item { - margin-left: 12.5px; - transition: margin-left 200ms, background-color 200ms, border 200ms; -} - -.services li .help { - color: white; - margin-left: 5px; - display: inline-block; - font-size: 12px; - position: relative; - top: -2.5px; - opacity: 0; - transition: opacity 200ms; -} - -.services li .help.exit { - color: #ff6969; -} - -.services li.selected .help { - opacity: 1; -} - -#copyright { - color: rgba(255, 255, 255, .5); - position: fixed; - bottom: 30px; - right: 30px; - text-align: right; - font-size: 12px; -} - -.setting-status { - float: right; -} - -#notice { - color: white; - position: fixed; - top: 20px; - right: 20px; - width: 180px; - text-align: right; - font-size: 14px; -} - -#scroll { - display: block; - text-align: center; - color: white; - padding-top: 100vh; - padding-bottom: 100vh; -} - -.cred-title { - color: yellow; -} - -.cred-content { - color: white; -} - -.technical { - color: cyan; -} - -.item-icon { - filter: invert(1); - vertical-align: middle; +.services li .item {
+ padding: 4px;
+ font-size: 20px;
+ width: 300px;
+ border-color: transparent;
+ margin-right: auto !important;
+ display: block;
+ text-align: left;
+ border-left-width: 3px;
+ border-left-style: solid;
+ border-color: transparent;
+}
+
+.services {
+ position: fixed;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ top: 150px;
+ padding-top: 50px;
+}
+
+.services li {
+ color: transparent;
+ margin-top: 5px;
+ margin-bottom: 5px;
+}
+
+.services li .item a {
+ color: white !important;
+ text-decoration: none;
+ transition: color 200ms;
+}
+
+.services li.selected .item a {
+ text-decoration: none;
+}
+
+.services:not(.services-settings) li.selected .item {
+ background-color: rgba(0, 255, 153, 0.25);
+ backdrop-filter: blur(10px);
+ border-radius: 10px;
+ animation-direction: alternate-reverse;
+ position: relative;
+ z-index: 9999999999;
+ animation-duration: 3s;
+ animation-name: border-overlay;
+ animation-fill-mode: both;
+ animation-iteration-count: infinite;
+}
+
+.services.services-settings li.selected .item {
+ border-color: #00ff99;
+ background-color: rgba(0, 255, 153, 0.25);
+ animation-direction: alternate-reverse;
+ animation-duration: 3s;
+ animation-name: border-overlay2;
+ animation-fill-mode: both;
+ animation-iteration-count: infinite;
+ border-top-right-radius: 10px;
+ border-bottom-right-radius: 10px;
+}
+
+@keyframes border-overlay {
+ 0% {
+ background-color: rgba(0, 255, 102, 0.25);
+ }
+ 100% {
+ background-color: rgba(0, 204, 255, 0.25);
+ }
+}
+
+@keyframes border-overlay2 {
+ 0% {
+ border-color: #00ff66;
+ background-color: rgba(0, 255, 102, 0.25);
+ }
+ 100% {
+ border-color: #00ccff;
+ background-color: rgba(0, 204, 255, 0.25);
+ }
+}
+
+.services li .item {
+ margin-left: 12.5px;
+ transition: margin-left 200ms, background-color 200ms, border 200ms;
+}
+
+.services li .help {
+ color: white;
+ margin-left: 5px;
+ display: inline-block;
+ font-size: 12px;
+ position: relative;
+ top: -2.5px;
+ opacity: 0;
+ transition: opacity 200ms;
+}
+
+.services li .help.exit {
+ color: #ff6969;
+}
+
+.services li.selected .help {
+ opacity: 1;
+}
+
+#copyright {
+ color: rgba(255, 255, 255, .5);
+ position: fixed;
+ bottom: 30px;
+ right: 30px;
+ text-align: right;
+ font-size: 12px;
+}
+
+.setting-status {
+ float: right;
+}
+
+#notice {
+ color: white;
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ width: 180px;
+ text-align: right;
+ font-size: 14px;
+}
+
+#scroll {
+ display: block;
+ text-align: center;
+ color: white;
+ padding-top: 100vh;
+ padding-bottom: 100vh;
+}
+
+.cred-title {
+ color: yellow;
+}
+
+.cred-content {
+ color: white;
+}
+
+.technical {
+ color: cyan;
+}
+
+.item-icon {
+ filter: invert(1);
+ vertical-align: middle;
+ display: inline-block;
+ margin-top: 3px;
+ margin-bottom: -1px;
+}
+
+div.services.home {
+ top: 115px;
+ padding: 0;
+ display: flex;
+ align-items: center;
+ bottom: 70px;
+ z-index: 9999;
+}
+
+div.services.home > div.items > ul > li > span.item {
+ width: 216px;
+ border-radius: 0;
+}
+
+div.services.home > div.items > ul > li > span.item > a {
+ margin-left: 10px;
+ margin-right: 10px;
+ width: 100%;
+ display: inline-block;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+}
+
+div.services.home > div.items {
+ width: 256px;
+}
+
+div.services.home > div.items > ul {
+ padding: 0;
+}
+
+div.services.home > div.items > ul > li {
+ list-style: none;
+}
+
+div.services.home > div.items > ul > li > span.item {
+ margin-left: 10vw;
+ transition: none;
+}
+
+img[alt="full-logo"] {
+ margin-left: calc(10vw + 37.5px) !important;
+ margin-top: 55px !important;
+ height: 56px !important;
+ z-index: 99999;
+ position: fixed;
+}
+
+span#copyright {
+ bottom: 46px;
+ left: 10vw;
+ z-index: 9999;
+ color: rgba(255, 255, 255, 0.75);
+ right: unset;
+ width: 227px;
+ text-align: center;
+}
+
+#services-background {
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ width: 227px;
+ z-index: 9;
+ backdrop-filter: blur(10px);
+ background: rgba(0, 0, 0, 0.5);
+ left: 10vw;
+}
+
+.item-text {
+ vertical-align: middle;
+ margin-top: 8px;
+ display: inline-block;
+}
+
+@media (max-height: 600px) {
+ img[alt="full-logo"][src="../logo/full.png"].full-logo {
+ margin-top: 16px !important;
+ }
+
+ span#copyright.copyright {
+ bottom: 14px !important;
+ }
+}
+
+body {
+ height: calc(100vh / 1.2);
+ overflow: hidden;
}
\ No newline at end of file diff --git a/views/menu.html b/views/menu.html index d00107c..59171d4 100644 --- a/views/menu.html +++ b/views/menu.html @@ -1,93 +1,120 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};</script> - <script src="../lang/loader.js"></script> - <script src="../scenario/client.js"></script> - <meta charset="UTF-8"> - <link rel="stylesheet" href="common/fonts.css"> - <link rel="stylesheet" href="common/blur.css"> - <link rel="stylesheet" href="menu.css"> - <title>Kartik</title> - <script src="../crash/client.js"></script> - <script src="./script/global_compatlayer.js"></script> - <script src="../sfx/sfx.js"></script> - <link rel="stylesheet" href="rain/rainstyle.css"> - <script> - scenar("intro", "neutral"); - if (!require('@electron/remote').getCurrentWindow().debug) { - document.write('<link rel="stylesheet" href="common/mouse.css">'); - } - </script> -</head> -<body class="back-row-toggle splat-toggle"> - <script>info("MainWindow", "Rendering initial frame..."); - - if (native) { - scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale; - } - - </script> - <div id="box" style="display: none;background:#222;position:fixed;top:0;left:0;right:0;bottom:0;"> - <div class="rain front-row"></div> - <div class="rain back-row"></div> - - <div style="width: 100%;height: 100%;background-color: #001743;background-image: url('./menu.jpg');background-size: cover;position: fixed;z-index: -1;"> - <img alt="full-logo" src="../logo/full.png" style="margin-left: 50px;margin-top: 30px;height: 96px;"> - </div> - - <div class="services"> - <div class="items"> - <ul> - <li class="selected"><span class="item"><a href="#" id="single"><img class="item-icon" src="../icons/singleplayer.svg"> <script>document.write(lang.menu.titles[0])</script></a></span></li> - <script id="prefill"> - if (require('@electron/remote').getCurrentWindow().online) { - document.write(`<li><span class="item"><a href="#" id="play"><img class="item-icon" src="../icons/local.svg"> ${lang.online.menu.local}</a></span></li>`) - document.write(`<li><span class="item"><a href="#" id="online"><img class="item-icon" src="../icons/online.svg"> ${lang.online.menu.online}</a></span></li>`); - document.write(`<li><span class="item"><a href="#" id="settings"><img class="item-icon" src="../icons/settings.svg"> ${lang.menu.titles[2]}</a></span></li>`); - } else { - document.write(`<li><span class="item"><a href="#" id="play"><img class="item-icon" src="../icons/local.svg"> ${lang.online.menu.local}</a></span></li>`) - document.write(`<li><span class="item"><a href="#" id="settings"><img class="item-icon" src="../icons/settings.svg"> ${lang.menu.titles[2]}</a></span></li>`); - } - document.getElementById('prefill').outerHTML = ""; - </script> - <li><span class="item"><a href="#" id="stats"><img class="item-icon" src="../icons/stats.svg"> <script>document.write(lang.stats.menu)</script></a></span></li> - <li><span class="item"><a href="#" id="quit"><img class="item-icon" src="../icons/exit.svg"> <script>document.write(lang.menu.titles[4])</script></a></span></li> - </ul> - </div> - </div> - - <div style="position: fixed;right: 16px;top: 16px;color: white;background: rgba(0, 0, 0, .5);font-size: 10px;text-align:left;z-index:999999999;padding: 10px;border-radius: 10px;width: 189px;" id="gpuinfo"> - <span style="text-align:center;display:block;font-weight: bold;margin-bottom: 5px;">GPU Support Status</span> - <div style="margin-bottom: 10px;height: 16px;width: 100%;background: rgba(47, 47, 47, .5);border-radius: 999px;"> - <div style="height: 16px;background: rgba(128, 0, 0, .5);border-radius: 999px;width: 0;" id="gpuinfo_progressbar"></div> - </div> - <span id="gpusupportperc" style="display: block;text-align: center;">0%</span> - <div id="gpuinfo-model" style="opacity: .25;padding-top: 5px;text-align: center;">Generic GPU</div> - <div id="gpuinfo-vram" style="opacity: .25;padding-top: 5px;text-align: center;">0 MiB VRAM</div> - <span id="gpuinfo-details" style="border-top:1px solid rgba(255, 255, 255, .25);"> - <div id="gpuinfo-outer" style="opacity: .25;padding-top: 5px;text-align: center;">↓ Hold Shift for details</div> - <div id="gpuinfo-inner" style="font-family:monospace;opacity:0;height:0;"> - <script src="./script/menu_gpuinfo.js"></script> - </div> - </span> - <script> - - if (require('@electron/remote').getCurrentWindow().update === "stable") { - document.getElementById('gpuinfo-outer').style.display = "none"; - document.getElementById('gpuinfo-inner').style.display = "none"; - document.getElementById('gpuinfo-details').style.display = "none"; - } - - </script> - </div> - - <span id="copyright">© <script src="./script/menu_copyright.js"></script></span> - </div> - - <script src="./script/menu_music.js"></script> -</body> -<script src="./script/menu_global.js"></script> -<script src="./rain/rainscript.js"></script> -<script src="./script/client_fullscreen.js"></script> -</html> +<!DOCTYPE html>
+<html lang="en">
+<head>
+ <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};const Nest = require("../nest/abi");currentNest = require('@electron/remote').getCurrentWindow().nest;</script>
+ <script src="../lang/loader.js"></script>
+ <script src="../scenario/client.js"></script>
+ <meta charset="UTF-8">
+ <link rel="stylesheet" href="common/fonts.css">
+ <link rel="stylesheet" href="common/blur.css">
+ <link rel="stylesheet" href="menu.css">
+ <title>Kartik</title>
+ <script src="../crash/client.js"></script>
+ <script src="./script/global_compatlayer.js"></script><script src="../typescript/mainloader.js"></script>
+ <script src="./script/menu_login.js"></script>
+ <script src="../sfx/sfx.js"></script>
+ <script src="./rain/snow.js"></script>
+ <script>
+ snowStorm.flakesMaxActive = 80;
+ snowStorm.followMouse = false;
+ snowStorm.snowStick = false;
+
+ scenar("intro", "neutral");
+ if (!require('@electron/remote').getCurrentWindow().debug) {
+ document.write('<link rel="stylesheet" href="common/mouse.css">');
+ }
+ </script>
+</head>
+<body class="back-row-toggle splat-toggle">
+ <script>info("MainWindow", "Rendering initial frame...");
+
+ if (native) {
+ scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale;
+ }
+
+ </script>
+ <div id="box" style="display: none;background:#9abecd;position:fixed;top:0;left:0;right:0;bottom:0;">
+ <div id="loggingIn" style="position: fixed;color: white;background: rgba(0, 0, 0, .5);z-index: 999999999999;top: 0;left: 0;right: 0;bottom: 0;display: none;align-items: center;justify-content: center;backdrop-filter: blur(10px);"><script>document.write(lang.polymer.logging);</script></div>
+
+ <div class="rain front-row"></div>
+ <div class="rain back-row"></div>
+
+ <div style="width: 100%;height: 100%;opacity:.5;background-image: url('./menu.jpg');background-size: cover;position: fixed;z-index: -1;"></div>
+ <img alt="full-logo" class="full-logo" src="../logo/full.png" style="margin-left: 50px;margin-top: 30px;height: 96px;">
+ <div id="services-background"></div>
+
+ <div class="services home">
+ <div class="items">
+ <ul>
+ <li class="selected"><span class="item"><a href="#" id="single"><img class="item-icon" src="../icons/singleplayer.svg"> <span class="item-text"><script>document.write(lang.menu.titles[0])</script></span></a></span></li>
+ <script id="prefill">
+ if (require('@electron/remote').getCurrentWindow().online) {
+ document.write(`<li><span class="item"><a href="#" id="play"><img class="item-icon" src="../icons/local.svg"> <span class="item-text">${lang.online.menu.local}</span></a></span></li>`)
+ document.write(`<li><span class="item"><a href="#" id="online"><img class="item-icon" src="../icons/online.svg"> <span class="item-text">${lang.online.menu.online}</span></a></span></li>`);
+ document.write(`<li><span class="item"><a href="#" id="settings"><img class="item-icon" src="../icons/settings.svg"> <span class="item-text">${lang.menu.titles[2]}</span></a></span></li>`);
+ } else {
+ document.write(`<li><span class="item"><a href="#" id="play"><img class="item-icon" src="../icons/local.svg"> <span class="item-text">${lang.online.menu.local}</span></a></span></li>`)
+ document.write(`<li><span class="item"><a href="#" id="settings"><img class="item-icon" src="../icons/settings.svg"> <span class="item-text">${lang.menu.titles[2]}</span></a></span></li>`);
+ }
+ document.getElementById('prefill').outerHTML = "";
+ </script>
+ <li><span class="item"><a href="#" id="stats"><img class="item-icon" src="../icons/stats.svg"> <span class="item-text"><script>document.write(lang.stats.menu)</script></span></a></span></li>
+ <li><span class="item"><a href="#" id="quit"><img class="item-icon" src="../icons/exit.svg"> <span class="item-text"><script>document.write(lang.menu.titles[4])</script></span></a></span></li>
+ </ul>
+ </div>
+ </div>
+
+ <div style="position: fixed;right: 16px;top: 79px;color: white;background: rgba(0, 0, 0, .5);font-size: 10px;text-align:left;z-index:999999999;padding: 10px;border-radius: 10px;width: 189px;" id="gpuinfo">
+ <span style="text-align:center;display:block;font-weight: bold;margin-bottom: 5px;"><script>document.write(lang.polymer.gpu);</script></span>
+ <div style="margin-bottom: 10px;height: 16px;width: 100%;background: rgba(47, 47, 47, .5);border-radius: 999px;">
+ <div style="height: 16px;background: rgba(128, 0, 0, .5);border-radius: 999px;width: 0;" id="gpuinfo_progressbar"></div>
+ </div>
+ <span id="gpusupportperc" style="display: block;text-align: center;">0%</span>
+ <div id="gpuinfo-model" style="opacity: .25;padding-top: 5px;text-align: center;">-</div>
+ <div id="gpuinfo-vram" style="opacity: .25;padding-top: 5px;text-align: center;">- VRAM</div>
+ <span id="gpuinfo-details" style="border-top:1px solid rgba(255, 255, 255, .25);">
+ <div id="gpuinfo-outer" style="opacity: .25;padding-top: 5px;text-align: center;">↓ <script>document.write(lang.polymer.gpuShift);</script></div>
+ <div id="gpuinfo-inner" style="font-family:monospace;opacity:0;height:0;">
+ <script src="./script/menu_gpuinfo.js"></script>
+ </div>
+ </span>
+ <script>
+
+ if (require('@electron/remote').getCurrentWindow().update === "stable") {
+ document.getElementById('gpuinfo-outer').style.display = "none";
+ document.getElementById('gpuinfo-inner').style.display = "none";
+ document.getElementById('gpuinfo-details').style.display = "none";
+ }
+
+ </script>
+ </div>
+
+ <div style="position: fixed;right: 16px;top: 16px;height:28px;color: white;backdrop-filter:blur(10px);background: rgba(0, 0, 0, .5);font-size: 10px;z-index:999999999;padding: 10px;border-radius: 10px;width: 189px;text-align:center;" id="loginIntro-outer">
+ <span id="loginIntro" style="padding-top: 10px;display: inline-block;"><script>document.write(lang.polymer.loginIntro);</script></span>
+ </div>
+
+ <div style="position: fixed;right: 16px;top: 16px;color: white;font-size: 10px;z-index:999999999;padding-left: 10px;border-radius: 10px;width: 199px;text-align:center;display: none;backdrop-filter: blur(10px);grid-template-columns: 1fr 48px;" id="loginUser"><div style="
+ text-align: left;
+ padding-top: 5px;
+ padding-left: 5px;
+ font-size: 14px;
+"><b id="kto-username">Username</b><br><span><script>document.write(lang.polymer.ktoLevel)</script> <span id="kto-level">0</span></span><br><span style="font-size: 10px;"><script>document.write(lang.polymer.logout)</script></span></div><img style="
+ border-bottom-right-radius: 10px;
+ height: 48px;
+ background: rgba(0, 0, 0, .25);
+ display: inline-block;
+ width: 48px;
+ border: none;
+ border-top-right-radius: 10px;
+ outline: none;
+" alt=" " id="kto-picture">
+ </div>
+
+ <span id="copyright" class="copyright">© <script src="./script/menu_copyright.js"></script></span>
+ </div>
+
+ <script src="./script/menu_music.js"></script>
+</body>
+<script src="./script/menu_global.js"></script>
+<script src="./script/client_fullscreen.js"></script>
+</html>
diff --git a/views/menu.jpg b/views/menu.jpg Binary files differindex 0ac1665..ade8fdd 100644 --- a/views/menu.jpg +++ b/views/menu.jpg diff --git a/views/online.html b/views/online.html index ac90e7e..8d79994 100644 --- a/views/online.html +++ b/views/online.html @@ -1,43 +1,43 @@ -<!DOCTYPE html> -<html lang="en" style="background:#000000;margin:0;height:100%;width:100%;"> -<head> - <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};</script> - <script src="../lang/loader.js"></script> - <script src="../scenario/client.js"></script> - <meta charset="UTF-8"> - <title>Kartik</title> - <link rel="stylesheet" href="common/fonts.css"> - <link rel="stylesheet" href="common/blur.css"> - <script src="../crash/client.js"></script> - <script src="./script/global_compatlayer.js"></script> - <script src="../sfx/sfx.js"></script> - <script> - if (!require('@electron/remote').getCurrentWindow().debug) { - document.write('<link rel="stylesheet" href="common/mouse.css">'); - } - </script> - <script src="./script/online_play.js"></script> -</head> -<body style="background:#000000;margin:0;height:100%;width:100%;color:white;"> - <script>info("MainWindow", "Rendering initial frame..."); - - if (native) { - scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale; - } - - </script> - <div id="box" style="display: none;background:#222;position:fixed;top:0;left:0;right:0;bottom:0;"> - <div style="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;"> - <div style="text-align: center;"> - <p style="font-size:10px;" id="progress"><script>document.write(lang.online.disconnected)</script></p> - <p style="font-size:15px;"><script>document.write(atob(location.hash.substr(1)))</script></p> - </div> - </div> - </div> - - <script src="./script/win_music.js"></script> - - <script src="./script/win_global.js"></script> - <script src="./script/client_fullscreen.js"></script> -</body> -</html> +<!DOCTYPE html>
+<html lang="en" style="background:#000000;margin:0;height:100%;width:100%;">
+<head>
+ <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};const Nest = require("../nest/abi");currentNest = require('@electron/remote').getCurrentWindow().nest;</script>
+ <script src="../lang/loader.js"></script>
+ <script src="../scenario/client.js"></script>
+ <meta charset="UTF-8">
+ <title>Kartik</title>
+ <link rel="stylesheet" href="common/fonts.css">
+ <link rel="stylesheet" href="common/blur.css">
+ <script src="../crash/client.js"></script>
+ <script src="./script/global_compatlayer.js"></script><script src="../typescript/mainloader.js"></script>
+ <script src="../sfx/sfx.js"></script>
+ <script>
+ if (!require('@electron/remote').getCurrentWindow().debug) {
+ document.write('<link rel="stylesheet" href="common/mouse.css">');
+ }
+ </script>
+ <script src="./script/online_play.js"></script>
+</head>
+<body style="background:#000000;margin:0;height:100%;width:100%;color:white;">
+ <script>info("MainWindow", "Rendering initial frame...");
+
+ if (native) {
+ scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale;
+ }
+
+ </script>
+ <div id="box" style="display: none;background:#222;position:fixed;top:0;left:0;right:0;bottom:0;">
+ <div style="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;">
+ <div style="text-align: center;">
+ <p style="font-size:10px;" id="progress"><script>document.write(lang.online.disconnected)</script></p>
+ <p style="font-size:15px;"><script>document.write(atob(location.hash.substr(1)))</script></p>
+ </div>
+ </div>
+ </div>
+
+ <script src="./script/win_music.js"></script>
+
+ <script src="./script/win_global.js"></script>
+ <script src="./script/client_fullscreen.js"></script>
+</body>
+</html>
diff --git a/views/rain/snow.js b/views/rain/snow.js new file mode 100644 index 0000000..26b13da --- /dev/null +++ b/views/rain/snow.js @@ -0,0 +1,666 @@ +/** @license
+ * DHTML Snowstorm! JavaScript-based snow for web pages
+ * Making it snow on the internets since 2003. You're welcome.
+ * -----------------------------------------------------------
+ * Version 1.44.20131208 (Previous rev: 1.44.20131125)
+ * Copyright (c) 2007, Scott Schiller. All rights reserved.
+ * Code provided under the BSD License
+ * http://schillmania.com/projects/snowstorm/license.txt
+ */
+
+/*jslint nomen: true, plusplus: true, sloppy: true, vars: true, white: true */
+/*global window, document, navigator, clearInterval, setInterval */
+
+var snowStorm = (function(window, document) {
+
+ // --- common properties ---
+
+ this.autoStart = true; // Whether the snow should start automatically or not.
+ this.excludeMobile = true; // Snow is likely to be bad news for mobile phones' CPUs (and batteries.) Enable at your own risk.
+ this.flakesMax = 128; // Limit total amount of snow made (falling + sticking)
+ this.flakesMaxActive = 64; // Limit amount of snow falling at once (less = lower CPU use)
+ this.animationInterval = 33; // Theoretical "miliseconds per frame" measurement. 20 = fast + smooth, but high CPU use. 50 = more conservative, but slower
+ this.useGPU = true; // Enable transform-based hardware acceleration, reduce CPU load.
+ this.className = null; // CSS class name for further customization on snow elements
+ this.excludeMobile = true; // Snow is likely to be bad news for mobile phones' CPUs (and batteries.) By default, be nice.
+ this.flakeBottom = null; // Integer for Y axis snow limit, 0 or null for "full-screen" snow effect
+ this.followMouse = true; // Snow movement can respond to the user's mouse
+ this.snowColor = '#fff'; // Don't eat (or use?) yellow snow.
+ this.snowCharacter = '•'; // • = bullet, · is square on some systems etc.
+ this.snowStick = true; // Whether or not snow should "stick" at the bottom. When off, will never collect.
+ this.targetElement = null; // element which snow will be appended to (null = document.body) - can be an element ID eg. 'myDiv', or a DOM node reference
+ this.useMeltEffect = true; // When recycling fallen snow (or rarely, when falling), have it "melt" and fade out if browser supports it
+ this.useTwinkleEffect = false; // Allow snow to randomly "flicker" in and out of view while falling
+ this.usePositionFixed = false; // true = snow does not shift vertically when scrolling. May increase CPU load, disabled by default - if enabled, used only where supported
+ this.usePixelPosition = false; // Whether to use pixel values for snow top/left vs. percentages. Auto-enabled if body is position:relative or targetElement is specified.
+
+ // --- less-used bits ---
+
+ this.freezeOnBlur = true; // Only snow when the window is in focus (foreground.) Saves CPU.
+ this.flakeLeftOffset = 0; // Left margin/gutter space on edge of container (eg. browser window.) Bump up these values if seeing horizontal scrollbars.
+ this.flakeRightOffset = 0; // Right margin/gutter space on edge of container
+ this.flakeWidth = 8; // Max pixel width reserved for snow element
+ this.flakeHeight = 8; // Max pixel height reserved for snow element
+ this.vMaxX = 5; // Maximum X velocity range for snow
+ this.vMaxY = 4; // Maximum Y velocity range for snow
+ this.zIndex = 0; // CSS stacking order applied to each snowflake
+
+ // --- "No user-serviceable parts inside" past this point, yadda yadda ---
+
+ var storm = this,
+ features,
+ // UA sniffing and backCompat rendering mode checks for fixed position, etc.
+ isIE = navigator.userAgent.match(/msie/i),
+ isIE6 = navigator.userAgent.match(/msie 6/i),
+ isMobile = navigator.userAgent.match(/mobile|opera m(ob|in)/i),
+ isBackCompatIE = (isIE && document.compatMode === 'BackCompat'),
+ noFixed = (isBackCompatIE || isIE6),
+ screenX = null, screenX2 = null, screenY = null, scrollY = null, docHeight = null, vRndX = null, vRndY = null,
+ windOffset = 1,
+ windMultiplier = 2,
+ flakeTypes = 6,
+ fixedForEverything = false,
+ targetElementIsRelative = false,
+ opacitySupported = (function(){
+ try {
+ document.createElement('div').style.opacity = '0.5';
+ } catch(e) {
+ return false;
+ }
+ return true;
+ }()),
+ didInit = false,
+ docFrag = document.createDocumentFragment();
+
+ features = (function() {
+
+ var getAnimationFrame;
+
+ /**
+ * hat tip: paul irish
+ * http://paulirish.com/2011/requestanimationframe-for-smart-animating/
+ * https://gist.github.com/838785
+ */
+
+ function timeoutShim(callback) {
+ window.setTimeout(callback, 1000/(storm.animationInterval || 20));
+ }
+
+ var _animationFrame = (window.requestAnimationFrame ||
+ window.webkitRequestAnimationFrame ||
+ window.mozRequestAnimationFrame ||
+ window.oRequestAnimationFrame ||
+ window.msRequestAnimationFrame ||
+ timeoutShim);
+
+ // apply to window, avoid "illegal invocation" errors in Chrome
+ getAnimationFrame = _animationFrame ? function() {
+ return _animationFrame.apply(window, arguments);
+ } : null;
+
+ var testDiv;
+
+ testDiv = document.createElement('div');
+
+ function has(prop) {
+
+ // test for feature support
+ var result = testDiv.style[prop];
+ return (result !== undefined ? prop : null);
+
+ }
+
+ // note local scope.
+ var localFeatures = {
+
+ transform: {
+ ie: has('-ms-transform'),
+ moz: has('MozTransform'),
+ opera: has('OTransform'),
+ webkit: has('webkitTransform'),
+ w3: has('transform'),
+ prop: null // the normalized property value
+ },
+
+ getAnimationFrame: getAnimationFrame
+
+ };
+
+ localFeatures.transform.prop = (
+ localFeatures.transform.w3 ||
+ localFeatures.transform.moz ||
+ localFeatures.transform.webkit ||
+ localFeatures.transform.ie ||
+ localFeatures.transform.opera
+ );
+
+ testDiv = null;
+
+ return localFeatures;
+
+ }());
+
+ this.timer = null;
+ this.flakes = [];
+ this.disabled = false;
+ this.active = false;
+ this.meltFrameCount = 20;
+ this.meltFrames = [];
+
+ this.setXY = function(o, x, y) {
+
+ if (!o) {
+ return false;
+ }
+
+ if (storm.usePixelPosition || targetElementIsRelative) {
+
+ o.style.left = (x - storm.flakeWidth) + 'px';
+ o.style.top = (y - storm.flakeHeight) + 'px';
+
+ } else if (noFixed) {
+
+ o.style.right = (100-(x/screenX*100)) + '%';
+ // avoid creating vertical scrollbars
+ o.style.top = (Math.min(y, docHeight-storm.flakeHeight)) + 'px';
+
+ } else {
+
+ if (!storm.flakeBottom) {
+
+ // if not using a fixed bottom coordinate...
+ o.style.right = (100-(x/screenX*100)) + '%';
+ o.style.bottom = (100-(y/screenY*100)) + '%';
+
+ } else {
+
+ // absolute top.
+ o.style.right = (100-(x/screenX*100)) + '%';
+ o.style.top = (Math.min(y, docHeight-storm.flakeHeight)) + 'px';
+
+ }
+
+ }
+
+ };
+
+ this.events = (function() {
+
+ var old = (!window.addEventListener && window.attachEvent), slice = Array.prototype.slice,
+ evt = {
+ add: (old?'attachEvent':'addEventListener'),
+ remove: (old?'detachEvent':'removeEventListener')
+ };
+
+ function getArgs(oArgs) {
+ var args = slice.call(oArgs), len = args.length;
+ if (old) {
+ args[1] = 'on' + args[1]; // prefix
+ if (len > 3) {
+ args.pop(); // no capture
+ }
+ } else if (len === 3) {
+ args.push(false);
+ }
+ return args;
+ }
+
+ function apply(args, sType) {
+ var element = args.shift(),
+ method = [evt[sType]];
+ if (old) {
+ element[method](args[0], args[1]);
+ } else {
+ element[method].apply(element, args);
+ }
+ }
+
+ function addEvent() {
+ apply(getArgs(arguments), 'add');
+ }
+
+ function removeEvent() {
+ apply(getArgs(arguments), 'remove');
+ }
+
+ return {
+ add: addEvent,
+ remove: removeEvent
+ };
+
+ }());
+
+ function rnd(n,min) {
+ if (isNaN(min)) {
+ min = 0;
+ }
+ return (Math.random()*n)+min;
+ }
+
+ function plusMinus(n) {
+ return (parseInt(rnd(2),10)===1?n*-1:n);
+ }
+
+ this.randomizeWind = function() {
+ var i;
+ vRndX = plusMinus(rnd(storm.vMaxX,0.2));
+ vRndY = rnd(storm.vMaxY,0.2);
+ if (this.flakes) {
+ for (i=0; i<this.flakes.length; i++) {
+ if (this.flakes[i].active) {
+ this.flakes[i].setVelocities();
+ }
+ }
+ }
+ };
+
+ this.scrollHandler = function() {
+ var i;
+ // "attach" snowflakes to bottom of window if no absolute bottom value was given
+ scrollY = (storm.flakeBottom ? 0 : parseInt(window.scrollY || document.documentElement.scrollTop || (noFixed ? document.body.scrollTop : 0), 10));
+ if (isNaN(scrollY)) {
+ scrollY = 0; // Netscape 6 scroll fix
+ }
+ if (!fixedForEverything && !storm.flakeBottom && storm.flakes) {
+ for (i=0; i<storm.flakes.length; i++) {
+ if (storm.flakes[i].active === 0) {
+ storm.flakes[i].stick();
+ }
+ }
+ }
+ };
+
+ this.resizeHandler = function() {
+ if (window.innerWidth || window.innerHeight) {
+ screenX = window.innerWidth - 16 - storm.flakeRightOffset;
+ screenY = (storm.flakeBottom || window.innerHeight);
+ } else {
+ screenX = (document.documentElement.clientWidth || document.body.clientWidth || document.body.scrollWidth) - (!isIE ? 8 : 0) - storm.flakeRightOffset;
+ screenY = storm.flakeBottom || document.documentElement.clientHeight || document.body.clientHeight || document.body.scrollHeight;
+ }
+ docHeight = document.body.offsetHeight;
+ screenX2 = parseInt(screenX/2,10);
+ };
+
+ this.resizeHandlerAlt = function() {
+ screenX = storm.targetElement.offsetWidth - storm.flakeRightOffset;
+ screenY = storm.flakeBottom || storm.targetElement.offsetHeight;
+ screenX2 = parseInt(screenX/2,10);
+ docHeight = document.body.offsetHeight;
+ };
+
+ this.freeze = function() {
+ // pause animation
+ if (!storm.disabled) {
+ storm.disabled = 1;
+ } else {
+ return false;
+ }
+ storm.timer = null;
+ };
+
+ this.resume = function() {
+ if (storm.disabled) {
+ storm.disabled = 0;
+ } else {
+ return false;
+ }
+ storm.timerInit();
+ };
+
+ this.toggleSnow = function() {
+ if (!storm.flakes.length) {
+ // first run
+ storm.start();
+ } else {
+ storm.active = !storm.active;
+ if (storm.active) {
+ storm.show();
+ storm.resume();
+ } else {
+ storm.stop();
+ storm.freeze();
+ }
+ }
+ };
+
+ this.stop = function() {
+ var i;
+ this.freeze();
+ for (i=0; i<this.flakes.length; i++) {
+ this.flakes[i].o.style.display = 'none';
+ }
+ storm.events.remove(window,'scroll',storm.scrollHandler);
+ storm.events.remove(window,'resize',storm.resizeHandler);
+ if (storm.freezeOnBlur) {
+ if (isIE) {
+ storm.events.remove(document,'focusout',storm.freeze);
+ storm.events.remove(document,'focusin',storm.resume);
+ } else {
+ storm.events.remove(window,'blur',storm.freeze);
+ storm.events.remove(window,'focus',storm.resume);
+ }
+ }
+ };
+
+ this.show = function() {
+ var i;
+ for (i=0; i<this.flakes.length; i++) {
+ this.flakes[i].o.style.display = 'block';
+ }
+ };
+
+ this.SnowFlake = function(type,x,y) {
+ var s = this;
+ this.type = type;
+ this.x = x||parseInt(rnd(screenX-20),10);
+ this.y = (!isNaN(y)?y:-rnd(screenY)-12);
+ this.vX = null;
+ this.vY = null;
+ this.vAmpTypes = [1,1.2,1.4,1.6,1.8]; // "amplification" for vX/vY (based on flake size/type)
+ this.vAmp = this.vAmpTypes[this.type] || 1;
+ this.melting = false;
+ this.meltFrameCount = storm.meltFrameCount;
+ this.meltFrames = storm.meltFrames;
+ this.meltFrame = 0;
+ this.twinkleFrame = 0;
+ this.active = 1;
+ this.fontSize = (10+(this.type/5)*10);
+ this.o = document.createElement('div');
+ this.o.innerHTML = storm.snowCharacter;
+ if (storm.className) {
+ this.o.setAttribute('class', storm.className);
+ }
+ this.o.style.color = storm.snowColor;
+ this.o.style.position = (fixedForEverything?'fixed':'absolute');
+ if (storm.useGPU && features.transform.prop) {
+ // GPU-accelerated snow.
+ this.o.style[features.transform.prop] = 'translate3d(0px, 0px, 0px)';
+ }
+ this.o.style.width = storm.flakeWidth+'px';
+ this.o.style.height = storm.flakeHeight+'px';
+ this.o.style.fontFamily = 'arial,verdana';
+ this.o.style.cursor = 'default';
+ this.o.style.overflow = 'hidden';
+ this.o.style.fontWeight = 'normal';
+ this.o.style.zIndex = storm.zIndex;
+ docFrag.appendChild(this.o);
+
+ this.refresh = function() {
+ if (isNaN(s.x) || isNaN(s.y)) {
+ // safety check
+ return false;
+ }
+ storm.setXY(s.o, s.x, s.y);
+ };
+
+ this.stick = function() {
+ if (noFixed || (storm.targetElement !== document.documentElement && storm.targetElement !== document.body)) {
+ s.o.style.top = (screenY+scrollY-storm.flakeHeight)+'px';
+ } else if (storm.flakeBottom) {
+ s.o.style.top = storm.flakeBottom+'px';
+ } else {
+ s.o.style.display = 'none';
+ s.o.style.bottom = '0%';
+ s.o.style.position = 'fixed';
+ s.o.style.display = 'block';
+ }
+ };
+
+ this.vCheck = function() {
+ if (s.vX>=0 && s.vX<0.2) {
+ s.vX = 0.2;
+ } else if (s.vX<0 && s.vX>-0.2) {
+ s.vX = -0.2;
+ }
+ if (s.vY>=0 && s.vY<0.2) {
+ s.vY = 0.2;
+ }
+ };
+
+ this.move = function() {
+ var vX = s.vX*windOffset, yDiff;
+ s.x += vX;
+ s.y += (s.vY*s.vAmp);
+ if (s.x >= screenX || screenX-s.x < storm.flakeWidth) { // X-axis scroll check
+ s.x = 0;
+ } else if (vX < 0 && s.x-storm.flakeLeftOffset < -storm.flakeWidth) {
+ s.x = screenX-storm.flakeWidth-1; // flakeWidth;
+ }
+ s.refresh();
+ yDiff = screenY+scrollY-s.y+storm.flakeHeight;
+ if (yDiff<storm.flakeHeight) {
+ s.active = 0;
+ if (storm.snowStick) {
+ s.stick();
+ } else {
+ s.recycle();
+ }
+ } else {
+ if (storm.useMeltEffect && s.active && s.type < 3 && !s.melting && Math.random()>0.998) {
+ // ~1/1000 chance of melting mid-air, with each frame
+ s.melting = true;
+ s.melt();
+ // only incrementally melt one frame
+ // s.melting = false;
+ }
+ if (storm.useTwinkleEffect) {
+ if (s.twinkleFrame < 0) {
+ if (Math.random() > 0.97) {
+ s.twinkleFrame = parseInt(Math.random() * 8, 10);
+ }
+ } else {
+ s.twinkleFrame--;
+ if (!opacitySupported) {
+ s.o.style.visibility = (s.twinkleFrame && s.twinkleFrame % 2 === 0 ? 'hidden' : 'visible');
+ } else {
+ s.o.style.opacity = (s.twinkleFrame && s.twinkleFrame % 2 === 0 ? 0 : 1);
+ }
+ }
+ }
+ }
+ };
+
+ this.animate = function() {
+ // main animation loop
+ // move, check status, die etc.
+ s.move();
+ };
+
+ this.setVelocities = function() {
+ s.vX = vRndX+rnd(storm.vMaxX*0.12,0.1);
+ s.vY = vRndY+rnd(storm.vMaxY*0.12,0.1);
+ };
+
+ this.setOpacity = function(o,opacity) {
+ if (!opacitySupported) {
+ return false;
+ }
+ o.style.opacity = opacity;
+ };
+
+ this.melt = function() {
+ if (!storm.useMeltEffect || !s.melting) {
+ s.recycle();
+ } else {
+ if (s.meltFrame < s.meltFrameCount) {
+ s.setOpacity(s.o,s.meltFrames[s.meltFrame]);
+ s.o.style.fontSize = s.fontSize-(s.fontSize*(s.meltFrame/s.meltFrameCount))+'px';
+ s.o.style.lineHeight = storm.flakeHeight+2+(storm.flakeHeight*0.75*(s.meltFrame/s.meltFrameCount))+'px';
+ s.meltFrame++;
+ } else {
+ s.recycle();
+ }
+ }
+ };
+
+ this.recycle = function() {
+ s.o.style.display = 'none';
+ s.o.style.position = (fixedForEverything?'fixed':'absolute');
+ s.o.style.bottom = 'auto';
+ s.setVelocities();
+ s.vCheck();
+ s.meltFrame = 0;
+ s.melting = false;
+ s.setOpacity(s.o,1);
+ s.o.style.padding = '0px';
+ s.o.style.margin = '0px';
+ s.o.style.fontSize = s.fontSize+'px';
+ s.o.style.lineHeight = (storm.flakeHeight+2)+'px';
+ s.o.style.textAlign = 'center';
+ s.o.style.verticalAlign = 'baseline';
+ s.x = parseInt(rnd(screenX-storm.flakeWidth-20),10);
+ s.y = parseInt(rnd(screenY)*-1,10)-storm.flakeHeight;
+ s.refresh();
+ s.o.style.display = 'block';
+ s.active = 1;
+ };
+
+ this.recycle(); // set up x/y coords etc.
+ this.refresh();
+
+ };
+
+ this.snow = function() {
+ var active = 0, flake = null, i, j;
+ for (i=0, j=storm.flakes.length; i<j; i++) {
+ if (storm.flakes[i].active === 1) {
+ storm.flakes[i].move();
+ active++;
+ }
+ if (storm.flakes[i].melting) {
+ storm.flakes[i].melt();
+ }
+ }
+ if (active<storm.flakesMaxActive) {
+ flake = storm.flakes[parseInt(rnd(storm.flakes.length),10)];
+ if (flake.active === 0) {
+ flake.melting = true;
+ }
+ }
+ if (storm.timer) {
+ features.getAnimationFrame(storm.snow);
+ }
+ };
+
+ this.mouseMove = function(e) {
+ if (!storm.followMouse) {
+ return true;
+ }
+ var x = parseInt(e.clientX,10);
+ if (x<screenX2) {
+ windOffset = -windMultiplier+(x/screenX2*windMultiplier);
+ } else {
+ x -= screenX2;
+ windOffset = (x/screenX2)*windMultiplier;
+ }
+ };
+
+ this.createSnow = function(limit,allowInactive) {
+ var i;
+ for (i=0; i<limit; i++) {
+ storm.flakes[storm.flakes.length] = new storm.SnowFlake(parseInt(rnd(flakeTypes),10));
+ if (allowInactive || i>storm.flakesMaxActive) {
+ storm.flakes[storm.flakes.length-1].active = -1;
+ }
+ }
+ storm.targetElement.appendChild(docFrag);
+ };
+
+ this.timerInit = function() {
+ storm.timer = true;
+ storm.snow();
+ };
+
+ this.init = function() {
+ var i;
+ for (i=0; i<storm.meltFrameCount; i++) {
+ storm.meltFrames.push(1-(i/storm.meltFrameCount));
+ }
+ storm.randomizeWind();
+ storm.createSnow(storm.flakesMax); // create initial batch
+ storm.events.add(window,'resize',storm.resizeHandler);
+ storm.events.add(window,'scroll',storm.scrollHandler);
+ if (storm.freezeOnBlur) {
+ if (isIE) {
+ storm.events.add(document,'focusout',storm.freeze);
+ storm.events.add(document,'focusin',storm.resume);
+ } else {
+ storm.events.add(window,'blur',storm.freeze);
+ storm.events.add(window,'focus',storm.resume);
+ }
+ }
+ storm.resizeHandler();
+ storm.scrollHandler();
+ if (storm.followMouse) {
+ storm.events.add(isIE?document:window,'mousemove',storm.mouseMove);
+ }
+ storm.animationInterval = Math.max(20,storm.animationInterval);
+ storm.timerInit();
+ };
+
+ this.start = function(bFromOnLoad) {
+ if (!didInit) {
+ didInit = true;
+ } else if (bFromOnLoad) {
+ // already loaded and running
+ return true;
+ }
+ if (typeof storm.targetElement === 'string') {
+ var targetID = storm.targetElement;
+ storm.targetElement = document.getElementById(targetID);
+ if (!storm.targetElement) {
+ throw new Error('Snowstorm: Unable to get targetElement "'+targetID+'"');
+ }
+ }
+ if (!storm.targetElement) {
+ storm.targetElement = (document.body || document.documentElement);
+ }
+ if (storm.targetElement !== document.documentElement && storm.targetElement !== document.body) {
+ // re-map handler to get element instead of screen dimensions
+ storm.resizeHandler = storm.resizeHandlerAlt;
+ //and force-enable pixel positioning
+ storm.usePixelPosition = true;
+ }
+ storm.resizeHandler(); // get bounding box elements
+ storm.usePositionFixed = (storm.usePositionFixed && !noFixed && !storm.flakeBottom); // whether or not position:fixed is to be used
+ if (window.getComputedStyle) {
+ // attempt to determine if body or user-specified snow parent element is relatlively-positioned.
+ try {
+ targetElementIsRelative = (window.getComputedStyle(storm.targetElement, null).getPropertyValue('position') === 'relative');
+ } catch(e) {
+ // oh well
+ targetElementIsRelative = false;
+ }
+ }
+ fixedForEverything = storm.usePositionFixed;
+ if (screenX && screenY && !storm.disabled) {
+ storm.init();
+ storm.active = true;
+ }
+ };
+
+ function doDelayedStart() {
+ window.setTimeout(function() {
+ storm.start(true);
+ }, 20);
+ // event cleanup
+ storm.events.remove(isIE?document:window,'mousemove',doDelayedStart);
+ }
+
+ function doStart() {
+ if (!storm.excludeMobile || !isMobile) {
+ doDelayedStart();
+ }
+ // event cleanup
+ storm.events.remove(window, 'load', doStart);
+ }
+
+ // hooks for starting the snow
+ if (storm.autoStart) {
+ storm.events.add(window, 'load', doStart, false);
+ }
+
+ return this;
+
+}(window, document));
\ No newline at end of file diff --git a/views/script/core_chart.js b/views/script/core_chart.js index 059c818..2f8a521 100644 --- a/views/script/core_chart.js +++ b/views/script/core_chart.js @@ -2,7 +2,7 @@ setInterval(() => { try { currentMemory = process.memoryUsage().rss; currentMemoryMib = (((currentMemory)/1024)/1024).toFixed(2); - if ((((currentMemory)/1024)/1024) > 250) { + if ((((currentMemory)/1024)/1024) > ((require('os').totalmem() / 1000000) / 4)) { throw new Error("Out of memory"); } @@ -66,5 +66,9 @@ setInterval(() => { } else { document.title="Kartik"+require('@electron/remote').getCurrentWindow().channel+require('./package.json').version + eaid; } - } catch (e) {} + } catch (e) { + if (e.message === "Out of memory") { + throw e; + } + } }, 1000)
\ No newline at end of file diff --git a/views/script/core_compatlayer.js b/views/script/core_compatlayer.js index 206aa28..74a0962 100644 --- a/views/script/core_compatlayer.js +++ b/views/script/core_compatlayer.js @@ -1,89 +1,89 @@ -window.addEventListener("load", () => { - if (require('os').platform !== "darwin") { - gpuinfo = require('@electron/remote').app.getGPUFeatureStatus(); - gpuscore = 0; - maxscore = 10; - if (gpuinfo['2d_canvas'].startsWith("enabled")) { - if (gpuinfo['2d_canvas'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['gpu_compositing'].startsWith("enabled")) { - if (gpuinfo['gpu_compositing'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['video_decode'].startsWith("enabled")) { - if (gpuinfo['video_decode'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['multiple_raster_threads'].startsWith("enabled")) { - if (gpuinfo['multiple_raster_threads'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['oop_rasterization'].startsWith("enabled")) { - if (gpuinfo['oop_rasterization'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['rasterization'].startsWith("enabled")) { - if (gpuinfo['rasterization'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['opengl'].startsWith("enabled")) { - if (gpuinfo['opengl'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['skia_renderer'].startsWith("enabled")) { - if (gpuinfo['skia_renderer'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['vulkan'].startsWith("enabled")) { - if (gpuinfo['vulkan'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['webgl'].startsWith("enabled")) { - if (gpuinfo['webgl'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - - gpuperct = (gpuscore / maxscore) * 100; - - if (gpuperct < 50) { - console.warn("Bad GPU support, disabling GPU-accelerated content"); - var head = document.getElementsByTagName('HEAD')[0]; - var link = document.createElement('link'); - link.rel = 'stylesheet'; - link.type = 'text/css'; - link.href = './views/common/compatibilityMode.css'; - head.appendChild(link); - } - } -})
\ No newline at end of file +window.addEventListener("load", () => {
+ if (require('os').platform !== "darwin") {
+ gpuinfo = require('@electron/remote').app.getGPUFeatureStatus();
+ gpuscore = 0;
+ maxscore = 10;
+ if (gpuinfo['2d_canvas'].startsWith("enabled")) {
+ if (gpuinfo['2d_canvas'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['gpu_compositing'].startsWith("enabled")) {
+ if (gpuinfo['gpu_compositing'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['video_decode'].startsWith("enabled")) {
+ if (gpuinfo['video_decode'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['multiple_raster_threads'].startsWith("enabled")) {
+ if (gpuinfo['multiple_raster_threads'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['oop_rasterization'].startsWith("enabled")) {
+ if (gpuinfo['oop_rasterization'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['rasterization'].startsWith("enabled")) {
+ if (gpuinfo['rasterization'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['opengl'].startsWith("enabled")) {
+ if (gpuinfo['opengl'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['skia_renderer'].startsWith("enabled")) {
+ if (gpuinfo['skia_renderer'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['vulkan'].startsWith("enabled")) {
+ if (gpuinfo['vulkan'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['webgl'].startsWith("enabled")) {
+ if (gpuinfo['webgl'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+
+ gpuperct = (gpuscore / maxscore) * 100;
+
+ if (gpuperct < 30) {
+ console.warn("Bad GPU support, disabling GPU-accelerated content");
+ var head = document.getElementsByTagName('HEAD')[0];
+ var link = document.createElement('link');
+ link.rel = 'stylesheet';
+ link.type = 'text/css';
+ link.href = './views/common/compatibilityMode.css';
+ head.appendChild(link);
+ }
+ }
+})
diff --git a/views/script/core_crash.js b/views/script/core_crash.js new file mode 100644 index 0000000..1a12230 --- /dev/null +++ b/views/script/core_crash.js @@ -0,0 +1,21 @@ +global.gameCrashed = false;
+crashSound = new Audio("./sfx/gamecrash.wav");
+
+function destroy() {
+ global.gameCrashed = true;
+ crashSound.play();
+ require('@electron/remote').webContents.fromId(webview.getWebContentsId()).forcefullyCrashRenderer();
+ try { musicElement.pause(); } catch (e) {}
+}
+
+function spawnError(crashReport) {
+ document.getElementById("error-outer").style.display = "flex";
+ document.getElementById("crash-dump").value = crashReport;
+ destroy();
+}
+
+const crashHandler = require('electron').ipcRenderer;
+
+crashHandler.on('crashreport', (event, args) => {
+ spawnError(args);
+})
\ No newline at end of file diff --git a/views/script/core_fullscreen.js b/views/script/core_fullscreen.js index 69f9e45..f2c540d 100644 --- a/views/script/core_fullscreen.js +++ b/views/script/core_fullscreen.js @@ -1,9 +1,40 @@ -$(document).keydown(function(e) { - if (e.keyCode === 122 || e.keyCode === 121 || e.keyCode === 112) { // F11/F1/F10 - if (!require('@electron/remote').getCurrentWindow().fullScreen && require('@electron/remote').getCurrentWindow().fullScreenable) { - require('@electron/remote').getCurrentWindow().setFullScreen(true); - } else { - require('@electron/remote').getCurrentWindow().setFullScreen(false); +window.addEventListener("load", () => { + require('@electron/remote').getCurrentWindow().show(); + + const Nest = require("./nest/abi"); + + $(document).keydown(function(e) { + if (e.keyCode === 122 || e.keyCode === 121 || e.keyCode === 112) { // F11/F1/F10 + if (!require('@electron/remote').getCurrentWindow().fullScreen && require('@electron/remote').getCurrentWindow().fullScreenable) { + require('@electron/remote').getCurrentWindow().setFullScreen(true); + } else { + require('@electron/remote').getCurrentWindow().setFullScreen(false); + } } + }) + + $(document).keydown(function(e) { + currentNest = Nest.load(homedir + "/.kartik/current.kfn"); + + if (e.keyCode === 122 || e.keyCode === 121 || e.keyCode === 112) { + if (currentNest.config.fullscreen) { + currentNest.config.fullscreen = false; + Nest.export(homedir + "/.kartik/current.kfn", currentNest); + require('electron').ipcRenderer.send("reloadNest") + } else { + currentNest.config.fullscreen = true; + Nest.export(homedir + "/.kartik/current.kfn", currentNest); + require('electron').ipcRenderer.send("reloadNest"); + } + } + }) + + currentNest = Nest.load(homedir + "/.kartik/current.kfn"); + if (currentNest.config.fullscreen) { + require('@electron/remote').getCurrentWindow().setFullScreen(true); + } else { + currentNest.config.fullscreen = false; + Nest.export(homedir + "/.kartik/current.kfn", currentNest); + require('electron').ipcRenderer.send("reloadNest") } })
\ No newline at end of file diff --git a/views/script/core_notification.js b/views/script/core_notification.js new file mode 100644 index 0000000..676b2d0 --- /dev/null +++ b/views/script/core_notification.js @@ -0,0 +1,13 @@ +var ipcRenderer = require('electron').ipcRenderer;
+ipcRenderer.on('notification', function (event, data) {
+ document.getElementById("notification-title").innerText = data.title;
+ document.getElementById("notification-message").innerText = data.message;
+ document.getElementById("notification").style.right = "20px";
+ document.getElementById("notification").style.opacity = "1";
+ new Audio("./sfx/notification.mp3").play();
+
+ setTimeout(() => {
+ document.getElementById("notification").style.right = "-300px";
+ document.getElementById("notification").style.opacity = "0";
+ }, 5000)
+});
\ No newline at end of file diff --git a/views/script/core_stats.js b/views/script/core_stats.js index a49851d..124f5fe 100644 --- a/views/script/core_stats.js +++ b/views/script/core_stats.js @@ -1,73 +1,51 @@ -const fs = require('fs'); -const homedir = require('@electron/remote').getCurrentWindow().homedir; -const defaultStats = { - times: { - single: 0, - local: 0, - online: 0 - }, - results: { - wins: 0, - loses: 0 - }, - ingame: { - walls: 0, - laps: 0, - turns: 0 - } -} - -if (!fs.existsSync(homedir + "/.kartik/stats.json")) { - fs.writeFileSync(homedir + "/.kartik/stats.json", JSON.stringify(defaultStats)); -} else { - try { - JSON.parse(fs.readFileSync(homedir + "/.kartik/stats.json").toString()); - } catch (e) { - fs.writeFileSync(homedir + "/.kartik/stats.json", JSON.stringify(defaultStats)); - } -} - -session = null; -timer = null; -current = null; - -webview.addEventListener('dom-ready', () => { - if (webview.getURL() !== current) { - if (session !== null) { - require('electron').ipcRenderer.send('addstats', { catalog: "times", key: session, add: Math.floor((new Date() - timer)/1000) }); - - session = null; - timer = null; - current = null; - } - } - - if (webview.getURL().endsWith("game.html")) { // Local - session = "local"; - timer = new Date(); - current = webview.getURL(); - } - if (webview.getURL().endsWith("game.html?sp")) { // Singleplayer - session = "single"; - timer = new Date(); - current = webview.getURL(); - } - if (webview.getURL().endsWith("game.html?online")) { // Online - session = "online"; - timer = new Date(); - current = webview.getURL(); - } -}) - -window.addEventListener("beforeunload", function(e){ - if (session !== null) { - require('electron').ipcRenderer.send('addstatsandclose', { catalog: "times", key: session, add: Math.floor((new Date() - timer)/1000) }); - - session = null; - timer = null; - current = null; - - e.preventDefault(); - return false; - } +const fs = require('fs');
+const homedir = require('@electron/remote').getCurrentWindow().homedir;
+
+session = null;
+timer = null;
+current = null;
+
+webview.addEventListener('dom-ready', () => {
+ try {
+ if (webview.getURL() !== current) {
+ if (session !== null) {
+ require('electron').ipcRenderer.send('addstats', { catalog: "times", key: session, add: Math.floor((new Date() - timer)/1000) });
+
+ session = null;
+ timer = null;
+ current = null;
+ }
+ }
+
+ if (webview.getURL().endsWith("game.html")) { // Local
+ session = "local";
+ timer = new Date();
+ current = webview.getURL();
+ }
+ if (webview.getURL().endsWith("game.html?sp")) { // Singleplayer
+ session = "single";
+ timer = new Date();
+ current = webview.getURL();
+ }
+ if (webview.getURL().endsWith("game.html?online")) { // Online
+ session = "online";
+ timer = new Date();
+ current = webview.getURL();
+ }
+ } catch (e) {}
+})
+
+window.addEventListener("beforeunload", function(e){
+ try {
+ if (session !== null) {
+ require('electron').ipcRenderer.send('addstatsandclose', { catalog: "times", key: session, add: Math.floor((new Date() - timer)/1000) });
+
+ session = null;
+ timer = null;
+ current = null;
+
+ e.preventDefault();
+ return false;
+ }
+ } catch (e) {}
}, false);
\ No newline at end of file diff --git a/views/script/core_viewer.js b/views/script/core_viewer.js index 389bf41..eac3766 100644 --- a/views/script/core_viewer.js +++ b/views/script/core_viewer.js @@ -1,24 +1,28 @@ const webview = document.getElementById('wb'); -webview.addEventListener('dom-ready', () => { - document.getElementById('dummyloader').style.display = "none"; - require('@electron/remote').getCurrentWindow().log(" * " + webview.getURL()); - try { - if (require('@electron/remote').getCurrentWindow().debug) { - info("MainWindow", "Opening debugging tools..."); - webview.openDevTools(); - } - } catch (e) {} -}) - -webview.addEventListener('dom-ready', () => { - setInterval(() => { +try { + webview.addEventListener('dom-ready', () => { + document.getElementById('dummyloader').style.display = "none"; + require('@electron/remote').getCurrentWindow().log(" * " + webview.getURL()); + require('@electron/remote').getCurrentWindow().focus(); + webview.focus(); try { - if (webview.isCrashed()) { - require('@electron/remote').getCurrentWindow().log(" * Compositing engine crashed!"); - error("MainWindow", "Subcontainer crashed"); - crash(new Error("Webview crashed")); + if (require('@electron/remote').getCurrentWindow().debug) { + info("MainWindow", "Opening debugging tools..."); + webview.openDevTools(); } } catch (e) {} - }, 2000) -})
\ No newline at end of file + }) + + webview.addEventListener('dom-ready', () => { + setInterval(() => { + try { + if (webview.isCrashed() && !gameCrashed) { + require('@electron/remote').getCurrentWindow().log(" * Compositing engine crashed!"); + error("MainWindow", "Subcontainer crashed"); + crash(new Error("Webview crashed")); + } + } catch (e) {} + }, 2000) + }) +} catch (e) {}
\ No newline at end of file diff --git a/views/script/game_debug.js b/views/script/game_debug.js index edcdc26..dee421b 100644 --- a/views/script/game_debug.js +++ b/views/script/game_debug.js @@ -1,261 +1,263 @@ -global.debugshow = false; - -function oil(id) { - return "\nO" + id +": " + document.getElementById('oil' + id + '').style.left.split("px")[0] + " " + document.getElementById('oil' + id + '').style.top.split("px")[0] + " / " + document.getElementById('oil' + id + '').style.transform.split("rotate(")[1].split("deg)")[0]; -} - -$(document).keydown((e) => { - if (e.keyCode === 114) { // F3 - if (debugshow) { - global.debugshow = false; - document.getElementById("debug").style.display = "none"; - } else { - global.debugshow = true; - document.getElementById("debug").style.display = ""; - } - } -}) - -if (require('os').platform() !== "darwin") { - gpuinfo = require('@electron/remote').app.getGPUFeatureStatus(); - gpuscore = 0; - maxscore = 10; - if (gpuinfo['2d_canvas'].startsWith("enabled")) { - if (gpuinfo['2d_canvas'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['gpu_compositing'].startsWith("enabled")) { - if (gpuinfo['gpu_compositing'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['video_decode'].startsWith("enabled")) { - if (gpuinfo['video_decode'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['multiple_raster_threads'].startsWith("enabled")) { - if (gpuinfo['multiple_raster_threads'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['oop_rasterization'].startsWith("enabled")) { - if (gpuinfo['oop_rasterization'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['rasterization'].startsWith("enabled")) { - if (gpuinfo['rasterization'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['opengl'].startsWith("enabled")) { - if (gpuinfo['opengl'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['skia_renderer'].startsWith("enabled")) { - if (gpuinfo['skia_renderer'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['vulkan'].startsWith("enabled")) { - if (gpuinfo['vulkan'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['webgl'].startsWith("enabled")) { - if (gpuinfo['webgl'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - - gpuperct = (gpuscore/maxscore)*100; -} else { - gpuperct = 100; -} - -pubver = require('../package.json').version; -pvpart = pubver.split("."); -if (pvpart.length === 3) { - intver = pvpart[0] + "." + pvpart[1]; -} else { - intver = "unknown"; -} - -if (require('@electron/remote').getCurrentWindow().mods.length > 0) { - release = "mods+" + require('@electron/remote').getCurrentWindow().mods.length; -} else { - release = "official"; -} - -if (gpuperct < 25) { - perf = "fast"; -} else if (gpuperct < 50) { - perf = "fancy"; -} else { - perf = "fabulous"; -} - -if (location.search === "") { - game = "Local multiplayer game"; -} else if (location.search === "?sp") { - game = "Singleplayer game"; -} else if (location.search === "?online") { - game = require("../online/server.json").hostname + ":" + require("../online/server.json").port; -} - -tps = -1; -cping = -1; -changedDataLeft = "playing: %false%" -changedDataRight = "" -immutableDataLeft = "Kartik " + pubver + " (" + intver + "/" + require('../package.json').channel + "+" + release + ")\n%tps% tps T:" + perf + ";vsync\n" + game + " @ %ping% ms ticks"; -immutableDataRight = "Electron: " + process.versions.electron + " " + process.arch; - -credits = "Debug: start runtime with debug argument\nFor help: https://kartik.hopto.org" - -setInterval(() => { - if (!debugshow) { return; } - - - leftparts = (immutableDataLeft + "\n" + changedDataLeft + "\n\n" + credits).split("\n"); - lefttext = "<span style='background:rgba(101,101,101,0.75);font-family: 'Source Code Pro', 'JetBrains Mono', 'Ubuntu Mono', 'Consolas', 'Lucida Console', 'Courier New', monospace;padding:1px;'>" + leftparts.join("</span><br><span style='background:rgba(101,101,101,0.75);font-family: 'Source Code Pro', 'JetBrains Mono', 'Ubuntu Mono', 'Consolas', 'Lucida Console', 'Courier New', monospace;padding:1px;'>") + "</span>"; - - rightparts = (immutableDataRight + "\n" + changedDataRight).split("\n"); - righttext = "<span style='background:rgba(101,101,101,0.75);font-family: 'Source Code Pro', 'JetBrains Mono', 'Ubuntu Mono', 'Consolas', 'Lucida Console', 'Courier New', monospace;padding:1px;'>" + rightparts.join("</span><br><span style='background:rgba(101,101,101,0.75);font-family: 'Source Code Pro', 'JetBrains Mono', 'Ubuntu Mono', 'Consolas', 'Lucida Console', 'Courier New', monospace;padding:1px;'>") + "</span>"; - - document.getElementById("debug-left").innerHTML = lefttext.replaceAll("%tps%", tps).replaceAll("%ping%", cping).replaceAll("%false%", "<span style='color:red;font-family: 'Source Code Pro', 'JetBrains Mono', 'Ubuntu Mono', 'Consolas', 'Lucida Console', 'Courier New', monospace;'>false</span>").replaceAll("%true%", "<span style='color:green;font-family: 'Source Code Pro', 'JetBrains Mono', 'Ubuntu Mono', 'Consolas', 'Lucida Console', 'Courier New', monospace;'>true</span>"); - document.getElementById("debug-right").innerHTML = righttext; -}, 100) - -var filterStrength = 20; -var frameTime = 0, lastLoop = new Date, thisLoop; - -setInterval(() => { - if (!debugshow) { return; } - - var thisFrameTime = (thisLoop=new Date) - lastLoop; - frameTime+= (thisFrameTime - frameTime) / filterStrength; - lastLoop = thisLoop; -}, 50) - -require('systeminformation').graphics().then((data) => { - global.gpudata = data; -}); - -setInterval(() => { - if (!debugshow) { return; } - - tps = (1000/frameTime).toFixed(1); - - if (typeof ping === "number") { - cping = ping; - } else { - cping = 0; - } - - if (started) { - changedDataLeft = "playing: %true%"; - changedDataLeft += "\n\n0$: XY: " + document.getElementById('car0').style.left.split("px")[0] + " / " + document.getElementById('car0').style.top.split("px")[0] - - c0rotate = document.getElementById('car0').style.transform.split("rotate(")[1].split("deg)")[0]; - if (c0rotate === "90") { - changedDataLeft += "\n0$: Facing: south (Towards negative Y)"; - } else if (c0rotate === "-90") { - changedDataLeft += "\n0$: Facing: north (Towards negative Y)"; - } else if (c0rotate === "0") { - changedDataLeft += "\n0$: Facing: east (Towards positive X)"; - } else if (c0rotate === "180") { - changedDataLeft += "\n0$: Facing: west (Towards negative X)"; - } - - changedDataLeft += "\n0$: Speed: A: " + car0cspeed.toFixed(2) + " R: " + (car0speed - car0cspeed).toFixed(2) + " M: " + car0speed.toFixed(2); - - changedDataLeft += "\n0$: Laps: " + document.getElementById('laps-car0').innerText + "/5"; - changedDataLeft += "\n0$: Model: " + selectedModel0; - - changedDataLeft += "\n\n1$: XY: " + document.getElementById('car1').style.left.split("px")[0] + " / " + document.getElementById('car1').style.top.split("px")[0] - - c0rotate = document.getElementById('car1').style.transform.split("rotate(")[1].split("deg)")[0]; - if (c0rotate === "90") { - changedDataLeft += "\n1$: Facing: south (Towards negative Y)"; - } else if (c0rotate === "-90") { - changedDataLeft += "\n1$: Facing: north (Towards negative Y)"; - } else if (c0rotate === "0") { - changedDataLeft += "\n1$: Facing: east (Towards positive X)"; - } else if (c0rotate === "180") { - changedDataLeft += "\n1$: Facing: west (Towards negative X)"; - } - - changedDataLeft += "\n1$: Speed: A: " + car1cspeed.toFixed(2) + " R: " + (car1speed - car1cspeed).toFixed(2) + " M: " + car1speed.toFixed(2); - - changedDataLeft += "\n1$: Laps: " + document.getElementById('laps-car1').innerText + "/5"; - changedDataLeft += "\n1$: Model: " + selectedModel1; - changedDataLeft += "\n" + oil(0) + oil(1) + oil(2) + oil(3) + oil(4); - changedDataLeft += "\n\nMusic: " + i; - changedDataLeft += "\nCircuit: " + rand; - - } else { - changedDataLeft = "playing: %false%" - } - - usedMem = (process.memoryUsage().heapUsed / 1000000).toFixed(2); - totalMem = (process.memoryUsage().heapTotal / 1000000).toFixed(2); - percMem = Math.round((process.memoryUsage().heapUsed / process.memoryUsage().heapTotal)*100); - allocateMem = (process.memoryUsage().rss / 1000000).toFixed(2); - - changedDataRight = "Mem: " + percMem + "% " + usedMem + "/" + totalMem + "MB" - changedDataRight += "\nAllocated: " + allocateMem + "MB" - changedDataRight += "\n\nCPU: (" + process.getCPUUsage().percentCPUUsage.toFixed(2) + "%) " + require('os').cpus().length + "x " + require('os').cpus()[0].model.trim() + " @ " + (require('os').cpus()[0].speed/1000).toFixed(2) + "GHz" - - try { - changedDataRight += "\n\nDisplay: " + window.innerWidth + "x" + window.innerHeight + " (" + gpudata.controllers[0].vendor + ")"; - changedDataRight += "\n" + gpudata.controllers[0].model; - - try { - if (gpudriverdata.gpuDevice[0].driverVendor !== undefined) { - dvendor = gpudriverdata.gpuDevice[0].driverVendor; - } else { - dvendor = "<Unknown>"; - } - if (gpudriverdata.gpuDevice[0].driverVersion !== undefined) { - dversion = gpudriverdata.gpuDevice[0].driverVersion; - } else { - dversion = "<Unknown>"; - } - } catch (e) { - dvendor = "<Unknown>"; - dversion = "<Unknown>"; - } - changedDataRight += "\n" + dvendor + " - " + dversion; - } catch (e) { - console.error(e); - } -},1000); - -window.addEventListener("load", () => { - require('@electron/remote').app.getGPUInfo('complete').then((data) => { - global.gpudriverdata = data; - }); +global.debugshow = false;
+
+function oil(id) {
+ return "\nO" + id +": " + document.getElementById('oil' + id + '').style.left.split("px")[0] + " " + document.getElementById('oil' + id + '').style.top.split("px")[0] + " / " + document.getElementById('oil' + id + '').style.transform.split("rotate(")[1].split("deg)")[0];
+}
+
+$(document).keydown((e) => {
+ if (e.keyCode === 114) { // F3
+ if (debugshow) {
+ global.debugshow = false;
+ document.getElementById("debug").style.display = "none";
+ } else {
+ global.debugshow = true;
+ document.getElementById("debug").style.display = "";
+ }
+ }
+})
+
+if (require('os').platform() !== "darwin") {
+ gpuinfo = require('@electron/remote').app.getGPUFeatureStatus();
+ gpuscore = 0;
+ maxscore = 10;
+ if (gpuinfo['2d_canvas'].startsWith("enabled")) {
+ if (gpuinfo['2d_canvas'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['gpu_compositing'].startsWith("enabled")) {
+ if (gpuinfo['gpu_compositing'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['video_decode'].startsWith("enabled")) {
+ if (gpuinfo['video_decode'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['multiple_raster_threads'].startsWith("enabled")) {
+ if (gpuinfo['multiple_raster_threads'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['oop_rasterization'].startsWith("enabled")) {
+ if (gpuinfo['oop_rasterization'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['rasterization'].startsWith("enabled")) {
+ if (gpuinfo['rasterization'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['opengl'].startsWith("enabled")) {
+ if (gpuinfo['opengl'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['skia_renderer'].startsWith("enabled")) {
+ if (gpuinfo['skia_renderer'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['vulkan'].startsWith("enabled")) {
+ if (gpuinfo['vulkan'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['webgl'].startsWith("enabled")) {
+ if (gpuinfo['webgl'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+
+ gpuperct = (gpuscore/maxscore)*100;
+} else {
+ gpuperct = 100;
+}
+
+pubver = require('../package.json').version;
+pvpart = pubver.split(".");
+if (pvpart.length === 3) {
+ intver = pvpart[0] + "." + pvpart[1];
+} else {
+ intver = "unknown";
+}
+
+if (require('@electron/remote').getCurrentWindow().mods.length > 0) {
+ release = "mods+" + require('@electron/remote').getCurrentWindow().mods.length;
+} else {
+ release = "official";
+}
+
+if (gpuperct < 25) {
+ perf = "fast";
+} else if (gpuperct < 50) {
+ perf = "fancy";
+} else {
+ perf = "fabulous";
+}
+
+if (location.search === "") {
+ game = "Local multiplayer game";
+} else if (location.search === "?sp") {
+ game = "Singleplayer game";
+} else if (location.search === "?online") {
+ game = require("../online/server.json").hostname + ":" + require("../online/server.json").port;
+}
+
+tps = -1;
+cping = -1;
+changedDataLeft = "playing: %false%"
+changedDataRight = ""
+immutableDataLeft = "Kartik " + pubver + " (" + intver + "/" + require('../package.json').channel + "+" + release + ")\n%tps% tps T:" + perf + ";vsync\n" + game + " @ %ping% ms ticks";
+immutableDataRight = "Electron: " + process.versions.electron + " " + process.arch;
+
+credits = "Debug: start runtime with debug argument\nFor help: https://kartik.hopto.org"
+
+setInterval(() => {
+ if (!debugshow) { return; }
+
+
+ leftparts = (immutableDataLeft + "\n" + changedDataLeft + "\n\n" + credits).split("\n");
+ lefttext = "<span style='background:rgba(101,101,101,0.75);font-family: 'Source Code Pro', 'JetBrains Mono', 'Ubuntu Mono', 'Consolas', 'Lucida Console', 'Courier New', monospace;padding:1px;'>" + leftparts.join("</span><br><span style='background:rgba(101,101,101,0.75);font-family: 'Source Code Pro', 'JetBrains Mono', 'Ubuntu Mono', 'Consolas', 'Lucida Console', 'Courier New', monospace;padding:1px;'>") + "</span>";
+
+ rightparts = (immutableDataRight + "\n" + changedDataRight).split("\n");
+ righttext = "<span style='background:rgba(101,101,101,0.75);font-family: 'Source Code Pro', 'JetBrains Mono', 'Ubuntu Mono', 'Consolas', 'Lucida Console', 'Courier New', monospace;padding:1px;'>" + rightparts.join("</span><br><span style='background:rgba(101,101,101,0.75);font-family: 'Source Code Pro', 'JetBrains Mono', 'Ubuntu Mono', 'Consolas', 'Lucida Console', 'Courier New', monospace;padding:1px;'>") + "</span>";
+
+ document.getElementById("debug-left").innerHTML = lefttext.replaceAll("%tps%", tps).replaceAll("%ping%", cping).replaceAll("%false%", "<span style='color:red;font-family: 'Source Code Pro', 'JetBrains Mono', 'Ubuntu Mono', 'Consolas', 'Lucida Console', 'Courier New', monospace;'>false</span>").replaceAll("%true%", "<span style='color:green;font-family: 'Source Code Pro', 'JetBrains Mono', 'Ubuntu Mono', 'Consolas', 'Lucida Console', 'Courier New', monospace;'>true</span>");
+ document.getElementById("debug-right").innerHTML = righttext;
+}, 100)
+
+var filterStrength = 20;
+var frameTime = 0, lastLoop = new Date, thisLoop;
+
+setInterval(() => {
+ if (!debugshow) { return; }
+
+ var thisFrameTime = (thisLoop=new Date) - lastLoop;
+ frameTime+= (thisFrameTime - frameTime) / filterStrength;
+ lastLoop = thisLoop;
+}, 50)
+
+require('systeminformation').graphics().then((data) => {
+ global.gpudata = data;
+});
+
+setInterval(() => {
+ if (!debugshow) { return; }
+
+ tps = (1000/frameTime).toFixed(1);
+
+ if (typeof ping === "number") {
+ cping = ping;
+ } else {
+ cping = 0;
+ }
+
+ if (started) {
+ changedDataLeft = "playing: %true%";
+ changedDataLeft += "\n\n0$: XY: " + document.getElementById('car0').style.left.split("px")[0] + " / " + document.getElementById('car0').style.top.split("px")[0]
+
+ c0rotate = document.getElementById('car0').style.transform.split("rotate(")[1].split("deg)")[0];
+ if (c0rotate === "90") {
+ changedDataLeft += "\n0$: Facing: south (Towards negative Y)";
+ } else if (c0rotate === "-90") {
+ changedDataLeft += "\n0$: Facing: north (Towards negative Y)";
+ } else if (c0rotate === "0") {
+ changedDataLeft += "\n0$: Facing: east (Towards positive X)";
+ } else if (c0rotate === "180") {
+ changedDataLeft += "\n0$: Facing: west (Towards negative X)";
+ }
+
+ changedDataLeft += "\n0$: Speed: A: " + car0cspeed.toFixed(2) + " R: " + (car0speed - car0cspeed).toFixed(2) + " M: " + car0speed.toFixed(2);
+
+ changedDataLeft += "\n0$: Laps: " + document.getElementById('laps-car0').innerText + "/5";
+ changedDataLeft += "\n0$: Model: " + selectedModel0;
+ changedDataLeft += "\n0$: Collision: " + (car0collisionon ? "%true%" : "%false%");
+
+ changedDataLeft += "\n\n1$: XY: " + document.getElementById('car1').style.left.split("px")[0] + " / " + document.getElementById('car1').style.top.split("px")[0]
+
+ c0rotate = document.getElementById('car1').style.transform.split("rotate(")[1].split("deg)")[0];
+ if (c0rotate === "90") {
+ changedDataLeft += "\n1$: Facing: south (Towards negative Y)";
+ } else if (c0rotate === "-90") {
+ changedDataLeft += "\n1$: Facing: north (Towards negative Y)";
+ } else if (c0rotate === "0") {
+ changedDataLeft += "\n1$: Facing: east (Towards positive X)";
+ } else if (c0rotate === "180") {
+ changedDataLeft += "\n1$: Facing: west (Towards negative X)";
+ }
+
+ changedDataLeft += "\n1$: Speed: A: " + car1cspeed.toFixed(2) + " R: " + (car1speed - car1cspeed).toFixed(2) + " M: " + car1speed.toFixed(2);
+
+ changedDataLeft += "\n1$: Laps: " + document.getElementById('laps-car1').innerText + "/5";
+ changedDataLeft += "\n1$: Model: " + selectedModel1;
+ changedDataLeft += "\n1$: Collision: " + (car1collisionon ? "%true%" : "%false%");
+ changedDataLeft += "\n" + oil(0) + oil(1) + oil(2) + oil(3) + oil(4);
+ changedDataLeft += "\n\nMusic: " + i;
+ changedDataLeft += "\nCircuit: " + rand;
+
+ } else {
+ changedDataLeft = "playing: %false%"
+ }
+
+ usedMem = (process.memoryUsage().heapUsed / 1000000).toFixed(2);
+ totalMem = (process.memoryUsage().heapTotal / 1000000).toFixed(2);
+ percMem = Math.round((process.memoryUsage().heapUsed / process.memoryUsage().heapTotal)*100);
+ allocateMem = (process.memoryUsage().rss / 1000000).toFixed(2);
+
+ changedDataRight = "Mem: " + percMem + "% " + usedMem + "/" + totalMem + "MB"
+ changedDataRight += "\nAllocated: " + allocateMem + "MB"
+ changedDataRight += "\n\nCPU: (" + process.getCPUUsage().percentCPUUsage.toFixed(2) + "%) " + require('os').cpus().length + "x " + require('os').cpus()[0].model.trim() + " @ " + (require('os').cpus()[0].speed/1000).toFixed(2) + "GHz"
+
+ try {
+ changedDataRight += "\n\nDisplay: " + window.innerWidth + "x" + window.innerHeight + " (" + gpudata.controllers[0].vendor + ")";
+ changedDataRight += "\n" + gpudata.controllers[0].model;
+
+ try {
+ if (gpudriverdata.gpuDevice[0].driverVendor !== undefined) {
+ dvendor = gpudriverdata.gpuDevice[0].driverVendor;
+ } else {
+ dvendor = "<Unknown>";
+ }
+ if (gpudriverdata.gpuDevice[0].driverVersion !== undefined) {
+ dversion = gpudriverdata.gpuDevice[0].driverVersion;
+ } else {
+ dversion = "<Unknown>";
+ }
+ } catch (e) {
+ dvendor = "<Unknown>";
+ dversion = "<Unknown>";
+ }
+ changedDataRight += "\n" + dvendor + " - " + dversion;
+ } catch (e) {
+ console.error(e);
+ }
+},100);
+
+window.addEventListener("load", () => {
+ require('@electron/remote').app.getGPUInfo('complete').then((data) => {
+ global.gpudriverdata = data;
+ });
})
\ No newline at end of file diff --git a/views/script/global_compatlayer.js b/views/script/global_compatlayer.js index 8545a29..9ef86ed 100644 --- a/views/script/global_compatlayer.js +++ b/views/script/global_compatlayer.js @@ -1,89 +1,89 @@ -window.addEventListener("load", () => { - if (require('os').platform !== "darwin") { - gpuinfo = require('@electron/remote').app.getGPUFeatureStatus(); - gpuscore = 0; - maxscore = 10; - if (gpuinfo['2d_canvas'].startsWith("enabled")) { - if (gpuinfo['2d_canvas'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['gpu_compositing'].startsWith("enabled")) { - if (gpuinfo['gpu_compositing'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['video_decode'].startsWith("enabled")) { - if (gpuinfo['video_decode'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['multiple_raster_threads'].startsWith("enabled")) { - if (gpuinfo['multiple_raster_threads'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['oop_rasterization'].startsWith("enabled")) { - if (gpuinfo['oop_rasterization'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['rasterization'].startsWith("enabled")) { - if (gpuinfo['rasterization'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['opengl'].startsWith("enabled")) { - if (gpuinfo['opengl'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['skia_renderer'].startsWith("enabled")) { - if (gpuinfo['skia_renderer'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['vulkan'].startsWith("enabled")) { - if (gpuinfo['vulkan'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - if (gpuinfo['webgl'].startsWith("enabled")) { - if (gpuinfo['webgl'] === "enabled") { - gpuscore++; - } else { - gpuscore += 0.5; - } - } - - gpuperct = (gpuscore / maxscore) * 100; - - if (gpuperct < 50) { - console.warn("Bad GPU support, disabling GPU-accelerated content"); - var head = document.getElementsByTagName('HEAD')[0]; - var link = document.createElement('link'); - link.rel = 'stylesheet'; - link.type = 'text/css'; - link.href = './common/compatibilityMode.css'; - head.appendChild(link); - } - } -})
\ No newline at end of file +window.addEventListener("load", () => {
+ if (require('os').platform !== "darwin") {
+ gpuinfo = require('@electron/remote').app.getGPUFeatureStatus();
+ gpuscore = 0;
+ maxscore = 10;
+ if (gpuinfo['2d_canvas'].startsWith("enabled")) {
+ if (gpuinfo['2d_canvas'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['gpu_compositing'].startsWith("enabled")) {
+ if (gpuinfo['gpu_compositing'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['video_decode'].startsWith("enabled")) {
+ if (gpuinfo['video_decode'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['multiple_raster_threads'].startsWith("enabled")) {
+ if (gpuinfo['multiple_raster_threads'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['oop_rasterization'].startsWith("enabled")) {
+ if (gpuinfo['oop_rasterization'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['rasterization'].startsWith("enabled")) {
+ if (gpuinfo['rasterization'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['opengl'].startsWith("enabled")) {
+ if (gpuinfo['opengl'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['skia_renderer'].startsWith("enabled")) {
+ if (gpuinfo['skia_renderer'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['vulkan'].startsWith("enabled")) {
+ if (gpuinfo['vulkan'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+ if (gpuinfo['webgl'].startsWith("enabled")) {
+ if (gpuinfo['webgl'] === "enabled") {
+ gpuscore++;
+ } else {
+ gpuscore += 0.5;
+ }
+ }
+
+ gpuperct = (gpuscore / maxscore) * 100;
+
+ if (gpuperct < 30) {
+ console.warn("Bad GPU support, disabling GPU-accelerated content");
+ var head = document.getElementsByTagName('HEAD')[0];
+ var link = document.createElement('link');
+ link.rel = 'stylesheet';
+ link.type = 'text/css';
+ link.href = './common/compatibilityMode.css';
+ head.appendChild(link);
+ }
+ }
+})
diff --git a/views/script/global_levelsapi.js b/views/script/global_levelsapi.js new file mode 100644 index 0000000..45a74d2 --- /dev/null +++ b/views/script/global_levelsapi.js @@ -0,0 +1,47 @@ +module.exports = class LevelsAPI {
+
+ associates;
+
+ constructor() {
+
+ let assocs_raw;
+ let assocs_lines;
+ let assocs_base;
+ let assocs;
+ let score;
+ let cline;
+ let line;
+ let clvl;
+
+ assocs_raw = require('fs').readFileSync("./online/levels.txt");
+ assocs_lines = assocs_raw.toString().split("\n");
+ assocs_base = {};
+
+ for (line of assocs_lines) {
+ cline = line.split(":");
+ assocs_base[cline[1].trim()] = cline[0].trim() - 1 + 1;
+ }
+
+ assocs = {};
+
+ clvl = 0;
+ for (let c = 0; c <= 5051; c++) {
+ if (assocs_base[c.toString()] !== undefined) {
+ clvl = assocs_base[c.toString()];
+ }
+ assocs[c.toString()] = clvl.toString()
+ }
+
+ this.associates = assocs;
+
+ }
+
+ correspond(score, god) {
+ if (score <= 5051) {
+ return this.associates[score].toString();
+ } else {
+ return god;
+ }
+ }
+
+}
\ No newline at end of file diff --git a/views/script/loader_global.js b/views/script/loader_global.js index 6bde06c..3a35d54 100644 --- a/views/script/loader_global.js +++ b/views/script/loader_global.js @@ -1,119 +1,127 @@ -window.addEventListener('load', () => { - setTimeout(() => { - if (native) { - setTimeout(() => { - setTimeout(() => { - if (native) {global.$ = require('jquery');} else {var script = document.createElement('script');script.src = '../webinit/jquery.js';script.type = 'text/javascript';document.getElementsByTagName('head')[0].appendChild(script);} - $("#progress").fadeOut(500); - setTimeout(() => { - window.fetch("https://kartik.hopto.org/latest.php?v=" + require('@electron/remote').getCurrentWindow().update).then((data) => { - data.blob().then((a) => { - a.text().then((b) => { - if (require('@electron/remote').getCurrentWindow().update == "git") { - document.getElementById('updates').style.backgroundColor = "lightsalmon"; - document.getElementById('updates').innerText = lang.updates.git; - } else { - console.log(b); - console.log(require('../package.json').version); - if (b == require('../package.json').version) { - document.getElementById('updates').style.backgroundColor = "lightgreen"; - document.getElementById('updates').innerText = lang.updates.ok; - } else { - document.getElementById('warning').style.opacity = "1"; - document.getElementById('updates').style.backgroundColor = "lightyellow"; - document.getElementById('updates').innerText = lang.updates.available; - } - } - setTimeout(() => { - document.getElementById('banner').style.width = "380px"; - document.getElementById('banner').style.height = "auto"; - document.getElementById('banner').src = "common/banner.gif"; - introsfx = new Audio("../sfx/newintro.mp3"); - introsfx.play() - introsfx.onended = () => { - $("body").fadeOut(500); - setTimeout(() => { - info("LoadWindow", "Switching control to MenuWindow"); - location.href = "intro.html"; - }, 1000) - } - }, 2000) - }).catch((e) => { - console.warn(e); - document.getElementById('updates').style.backgroundColor = "lightcoral"; - document.getElementById('updates').innerText = lang.updates.error; - setTimeout(() => { - document.getElementById('banner').style.width = "380px"; - document.getElementById('banner').style.height = "auto"; - document.getElementById('banner').src = "common/banner.gif"; - introsfx = new Audio("../sfx/newintro.mp3"); - introsfx.play() - introsfx.onended = () => { - $("body").fadeOut(500); - setTimeout(() => { - info("LoadWindow", "Switching control to MenuWindow"); - location.href = "intro.html"; - }, 1000) - } - }, 2000) - }); - }).catch((e) => { - console.warn(e); - document.getElementById('updates').style.backgroundColor = "lightcoral"; - document.getElementById('updates').innerText = lang.updates.error; - setTimeout(() => { - document.getElementById('banner').style.width = "380px"; - document.getElementById('banner').style.height = "auto"; - document.getElementById('banner').src = "common/banner.gif"; - introsfx = new Audio("../sfx/newintro.mp3"); - introsfx.play() - introsfx.onended = () => { - $("body").fadeOut(500); - setTimeout(() => { - info("LoadWindow", "Switching control to MenuWindow"); - location.href = "intro.html"; - }, 1000) - } - }, 2000) - }); - }).catch((e) => { - console.warn(e); - document.getElementById('updates').style.backgroundColor = "lightcoral"; - document.getElementById('updates').innerText = lang.updates.error; - setTimeout(() => { - document.getElementById('banner').style.width = "380px"; - document.getElementById('banner').style.height = "auto"; - document.getElementById('banner').src = "common/banner.gif"; - introsfx = new Audio("../sfx/newintro.mp3"); - introsfx.play() - introsfx.onended = () => { - $("body").fadeOut(500); - setTimeout(() => { - info("LoadWindow", "Switching control to MenuWindow"); - location.href = "intro.html"; - }, 1000) - } - }, 2000) - }); - }, 2000) - }, 3000) - }, 1000) - } else { - if (native) {global.$ = require('jquery');} else {var script = document.createElement('script');script.src = '../webinit/jquery.js';script.type = 'text/javascript';document.getElementsByTagName('head')[0].appendChild(script);} - setTimeout(() => { - document.getElementById('banner').style.width = "380px"; - document.getElementById('banner').style.height = "auto"; - document.getElementById('banner').src = "common/banner.gif"; - introsfx = new Audio("../sfx/newintro.mp3"); - introsfx.play() - introsfx.onended = () => { - $("body").fadeOut(500); - setTimeout(() => { - info("LoadWindow", "Switching control to MenuWindow"); - location.href = "intro.html"; - }, 1000) - } - }, 5000) - } - }, 2000) -}) +window.addEventListener('load', () => {
+ setTimeout(() => {
+ if (native) {
+ setTimeout(() => {
+ setTimeout(() => {
+
+ $("#progress").fadeOut(500);
+ setTimeout(() => {
+ window.fetch("https://kartik.hopto.org/latest.php?v=" + require('@electron/remote').getCurrentWindow().update).then((data) => {
+ data.blob().then((a) => {
+ a.text().then((b) => {
+ if (require('@electron/remote').getCurrentWindow().update === "git") {
+ document.getElementById('updates').style.backgroundColor = "lightsalmon";
+ document.getElementById('updates').innerText = lang.updates.git;
+ } else {
+ console.log(b);
+ console.log(require('../package.json').version);
+ if (b === require('../package.json').version) {
+ document.getElementById('updates').style.backgroundColor = "lightgreen";
+ document.getElementById('updates').innerText = lang.updates.ok;
+ } else {
+ require('@electron/remote').getCurrentWindow().webContents.send("notification", {title: lang.updates.warn[0], message: lang.updates.warn[1]});
+ document.getElementById('updates').style.backgroundColor = "lightyellow";
+ document.getElementById('updates').innerText = lang.updates.available;
+ }
+ }
+ setTimeout(() => {
+ $("#banner-outer").fadeOut(200);
+ $("#intro-video").fadeIn(200);
+ setTimeout(() => {
+ introsfx = document.getElementById("intro-video");
+ introsfx.play()
+ introsfx.onended = () => {
+ $("body").fadeOut(500);
+ setTimeout(() => {
+ info("LoadWindow", "Switching control to MenuWindow");
+ location.href = "intro.html";
+ }, 1000)
+ }
+ }, 200)
+ }, 2000)
+ }).catch((e) => {
+ console.warn(e);
+ document.getElementById('updates').style.backgroundColor = "lightcoral";
+ document.getElementById('updates').innerText = lang.updates.error;
+ require('@electron/remote').getCurrentWindow().webContents.send("notification", {title: lang.polymer.updateError[0], message: lang.polymer.updateError[1]});
+ setTimeout(() => {
+ $("#banner-outer").fadeOut(200);
+ $("#intro-video").fadeIn(200);
+ setTimeout(() => {
+ introsfx = document.getElementById("intro-video");
+ introsfx.play()
+ introsfx.onended = () => {
+ $("body").fadeOut(500);
+ setTimeout(() => {
+ info("LoadWindow", "Switching control to MenuWindow");
+ location.href = "intro.html";
+ }, 1000)
+ }
+ }, 200)
+ }, 2000)
+ });
+ }).catch((e) => {
+ console.warn(e);
+ document.getElementById('updates').style.backgroundColor = "lightcoral";
+ document.getElementById('updates').innerText = lang.updates.error;
+ require('@electron/remote').getCurrentWindow().webContents.send("notification", {title: lang.polymer.updateError[0], message: lang.polymer.updateError[1]});
+ setTimeout(() => {
+ $("#banner-outer").fadeOut(200);
+ $("#intro-video").fadeIn(200);
+ setTimeout(() => {
+ introsfx = document.getElementById("intro-video");
+ introsfx.play()
+ introsfx.onended = () => {
+ $("body").fadeOut(500);
+ setTimeout(() => {
+ info("LoadWindow", "Switching control to MenuWindow");
+ location.href = "intro.html";
+ }, 1000)
+ }
+ }, 200)
+ }, 2000)
+ });
+ }).catch((e) => {
+ console.warn(e);
+ document.getElementById('updates').style.backgroundColor = "lightcoral";
+ document.getElementById('updates').innerText = lang.updates.error;
+ require('@electron/remote').getCurrentWindow().webContents.send("notification", {title: lang.polymer.updateError[0], message: lang.polymer.updateError[1]});
+ setTimeout(() => {
+ $("#banner-outer").fadeOut(200);
+ $("#intro-video").fadeIn(200);
+ setTimeout(() => {
+ introsfx = document.getElementById("intro-video");
+ introsfx.play()
+ introsfx.onended = () => {
+ $("body").fadeOut(500);
+ setTimeout(() => {
+ info("LoadWindow", "Switching control to MenuWindow");
+ location.href = "intro.html";
+ }, 1000)
+ }
+ }, 200)
+ }, 2000)
+ });
+ }, 2000)
+ }, 3000)
+ }, 1000)
+ } else {
+
+ setTimeout(() => {
+ $("#banner-outer").fadeOut(200);
+ $("#intro-video").fadeIn(200);
+ setTimeout(() => {
+ introsfx = document.getElementById("intro-video");
+ introsfx.play()
+ introsfx.onended = () => {
+ $("body").fadeOut(500);
+ setTimeout(() => {
+ info("LoadWindow", "Switching control to MenuWindow");
+ location.href = "intro.html";
+ }, 1000)
+ }
+ }, 200)
+ }, 5000)
+ }
+ }, 2000)
+})
diff --git a/views/script/menu_copyright.js b/views/script/menu_copyright.js index 35b322a..49ed8a5 100644 --- a/views/script/menu_copyright.js +++ b/views/script/menu_copyright.js @@ -1,5 +1,5 @@ -if (new Date().getFullYear() === 2021) { - document.write(new Date().getFullYear() + " Minteck Projects"); -} else { - document.write("2021-" + new Date().getFullYear() + " Minteck Projects"); +if (new Date().getFullYear() === 2021) {
+ document.write(new Date().getFullYear() + " Minteck");
+} else {
+ document.write("2021-" + new Date().getFullYear() + " Minteck");
}
\ No newline at end of file diff --git a/views/script/menu_global.js b/views/script/menu_global.js index 3713591..a16d3d1 100644 --- a/views/script/menu_global.js +++ b/views/script/menu_global.js @@ -1,122 +1,127 @@ -let menuOpen = true; - -if (native) {global.$ = require('jquery');} else {var script = document.createElement('script');script.src = '../webinit/jquery.js';script.type = 'text/javascript';document.getElementsByTagName('head')[0].appendChild(script);} -$("#box").fadeOut(0); -window.addEventListener('load', () => { - setTimeout(() => { - $("#box").fadeIn(500); - }, 1000) -}) - -$("body").focus(); -keysEnabled = true; -$(document).keydown(function(e) { - if (keysEnabled) { - if (e.keyCode === 13 || e.keyCode === 88 || e.keyCode === 32) { // enter - if ($(".services").is(":visible")) { - selectOption(); - } else { - $(".services").show(); - } - menuOpen = !menuOpen; - } - if (e.keyCode === 38 || e.keyCode === 90) { // up - Sound.menu(); - var selected = $(".selected"); - $(".services li").removeClass("selected"); - if (selected.prev().length === 0) { - selected.siblings().last().addClass("selected"); - } else { - selected.prev().addClass("selected"); - } - } - if (e.keyCode === 40 || e.keyCode === 83) { // down - Sound.menu(); - var selected = $(".selected"); - $(".services li").removeClass("selected"); - if (selected.next().length === 0) { - selected.siblings().first().addClass("selected"); - } else { - selected.next().addClass("selected"); - } - } - if (e.keyCode === 27 || e.keyCode === 8) { // esc - keysEnabled = false; - Sound.click(); - setTimeout(() => { - require('@electron/remote').getCurrentWindow().close(); - }, 250) - } - } -}); - -function selectOption() { - item = document.querySelector(".selected a").id; - Sound.click(); - - switch (item) { - case 'single': - scenar("start", "happy"); - keysEnabled = false; - require('electron').ipcRenderer.send('prefademusic', ""); - $("#box").fadeOut(500); - setTimeout(() => { - info("MenuWindow", "Switching control to GameWindow"); - location.href = "game.html?sp"; - }, 1000) - break; - case 'online': - keysEnabled = false; - require('electron').ipcRenderer.send('prefademusic', ""); - $("#box").fadeOut(500); - setTimeout(() => { - info("MenuWindow", "Switching control to GameWindow"); - location.href = "game.html?online"; - }, 1000) - break; - case 'play': - keysEnabled = false; - require('electron').ipcRenderer.send('prefademusic', ""); - $("#box").fadeOut(500); - setTimeout(() => { - info("MenuWindow", "Switching control to GameWindow"); - location.href = "game.html"; - }, 1000) - break; - case 'settings': - keysEnabled = false; - $("#box").fadeOut(500); - setTimeout(() => { - info("MenuWindow", "Switching control to OptnWindow"); - location.href = "settings.html"; - }, 1000) - break; - case 'stats': - keysEnabled = false; - require('electron').ipcRenderer.send('prefademusic', ""); - $("#box").fadeOut(500); - setTimeout(() => { - info("MenuWindow", "Switching control to OptnWindow"); - location.href = "stats.html"; - }, 1000) - break; - case 'credits': - keysEnabled = false; - require('electron').ipcRenderer.send('prefademusic', ""); - $("#box").fadeOut(500); - setTimeout(() => { - info("MenuWindow", "Switching control to OptnWindow"); - location.href = "credits.html"; - }, 1000) - break; - case 'quit': - keysEnabled = false; - require('electron').ipcRenderer.send('prefademusic', ""); - info("MenuWindow", "Quitting game"); - Sound.click(); - setTimeout(() => { - require('@electron/remote').getCurrentWindow().close(); - }, 250) - break; - } +let menuOpen = true;
+
+if (native) {global.$ = require('jquery');} else {var script = document.createElement('script');script.src = '../webinit/jquery.js';script.type = 'text/javascript';document.getElementsByTagName('head')[0].appendChild(script);}
+$("#box").fadeOut(0);
+window.addEventListener('load', () => {
+ setTimeout(() => {
+ $("#box").fadeIn(500);
+ }, 1000)
+})
+
+$("body").focus();
+keysEnabled = true;
+$(document).keydown(function(e) {
+ if (loggingIn) { return; }
+
+ if (keysEnabled) {
+ if (e.ctrlKey && e.keyCode === 13) { // ctrl+enter
+ throw new RangeError("Manually initiated crash");
+ }
+ if (e.keyCode === 13 || e.keyCode === 88 || e.keyCode === 32) { // enter
+ if ($(".services").is(":visible")) {
+ selectOption();
+ } else {
+ $(".services").show();
+ }
+ menuOpen = !menuOpen;
+ }
+ if (e.keyCode === 38 || e.keyCode === 90) { // up
+ Sound.menu();
+ var selected = $(".selected");
+ $(".services li").removeClass("selected");
+ if (selected.prev().length === 0) {
+ selected.siblings().last().addClass("selected");
+ } else {
+ selected.prev().addClass("selected");
+ }
+ }
+ if (e.keyCode === 40 || e.keyCode === 83) { // down
+ Sound.menu();
+ var selected = $(".selected");
+ $(".services li").removeClass("selected");
+ if (selected.next().length === 0) {
+ selected.siblings().first().addClass("selected");
+ } else {
+ selected.next().addClass("selected");
+ }
+ }
+ if (e.keyCode === 27 || e.keyCode === 8) { // esc
+ keysEnabled = false;
+ Sound.click();
+ setTimeout(() => {
+ require('@electron/remote').getCurrentWindow().close();
+ }, 250)
+ }
+ }
+});
+
+function selectOption() {
+ item = document.querySelector(".selected a").id;
+ Sound.click();
+
+ switch (item) {
+ case 'single':
+ scenar("start", "happy");
+ keysEnabled = false;
+ require('electron').ipcRenderer.send('prefademusic', "");
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("MenuWindow", "Switching control to GameWindow");
+ location.href = "game.html?sp";
+ }, 1000)
+ break;
+ case 'online':
+ keysEnabled = false;
+ require('electron').ipcRenderer.send('prefademusic', "");
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("MenuWindow", "Switching control to GameWindow");
+ location.href = "game.html?online";
+ }, 1000)
+ break;
+ case 'play':
+ keysEnabled = false;
+ require('electron').ipcRenderer.send('prefademusic', "");
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("MenuWindow", "Switching control to GameWindow");
+ location.href = "game.html";
+ }, 1000)
+ break;
+ case 'settings':
+ keysEnabled = false;
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("MenuWindow", "Switching control to OptnWindow");
+ location.href = "settings.html";
+ }, 1000)
+ break;
+ case 'stats':
+ keysEnabled = false;
+ require('electron').ipcRenderer.send('prefademusic', "");
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("MenuWindow", "Switching control to OptnWindow");
+ location.href = "stats.html";
+ }, 1000)
+ break;
+ case 'credits':
+ keysEnabled = false;
+ require('electron').ipcRenderer.send('prefademusic', "");
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("MenuWindow", "Switching control to OptnWindow");
+ location.href = "credits.html";
+ }, 1000)
+ break;
+ case 'quit':
+ keysEnabled = false;
+ require('electron').ipcRenderer.send('prefademusic', "");
+ info("MenuWindow", "Quitting game");
+ Sound.click();
+ setTimeout(() => {
+ require('@electron/remote').getCurrentWindow().close();
+ }, 250)
+ break;
+ }
}
\ No newline at end of file diff --git a/views/script/menu_login.js b/views/script/menu_login.js new file mode 100644 index 0000000..f2d7c7e --- /dev/null +++ b/views/script/menu_login.js @@ -0,0 +1,242 @@ +global.loggingIn = false;
+homedir = require('@electron/remote').getCurrentWindow().homedir;
+
+function startLogin() {
+ loggingIn = true;
+
+ document.getElementById('loggingIn').style.display = "flex";
+ var http = require('http');
+
+ reqid = 0;
+
+ var server = http.createServer(function (req, res) {
+
+ const queryObject = require('querystring').parse(req.url,true);
+ token = queryObject[Object.keys(queryObject)[0]];
+ res.end(lang.polymer.loginClose);
+ reqid++;
+
+ if (reqid === 1) {
+ document.getElementById("loggingIn").innerText = lang.polymer.gatheringLogin
+ require('@electron/remote').getCurrentWindow().focus();
+ server.close();
+
+ playerData = {
+ "picture": null,
+ "name": null,
+ "level": -1,
+ "token": token
+ };
+
+ playerData.picture = $.ajax({
+ type: "GET",
+ url: 'https://kartik.hopto.org/online/ingame/api/profile.picture.php?kartik_online_token=' + token,
+ async: false,
+ error: (e) => { throw e; }
+ }).responseText.trim();
+
+ playerData.name = $.ajax({
+ type: "GET",
+ url: 'https://kartik.hopto.org/online/ingame/api/profile.name.php?kartik_online_token=' + token,
+ async: false,
+ error: (e) => { throw e; }
+ }).responseText.trim();
+
+ playerData.level = $.ajax({
+ type: "GET",
+ url: 'https://kartik.hopto.org/online/ingame/api/profile.level.php?kartik_online_token=' + token,
+ async: false,
+ error: (e) => { throw e; }
+ }).responseText.trim() - 1 + 1;
+
+ if (playerData.level >= 0 && playerData.name !== null && playerData.picture !== null) {
+ console.log(playerData);
+ loggingIn = false;
+ document.getElementById('loggingIn').style.display = "none";
+ currentNest.auth = playerData;
+ Nest.export(homedir + "/.kartik/current.kfn", currentNest);require('electron').ipcRenderer.send("reloadNest")
+ keysEnabled = false;
+ require('electron').ipcRenderer.send('prefademusic', "");
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ location.href = "menu.html";
+ }, 1000)
+ } else {
+ throw new Error("Incomplete information received");
+ }
+ }
+
+ });
+
+ server.listen(14552);
+
+ console.log('Waiting for login requests on port 14552')
+ require('open')("https://kartik.hopto.org/online/ingame");
+}
+
+window.addEventListener('load', () => {
+ onlineMode = false;
+
+ window.fetch("https://kartik.hopto.org/latest.php?v=" + require('@electron/remote').getCurrentWindow().update).then((data) => {
+ data.blob().then((a) => {
+ a.text().then((b) => {
+ onlineMode = true;
+ postOnlineMode();
+ }).catch((e) => {
+ require('@electron/remote').getCurrentWindow().webContents.send("notification", {title: lang.polymer.error[0], message: lang.polymer.error[1]});
+ console.error(e);
+ onlineMode = false;
+ postOnlineMode();
+ document.getElementById("loginIntro").innerText = lang.polymer.error[2];
+ document.getElementById("online").parentElement.parentElement.outerHTML = "";
+ })
+ }).catch((e) => {
+ require('@electron/remote').getCurrentWindow().webContents.send("notification", {title: lang.polymer.error[0], message: lang.polymer.error[1]});
+ console.error(e);
+ onlineMode = false;
+ postOnlineMode();
+ document.getElementById("loginIntro").innerText = lang.polymer.error[2];
+ document.getElementById("online").parentElement.parentElement.outerHTML = "";
+ })
+ }).catch((e) => {
+ require('@electron/remote').getCurrentWindow().webContents.send("notification", {title: lang.polymer.error[0], message: lang.polymer.error[1]});
+ console.error(e);
+ onlineMode = false;
+ postOnlineMode();
+ document.getElementById("loginIntro").innerText = lang.polymer.error[2];
+ document.getElementById("online").parentElement.parentElement.outerHTML = "";
+ })
+})
+
+function logout() {
+ $.ajax({
+ type: "GET",
+ url: 'https://kartik.hopto.org/online/ingame/api/profile.logout.php?kartik_online_token=' + currentNest.auth.token,
+ async: false,
+ error: (e) => { throw e; }
+ }).responseText.trim();
+ currentNest.auth = null;
+ Nest.export(homedir + "/.kartik/current.kfn", currentNest);require('electron').ipcRenderer.send("reloadNest")
+}
+
+function postOnlineMode() {
+ try {
+ if (currentNest.auth !== null) {
+ console.log(currentNest.auth);
+ tokenvalidity = $.ajax({
+ type: "GET",
+ url: 'https://kartik.hopto.org/online/ingame/api/profile.token.php?kartik_online_token=' + currentNest.auth.token,
+ async: false,
+ error: (e) => { throw e; }
+ }).responseText.trim();
+
+ if (tokenvalidity !== "true") {
+ require('@electron/remote').getCurrentWindow().webContents.send("notification", {title: lang.polymer.token[0], message: lang.polymer.token[1]});
+ logout();
+ }
+ }
+
+ if (currentNest.auth === null || !onlineMode) {
+ $(document).keydown(function(e) {
+ if (e.keyCode === 76 && !loggingIn && onlineMode) {
+ startLogin();
+ }
+ })
+ } else {
+ $(document).keydown(function(e) {
+ if (e.keyCode === 76 && !loggingIn && onlineMode) {
+ logout();
+ location.reload();
+ }
+ })
+
+ authData = currentNest.auth;
+
+ document.getElementById('loginIntro').style.display = "none";
+ document.getElementById('loginUser').style.display = "grid";
+
+ olevel = $.ajax({
+ type: "GET",
+ url: 'https://kartik.hopto.org/online/ingame/api/profile.level.php?kartik_online_token=' + authData.token,
+ async: false,
+ error: (e) => { throw e; }
+ }).responseText.trim() - 1 + 1;
+
+ if (authData.level > olevel) {
+ $.ajax({
+ type: "GET",
+ url: 'https://kartik.hopto.org/online/ingame/api/set.level.php?kartik_online_token=' + authData.token + "&level=" + authData.level,
+ async: false,
+ error: (e) => { throw e; }
+ });
+ } else if (authData.level < olevel) {
+ authData.level = $.ajax({
+ type: "GET",
+ url: 'https://kartik.hopto.org/online/ingame/api/profile.level.php?kartik_online_token=' + authData.token,
+ async: false,
+ error: (e) => { throw e; }
+ }).responseText.trim() - 1 + 1;
+ currentNest.auth = authData;
+ Nest.export(homedir + "/.kartik/current.kfn", currentNest);require('electron').ipcRenderer.send("reloadNest")
+ }
+
+ ostats = JSON.parse($.ajax({
+ type: "GET",
+ url: 'https://kartik.hopto.org/online/ingame/api/profile.stats.php?kartik_online_token=' + authData.token,
+ async: false,
+ error: (e) => { throw e; }
+ }).responseText.trim())
+
+ if (ostats === null) {
+ cstats = currentNest.stats;
+ } else {
+ cstats = {};
+
+ for (group in currentNest.stats) {
+ cstats[group] = {};
+
+ for (item in currentNest.stats[group]) {
+ if (ostats[group][item]) {
+ if (ostats[group][item] > currentNest.stats[group][item]) {
+ cstats[group][item] = ostats[group][item];
+ } else {
+ cstats[group][item] = currentNest.stats[group][item];
+ }
+ } else {
+ cstats[group][item] = currentNest.stats[group][item];
+ }
+ }
+ }
+ }
+
+ $.ajax({
+ type: "GET",
+ url: 'https://kartik.hopto.org/online/ingame/api/set.stats.php?kartik_online_token=' + authData.token + "&stats=" + Buffer.from(JSON.stringify(cstats)).toString("base64"),
+ async: false,
+ error: (e) => { throw e; }
+ });
+
+ currentNest.stats = JSON.parse($.ajax({
+ type: "GET",
+ url: 'https://kartik.hopto.org/online/ingame/api/profile.stats.php?kartik_online_token=' + authData.token,
+ async: false,
+ error: (e) => { throw e; }
+ }).responseText.trim());
+ Nest.export(homedir + "/.kartik/current.kfn", currentNest);require('electron').ipcRenderer.send("reloadNest")
+
+ document.getElementById('kto-picture').src = authData.picture;
+ document.getElementById('kto-username').innerText = authData.name;
+ if (authData.level < 200) {
+ document.getElementById('kto-level').innerText = authData.level;
+ } else {
+ document.getElementById('kto-level').innerText = lang.polymer.ktoMaxLevel;
+ }
+ }
+ } catch (e) {
+ require('@electron/remote').getCurrentWindow().webContents.send("notification", {title: lang.polymer.error[0], message: lang.polymer.error[1]});
+ console.error(e);
+ onlineMode = false;
+ document.getElementById("loginIntro").innerText = lang.polymer.error[2];
+ document.getElementById("online").parentElement.parentElement.outerHTML = "";
+ }
+}
\ No newline at end of file diff --git a/views/script/settings_global.js b/views/script/settings_global.js index f224ea9..047967a 100644 --- a/views/script/settings_global.js +++ b/views/script/settings_global.js @@ -1,226 +1,127 @@ -let menuOpen = true; - -if (native) {global.$ = require('jquery');} else {var script = document.createElement('script');script.src = '../webinit/jquery.js';script.type = 'text/javascript';document.getElementsByTagName('head')[0].appendChild(script);} -$("#box").fadeOut(0); -setTimeout(() => { - $("#box").fadeIn(500); -}, 200) - -$("body").focus(); -keysEnabled = true; -$(document).keydown(function(e) { - if (keysEnabled) { - if (e.keyCode === 13 || e.keyCode === 88 || e.keyCode === 32) { // enter - if ($(".services").is(":visible")) { - selectOption(); - } else { - $(".services").show(); - } - } - if (e.keyCode === 38 || e.keyCode === 90) { // up - Sound.menu(); - var selected = $(".selected"); - $(".services li").removeClass("selected"); - if (selected.prev().length === 0) { - selected.siblings().last().addClass("selected"); - } else { - selected.prev().addClass("selected"); - } - } - if (e.keyCode === 40 || e.keyCode === 83) { // down - Sound.menu(); - var selected = $(".selected"); - $(".services li").removeClass("selected"); - if (selected.next().length === 0) { - selected.siblings().first().addClass("selected"); - } else { - selected.next().addClass("selected"); - } - } - if (e.keyCode === 68 || e.keyCode === 39 || e.keyCode === 81 || e.keyCode === 37) { // right/left - Sound.menu(); - var selected = $(".selected"); - var id = $(".selected")[0].children[0].children[0].id; - - if (id === "musicb") { - if (document.getElementById("setting-music").innerText === "1") { - document.getElementById("setting-music").innerText = "0"; - require('fs').writeFileSync(homedir + "/.kartik/config/music.txt", "0"); - } else { - document.getElementById("setting-music").innerText = "1"; - require('fs').writeFileSync(homedir + "/.kartik/config/music.txt", "1"); - } - } - if (id === "voice") { - if (document.getElementById("setting-voice").innerText === "1") { - document.getElementById("setting-voice").innerText = "0"; - require('fs').writeFileSync(homedir + "/.kartik/config/voice.txt", "0"); - } else { - document.getElementById("setting-voice").innerText = "1"; - require('fs').writeFileSync(homedir + "/.kartik/config/voice.txt", "2"); - } - } - if (id === "zoom") { - zoom = document.getElementById("setting-zoom").innerText; - - switch (zoom) { - case "0.9": - document.getElementById("setting-zoom").innerText = "1"; - require('fs').writeFileSync(homedir + "/.kartik/config/scale.txt", "1"); - break; - case "1": - document.getElementById("setting-zoom").innerText = "1.1"; - require('fs').writeFileSync(homedir + "/.kartik/config/scale.txt", "1.1"); - break; - case "1.1": - document.getElementById("setting-zoom").innerText = "1.2"; - require('fs').writeFileSync(homedir + "/.kartik/config/scale.txt", "1.2"); - break; - case "1.2": - document.getElementById("setting-zoom").innerText = "1.3"; - require('fs').writeFileSync(homedir + "/.kartik/config/scale.txt", "1.3"); - break; - case "1.3": - document.getElementById("setting-zoom").innerText = "1.4"; - require('fs').writeFileSync(homedir + "/.kartik/config/scale.txt", "1.4"); - break; - case "1.4": - document.getElementById("setting-zoom").innerText = "1.5"; - require('fs').writeFileSync(homedir + "/.kartik/config/scale.txt", "1.5"); - break; - case "1.5": - document.getElementById("setting-zoom").innerText = "1.6"; - require('fs').writeFileSync(homedir + "/.kartik/config/scale.txt", "1.6"); - break; - case "1.6": - document.getElementById("setting-zoom").innerText = "1.7"; - require('fs').writeFileSync(homedir + "/.kartik/config/scale.txt", "1.7"); - break; - case "1.7": - document.getElementById("setting-zoom").innerText = "1.8"; - require('fs').writeFileSync(homedir + "/.kartik/config/scale.txt", "1.8"); - break; - case "1.8": - document.getElementById("setting-zoom").innerText = "1.9"; - require('fs').writeFileSync(homedir + "/.kartik/config/scale.txt", "1.9"); - break; - case "1.9": - document.getElementById("setting-zoom").innerText = "2"; - require('fs').writeFileSync(homedir + "/.kartik/config/scale.txt", "2"); - break; - case "2": - document.getElementById("setting-zoom").innerText = "0.9"; - require('fs').writeFileSync(homedir + "/.kartik/config/scale.txt", "0.9"); - break; - } - } - if (id === "lang") { - lang = document.getElementById("setting-lang").innerText; - slng = require('../lang/languages.json'); - slst = Object.keys(slng); - maxl = slst.length - 1; - - ci = -1; - ni = -1; - slst.forEach((key, index) => { - if (slng[key] === lang) { - ci = index; - if (index + 1 > maxl) { - ni = 0; - } else { - ni = index + 1; - } - } - }) - - if (ci !== -1 && ni !== -1) { - document.getElementById("setting-lang").innerText = slng[slst[ni]]; - require('fs').writeFileSync(homedir + "/.kartik/config/lang.txt", slst[ni]); - require('@electron/remote').getCurrentWindow().lp = slst[ni]; - } - - /*switch (lang) { - case "Français": - document.getElementById("setting-lang").innerText = "English"; - require('fs').writeFileSync(homedir + "/.kartik/config/lang.txt", "en"); - require('@electron/remote').getCurrentWindow().lp = "en"; - break; - - case "English": - document.getElementById("setting-lang").innerText = "Español"; - require('fs').writeFileSync(homedir + "/.kartik/config/lang.txt", "es"); - require('@electron/remote').getCurrentWindow().lp = "es"; - break; - - case "Español": - document.getElementById("setting-lang").innerText = "中国人"; - require('fs').writeFileSync(homedir + "/.kartik/config/lang.txt", "zh"); - require('@electron/remote').getCurrentWindow().lp = "zh"; - break; - - case "中国人": - document.getElementById("setting-lang").innerText = "日本語"; - require('fs').writeFileSync(homedir + "/.kartik/config/lang.txt", "jp"); - require('@electron/remote').getCurrentWindow().lp = "jp"; - break; - - case "日本語": - document.getElementById("setting-lang").innerText = "русский"; - require('fs').writeFileSync(homedir + "/.kartik/config/lang.txt", "ru"); - require('@electron/remote').getCurrentWindow().lp = "ru"; - break; - - case "русский": - document.getElementById("setting-lang").innerText = "Deutsche"; - require('fs').writeFileSync(homedir + "/.kartik/config/lang.txt", "de"); - require('@electron/remote').getCurrentWindow().lp = "de"; - break; - - case "Deutsche": - document.getElementById("setting-lang").innerText = "Nederlands"; - require('fs').writeFileSync(homedir + "/.kartik/config/lang.txt", "nl"); - require('@electron/remote').getCurrentWindow().lp = "nl"; - break; - - case "Nederlands": - document.getElementById("setting-lang").innerText = "Français"; - require('fs').writeFileSync(homedir + "/.kartik/config/lang.txt", "fr"); - require('@electron/remote').getCurrentWindow().lp = "fr"; - break; - }*/ - } - } - if (e.keyCode === 27 || e.keyCode === 8) { // esc - keysEnabled = false; - Sound.click(); - $("#box").fadeOut(500); - setTimeout(() => { - info("OptnWindow", "Switching control to MenuWindow"); - location.href = "menu.html"; - }, 1000) - } - } -}); - -function selectOption() { - item = document.querySelector(".selected a").id; - Sound.click(); - - switch (item) { - case 'back': - $("#box").fadeOut(500); - setTimeout(() => { - info("OptnWindow", "Switching control to MenuWindow"); - location.href = "menu.html?noreset"; - }, 1000) - break; - case 'credits': - require('electron').ipcRenderer.send('prefademusic', ""); - $("#box").fadeOut(500); - setTimeout(() => { - info("OptnWindow", "Switching control to MenuWindow"); - location.href = "credits.html"; - }, 1000) - break; - } -} +let menuOpen = true;
+
+if (native) {global.$ = require('jquery');} else {var script = document.createElement('script');script.src = '../webinit/jquery.js';script.type = 'text/javascript';document.getElementsByTagName('head')[0].appendChild(script);}
+$("#box").fadeOut(0);
+setTimeout(() => {
+ $("#box").fadeIn(500);
+}, 200)
+
+$("body").focus();
+keysEnabled = true;
+$(document).keydown(function(e) {
+ if (keysEnabled) {
+ if (e.keyCode === 13 || e.keyCode === 88 || e.keyCode === 32) { // enter
+ if ($(".services").is(":visible")) {
+ selectOption();
+ } else {
+ $(".services").show();
+ }
+ }
+ if (e.keyCode === 38 || e.keyCode === 90) { // up
+ Sound.menu();
+ var selected = $(".selected");
+ $(".services li").removeClass("selected");
+ if (selected.prev().length === 0) {
+ selected.siblings().last().addClass("selected");
+ } else {
+ selected.prev().addClass("selected");
+ }
+ }
+ if (e.keyCode === 40 || e.keyCode === 83) { // down
+ Sound.menu();
+ var selected = $(".selected");
+ $(".services li").removeClass("selected");
+ if (selected.next().length === 0) {
+ selected.siblings().first().addClass("selected");
+ } else {
+ selected.next().addClass("selected");
+ }
+ }
+ if (e.keyCode === 68 || e.keyCode === 39 || e.keyCode === 81 || e.keyCode === 37) { // right/left
+ Sound.menu();
+ var selected = $(".selected");
+ var id = $(".selected")[0].children[0].children[0].id;
+
+ if (id === "musicb") {
+ if (document.getElementById("setting-music").innerText === "1") {
+ document.getElementById("setting-music").innerText = "0";
+ currentNest.config.music = false;
+ Nest.export(homedir + "/.kartik/current.kfn", currentNest);require('electron').ipcRenderer.send("reloadNest")
+ } else {
+ document.getElementById("setting-music").innerText = "1";
+ currentNest.config.music = true;
+ Nest.export(homedir + "/.kartik/current.kfn", currentNest);require('electron').ipcRenderer.send("reloadNest")
+ }
+ }
+ if (id === "voice") {
+ if (document.getElementById("setting-voice").innerText === "1") {
+ document.getElementById("setting-voice").innerText = "0";
+ currentNest.config.music = false;
+ Nest.export(homedir + "/.kartik/current.kfn", currentNest);require('electron').ipcRenderer.send("reloadNest")
+ } else {
+ document.getElementById("setting-voice").innerText = "1";
+ currentNest.config.music = true;
+ Nest.export(homedir + "/.kartik/current.kfn", currentNest);require('electron').ipcRenderer.send("reloadNest")
+ }
+ }
+ if (id === "lang") {
+ lang = document.getElementById("setting-lang").innerText;
+ slng = require('../lang/languages.json');
+ slst = Object.keys(slng);
+ maxl = slst.length - 1;
+
+ ci = -1;
+ ni = -1;
+ slst.forEach((key, index) => {
+ if (slng[key] === lang) {
+ ci = index;
+ if (index + 1 > maxl) {
+ ni = 0;
+ } else {
+ ni = index + 1;
+ }
+ }
+ })
+
+ if (ci !== -1 && ni !== -1) {
+ document.getElementById("setting-lang").innerText = slng[slst[ni]];
+ currentNest.config.lang = slst[ni];
+ Nest.export(homedir + "/.kartik/current.kfn", currentNest);require('electron').ipcRenderer.send("reloadNest")
+ require('@electron/remote').getCurrentWindow().lp = slst[ni];
+ }
+ }
+ }
+ if (e.keyCode === 27 || e.keyCode === 8) { // esc
+ keysEnabled = false;
+ Sound.click();
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("OptnWindow", "Switching control to MenuWindow");
+ location.href = "menu.html";
+ }, 1000)
+ }
+ }
+});
+
+function selectOption() {
+ item = document.querySelector(".selected a").id;
+ Sound.click();
+
+ switch (item) {
+ case 'back':
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("OptnWindow", "Switching control to MenuWindow");
+ location.href = "menu.html?noreset";
+ }, 1000)
+ break;
+ case 'credits':
+ require('electron').ipcRenderer.send('prefademusic', "");
+ $("#box").fadeOut(500);
+ setTimeout(() => {
+ info("OptnWindow", "Switching control to MenuWindow");
+ location.href = "credits.html";
+ }, 1000)
+ break;
+ }
+}
diff --git a/views/script/settings_load.js b/views/script/settings_load.js index 030a7dd..e2bad80 100644 --- a/views/script/settings_load.js +++ b/views/script/settings_load.js @@ -1,25 +1,25 @@ -info("OptnWindow", "Restoring settings..."); - -if (require('@electron/remote').getCurrentWindow().music) { - if (location.search === "?credits") { - require('electron').ipcRenderer.send('newmusic', kresources.music['title'].file); - } - document.getElementById("setting-music").innerText = "1"; -} else { - document.getElementById("setting-music").innerText = "0"; -} - -if (require('fs').readFileSync(homedir + "/.kartik/config/voice.txt").toString() === "2") { - document.getElementById("setting-voice").innerText = "1"; -} else { - document.getElementById("setting-voice").innerText = "0"; -} - -slang = require('@electron/remote').getCurrentWindow().lp; -langs = require('../lang/languages.json'); - -if (Object.keys(langs).includes(slang)) { - document.getElementById("setting-lang").innerText = langs[slang]; -} else { - document.getElementById("setting-lang").innerText = slang; -} +info("OptnWindow", "Restoring settings...");
+
+if (require('@electron/remote').getCurrentWindow().music) {
+ if (location.search === "?credits") {
+ require('electron').ipcRenderer.send('newmusic', kresources.music['title'].file);
+ }
+ document.getElementById("setting-music").innerText = "1";
+} else {
+ document.getElementById("setting-music").innerText = "0";
+}
+
+if (currentNest.config.voice === true) {
+ document.getElementById("setting-voice").innerText = "1";
+} else {
+ document.getElementById("setting-voice").innerText = "0";
+}
+
+slang = require('@electron/remote').getCurrentWindow().lp;
+langs = require('../lang/languages.json');
+
+if (Object.keys(langs).includes(slang)) {
+ document.getElementById("setting-lang").innerText = langs[slang];
+} else {
+ document.getElementById("setting-lang").innerText = slang;
+}
diff --git a/views/settings.html b/views/settings.html index 1759d25..9fa0b5a 100644 --- a/views/settings.html +++ b/views/settings.html @@ -1,70 +1,70 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};</script> - <script src="../lang/loader.js"></script> - <script src="../scenario/client.js"></script> - <meta charset="UTF-8"> - <link rel="stylesheet" href="common/fonts.css"> - <link rel="stylesheet" href="common/blur.css"> - <link rel="stylesheet" href="menu.css"> - <title>Kartik</title> - <script src="../crash/client.js"></script> - <script src="./script/global_compatlayer.js"></script> - <script src="../sfx/sfx.js"></script> - <script> - if (!require('@electron/remote').getCurrentWindow().debug) { - document.write('<link rel="stylesheet" href="common/mouse.css">'); - } - </script> - <script> - require('@electron/remote').getCurrentWindow().dstate = lang.discord.settings[0]; - require('@electron/remote').getCurrentWindow().ddetails = lang.discord.settings[1]; - homedir = require('@electron/remote').getCurrentWindow().homedir; - </script> -</head> -<body> - <script>info("MainWindow", "Rendering initial frame..."); - - if (native) { - scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale; - } - - </script> - <div id="box" style="display: none;background:#222;position:fixed;top:0;left:0;right:0;bottom:0;"> - <div style="width: 100%;height: 192px;background: #00538e;background-image: url('./background.jpg');background-size: cover;position: fixed;z-index: -1;"><h2 style="margin: 0;padding: 50px;font-size: 48px;color: white;"><script>document.write(lang.settings.title)</script></h2></div> - - <div class="services services-settings"> - <div class="items"> - <ul> - <li class="selected"><span class="item" style="width: calc(100% - 150px);"><a href="#" id="back"><img class="item-icon" src="../icons/back.svg"> <script>document.write(lang.settings.back)</script></a></span></li> - <li><span class="item" style="width: calc(100% - 150px);"><a href="#" id="lang"><img class="item-icon" src="../icons/language.svg"> <script>document.write(lang.settings.lang)</script> [Language]<span class="setting-status"><span id="setting-lang">Français</span></span></a></span></li> - <li><span class="item" style="width: calc(100% - 150px);"><a href="#" id="musicb"><img class="item-icon" src="../icons/music.svg"> <script>document.write(lang.settings.music)</script><span class="setting-status"><span id="setting-music"><script>document.write(lang.settings.yes)</script></span></span></a></span></li> - <li><span class="item" style="width: calc(100% - 150px);"><a href="#" id="voice"><img class="item-icon" src="../icons/scenario.svg"> <script>document.write(lang.settings.voice)</script><span class="setting-status"><span id="setting-voice"><script>document.write(lang.settings.yes)</script></span></span></a></span></li> - <li><span class="item" style="width: calc(100% - 150px);"><a href="#" id="credits"><img class="item-icon" src="../icons/credits.svg"> <script>document.write(lang.menu.titles[3])</script></a></span></li> - </ul> - </div> - </div> - - <span id="notice"> - <script> - document.write(lang.settings.notice); - - if (require('@electron/remote').getCurrentWindow().mods.length > 0) { - document.write("<br><br>"); - if (require('@electron/remote').getCurrentWindow().mods.length > 1) { - document.write(require('@electron/remote').getCurrentWindow().mods.length + " mods loaded"); - } else { - document.write("1 mod loaded"); - } - } - </script> - </span> - </div> - - <script src="./script/settings_load.js"></script> -<script>info("OptnWindow", "Menu opened");</script> -</body> -<script src="./script/settings_global.js"></script> -<script src="./script/client_fullscreen.js"></script> -</html> +<!DOCTYPE html>
+<html lang="en">
+<head>
+ <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};const Nest = require("../nest/abi");currentNest = require('@electron/remote').getCurrentWindow().nest;</script>
+ <script src="../lang/loader.js"></script>
+ <script src="../scenario/client.js"></script>
+ <meta charset="UTF-8">
+ <link rel="stylesheet" href="common/fonts.css">
+ <link rel="stylesheet" href="common/blur.css">
+ <link rel="stylesheet" href="menu.css">
+ <title>Kartik</title>
+ <script src="../crash/client.js"></script>
+ <script src="./script/global_compatlayer.js"></script><script src="../typescript/mainloader.js"></script>
+ <script src="../sfx/sfx.js"></script>
+ <script>
+ if (!require('@electron/remote').getCurrentWindow().debug) {
+ document.write('<link rel="stylesheet" href="common/mouse.css">');
+ }
+ </script>
+ <script>
+ require('@electron/remote').getCurrentWindow().dstate = lang.discord.settings[0];
+ require('@electron/remote').getCurrentWindow().ddetails = lang.discord.settings[1];
+ homedir = require('@electron/remote').getCurrentWindow().homedir;
+ </script>
+</head>
+<body>
+ <script>info("MainWindow", "Rendering initial frame...");
+
+ if (native) {
+ scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale;
+ }
+
+ </script>
+ <div id="box" style="display: none;background:#222;position:fixed;top:0;left:0;right:0;bottom:0;">
+ <div style="color:black;width: 100%;height: 192px;background: #00538e;background-image: url('./background.jpg');background-size: cover;position: fixed;z-index: -1;"><h2 style="margin: 0;padding: 50px;font-size: 48px;color: black;"><script>document.write(lang.settings.title)</script></h2></div>
+
+ <div class="services services-settings">
+ <div class="items">
+ <ul>
+ <li class="selected"><span class="item" style="width: calc(100% - 150px);"><a href="#" id="back"><img class="item-icon" src="../icons/back.svg"> <script>document.write(lang.settings.back)</script></a></span></li>
+ <li><span class="item" style="width: calc(100% - 150px);"><a href="#" id="lang"><img class="item-icon" src="../icons/language.svg"> <script>document.write(lang.settings.lang)</script> [Language]<span class="setting-status"><span id="setting-lang">Français</span></span></a></span></li>
+ <li><span class="item" style="width: calc(100% - 150px);"><a href="#" id="musicb"><img class="item-icon" src="../icons/music.svg"> <script>document.write(lang.settings.music)</script><span class="setting-status"><span id="setting-music"><script>document.write(lang.settings.yes)</script></span></span></a></span></li>
+ <li><span class="item" style="width: calc(100% - 150px);"><a href="#" id="voice"><img class="item-icon" src="../icons/scenario.svg"> <script>document.write(lang.settings.voice)</script><span class="setting-status"><span id="setting-voice"><script>document.write(lang.settings.yes)</script></span></span></a></span></li>
+ <li><span class="item" style="width: calc(100% - 150px);"><a href="#" id="credits"><img class="item-icon" src="../icons/credits.svg"> <script>document.write(lang.menu.titles[3])</script></a></span></li>
+ </ul>
+ </div>
+ </div>
+
+ <span id="notice" style="color:black;">
+ <script>
+ document.write(lang.settings.notice);
+
+ if (require('@electron/remote').getCurrentWindow().mods.length > 0) {
+ document.write("<br><br>");
+ if (require('@electron/remote').getCurrentWindow().mods.length > 1) {
+ document.write(require('@electron/remote').getCurrentWindow().mods.length + " mods loaded");
+ } else {
+ document.write("1 mod loaded");
+ }
+ }
+ </script>
+ </span>
+ </div>
+
+ <script src="./script/settings_load.js"></script>
+<script>info("OptnWindow", "Menu opened");</script>
+</body>
+<script src="./script/settings_global.js"></script>
+<script src="./script/client_fullscreen.js"></script>
+</html>
diff --git a/views/stats.html b/views/stats.html index dcb4275..c80004d 100644 --- a/views/stats.html +++ b/views/stats.html @@ -1,70 +1,70 @@ -<!DOCTYPE html> -<html lang="en" style="background:#000000;margin:0;height:100%;width:100%;"> -<head> - <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};</script> - <script src="../lang/loader.js"></script> - <script src="../scenario/client.js"></script> - <meta charset="UTF-8"> - <title>Kartik</title> - <link rel="stylesheet" href="common/fonts.css"> - <link rel="stylesheet" href="common/blur.css"> - <script src="../crash/client.js"></script> - <script src="./script/global_compatlayer.js"></script> - <script src="../sfx/sfx.js"></script> - <script> - if (!require('@electron/remote').getCurrentWindow().debug) { - document.write('<link rel="stylesheet" href="common/mouse.css">'); - } - </script> - <script src="./script/win_play.js"></script> -</head> -<body style="background:#000000;margin:0;height:100%;width:100%;color:white;"> - <script>info("MainWindow", "Rendering initial frame..."); - - if (native) { - scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale; - } - - </script> - <div id="box" style="display: none;background:#222;position:fixed;top:0;left:0;right:0;bottom:0;"> - <div style="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;"> - <div style="text-align: center;"> - <h2><script>const homedir = require('@electron/remote').getCurrentWindow().homedir;document.write(lang.stats.title);stats=require(homedir + "/.kartik/stats.json")</script></h2> - - <div style="display:grid;grid-template-columns: 1fr 1fr;"> - <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['times.single'])</script></b></div> - <div style="padding:10px;text-align:right;"><script>document.write(new Date(stats.times.single * 1000).toISOString().substr(11, 8))</script></div> - - <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['times.local'])</script></b></div> - <div style="padding:10px;text-align:right;"><script>document.write(new Date(stats.times.local * 1000).toISOString().substr(11, 8))</script></div> - - <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['times.online'])</script></b></div> - <div style="padding:10px;text-align:right;"><script>document.write(new Date(stats.times.online * 1000).toISOString().substr(11, 8))</script></div> - - <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['results.wins'])</script></b></div> - <div style="padding:10px;text-align:right;"><script>document.write(stats.results.wins)</script></div> - - <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['results.loses'])</script></b></div> - <div style="padding:10px;text-align:right;"><script>document.write(stats.results.loses)</script></div> - - <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['ingame.walls'])</script></b></div> - <div style="padding:10px;text-align:right;"><script>document.write(stats.ingame.walls)</script></div> - - <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['ingame.laps'])</script></b></div> - <div style="padding:10px;text-align:right;"><script>document.write(stats.ingame.laps)</script></div> - - <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['ingame.turns'])</script></b></div> - <div style="padding:10px;text-align:right;"><script>document.write(stats.ingame.turns)</script></div> - </div> - - <p><script>document.write(lang.win.quit[0])</script></p> - </div> - </div> - </div> - - <script src="./script/win_music.js"></script> - - <script src="./script/win_global.js"></script> - <script src="./script/client_fullscreen.js"></script> -</body> -</html> +<!DOCTYPE html>
+<html lang="en" style="background:#000000;margin:0;height:100%;width:100%;">
+<head>
+ <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};const Nest = require("../nest/abi");currentNest = require('@electron/remote').getCurrentWindow().nest;</script>
+ <script src="../lang/loader.js"></script>
+ <script src="../scenario/client.js"></script>
+ <meta charset="UTF-8">
+ <title>Kartik</title>
+ <link rel="stylesheet" href="common/fonts.css">
+ <link rel="stylesheet" href="common/blur.css">
+ <script src="../crash/client.js"></script>
+ <script src="./script/global_compatlayer.js"></script><script src="../typescript/mainloader.js"></script>
+ <script src="../sfx/sfx.js"></script>
+ <script>
+ if (!require('@electron/remote').getCurrentWindow().debug) {
+ document.write('<link rel="stylesheet" href="common/mouse.css">');
+ }
+ </script>
+ <script src="./script/win_play.js"></script>
+</head>
+<body style="background:#000000;margin:0;height:100%;width:100%;color:white;">
+ <script>info("MainWindow", "Rendering initial frame...");
+
+ if (native) {
+ scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale;
+ }
+
+ </script>
+ <div id="box" style="display: none;background:#222;position:fixed;top:0;left:0;right:0;bottom:0;">
+ <div style="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;">
+ <div style="text-align: center;">
+ <h2><script>let homedir = require('@electron/remote').getCurrentWindow().homedir;document.write(lang.stats.title);stats=currentNest.stats</script></h2>
+
+ <div style="display:grid;grid-template-columns: 1fr 1fr;">
+ <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['times.single'])</script></b></div>
+ <div style="padding:10px;text-align:right;"><script>document.write(new Date(stats.times.single * 1000).toISOString().substr(11, 8))</script></div>
+
+ <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['times.local'])</script></b></div>
+ <div style="padding:10px;text-align:right;"><script>document.write(new Date(stats.times.local * 1000).toISOString().substr(11, 8))</script></div>
+
+ <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['times.online'])</script></b></div>
+ <div style="padding:10px;text-align:right;"><script>document.write(new Date(stats.times.online * 1000).toISOString().substr(11, 8))</script></div>
+
+ <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['results.wins'])</script></b></div>
+ <div style="padding:10px;text-align:right;"><script>document.write(stats.results.wins)</script></div>
+
+ <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['results.loses'])</script></b></div>
+ <div style="padding:10px;text-align:right;"><script>document.write(stats.results.loses)</script></div>
+
+ <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['ingame.walls'])</script></b></div>
+ <div style="padding:10px;text-align:right;"><script>document.write(stats.ingame.walls)</script></div>
+
+ <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['ingame.laps'])</script></b></div>
+ <div style="padding:10px;text-align:right;"><script>document.write(stats.ingame.laps)</script></div>
+
+ <div style="padding:10px;text-align:left;"><b><script>document.write(lang.stats.items['ingame.turns'])</script></b></div>
+ <div style="padding:10px;text-align:right;"><script>document.write(stats.ingame.turns)</script></div>
+ </div>
+
+ <p><script>document.write(lang.win.quit[0])</script></p>
+ </div>
+ </div>
+ </div>
+
+ <script src="./script/win_music.js"></script>
+
+ <script src="./script/win_global.js"></script>
+ <script src="./script/client_fullscreen.js"></script>
+</body>
+</html>
diff --git a/views/win.html b/views/win.html index a3cdfb5..f09f598 100644 --- a/views/win.html +++ b/views/win.html @@ -1,44 +1,44 @@ -<!DOCTYPE html> -<html lang="en" style="background:#000000;margin:0;height:100%;width:100%;"> -<head> - <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};</script> - <script src="../lang/loader.js"></script> - <script src="../scenario/client.js"></script> - <meta charset="UTF-8"> - <title>Kartik</title> - <link rel="stylesheet" href="common/fonts.css"> - <link rel="stylesheet" href="common/blur.css"> - <script src="../crash/client.js"></script> - <script src="./script/global_compatlayer.js"></script> - <script src="../sfx/sfx.js"></script> - <script> - if (!require('@electron/remote').getCurrentWindow().debug) { - document.write('<link rel="stylesheet" href="common/mouse.css">'); - } - </script> - <script src="./script/win_play.js"></script> -</head> -<body style="background:#000000;margin:0;height:100%;width:100%;color:white;"> - <script>info("MainWindow", "Rendering initial frame..."); - - if (native) { - scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale; - } - - </script> - <div id="box" style="display: none;background:#222;position:fixed;top:0;left:0;right:0;bottom:0;"> - <div style="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;"> - <div style="text-align: center;"> - <p style="font-size:36px;"><script src="./script/win_message.js"></script></p> - <p style="font-size:16px;" id="progress"><script>document.write(lang.win.quit[0])</script></p> - <script src="./script/win_quit.js"></script> - </div> - </div> - </div> - - <script src="./script/win_music.js"></script> - - <script src="./script/win_global.js"></script> - <script src="./script/client_fullscreen.js"></script> -</body> -</html> +<!DOCTYPE html>
+<html lang="en" style="background:#000000;margin:0;height:100%;width:100%;">
+<head>
+ <script>if (typeof require !== "undefined") {native = true;try{global.native = true;}catch(e){}} else {native = false;try{global.native = false;}catch(e){}}if (!native){global = window;}if (native){kresources=require('@electron/remote').getCurrentWindow().resources;trackEvent=require('@electron/remote').getCurrentWindow().trackEvent;}info=(_a,b)=>{console.info(b);};warn=(_a,b)=>{console.warn(b);};error=(_a,b)=>{console.error(b);};const Nest = require("../nest/abi");currentNest = require('@electron/remote').getCurrentWindow().nest;</script>
+ <script src="../lang/loader.js"></script>
+ <script src="../scenario/client.js"></script>
+ <meta charset="UTF-8">
+ <title>Kartik</title>
+ <link rel="stylesheet" href="common/fonts.css">
+ <link rel="stylesheet" href="common/blur.css">
+ <script src="../crash/client.js"></script>
+ <script src="./script/global_compatlayer.js"></script><script src="../typescript/mainloader.js"></script>
+ <script src="../sfx/sfx.js"></script>
+ <script>
+ if (!require('@electron/remote').getCurrentWindow().debug) {
+ document.write('<link rel="stylesheet" href="common/mouse.css">');
+ }
+ </script>
+ <script src="./script/win_play.js"></script>
+</head>
+<body style="background:#000000;margin:0;height:100%;width:100%;color:white;">
+ <script>info("MainWindow", "Rendering initial frame...");
+
+ if (native) {
+ scale=require('@electron/remote').getCurrentWindow().scale;document.body.style.zoom=scale;
+ }
+
+ </script>
+ <div id="box" style="display: none;background:#222;position:fixed;top:0;left:0;right:0;bottom:0;">
+ <div style="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;">
+ <div style="text-align: center;">
+ <p style="font-size:36px;"><script src="./script/win_message.js"></script></p>
+ <p style="font-size:16px;" id="progress"><script>document.write(lang.win.quit[0])</script></p>
+ <script src="./script/win_quit.js"></script>
+ </div>
+ </div>
+ </div>
+
+ <script src="./script/win_music.js"></script>
+
+ <script src="./script/win_global.js"></script>
+ <script src="./script/client_fullscreen.js"></script>
+</body>
+</html>
|