aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/game.gd7
-rw-r--r--client/gui/menus/main/about.gd6
-rw-r--r--client/gui/menus/menu.gd2
-rw-r--r--client/gui/overlays/controls_visualization/arrow.svg9
-rw-r--r--client/gui/overlays/controls_visualization/arrow.svg.import43
-rw-r--r--client/gui/overlays/controls_visualization/controller/controller.svg309
-rw-r--r--client/gui/overlays/controls_visualization/controller/controller.svg.import43
-rw-r--r--client/gui/overlays/controls_visualization/controller/controller_explanation.gd45
-rw-r--r--client/gui/overlays/controls_visualization/controller/controller_explanation.gd.uid1
-rw-r--r--client/gui/overlays/controls_visualization/controller/controller_explanation.tscn126
-rw-r--r--client/gui/overlays/controls_visualization/device_explanation.gd20
-rw-r--r--client/gui/overlays/controls_visualization/device_explanation.gd.uid1
-rw-r--r--client/gui/overlays/controls_visualization/explanation.gd39
-rw-r--r--client/gui/overlays/controls_visualization/explanation.gd.uid1
-rw-r--r--client/gui/overlays/controls_visualization/explanation.tscn68
-rw-r--r--client/gui/overlays/controls_visualization/keyboard/keyboard_button.tscn33
-rw-r--r--client/gui/overlays/controls_visualization/keyboard/keyboard_explanation.gd46
-rw-r--r--client/gui/overlays/controls_visualization/keyboard/keyboard_explanation.gd.uid1
-rw-r--r--client/gui/overlays/controls_visualization/keyboard/keyboard_explanation.tscn249
-rw-r--r--client/gui/resources/fonts/sansita-swashed-bold.tres9
-rw-r--r--client/multiplayer.gd5
-rw-r--r--client/system/profile.gd4
-rw-r--r--locale/en.ini34
23 files changed, 1084 insertions, 17 deletions
diff --git a/client/game.gd b/client/game.gd
index 89a68be5..efb75c9f 100644
--- a/client/game.gd
+++ b/client/game.gd
@@ -299,6 +299,13 @@ func handle_packet(p):
toggle_join()
elif not is_replay:
menu.submenu("res://gui/menus/ingame.tscn")
+ elif not in_lobby and not is_replay and not Global.using_touch and p.state:
+ if Global.hand_count == 1 and not Profile.read("controls_one_handed_explained"):
+ menu.submenu("res://gui/overlays/controls_visualization/explanation.tscn", false)
+ elif Global.hand_count == 2 and not Profile.read("controls_two_handed_explained"):
+ menu.submenu("res://gui/overlays/controls_visualization/explanation.tscn", true)
+ else:
+ mp.send_ready()
"score":
if p.time_remaining != null:
overlay_score.update(p.demands_failed, p.demands_completed, p.points, p.time_remaining)
diff --git a/client/gui/menus/main/about.gd b/client/gui/menus/main/about.gd
index 56887203..95f98d30 100644
--- a/client/gui/menus/main/about.gd
+++ b/client/gui/menus/main/about.gd
@@ -61,6 +61,10 @@ var credits := [
["Dillon Becker", "Super Dialogue Audio Pack V1", cc_by_4],
["Ekrcoaster", "Water steaming on hot surface #2", cc0]
]],
+ [tr("c.credits.other"), [
+ ["Ray Trace", "Nintendo_Switch_Pro_Controller.svg", cc_by_4],
+ ["Amousey", "Curved solid arrow.svg", cc0]
+ ]],
[tr("c.credits.translations"), {
tr("c.settings.ui.language.zh_Hans"): ["Outbreak2096"],
tr("c.settings.ui.language.zh_Hant"): ["hugoalh"],
@@ -117,7 +121,7 @@ func credits_text() -> String:
func legal_text() -> String:
var all: Array[String] = []
var translators: Array[String] = []
- for c in credits[2][1].values():
+ for c in credits[3][1].values():
translators.append_array(c)
translators.shuffle()
authors.shuffle()
diff --git a/client/gui/menus/menu.gd b/client/gui/menus/menu.gd
index e1dc8929..e0d5472a 100644
--- a/client/gui/menus/menu.gd
+++ b/client/gui/menus/menu.gd
@@ -109,7 +109,7 @@ func focus_first(node: Node) -> bool:
focus_auto_changed = true
if node.is_in_group("no_auto_focus"):
return false
- if node is Button or node.is_in_group("autoselect"):
+ if (node is Button and not node.focus_mode == FocusMode.FOCUS_NONE) or node.is_in_group("autoselect"):
node.grab_focus()
# print("Node %s (%s) was selected for focus" % [node.name, node])
return true
diff --git a/client/gui/overlays/controls_visualization/arrow.svg b/client/gui/overlays/controls_visualization/arrow.svg
new file mode 100644
index 00000000..d4fda2c4
--- /dev/null
+++ b/client/gui/overlays/controls_visualization/arrow.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Created with Vectornator (http://vectornator.io/) -->
+<svg height="100%" stroke-miterlimit="10" style="fill-rule:nonzero;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;" version="1.1" viewBox="0 0 140 250" width="100%" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<defs/>
+<g id="left-arrow">
+<path d="M106.261 4.94909C108.864 5.03812 111.083 5.13379 112.984 5.23608C114.885 5.33838 116.467 5.44731 117.794 5.56287C119.12 5.67844 120.191 5.80063 121.07 5.92946C121.95 6.05829 122.637 6.19375 123.195 6.33584C123.754 6.47794 124.184 6.62666 124.549 6.78202C124.915 6.93738 125.215 7.09937 125.513 7.268C125.927 7.75769 126.327 8.25192 126.712 8.75071C127.097 9.2495 127.469 9.75284 127.826 10.2607C128.183 10.7686 128.526 11.2811 128.855 11.7981C129.184 12.315 129.498 12.8366 129.799 13.3627C130.1 13.8888 130.386 14.4194 130.659 14.9546C130.931 15.4898 131.189 16.0296 131.433 16.5739C131.678 17.1182 131.908 17.667 132.124 18.2204C132.34 18.7738 132.541 19.3317 132.729 19.8942C132.917 20.4567 133.09 21.0238 133.25 21.5954C133.409 22.167 133.555 22.7432 133.686 23.3239C133.817 23.9046 133.934 24.4898 134.037 25.0796C134.14 25.6694 134.229 26.2638 134.303 26.8627C134.378 27.4616 134.439 28.0651 134.485 28.6731C134.532 29.2811 134.564 29.8936 134.582 30.5107C134.601 31.1278 134.605 31.7495 134.595 32.3757C134.585 33.0019 134.561 33.6327 134.522 34.268C133.418 36.0663 132.329 37.8701 131.257 39.6793C130.185 41.4885 129.129 43.3031 128.089 45.1232C127.049 46.9433 126.026 48.7688 125.019 50.5997C124.011 52.4307 123.02 54.2671 122.046 56.109C121.071 57.9508 120.113 59.7981 119.171 61.6509C118.228 63.5036 117.303 65.3618 116.393 67.2254C115.483 69.089 114.59 70.9581 113.713 72.8326C112.836 74.7071 111.975 76.5871 111.13 78.4725C110.286 80.3579 109.457 82.2488 108.645 84.1451C107.833 86.0414 107.037 87.9431 106.258 89.8503C105.478 91.7575 104.715 93.6701 103.968 95.5882C103.221 97.5063 102.49 99.4298 101.775 101.359C101.061 103.288 100.363 105.222 99.6806 107.162C98.9986 109.102 98.3329 111.047 97.6834 112.998C97.0339 114.949 96.4007 116.905 95.7837 118.867C95.1668 120.828 94.5661 122.795 93.9817 124.768C93.3592 124.132 92.7594 123.488 92.1822 122.836C91.605 122.184 91.0504 121.524 90.5184 120.857C89.9864 120.19 89.477 119.515 88.9902 118.832C88.5035 118.149 88.0393 117.458 87.5977 116.76C87.1562 116.062 86.7373 115.355 86.3409 114.642C85.9446 113.928 85.5709 113.206 85.2197 112.477C84.8686 111.747 84.5401 111.01 84.2342 110.265C83.9284 109.52 83.6451 108.768 83.3844 108.007C83.1237 107.247 82.8857 106.479 82.6702 105.703C82.4548 104.927 82.2619 104.143 82.0917 103.352C81.9215 102.56 81.7739 101.761 81.6489 100.954C81.5239 100.147 81.4215 99.3323 81.3417 98.5098C81.2619 97.6873 81.2048 96.8571 81.1702 96.0191C81.1357 95.1812 81.1237 94.3354 81.1344 93.482C81.1451 92.6285 81.1784 91.7672 81.2343 90.8982C81.2902 90.0293 81.3687 89.1525 81.4698 88.268L81.8761 86.6511L82.2824 85.0342L82.7066 83.424L83.1309 81.8137L83.5731 80.21L84.0153 78.6064L84.4755 77.0093L84.9356 75.4123L85.4138 73.8218L85.8919 72.2314L86.3881 70.6475L86.8842 69.0637L87.3983 67.4865L87.9125 65.9092L88.4446 64.3386L88.9767 62.768L88.9141 62.6743L88.8516 62.5805L88.789 62.4868L88.7265 62.393L88.6639 62.2993L88.6013 62.2055L88.5388 62.1118L88.4762 62.018L88.4137 61.9243L88.3511 61.8305L88.2885 61.7368L88.226 61.643L88.1634 61.5493L88.1008 61.4555L88.0383 61.3618L87.9757 61.268C87.2289 61.7536 86.489 62.2465 85.7561 62.7469C85.0231 63.2473 84.2971 63.7551 83.578 64.2703C82.8589 64.7856 82.1467 65.3082 81.4415 65.8382C80.7362 66.3683 80.0379 66.9057 79.3465 67.4506C78.6551 67.9955 77.9706 68.5478 77.293 69.1075C76.6155 69.6672 75.9448 70.2343 75.2811 70.8088C74.6174 71.3833 73.9606 71.9652 73.3107 72.5546C72.6609 73.1439 72.0179 73.7407 71.3819 74.3449C70.7459 74.949 70.1168 75.5606 69.4946 76.1796C68.8724 76.7986 68.2571 77.425 67.6488 78.0588C67.0405 78.6927 66.439 79.3339 65.8445 79.9825C65.25 80.6312 64.6625 81.2872 64.0818 81.9507C63.5011 82.6142 62.9274 83.285 62.3606 83.9633C61.7938 84.6416 61.2339 85.3273 60.6809 86.0204C60.1279 86.7135 59.5818 87.4141 59.0427 88.122C58.5036 88.8299 57.9713 89.5453 57.446 90.268C55.263 93.0438 53.1885 95.8362 51.2223 98.6453C49.2561 101.454 47.3984 104.28 45.6491 107.122C43.8997 109.965 42.2588 112.823 40.7263 115.699C39.1938 118.574 37.7696 121.466 36.454 124.375C35.1383 127.284 33.931 130.209 32.8321 133.151C31.7332 136.093 30.7428 139.052 29.8607 142.027C28.9787 145.002 28.2051 147.994 27.5399 151.002C26.8746 154.011 26.3178 157.036 25.8694 160.077C25.4211 163.119 25.0811 166.177 24.8495 169.252C24.618 172.327 24.4948 175.419 24.4801 178.527C24.4654 181.635 24.5591 184.76 24.7612 187.901C24.9633 191.042 25.2738 194.2 25.6928 197.375C26.1117 200.55 26.6391 203.741 27.2749 206.949C27.9107 210.157 28.6549 213.381 29.5075 216.622C30.3601 219.863 31.3211 223.121 32.3906 226.395C33.4601 229.669 34.6379 232.96 35.9242 236.268C35.8276 236.39 35.7292 236.506 35.629 236.616C35.5288 236.726 35.4269 236.831 35.3231 236.93C35.2194 237.029 35.1138 237.122 35.0065 237.21C34.8992 237.298 34.7901 237.38 34.6792 237.456C34.5684 237.533 34.4557 237.604 34.3413 237.669C34.2268 237.734 34.1106 237.793 33.9926 237.847C33.8746 237.901 33.7548 237.949 33.6333 237.992C33.5117 238.034 33.3884 238.071 33.2633 238.102C33.1381 238.134 33.0112 238.159 32.8825 238.179C32.7539 238.199 32.6234 238.214 32.4911 238.222C32.3589 238.231 32.2249 238.234 32.089 238.231C31.9532 238.229 31.8156 238.22 31.6763 238.206C31.5369 238.192 31.3957 238.173 31.2528 238.148C31.1099 238.122 30.9651 238.091 30.8186 238.055C30.6722 238.018 30.5239 237.976 30.3738 237.928C30.2237 237.881 30.0719 237.827 29.9183 237.768C29.2053 237.167 28.5088 236.555 27.8289 235.934C27.149 235.313 26.4856 234.682 25.8388 234.04C25.1919 233.399 24.5616 232.748 23.9478 232.087C23.334 231.426 22.7368 230.755 22.1561 230.074C21.5754 229.394 21.0113 228.703 20.4636 228.002C19.916 227.301 19.3849 226.591 18.8704 225.87C18.3559 225.149 17.8579 224.419 17.3764 223.678C16.895 222.938 16.43 222.187 15.9817 221.427C15.5333 220.666 15.1015 219.896 14.6862 219.116C14.2709 218.335 13.8722 217.545 13.49 216.745C13.1078 215.945 12.7421 215.135 12.393 214.315C12.0439 213.495 11.7114 212.665 11.3953 211.825C11.0793 210.985 10.7799 210.135 10.4969 209.275C10.214 208.415 9.94765 207.545 9.69783 206.666C9.44801 205.786 9.21473 204.896 8.99801 203.997C8.78129 203.097 8.58111 202.188 8.39749 201.268C7.93568 199.215 7.50925 197.164 7.1182 195.114C6.72715 193.065 6.37148 191.018 6.05119 188.973C5.7309 186.928 5.44598 184.884 5.19645 182.843C4.94691 180.802 4.73276 178.763 4.55398 176.726C4.37521 174.689 4.23181 172.654 4.1238 170.621C4.01578 168.588 3.94314 166.557 3.90589 164.528C3.86863 162.499 3.86675 160.472 3.90026 158.447C3.93376 156.422 4.00265 154.4 4.10691 152.379C4.21118 150.358 4.35082 148.339 4.52585 146.322C4.70087 144.306 4.91128 142.291 5.15707 140.278C5.40285 138.265 5.68402 136.255 6.00057 134.246C6.31712 132.237 6.66905 130.231 7.05637 128.226C7.44368 126.221 7.86637 124.219 8.32445 122.218C8.78253 120.218 9.27598 118.219 9.80482 116.223C10.3337 114.226 10.8979 112.232 11.4975 110.239C12.0971 108.247 12.7321 106.256 13.4024 104.268C13.7517 103.465 14.1078 102.667 14.4707 101.873C14.8337 101.079 15.2034 100.29 15.5801 99.5057C15.9567 98.7212 16.3401 97.9414 16.7305 97.1661C17.1208 96.3909 17.5179 95.6202 17.9219 94.8542C18.3259 94.0881 18.7368 93.3267 19.1545 92.5699C19.5722 91.8131 19.9967 91.0609 20.4281 90.3133C20.8595 89.5657 21.2977 88.8227 21.7428 88.0843C22.1879 87.3459 22.6398 86.6122 23.0986 85.883C23.5574 85.1538 24.023 84.4293 24.4955 83.7094C24.9679 82.9894 25.4473 82.2741 25.9334 81.5634C26.4196 80.8527 26.9126 80.1465 27.4125 79.445C27.9124 78.7435 28.4191 78.0466 28.9326 77.3543C29.4462 76.6621 29.9666 75.9744 30.4939 75.2913C31.0212 74.6082 31.5553 73.9298 32.0962 73.2559C32.6372 72.582 33.185 71.9128 33.7397 71.2481C34.2944 70.5835 34.8559 69.9234 35.4242 69.268L37.6902 67.1133L39.9562 64.9585L42.2221 62.8037L44.4881 60.649L46.7657 58.5141L49.0434 56.3792L51.321 54.2443L53.5987 52.1094L55.888 49.9943L58.1773 47.8792L60.4667 45.7642L62.756 43.6491L65.057 41.5538L67.3579 39.4585L69.6589 37.3633L71.9599 35.268L71.1528 35.1204L70.3456 34.9729L69.5367 34.8407L68.7278 34.7085L67.9171 34.5917L67.1065 34.4749L66.294 34.3734L65.4816 34.272L64.6674 34.1859L63.8532 34.0999L63.0372 34.0292L62.2213 33.9585L61.4036 33.9032L60.5859 33.8479L59.7664 33.8079L58.947 33.768C58.6863 33.6743 58.4309 33.5753 58.1806 33.4711C57.9303 33.367 57.6853 33.2576 57.4455 33.143C57.2057 33.0284 56.971 32.9087 56.7416 32.7837C56.5122 32.6587 56.2881 32.5285 56.0691 32.3931C55.8501 32.2576 55.6364 32.117 55.4278 31.9712C55.2193 31.8254 55.016 31.6743 54.8179 31.5181C54.6198 31.3618 54.4269 31.2004 54.2392 31.0337C54.0515 30.8671 53.8691 30.6952 53.6918 30.5181C53.5146 30.341 53.3425 30.1588 53.1757 29.9713C53.0089 29.7838 52.8473 29.5911 52.6909 29.3931C52.5345 29.1952 52.3833 28.9921 52.2374 28.7838C52.0914 28.5754 51.9507 28.3619 51.8151 28.1431C51.6796 27.9244 51.5493 27.7004 51.4242 27.4713C51.2991 27.2421 51.1792 27.0077 51.0645 26.7681C50.9499 26.5285 50.8404 26.2837 50.7362 26.0337C50.6319 25.7837 50.5329 25.5284 50.4391 25.268C50.3172 25.0099 50.1983 24.7511 50.0825 24.4914C49.9666 24.2318 49.8539 23.9713 49.7441 23.71C49.6344 23.4488 49.5278 23.1867 49.4242 22.9238C49.3206 22.661 49.22 22.3973 49.1225 22.1328C49.025 21.8684 48.9306 21.6031 48.8392 21.3371C48.7479 21.071 48.6596 20.8042 48.5743 20.5365C48.489 20.2688 48.4068 20.0004 48.3277 19.7311C48.2486 19.4619 48.1725 19.1918 48.0995 18.921C48.0265 18.6502 47.9565 18.3785 47.8896 18.1061C47.8227 17.8336 47.7589 17.5604 47.6981 17.2864C47.6374 17.0124 47.5796 16.7375 47.525 16.4619C47.4704 16.1863 47.4188 15.9099 47.3703 15.6327C47.3217 15.3554 47.2763 15.0774 47.2339 14.7986C47.1915 14.5198 47.1522 14.2402 47.1159 13.9599C47.0796 13.6795 47.0464 13.3983 47.0163 13.1163C46.9862 12.8343 46.9591 12.5516 46.9351 12.268L50.9226 11.9576L54.9101 11.6472L58.8844 11.2827L62.8588 10.9182L66.8199 10.4995L70.7811 10.0808L74.7291 9.60788L78.6771 9.135L82.6119 8.60794L86.5467 8.08087L90.4683 7.49961L94.39 6.91834L98.2985 6.28287L102.207 5.64739L106.102 4.9577C106.102 4.9577 103.659 4.86006 106.261 4.94909Z" fill="#ffffff" fill-rule="evenodd" opacity="1" stroke="none"/>
+</g>
+</svg>
diff --git a/client/gui/overlays/controls_visualization/arrow.svg.import b/client/gui/overlays/controls_visualization/arrow.svg.import
new file mode 100644
index 00000000..3d0a0c76
--- /dev/null
+++ b/client/gui/overlays/controls_visualization/arrow.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cf8hrxilqe2ih"
+path="res://.godot/imported/arrow.svg-94e1ee2c28cf422e8623ba865fb0f77b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://gui/overlays/controls_visualization/arrow.svg"
+dest_files=["res://.godot/imported/arrow.svg-94e1ee2c28cf422e8623ba865fb0f77b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/client/gui/overlays/controls_visualization/controller/controller.svg b/client/gui/overlays/controls_visualization/controller/controller.svg
new file mode 100644
index 00000000..ad616301
--- /dev/null
+++ b/client/gui/overlays/controls_visualization/controller/controller.svg
@@ -0,0 +1,309 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ height="1003px"
+ viewBox="0 0 38.107548 26.544682"
+ width="1440px"
+ version="1.1"
+ id="svg62"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <defs
+ id="defs62" />
+ <g
+ transform="translate(-26.715988,-25.930946)"
+ id="g62">
+ <g
+ fill="#898989"
+ id="g2">
+ <path
+ d="m 40.117447,26.434603 -0.624252,0.05374 0.795353,0.367393 7.290438,-0.0527 3.671461,0.0527 0.483862,-0.202028 0.422741,-0.192731 -2.134264,-0.113194 -7.730794,-0.0083 z"
+ id="path1" />
+ <path
+ d="m 0,0 c 0.97,0 1.947,0.018 2.915,-0.069 0.882,-0.079 1.775,-0.298 2.525,-0.787 0.831,-0.543 1.467,-1.321 2.024,-2.13 0.603,-0.875 1.107,-1.814 1.588,-2.76 1.022,-2.008 1.947,-4.064 2.984,-6.066 0.834,-1.613 1.686,-3.225 2.631,-4.777 0.919,-1.506 1.938,-2.97 3.392,-4.003 1.503,-1.066 3.336,-1.637 5.18,-1.512 1.955,0.131 3.826,1.004 5.325,2.242 2.776,2.292 4.007,5.817 4.231,9.323 0.141,2.206 -0.03,4.435 -0.263,6.631 -0.185,1.74 -0.404,3.484 -0.689,5.211 -0.21,1.277 -0.421,2.554 -0.631,3.83 -0.368,2.226 -0.735,4.451 -1.104,6.678 -0.277,1.679 -0.554,3.359 -0.832,5.04 -0.367,2.229 -0.78,4.453 -1.212,6.672 -0.321,1.641 -0.665,3.275 -0.959,4.921 -0.375,2.109 -0.842,4.21 -1.362,6.288 -0.266,1.071 -0.559,2.136 -0.885,3.19 -0.165,0.529 -0.337,1.055 -0.521,1.577 -0.096,0.272 -0.194,0.544 -0.296,0.816 -0.097,0.255 -0.175,0.507 -0.341,0.726 -0.344,0.456 -0.687,0.912 -1.032,1.369 -0.179,0.238 -0.359,0.475 -0.536,0.712 -0.133,0.176 -0.296,0.428 -0.506,0.521 -0.824,0.362 -1.619,0.781 -2.395,1.24 -0.957,0.565 -1.897,1.16 -2.882,1.677 -0.977,0.511 -1.987,0.958 -3.023,1.335 -2.116,0.77 -4.323,1.245 -6.551,1.555 -2.295,0.32 -4.612,0.492 -6.923,0.633 -2.316,0.141 -4.636,0.232 -6.955,0.294 -4.627,0.125 -9.257,0.134 -13.886,0.134 -4.63,0 -9.26,-0.009 -13.887,-0.134 -2.32,-0.062 -4.639,-0.153 -6.955,-0.294 -2.313,-0.141 -4.629,-0.313 -6.924,-0.633 -2.226,-0.31 -4.435,-0.785 -6.551,-1.555 -1.035,-0.377 -2.046,-0.824 -3.022,-1.335 -0.985,-0.517 -1.925,-1.112 -2.883,-1.677 -0.774,-0.459 -1.57,-0.878 -2.394,-1.24 -0.21,-0.093 -0.374,-0.345 -0.505,-0.521 -0.18,-0.237 -0.358,-0.474 -0.537,-0.712 -0.344,-0.457 -0.689,-0.913 -1.034,-1.369 -0.165,-0.219 -0.244,-0.471 -0.339,-0.726 -0.102,-0.272 -0.2,-0.544 -0.296,-0.816 -0.183,-0.522 -0.357,-1.048 -0.521,-1.577 -0.328,-1.054 -0.619,-2.119 -0.887,-3.19 -0.517,-2.078 -0.985,-4.179 -1.361,-6.288 -0.294,-1.646 -0.638,-3.28 -0.958,-4.921 -0.433,-2.219 -0.845,-4.443 -1.214,-6.672 -0.277,-1.681 -0.554,-3.361 -0.832,-5.04 -0.367,-2.227 -0.734,-4.452 -1.101,-6.678 -0.211,-1.276 -0.422,-2.553 -0.633,-3.83 -0.285,-1.727 -0.504,-3.471 -0.688,-5.211 -0.233,-2.196 -0.404,-4.425 -0.263,-6.631 0.222,-3.506 1.455,-7.031 4.23,-9.323 1.499,-1.238 3.37,-2.111 5.324,-2.242 1.846,-0.125 3.678,0.446 5.18,1.512 1.456,1.033 2.475,2.497 3.393,4.003 0.947,1.552 1.796,3.164 2.632,4.777 1.036,2.002 1.961,4.058 2.984,6.066 0.481,0.946 0.985,1.885 1.587,2.76 0.558,0.809 1.193,1.587 2.025,2.13 0.75,0.489 1.643,0.708 2.525,0.787 C -43.927,0.018 -42.95,0 -41.979,0 Z"
+ stroke="#231916"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ stroke-width="0.35"
+ transform="matrix(0.35277777,0,0,-0.35277777,53.17439,44.610093)"
+ id="path2" />
+ </g>
+ <g
+ id="g61">
+ <path
+ d="m 0,0 c -3.757,0 -6.804,3.046 -6.804,6.804 0,3.756 3.047,6.803 6.804,6.803 3.757,0 6.803,-3.047 6.803,-6.803 C 6.803,3.046 3.757,0 0,0"
+ fill="#dcdddd"
+ transform="matrix(0.35277777,0,0,-0.35277777,50.769717,41.603544)"
+ id="path3" />
+ <path
+ d="m 0,0 c -3.758,0 -6.804,3.047 -6.804,6.804 0,3.758 3.046,6.803 6.804,6.803 3.757,0 6.803,-3.045 6.803,-6.803 C 6.803,3.047 3.757,0 0,0"
+ fill="#dcdddd"
+ transform="matrix(0.35277777,0,0,-0.35277777,35.269861,36.353929)"
+ id="path4" />
+ <path
+ d="m 0,0 c 0,0.06 0.025,0.146 0.059,0.195 0.076,0.115 0.159,0.16 0.297,0.159 1.382,0 2.767,-0.002 4.151,-0.004 0.47,-0.002 0.85,0.379 0.85,0.848 v 1.73 1.728 c 0,0.471 -0.38,0.851 -0.85,0.85 C 3.123,5.504 1.738,5.502 0.356,5.5 0.159,5.5 0,5.658 0,5.854 c 0.002,1.384 0.004,2.768 0.006,4.152 0.002,0.47 -0.379,0.851 -0.849,0.851 -1.153,-10e-4 -2.305,-10e-4 -3.458,0 -0.47,0 -0.85,-0.381 -0.849,-0.851 0.002,-1.384 0.004,-2.768 0.006,-4.152 0,-0.145 -0.049,-0.231 -0.174,-0.305 C -5.365,5.521 -5.444,5.5 -5.499,5.5 -6.883,5.502 -8.267,5.504 -9.65,5.506 -10.121,5.507 -10.502,5.127 -10.502,4.656 V 2.928 1.198 c 0,-0.469 0.381,-0.85 0.852,-0.848 1.383,0.002 2.767,0.004 4.151,0.004 0.138,0.001 0.22,-0.044 0.296,-0.159 C -5.17,0.146 -5.144,0.06 -5.144,0 -5.146,-1.383 -5.148,-2.768 -5.15,-4.151 c -10e-4,-0.47 0.379,-0.851 0.849,-0.851 h 3.458 c 0.47,0 0.851,0.381 0.849,0.851 C 0.004,-2.768 0.002,-1.383 0,0"
+ fill="#666565"
+ transform="matrix(0.35277777,0,0,-0.35277777,40.802016,40.236178)"
+ id="path5" />
+ <path
+ d="m 0,0 c 0,-2.201 -1.785,-3.986 -3.986,-3.986 -2.201,0 -3.987,1.785 -3.987,3.986 0,2.202 1.786,3.986 3.987,3.986 C -1.785,3.986 0,2.202 0,0"
+ fill="#666565"
+ transform="matrix(0.35277777,0,0,-0.35277777,54.263381,33.953699)"
+ id="path6" />
+ <path
+ d="m 0,0 c 0,-2.201 1.785,-3.986 3.986,-3.986 2.201,0 3.987,1.785 3.987,3.986 0,2.201 -1.786,3.986 -3.987,3.986 C 1.785,3.986 0,2.201 0,0"
+ fill="#666565"
+ transform="matrix(0.35277777,0,0,-0.35277777,54.425976,36.528589)"
+ id="path7" />
+ <path
+ d="M 0,0 C 0,2.202 1.784,3.986 3.985,3.986 6.187,3.986 7.972,2.202 7.972,0 7.972,-2.201 6.187,-3.986 3.985,-3.986 1.784,-3.986 0,-2.201 0,0"
+ fill="#666565"
+ transform="matrix(0.35277777,0,0,-0.35277777,57.401163,33.953699)"
+ id="path8" />
+ <path
+ d="m 0,0 c 0,-2.202 -1.785,-3.986 -3.986,-3.986 -2.201,0 -3.987,1.784 -3.987,3.986 0,2.202 1.786,3.986 3.987,3.986 C -1.785,3.986 0,2.202 0,0"
+ fill="#666565"
+ transform="matrix(0.35277777,0,0,-0.35277777,57.238568,31.378492)"
+ id="path9" />
+ <path
+ d="M 0,0 C 3.287,0 5.952,2.665 5.952,5.952 5.952,9.24 3.287,11.906 0,11.906 -3.287,11.906 -5.952,9.24 -5.952,5.952 -5.952,2.665 -3.287,0 0,0"
+ fill="#666565"
+ transform="matrix(0.35277777,0,0,-0.35277777,50.769717,41.303824)"
+ id="path14" />
+ <path
+ d="m 0,0 c 3.287,0 5.951,2.666 5.951,5.954 0,3.288 -2.664,5.953 -5.951,5.953 -3.288,0 -5.953,-2.665 -5.953,-5.953 C -5.953,2.666 -3.288,0 0,0"
+ fill="#666565"
+ transform="matrix(0.35277777,0,0,-0.35277777,35.269861,36.054174)"
+ id="path15" />
+ <path
+ d="m 58.60343,34.314599 h 0.165453 c 0.128764,0 0.240947,-0.04833 0.240947,-0.17004 0,-0.115358 -0.08255,-0.172508 -0.224719,-0.172508 H 58.60343 Z m 0,-0.41522 h 0.179211 c 0.08537,0 0.185209,-0.03669 0.185209,-0.153106 0,-0.111125 -0.0949,-0.153104 -0.210256,-0.153104 H 58.60343 Z m -0.0889,-0.383117 h 0.26035 c 0.133703,0 0.28187,0.04833 0.28187,0.223662 0,0.09172 -0.06174,0.166863 -0.154164,0.18803 v 0.0021 c 0.113594,0.01235 0.197555,0.09172 0.197555,0.219075 0,0.145698 -0.12453,0.242007 -0.326672,0.242007 H 58.51453 Z"
+ fill="#ffffff"
+ id="path16"
+ style="stroke-width:0.352778" />
+ <path
+ d="m 55.63865,36.654707 h 0.385233 l -0.192617,-0.464608 z m -0.128764,0.311503 h -0.09772 l 0.378531,-0.875242 h 0.08643 l 0.375356,0.875242 h -0.09842 l -0.09631,-0.230364 h -0.45297 z"
+ fill="#ffffff"
+ id="path17"
+ style="stroke-width:0.352778" />
+ <path
+ d="m 52.858796,33.869561 0.23883,-0.353483 h 0.106539 l -0.291041,0.41663 0.32138,0.458611 h -0.111125 l -0.2667,-0.394405 -0.265994,0.394405 H 52.47956 l 0.32138,-0.459669 -0.292805,-0.415572 h 0.110772 z"
+ fill="#ffffff"
+ id="path18"
+ style="stroke-width:0.352778" />
+ <path
+ d="m 55.876669,31.815936 h -0.08925 V 31.43917 l -0.327378,-0.498122 h 0.111478 l 0.263172,0.424038 0.265642,-0.424038 H 56.2044 l -0.327731,0.498122 z"
+ fill="#ffffff"
+ id="path19"
+ style="stroke-width:0.352778" />
+ <path
+ d="m 0,0 c 0.716,0.329 1.411,0.7 2.09,1.103 0.958,0.565 1.897,1.16 2.883,1.676 0.976,0.512 1.987,0.958 3.022,1.335 2.115,0.771 4.324,1.245 6.551,1.556 2.295,0.319 4.611,0.492 6.924,0.633 1.766,0.107 3.535,0.185 5.304,0.244 -0.957,0.419 -3.07,1.339 -4.031,1.751 l -0.002,10e-4 c -0.057,0.025 -0.115,0.05 -0.173,0.075 L 22.565,8.375 C 21.741,8.729 20.946,9.003 20.019,8.993 19.605,8.988 18.881,8.951 18.468,8.92 16.743,8.788 15.029,8.6 13.319,8.337 12.898,8.273 12.478,8.202 12.058,8.127 10.735,7.891 9.44,7.605 8.169,7.149 7.546,6.927 6.507,6.453 5.931,6.126 4.654,5.402 3.499,4.559 2.415,3.57 2.155,3.334 1.941,3.071 1.757,2.773 1.756,2.774 1.755,2.774 1.755,2.774 L 1.757,2.773 C 1.273,2.001 0.48,0.761 -0.013,-0.007 Z"
+ fill="#666565"
+ transform="matrix(0.35277777,0,0,-0.35277777,30.843276,29.165376)"
+ id="path20" />
+ <path
+ d="m 0,0 c -0.716,0.329 -1.411,0.7 -2.09,1.103 -0.958,0.565 -1.897,1.16 -2.883,1.676 -0.976,0.512 -1.987,0.958 -3.022,1.335 -2.115,0.771 -4.324,1.245 -6.551,1.556 -2.295,0.319 -4.611,0.492 -6.924,0.633 -1.766,0.107 -3.535,0.185 -5.304,0.244 0.957,0.419 3.07,1.339 4.031,1.751 l 0.002,10e-4 c 0.057,0.025 0.115,0.05 0.173,0.075 l 0.003,10e-4 c 0.824,0.354 1.619,0.628 2.546,0.618 0.415,-0.005 1.138,-0.042 1.551,-0.073 1.725,-0.132 3.439,-0.32 5.149,-0.583 0.421,-0.064 0.842,-0.135 1.261,-0.21 1.323,-0.236 2.618,-0.522 3.889,-0.978 0.623,-0.222 1.662,-0.696 2.238,-1.023 1.277,-0.724 2.432,-1.567 3.516,-2.556 0.26,-0.236 0.474,-0.499 0.658,-0.797 10e-4,10e-4 0.002,10e-4 0.002,10e-4 L -1.757,2.773 c 0.484,-0.772 1.278,-2.012 1.77,-2.78 z"
+ fill="#666565"
+ transform="matrix(0.35277777,0,0,-0.35277777,60.695719,29.165376)"
+ id="path21" />
+ <path
+ d="m 0,0 c -0.048,-0.084 -0.128,-0.084 -0.175,0 l -0.601,1.041 c -0.048,0.082 -0.008,0.15 0.088,0.15 h 1.201 c 0.096,0 0.135,-0.068 0.086,-0.15 z"
+ fill="#ffffff"
+ transform="matrix(0.35277777,0,0,-0.35277777,39.925222,41.285903)"
+ id="path22" />
+ <path
+ d="M 0,0 C 0.048,0.083 0.128,0.083 0.176,0 L 0.774,-1.039 C 0.824,-1.124 0.784,-1.19 0.688,-1.19 h -1.201 c -0.095,0 -0.135,0.066 -0.088,0.151 z"
+ fill="#ffffff"
+ transform="matrix(0.35277777,0,0,-0.35277777,39.863239,37.163518)"
+ id="path23" />
+ <path
+ d="m 0,0 c 0.082,-0.047 0.082,-0.126 0,-0.176 l -1.041,-0.599 c -0.084,-0.048 -0.151,-0.01 -0.151,0.086 v 1.202 c 0,0.096 0.067,0.135 0.151,0.089 z"
+ fill="#ffffff"
+ transform="matrix(0.35277777,0,0,-0.35277777,41.977472,39.172341)"
+ id="path24" />
+ <path
+ d="M 0,0 C -0.084,0.048 -0.084,0.128 0,0.174 L 1.04,0.775 C 1.123,0.824 1.192,0.784 1.192,0.688 v -1.202 c 0,-0.095 -0.069,-0.135 -0.152,-0.087 z"
+ fill="#ffffff"
+ transform="matrix(0.35277777,0,0,-0.35277777,37.854029,39.233654)"
+ id="path25" />
+ <g
+ stroke="#231916"
+ stroke-width="0.35"
+ id="g54">
+ <path
+ d="m 0,0 c 0,0.06 0.025,0.146 0.059,0.195 0.076,0.115 0.159,0.16 0.297,0.159 1.382,0 2.767,-0.002 4.151,-0.004 0.47,-0.002 0.85,0.379 0.85,0.848 v 1.73 1.728 c 0,0.471 -0.38,0.851 -0.85,0.85 C 3.123,5.504 1.738,5.502 0.356,5.5 0.159,5.5 0,5.658 0,5.854 c 0.002,1.384 0.004,2.768 0.006,4.152 0.002,0.47 -0.379,0.851 -0.849,0.851 -1.153,-10e-4 -2.305,-10e-4 -3.458,0 -0.47,0 -0.85,-0.381 -0.849,-0.851 0.002,-1.384 0.004,-2.768 0.006,-4.152 0,-0.145 -0.049,-0.231 -0.174,-0.305 C -5.365,5.521 -5.444,5.5 -5.499,5.5 -6.883,5.502 -8.267,5.504 -9.65,5.506 -10.121,5.507 -10.502,5.127 -10.502,4.656 V 2.928 1.198 c 0,-0.469 0.381,-0.85 0.852,-0.848 1.383,0.002 2.767,0.004 4.151,0.004 0.138,0.001 0.22,-0.044 0.296,-0.159 C -5.17,0.146 -5.144,0.06 -5.144,0 -5.146,-1.383 -5.148,-2.768 -5.15,-4.151 c -10e-4,-0.47 0.379,-0.851 0.849,-0.851 h 3.458 c 0.47,0 0.851,0.381 0.849,0.851 C 0.004,-2.768 0.002,-1.383 0,0 Z"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,40.802016,40.236178)"
+ id="path29" />
+ <path
+ d="m 0,0 c 0,-2.201 -1.785,-3.986 -3.986,-3.986 -2.201,0 -3.987,1.785 -3.987,3.986 0,2.202 1.786,3.986 3.987,3.986 C -1.785,3.986 0,2.202 0,0 Z"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,54.263381,33.953699)"
+ id="path31" />
+ <path
+ d="m 0,0 c 0,-2.201 1.785,-3.986 3.986,-3.986 2.201,0 3.987,1.785 3.987,3.986 0,2.201 -1.786,3.986 -3.987,3.986 C 1.785,3.986 0,2.201 0,0 Z"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,54.425976,36.528589)"
+ id="path32" />
+ <path
+ d="M 0,0 C 0,2.202 1.784,3.986 3.985,3.986 6.187,3.986 7.972,2.202 7.972,0 7.972,-2.201 6.187,-3.986 3.985,-3.986 1.784,-3.986 0,-2.201 0,0 Z"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,57.401163,33.953699)"
+ id="path33" />
+ <path
+ d="m 0,0 c 0,-2.202 -1.785,-3.986 -3.986,-3.986 -2.201,0 -3.987,1.784 -3.987,3.986 0,2.202 1.786,3.986 3.987,3.986 C -1.785,3.986 0,2.202 0,0 Z"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,57.238568,31.378492)"
+ id="path34" />
+ <path
+ d="M 0,0 C 0.492,0.768 1.286,2.008 1.77,2.78 L 1.768,2.781 c 0,0 10e-4,0 0.002,-0.001 0.184,0.298 0.398,0.561 0.658,0.797 1.084,0.988 2.239,1.832 3.515,2.556 0.577,0.327 1.616,0.801 2.239,1.023 1.271,0.455 2.566,0.741 3.888,0.978 0.42,0.075 0.841,0.145 1.262,0.21 1.71,0.262 3.424,0.451 5.148,0.583 0.414,0.031 1.137,0.068 1.551,0.073 0.928,0.01 1.723,-0.265 2.547,-0.618 l 0.003,-10e-4 c 0.058,-0.026 0.115,-0.05 0.173,-0.075 L 22.756,8.305 C 23.717,7.893 25.83,6.973 26.787,6.554"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,30.838796,29.167775)"
+ id="path37" />
+ <path
+ d="m 0,0 c -3.757,0 -6.804,3.046 -6.804,6.804 0,3.756 3.047,6.803 6.804,6.803 3.757,0 6.803,-3.047 6.803,-6.803 C 6.803,3.046 3.757,0 0,0 Z"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,50.769717,41.603544)"
+ id="path38" />
+ <path
+ d="m 0,0 c -3.758,0 -6.804,3.047 -6.804,6.804 0,3.758 3.046,6.803 6.804,6.803 3.757,0 6.803,-3.045 6.803,-6.803 C 6.803,3.047 3.757,0 0,0 Z"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,35.269861,36.353929)"
+ id="path42" />
+ <path
+ d="m 0,0 c -0.023,-0.127 0.065,-0.328 0.129,-0.475 0.083,-0.189 0.174,-0.372 0.267,-0.556 0.24,-0.475 0.51,-0.935 0.781,-1.393 0.578,-0.978 1.169,-1.951 1.787,-2.904 1.255,-1.934 2.56,-3.834 3.889,-5.717 2.649,-3.755 5.403,-7.437 8.205,-11.08 1.057,-1.377 2.108,-2.76 3.275,-4.047 0.568,-0.627 1.143,-1.249 1.715,-1.873 0.275,-0.301 0.557,-0.598 0.847,-0.885 0.149,-0.146 0.299,-0.291 0.456,-0.428 0.092,-0.083 0.291,-0.284 0.408,-0.253"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,28.829268,34.428432)"
+ id="path43" />
+ <path
+ d="m 0,0 c -0.49,0.768 -1.285,2.008 -1.768,2.78 l 0.001,0.001 c -0.001,0 -0.001,0 -0.001,-0.001 -0.185,0.298 -0.398,0.561 -0.658,0.797 -1.084,0.988 -2.24,1.832 -3.515,2.556 -0.577,0.327 -1.616,0.801 -2.241,1.023 -1.269,0.455 -2.566,0.741 -3.888,0.978 -0.42,0.075 -0.84,0.145 -1.262,0.21 -1.709,0.262 -3.423,0.451 -5.147,0.583 -0.414,0.031 -1.136,0.068 -1.551,0.073 -0.927,0.01 -1.722,-0.265 -2.548,-0.618 L -22.58,8.381 c -0.058,-0.026 -0.115,-0.05 -0.173,-0.075 l -0.003,-10e-4 c -0.961,-0.412 -3.072,-1.332 -4.031,-1.751"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,60.700199,29.167775)"
+ id="path44" />
+ <path
+ d="m 0,0 c -4.652,0.222 -9.961,0.398 -14.617,0.413 -1.744,0.006 -5.234,0.005 -6.978,0 C -26.251,0.4 -31.559,0.222 -36.211,0"
+ fill="#898989"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,52.157051,26.460982)"
+ id="path45" />
+ <path
+ d="m 0,0 c 0.023,-0.127 -0.066,-0.328 -0.129,-0.475 -0.082,-0.189 -0.174,-0.372 -0.267,-0.556 -0.241,-0.475 -0.51,-0.935 -0.781,-1.393 -0.577,-0.978 -1.169,-1.951 -1.788,-2.904 -1.254,-1.934 -2.56,-3.834 -3.888,-5.717 -2.649,-3.755 -5.403,-7.437 -8.204,-11.08 -1.058,-1.377 -2.109,-2.76 -3.275,-4.047 -0.568,-0.627 -1.144,-1.249 -1.715,-1.873 -0.276,-0.301 -0.557,-0.598 -0.848,-0.885 -0.148,-0.146 -0.299,-0.291 -0.456,-0.428 -0.092,-0.083 -0.292,-0.284 -0.409,-0.253"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,62.71008,34.428432)"
+ id="path46" />
+ <path
+ d="M 0,0 C 3.287,0 5.952,2.665 5.952,5.952 5.952,9.24 3.287,11.906 0,11.906 -3.287,11.906 -5.952,9.24 -5.952,5.952 -5.952,2.665 -3.287,0 0,0 Z"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,50.769717,41.303824)"
+ id="path48" />
+ <path
+ d="m 0,0 c -2.491,0 -4.511,2.019 -4.511,4.51 0,2.492 2.02,4.511 4.511,4.511 2.491,0 4.51,-2.019 4.51,-4.51 C 4.51,2.019 2.491,0 0,0 Z"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,50.769717,40.794978)"
+ id="path49" />
+ <path
+ d="m 0,0 c 3.287,0 5.951,2.666 5.951,5.954 0,3.288 -2.664,5.953 -5.951,5.953 -3.288,0 -5.953,-2.665 -5.953,-5.953 C -5.953,2.666 -3.288,0 0,0 Z"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,35.269861,36.054174)"
+ id="path50" />
+ <path
+ d="M 0,0 C -2.492,0 -4.511,2.018 -4.511,4.51 -4.511,7 -2.492,9.019 0,9.019 2.49,9.019 4.51,7 4.51,4.51 4.51,2.018 2.49,0 0,0 Z"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,35.269861,35.544657)"
+ id="path51" />
+ <path
+ d="m 0,0 c 0,4.695 -3.808,8.504 -8.504,8.504 -4.697,0 -8.504,-3.809 -8.504,-8.504 0,-4.697 3.807,-8.505 8.504,-8.505 C -3.808,-8.505 0,-4.697 0,0 Z"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,38.269531,33.953382)"
+ id="path52" />
+ <path
+ d="m 0,0 c 0,-4.696 3.808,-8.504 8.505,-8.504 4.695,0 8.504,3.808 8.504,8.504 0,4.697 -3.809,8.504 -8.504,8.504 C 3.808,8.504 0,4.697 0,0 Z"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,47.769377,39.203703)"
+ id="path53" />
+ <path
+ d="M 0,0 C -0.439,0.107 -0.85,0.419 -1.223,0.664 -1.62,0.924 -2.01,1.197 -2.408,1.457 -3.331,2.062 -4.296,2.59 -5.283,3.08 c -1.965,0.978 -3.962,1.824 -6.084,2.397 -4.296,1.158 -8.777,1.511 -13.202,1.77 -9.146,0.534 -18.336,0.47 -27.494,0.39 C -56.676,7.596 -61.29,7.488 -65.895,7.195 -70.338,6.914 -74.846,6.518 -79.128,5.23 -81.069,4.646 -82.91,3.813 -84.715,2.896 c -0.9,-0.458 -1.777,-0.957 -2.621,-1.514 -0.389,-0.257 -0.771,-0.523 -1.162,-0.778 -0.193,-0.125 -0.389,-0.249 -0.589,-0.362 -0.061,-0.035 -0.535,-0.215 -0.543,-0.246"
+ fill="none"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ transform="matrix(0.35277777,0,0,-0.35277777,61.579039,30.189243)"
+ id="path54" />
+ </g>
+ <path
+ d="m 161.14532,100.01397 c 0.12515,-5.7e-4 0.32993,-5.7e-4 0.45508,0 0.12515,5.8e-4 0.0228,0.001 -0.22754,0.001 -0.25029,0 -0.35269,-4.6e-4 -0.22754,-0.001 z"
+ fill="#7f7f7f"
+ stroke-width="0.003906"
+ transform="scale(0.26458333)"
+ id="path55" />
+ <path
+ d="m 161.44976,100.01398 c 0.0369,-6.4e-4 0.0984,-6.4e-4 0.13671,0 0.0383,6.4e-4 0.008,10e-4 -0.0671,10e-4 -0.0752,1e-5 -0.10651,-5.2e-4 -0.0696,-10e-4 z"
+ fill="#7f7f7f"
+ stroke-width="0.003906"
+ transform="scale(0.26458333)"
+ id="path56" />
+ <path
+ d="m 161.2879,100.01398 c 0.0381,-6.4e-4 0.10054,-6.4e-4 0.13867,0 0.0381,6.4e-4 0.007,10e-4 -0.0693,10e-4 -0.0763,0 -0.10747,-5.2e-4 -0.0693,-10e-4 z"
+ fill="#7f7f7f"
+ stroke-width="0.003906"
+ transform="scale(0.26458333)"
+ id="path57" />
+ <path
+ d="m 161.43648,100.01401 c 0.0124,-7.8e-4 0.0318,-7.7e-4 0.043,2e-5 0.0112,7.8e-4 0.001,10e-4 -0.0226,10e-4 -0.0236,-10e-6 -0.0328,-6.5e-4 -0.0204,-10e-4 z"
+ fill="#7f7f7f"
+ stroke-width="0.003906"
+ transform="scale(0.26458333)"
+ id="path58" />
+ <path
+ d="m 161.39545,100.01402 c 0.0113,-7.9e-4 0.0289,-7.8e-4 0.0391,2e-5 0.0101,8e-4 8.5e-4,0.001 -0.0206,0.001 -0.0215,-1e-5 -0.0298,-6.7e-4 -0.0184,-0.001 z"
+ fill="#7f7f7f"
+ stroke-width="0.003906"
+ transform="scale(0.26458333)"
+ id="path59" />
+ <path
+ d="m 161.43048,100.01415 c 0.005,-9.3e-4 0.0127,-9.3e-4 0.0176,0 0.005,9.3e-4 8.8e-4,0.002 -0.009,0.002 -0.01,0 -0.0136,-7.6e-4 -0.009,-0.002 z"
+ fill="#7f7f7f"
+ stroke-width="0.003906"
+ transform="scale(0.26458333)"
+ id="path60" />
+ <path
+ d="m 161.4325,100.0142 c 0.004,-9.9e-4 0.009,-9.3e-4 0.0117,1.4e-4 0.003,10e-4 -4.6e-4,0.002 -0.007,0.002 -0.006,-8e-5 -0.009,-9.5e-4 -0.005,-0.002 z"
+ fill="#7f7f7f"
+ stroke-width="0.003906"
+ transform="scale(0.26458333)"
+ id="path61" />
+ </g>
+ </g>
+</svg>
diff --git a/client/gui/overlays/controls_visualization/controller/controller.svg.import b/client/gui/overlays/controls_visualization/controller/controller.svg.import
new file mode 100644
index 00000000..79a6e2d7
--- /dev/null
+++ b/client/gui/overlays/controls_visualization/controller/controller.svg.import
@@ -0,0 +1,43 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://doo07i13vtb34"
+path="res://.godot/imported/controller.svg-cfc5787dc7bf7b1a87918dcfd10423cd.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://gui/overlays/controls_visualization/controller/controller.svg"
+dest_files=["res://.godot/imported/controller.svg-cfc5787dc7bf7b1a87918dcfd10423cd.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=false
+editor/convert_colors_with_editor_theme=false
diff --git a/client/gui/overlays/controls_visualization/controller/controller_explanation.gd b/client/gui/overlays/controls_visualization/controller/controller_explanation.gd
new file mode 100644
index 00000000..84e93cfa
--- /dev/null
+++ b/client/gui/overlays/controls_visualization/controller/controller_explanation.gd
@@ -0,0 +1,45 @@
+# Hurry Curry! - a game about cooking
+# Copyright (C) 2025 Hurry Curry! contributors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, version 3 of the License only.
+#
+# 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+class_name ControllerExplanation
+extends DeviceExplanation
+
+const MODULATE_SPEED := 5.
+
+var double_handed := false
+
+@onready var left_hand: Node2D = $Control/Node2D/InteractLeft
+@onready var right_hand: Node2D = $Control/Node2D/InteractRight
+
+@onready var left_arrow: Sprite2D = $Control/Node2D/Arrow4
+
+@onready var interact_right_label: Label = $Control/Node2D/InteractRight/Label
+
+func toggle_double_handed(val: bool) -> void:
+ double_handed = val
+ left_hand.visible = val
+ left_arrow.visible = val
+ interact_right_label.text = tr("c.controls_explanation.interact_right") if val else tr("c.settings.input.interact")
+
+var t := 0.
+func _process(delta: float) -> void:
+ if not double_handed: return
+
+ t += delta
+ var weight: float = (cos(t * MODULATE_SPEED) - 1.) * -0.5
+ for i: Node2D in [left_hand,right_hand]:
+ i.modulate = Color.WHITE.lerp(Color("ffcd59ff"), weight)
+ var size_ := lerpf(1, 1.2, weight)
+ i.scale = Vector2(size_, size_)
diff --git a/client/gui/overlays/controls_visualization/controller/controller_explanation.gd.uid b/client/gui/overlays/controls_visualization/controller/controller_explanation.gd.uid
new file mode 100644
index 00000000..5bdb1e6c
--- /dev/null
+++ b/client/gui/overlays/controls_visualization/controller/controller_explanation.gd.uid
@@ -0,0 +1 @@
+uid://dsg537e6dc68
diff --git a/client/gui/overlays/controls_visualization/controller/controller_explanation.tscn b/client/gui/overlays/controls_visualization/controller/controller_explanation.tscn
new file mode 100644
index 00000000..410f2592
--- /dev/null
+++ b/client/gui/overlays/controls_visualization/controller/controller_explanation.tscn
@@ -0,0 +1,126 @@
+[gd_scene load_steps=5 format=3 uid="uid://ceex0cpjrb81p"]
+
+[ext_resource type="Script" uid="uid://dsg537e6dc68" path="res://gui/overlays/controls_visualization/controller/controller_explanation.gd" id="1_n0s1n"]
+[ext_resource type="FontVariation" uid="uid://cl6m4hqsnrpav" path="res://gui/resources/fonts/sansita-swashed-bold.tres" id="2_ewgm4"]
+[ext_resource type="Texture2D" uid="uid://cf8hrxilqe2ih" path="res://gui/overlays/controls_visualization/arrow.svg" id="3_565r1"]
+[ext_resource type="Texture2D" uid="uid://doo07i13vtb34" path="res://gui/overlays/controls_visualization/controller/controller.svg" id="5_nalwd"]
+
+[node name="ControllerExplanation" type="Control"]
+custom_minimum_size = Vector2(0, 450)
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_bottom = -270.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_n0s1n")
+
+[node name="Control" type="Control" parent="."]
+layout_mode = 1
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="Node2D" type="Node2D" parent="Control"]
+position = Vector2(0, 50)
+
+[node name="Controller" type="Sprite2D" parent="Control/Node2D"]
+scale = Vector2(0.4, 0.4)
+texture = ExtResource("5_nalwd")
+
+[node name="Arrow" type="Sprite2D" parent="Control/Node2D"]
+position = Vector2(-250, -150)
+rotation = 1.5707964
+scale = Vector2(0.5, 0.5)
+texture = ExtResource("3_565r1")
+
+[node name="Arrow4" type="Sprite2D" parent="Control/Node2D"]
+position = Vector2(45, -150)
+scale = Vector2(0.5, -0.5)
+texture = ExtResource("3_565r1")
+
+[node name="Arrow2" type="Sprite2D" parent="Control/Node2D"]
+position = Vector2(260, -140)
+rotation = 1.5707963
+scale = Vector2(0.5, -0.5)
+texture = ExtResource("3_565r1")
+
+[node name="Arrow3" type="Sprite2D" parent="Control/Node2D"]
+position = Vector2(215, 20)
+rotation = -1.5707964
+scale = Vector2(0.5, 0.5)
+texture = ExtResource("3_565r1")
+
+[node name="Move" type="Node2D" parent="Control/Node2D"]
+position = Vector2(-330, -175)
+
+[node name="Label" type="Label" parent="Control/Node2D/Move"]
+anchors_preset = 6
+anchor_left = 1.0
+anchor_top = 0.5
+anchor_right = 1.0
+anchor_bottom = 0.5
+offset_left = -549.0
+offset_top = -24.5
+offset_bottom = 24.5
+grow_horizontal = 0
+grow_vertical = 2
+theme_override_fonts/font = ExtResource("2_ewgm4")
+theme_override_font_sizes/font_size = 40
+text = "c.controls_explanation.move"
+horizontal_alignment = 2
+
+[node name="Boost" type="Node2D" parent="Control/Node2D"]
+position = Vector2(335, -165)
+
+[node name="Label" type="Label" parent="Control/Node2D/Boost"]
+anchors_preset = 4
+anchor_top = 0.5
+anchor_bottom = 0.5
+offset_top = -24.5
+offset_right = 549.0
+offset_bottom = 24.5
+grow_vertical = 2
+theme_override_fonts/font = ExtResource("2_ewgm4")
+theme_override_font_sizes/font_size = 40
+text = "c.controls_explanation.boost"
+
+[node name="InteractRight" type="Node2D" parent="Control/Node2D"]
+position = Vector2(290, 25)
+
+[node name="Label" type="Label" parent="Control/Node2D/InteractRight"]
+anchors_preset = 4
+anchor_top = 0.5
+anchor_bottom = 0.5
+offset_top = -24.5
+offset_right = 549.0
+offset_bottom = 24.5
+grow_vertical = 2
+theme_override_fonts/font = ExtResource("2_ewgm4")
+theme_override_font_sizes/font_size = 40
+text = "c.controls_explanation.interact_right"
+
+[node name="InteractLeft" type="Node2D" parent="Control/Node2D"]
+position = Vector2(20, -250)
+
+[node name="Label" type="Label" parent="Control/Node2D/InteractLeft"]
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -274.5
+offset_top = -24.5
+offset_right = 274.5
+offset_bottom = 24.5
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_fonts/font = ExtResource("2_ewgm4")
+theme_override_font_sizes/font_size = 40
+text = "c.controls_explanation.interact_left"
+horizontal_alignment = 1
diff --git a/client/gui/overlays/controls_visualization/device_explanation.gd b/client/gui/overlays/controls_visualization/device_explanation.gd
new file mode 100644
index 00000000..7bfe2fb4
--- /dev/null
+++ b/client/gui/overlays/controls_visualization/device_explanation.gd
@@ -0,0 +1,20 @@
+# Hurry Curry! - a game about cooking
+# Copyright (C) 2025 Hurry Curry! contributors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, version 3 of the License only.
+#
+# 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+@abstract
+class_name DeviceExplanation
+extends Control
+
+@abstract func toggle_double_handed(val: bool) -> void
diff --git a/client/gui/overlays/controls_visualization/device_explanation.gd.uid b/client/gui/overlays/controls_visualization/device_explanation.gd.uid
new file mode 100644
index 00000000..86ec5a25
--- /dev/null
+++ b/client/gui/overlays/controls_visualization/device_explanation.gd.uid
@@ -0,0 +1 @@
+uid://bh5s8l2cjnarb
diff --git a/client/gui/overlays/controls_visualization/explanation.gd b/client/gui/overlays/controls_visualization/explanation.gd
new file mode 100644
index 00000000..47716a42
--- /dev/null
+++ b/client/gui/overlays/controls_visualization/explanation.gd
@@ -0,0 +1,39 @@
+# Hurry Curry! - a game about cooking
+# Copyright (C) 2025 Hurry Curry! contributors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, version 3 of the License only.
+#
+# 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+extends Menu
+class_name ControlsExplanation
+
+var two_handed: bool
+
+@onready var game: Game = $"../Game"
+
+@onready var title: Label = $MarginContainer/PanelContainer/SmartMarginContainer/VBoxContainer/Title
+@onready var keyboard_explanation: KeyboardExplanation = $MarginContainer/PanelContainer/SmartMarginContainer/VBoxContainer/KeyboardExplanation
+@onready var controller_explanation: ControllerExplanation = $MarginContainer/PanelContainer/SmartMarginContainer/VBoxContainer/ControllerExplanation
+
+func _ready():
+ two_handed = data
+ @warning_ignore("incompatible_ternary")
+ var explanation: DeviceExplanation = controller_explanation if Global.using_joypad else keyboard_explanation
+ explanation.visible = true
+ explanation.toggle_double_handed(two_handed)
+ title.text = tr("c.controls_explanation.two_handed") if two_handed else tr("c.settings.input")
+ super()
+
+func _on_accept_pressed() -> void:
+ Profile.write("controls_" + ("two" if two_handed else "one") + "_handed_explained", true)
+ game.mp.send_ready()
+ exit()
diff --git a/client/gui/overlays/controls_visualization/explanation.gd.uid b/client/gui/overlays/controls_visualization/explanation.gd.uid
new file mode 100644
index 00000000..4c10943d
--- /dev/null
+++ b/client/gui/overlays/controls_visualization/explanation.gd.uid
@@ -0,0 +1 @@
+uid://bs2xryd5vamjf
diff --git a/client/gui/overlays/controls_visualization/explanation.tscn b/client/gui/overlays/controls_visualization/explanation.tscn
new file mode 100644
index 00000000..e102fa85
--- /dev/null
+++ b/client/gui/overlays/controls_visualization/explanation.tscn
@@ -0,0 +1,68 @@
+[gd_scene load_steps=8 format=3 uid="uid://c7g5gpiyofmu8"]
+
+[ext_resource type="Theme" uid="uid://b0qmvo504e457" path="res://gui/resources/theme/theme.tres" id="1_81hfk"]
+[ext_resource type="Script" uid="uid://bs2xryd5vamjf" path="res://gui/overlays/controls_visualization/explanation.gd" id="2_lxysr"]
+[ext_resource type="Script" uid="uid://byshs20og68tn" path="res://gui/components/smart_margin_container.gd" id="2_m528b"]
+[ext_resource type="Material" uid="uid://beea1pc5nt67r" path="res://gui/resources/materials/dark_blur_material.tres" id="3_pomap"]
+[ext_resource type="Script" uid="uid://cmncjc06kadpe" path="res://gui/components/blur_setup.gd" id="4_v3ijr"]
+[ext_resource type="PackedScene" uid="uid://wwj1ow1f437s" path="res://gui/overlays/controls_visualization/keyboard/keyboard_explanation.tscn" id="5_v3ijr"]
+[ext_resource type="PackedScene" uid="uid://ceex0cpjrb81p" path="res://gui/overlays/controls_visualization/controller/controller_explanation.tscn" id="7_yuxcv"]
+
+[node name="Explanation" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme = ExtResource("1_81hfk")
+script = ExtResource("2_lxysr")
+support_anim = false
+
+[node name="MarginContainer" type="MarginContainer" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("2_m528b")
+metadata/_custom_type_script = "uid://byshs20og68tn"
+
+[node name="PanelContainer" type="PanelContainer" parent="MarginContainer"]
+material = ExtResource("3_pomap")
+layout_mode = 2
+script = ExtResource("4_v3ijr")
+
+[node name="SmartMarginContainer" type="MarginContainer" parent="MarginContainer/PanelContainer"]
+layout_mode = 2
+script = ExtResource("2_m528b")
+metadata/_custom_type_script = "uid://byshs20og68tn"
+
+[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/PanelContainer/SmartMarginContainer"]
+layout_mode = 2
+
+[node name="Title" type="Label" parent="MarginContainer/PanelContainer/SmartMarginContainer/VBoxContainer"]
+layout_mode = 2
+theme_override_font_sizes/font_size = 36
+text = "c.settings.input"
+horizontal_alignment = 1
+
+[node name="KeyboardExplanation" parent="MarginContainer/PanelContainer/SmartMarginContainer/VBoxContainer" instance=ExtResource("5_v3ijr")]
+visible = false
+layout_mode = 2
+
+[node name="ControllerExplanation" parent="MarginContainer/PanelContainer/SmartMarginContainer/VBoxContainer" instance=ExtResource("7_yuxcv")]
+visible = false
+layout_mode = 2
+
+[node name="Spacer" type="Control" parent="MarginContainer/PanelContainer/SmartMarginContainer/VBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 3
+
+[node name="Accept" type="Button" parent="MarginContainer/PanelContainer/SmartMarginContainer/VBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 4
+text = "c.menu.accept"
+
+[connection signal="pressed" from="MarginContainer/PanelContainer/SmartMarginContainer/VBoxContainer/Accept" to="." method="_on_accept_pressed"]
diff --git a/client/gui/overlays/controls_visualization/keyboard/keyboard_button.tscn b/client/gui/overlays/controls_visualization/keyboard/keyboard_button.tscn
new file mode 100644
index 00000000..e4462464
--- /dev/null
+++ b/client/gui/overlays/controls_visualization/keyboard/keyboard_button.tscn
@@ -0,0 +1,33 @@
+[gd_scene load_steps=2 format=3 uid="uid://dj7tqrgpdja42"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ilwpo"]
+content_margin_left = 5.0
+content_margin_top = 5.0
+content_margin_right = 5.0
+content_margin_bottom = 5.0
+bg_color = Color(0.9, 0.9, 0.9, 1)
+border_width_left = 4
+border_width_top = 4
+border_width_right = 4
+border_width_bottom = 4
+border_color = Color(0.15, 0.15, 0.15, 1)
+corner_radius_top_left = 15
+corner_radius_top_right = 15
+corner_radius_bottom_right = 15
+corner_radius_bottom_left = 15
+shadow_size = 3
+
+[node name="KeyboardButton" type="Button"]
+custom_minimum_size = Vector2(75, 75)
+offset_right = 8.0
+offset_bottom = 8.0
+size_flags_horizontal = 0
+size_flags_vertical = 0
+focus_mode = 0
+theme_override_colors/font_color = Color(0, 0, 0, 1)
+theme_override_colors/font_disabled_color = Color(0, 0, 0, 1)
+theme_override_font_sizes/font_size = 36
+theme_override_styles/normal = SubResource("StyleBoxFlat_ilwpo")
+theme_override_styles/disabled = SubResource("StyleBoxFlat_ilwpo")
+disabled = true
+text = "A"
diff --git a/client/gui/overlays/controls_visualization/keyboard/keyboard_explanation.gd b/client/gui/overlays/controls_visualization/keyboard/keyboard_explanation.gd
new file mode 100644
index 00000000..5d6dfb42
--- /dev/null
+++ b/client/gui/overlays/controls_visualization/keyboard/keyboard_explanation.gd
@@ -0,0 +1,46 @@
+# Hurry Curry! - a game about cooking
+# Copyright (C) 2025 Hurry Curry! contributors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, version 3 of the License only.
+#
+# 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+class_name KeyboardExplanation
+extends DeviceExplanation
+
+const MODULATE_SPEED := 5.
+
+var double_handed := false
+
+@onready var j: Node2D = $VBoxContainer/Control2/JKL/J
+@onready var l: Node2D = $VBoxContainer/Control2/JKL/L
+
+@onready var left_hand_label: Label = $VBoxContainer/Control2/JKL/LeftHand/Label
+@onready var right_hand: Node2D = $VBoxContainer/Control2/JKL/RightHand
+@onready var right_arrow: Sprite2D = $VBoxContainer/Control2/JKL/Sprite2D2
+
+func toggle_double_handed(val: bool) -> void:
+ double_handed = val
+ right_hand.visible = val
+ right_arrow.visible = val
+ l.visible = val
+ left_hand_label.text = tr("c.controls_explanation.interact_left") if val else tr("c.settings.input.interact")
+
+var t := 0.
+func _process(delta: float) -> void:
+ if not double_handed: return
+
+ t += delta
+ var weight: float = (cos(t * MODULATE_SPEED) - 1.) * -0.5
+ for i: Node2D in [j,l]:
+ i.modulate = Color.WHITE.lerp(Color("ffcd59ff"), weight)
+ var size_ := lerpf(1, 1.2, weight)
+ i.scale = Vector2(size_, size_)
diff --git a/client/gui/overlays/controls_visualization/keyboard/keyboard_explanation.gd.uid b/client/gui/overlays/controls_visualization/keyboard/keyboard_explanation.gd.uid
new file mode 100644
index 00000000..0d383385
--- /dev/null
+++ b/client/gui/overlays/controls_visualization/keyboard/keyboard_explanation.gd.uid
@@ -0,0 +1 @@
+uid://dekpmw0i03eyi
diff --git a/client/gui/overlays/controls_visualization/keyboard/keyboard_explanation.tscn b/client/gui/overlays/controls_visualization/keyboard/keyboard_explanation.tscn
new file mode 100644
index 00000000..54001686
--- /dev/null
+++ b/client/gui/overlays/controls_visualization/keyboard/keyboard_explanation.tscn
@@ -0,0 +1,249 @@
+[gd_scene load_steps=5 format=3 uid="uid://wwj1ow1f437s"]
+
+[ext_resource type="Script" uid="uid://dekpmw0i03eyi" path="res://gui/overlays/controls_visualization/keyboard/keyboard_explanation.gd" id="1_ubxjd"]
+[ext_resource type="PackedScene" uid="uid://dj7tqrgpdja42" path="res://gui/overlays/controls_visualization/keyboard/keyboard_button.tscn" id="2_8nrgi"]
+[ext_resource type="FontVariation" uid="uid://cl6m4hqsnrpav" path="res://gui/resources/fonts/sansita-swashed-bold.tres" id="3_nvtkh"]
+[ext_resource type="Texture2D" uid="uid://cf8hrxilqe2ih" path="res://gui/overlays/controls_visualization/arrow.svg" id="4_mjakv"]
+
+[node name="KeyboardExplanation" type="Control"]
+custom_minimum_size = Vector2(0, 450)
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_ubxjd")
+
+[node name="VBoxContainer" type="HBoxContainer" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="Control" type="Control" parent="VBoxContainer"]
+custom_minimum_size = Vector2(400, 375)
+layout_mode = 2
+size_flags_vertical = 4
+
+[node name="WASD" type="Node2D" parent="VBoxContainer/Control"]
+
+[node name="Node2D" type="Node2D" parent="VBoxContainer/Control/WASD"]
+position = Vector2(200, 100)
+
+[node name="KeyboardButton" parent="VBoxContainer/Control/WASD/Node2D" instance=ExtResource("2_8nrgi")]
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -24.0
+offset_top = -24.5
+offset_right = 24.0
+offset_bottom = 24.5
+grow_horizontal = 2
+grow_vertical = 2
+text = "W"
+
+[node name="Node2D2" type="Node2D" parent="VBoxContainer/Control/WASD"]
+position = Vector2(200, 175)
+
+[node name="KeyboardButton" parent="VBoxContainer/Control/WASD/Node2D2" instance=ExtResource("2_8nrgi")]
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -24.0
+offset_top = -24.5
+offset_right = 24.0
+offset_bottom = 24.5
+grow_horizontal = 2
+grow_vertical = 2
+text = "S"
+
+[node name="Node2D3" type="Node2D" parent="VBoxContainer/Control/WASD"]
+position = Vector2(125, 175)
+
+[node name="KeyboardButton" parent="VBoxContainer/Control/WASD/Node2D3" instance=ExtResource("2_8nrgi")]
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -24.0
+offset_top = -24.5
+offset_right = 24.0
+offset_bottom = 24.5
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="Node2D4" type="Node2D" parent="VBoxContainer/Control/WASD"]
+position = Vector2(275, 175)
+
+[node name="KeyboardButton" parent="VBoxContainer/Control/WASD/Node2D4" instance=ExtResource("2_8nrgi")]
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -24.0
+offset_top = -24.5
+offset_right = 24.0
+offset_bottom = 24.5
+grow_horizontal = 2
+grow_vertical = 2
+text = "D"
+
+[node name="Node2D5" type="Node2D" parent="VBoxContainer/Control/WASD"]
+position = Vector2(200, 275)
+
+[node name="Label" type="Label" parent="VBoxContainer/Control/WASD/Node2D5"]
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -21.5
+offset_top = -11.5
+offset_right = 21.5
+offset_bottom = 11.5
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_fonts/font = ExtResource("3_nvtkh")
+theme_override_font_sizes/font_size = 40
+text = "c.controls_explanation.move"
+
+[node name="Spacer" type="Control" parent="VBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="Control2" type="Control" parent="VBoxContainer"]
+custom_minimum_size = Vector2(750, 450)
+layout_mode = 2
+size_flags_vertical = 4
+
+[node name="JKL" type="Node2D" parent="VBoxContainer/Control2"]
+position = Vector2(150, 0)
+
+[node name="K" type="Node2D" parent="VBoxContainer/Control2/JKL"]
+position = Vector2(200, 175)
+
+[node name="KeyboardButton" parent="VBoxContainer/Control2/JKL/K" instance=ExtResource("2_8nrgi")]
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -24.0
+offset_top = -24.5
+offset_right = 24.0
+offset_bottom = 24.5
+grow_horizontal = 2
+grow_vertical = 2
+text = "K"
+
+[node name="J" type="Node2D" parent="VBoxContainer/Control2/JKL"]
+position = Vector2(125, 175)
+
+[node name="KeyboardButton" parent="VBoxContainer/Control2/JKL/J" instance=ExtResource("2_8nrgi")]
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -24.0
+offset_top = -24.5
+offset_right = 24.0
+offset_bottom = 24.5
+grow_horizontal = 2
+grow_vertical = 2
+text = "J"
+
+[node name="L" type="Node2D" parent="VBoxContainer/Control2/JKL"]
+position = Vector2(275, 175)
+
+[node name="KeyboardButton" parent="VBoxContainer/Control2/JKL/L" instance=ExtResource("2_8nrgi")]
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -24.0
+offset_top = -24.5
+offset_right = 24.0
+offset_bottom = 24.5
+grow_horizontal = 2
+grow_vertical = 2
+text = "L"
+
+[node name="LeftHand" type="Node2D" parent="VBoxContainer/Control2/JKL"]
+position = Vector2(25, 375)
+
+[node name="Label" type="Label" parent="VBoxContainer/Control2/JKL/LeftHand"]
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -21.5
+offset_top = -11.5
+offset_right = 21.5
+offset_bottom = 11.5
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_fonts/font = ExtResource("3_nvtkh")
+theme_override_font_sizes/font_size = 40
+text = "c.controls_explanation.interact_left"
+
+[node name="RightHand" type="Node2D" parent="VBoxContainer/Control2/JKL"]
+position = Vector2(375, 375)
+
+[node name="Label" type="Label" parent="VBoxContainer/Control2/JKL/RightHand"]
+anchors_preset = 8
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -21.5
+offset_top = -11.5
+offset_right = 21.5
+offset_bottom = 11.5
+grow_horizontal = 2
+grow_vertical = 2
+theme_override_fonts/font = ExtResource("3_nvtkh")
+theme_override_font_sizes/font_size = 40
+text = "c.controls_explanation.interact_right"
+
+[node name="Boost" type="Node2D" parent="VBoxContainer/Control2/JKL"]
+position = Vector2(335, 65)
+
+[node name="Label" type="Label" parent="VBoxContainer/Control2/JKL/Boost"]
+anchors_preset = 4
+anchor_top = 0.5
+anchor_bottom = 0.5
+offset_top = -29.0
+offset_right = 113.0
+offset_bottom = 20.0
+grow_vertical = 2
+theme_override_fonts/font = ExtResource("3_nvtkh")
+theme_override_font_sizes/font_size = 40
+text = "c.controls_explanation.boost"
+
+[node name="Sprite2D" type="Sprite2D" parent="VBoxContainer/Control2/JKL"]
+position = Vector2(50, 275)
+scale = Vector2(0.5, 0.5)
+texture = ExtResource("4_mjakv")
+
+[node name="Sprite2D2" type="Sprite2D" parent="VBoxContainer/Control2/JKL"]
+position = Vector2(350, 275)
+scale = Vector2(-0.5, 0.5)
+texture = ExtResource("4_mjakv")
+
+[node name="Sprite2D3" type="Sprite2D" parent="VBoxContainer/Control2/JKL"]
+position = Vector2(250, 90)
+rotation = -1.5707964
+scale = Vector2(-0.5, 0.5)
+texture = ExtResource("4_mjakv")
diff --git a/client/gui/resources/fonts/sansita-swashed-bold.tres b/client/gui/resources/fonts/sansita-swashed-bold.tres
new file mode 100644
index 00000000..17903145
--- /dev/null
+++ b/client/gui/resources/fonts/sansita-swashed-bold.tres
@@ -0,0 +1,9 @@
+[gd_resource type="FontVariation" load_steps=2 format=3 uid="uid://cl6m4hqsnrpav"]
+
+[ext_resource type="FontFile" uid="uid://bo4vh5xkpvrh1" path="res://gui/resources/fonts/font-sansita-swashed.woff2" id="1_x5a5j"]
+
+[resource]
+base_font = ExtResource("1_x5a5j")
+variation_opentype = {
+2003265652: 900
+}
diff --git a/client/multiplayer.gd b/client/multiplayer.gd
index b94b044c..c550716c 100644
--- a/client/multiplayer.gd
+++ b/client/multiplayer.gd
@@ -145,6 +145,11 @@ func send_leave(player):
"player": player,
})
+func send_ready():
+ send_packet({
+ "type": "ready"
+ })
+
func send_packet(p):
var json = JSON.stringify(p)
socket.send_text(json)
diff --git a/client/system/profile.gd b/client/system/profile.gd
index d0e04bb2..5fd7f548 100644
--- a/client/system/profile.gd
+++ b/client/system/profile.gd
@@ -25,7 +25,9 @@ static var default_profile := {
},
"last_server_url": "",
"tutorial_ingredients_played": [],
- "registry_asked": false
+ "registry_asked": false,
+ "controls_one_handed_explained": false,
+ "controls_two_handed_explained": false
}
# profile is stored in a Dictionary[String, Any]
diff --git a/locale/en.ini b/locale/en.ini
index 3e707831..55dcdde5 100644
--- a/locale/en.ini
+++ b/locale/en.ini
@@ -2,9 +2,15 @@
c.announce.go=GO!
c.announce.ready=READY?
c.chat.write_message=Write message
+c.controls_explanation.boost=Boost
+c.controls_explanation.interact_left=Left hand
+c.controls_explanation.interact_right=Right hand
+c.controls_explanation.move=Move
+c.controls_explanation.two_handed=You can use both hands in this map
c.credits.contributors=with contributions from
c.credits.developed_by=developed by
c.credits.models=Models
+c.credits.other=Other
c.credits.sounds=Sounds
c.credits.thanks=Thank You For Playing
c.credits.title=Hurry Curry! - a game about cooking
@@ -26,8 +32,6 @@ c.map.difficulty.2=Moderate
c.map.difficulty.3=Unplayable
c.map.difficulty.4=Very hard
c.map.difficulty=Difficulty
-c.system_message.screenshot_saved=Screenshot saved to {path}
-c.system_message.sceneshot_saved=Sceneshot saved to {path}
c.map.players_recommended={0} players recommended
c.menu.about.credits=Credits
c.menu.about.legal=Legal
@@ -36,9 +40,10 @@ c.menu.about.version=Version
c.menu.about=About
c.menu.accept=Accept
c.menu.back=Back
+c.menu.customize_chef=Customize Chef
c.menu.deny=Deny
-c.menu.game.connecting=Connecting...
c.menu.error.title=Error
+c.menu.game.connecting=Connecting...
c.menu.ingame.cancel=Abort current game
c.menu.ingame.join=Join game
c.menu.ingame.leave=Spectate
@@ -51,7 +56,6 @@ c.menu.lobby.enable_bots=Enable bots
c.menu.lobby.mapname=Map name
c.menu.lobby.players=Players
c.menu.lobby.start=Start game
-c.menu.customize_chef=Customize Chef
c.menu.play.allow_query_registry=To show a public server list a registry service is contacted regularly. The registry service is {0}.
c.menu.play.connect=Connect
c.menu.play.editor_failed=Editor (failed)
@@ -62,18 +66,18 @@ c.menu.play.editor_testing=Map Editor (testing)
c.menu.play.editor_unavailable=Map Editor (unavailable)
c.menu.play.editor=Map Editor
c.menu.play.fetching_list=Fetching server list…
-c.menu.play.server_version_mismatch=Protocol version mismatch
-c.menu.play.server_players={0} players online
c.menu.play.no_servers=No servers available.
c.menu.play.quick_connect=Quick Connect
c.menu.play.server_binary_not_found=Server binary was not found. Please install the server separately.
c.menu.play.server_failed_tooltip=The server crashed or exited in some way or another.%nYou should try starting the server from the command-line.
c.menu.play.server_failed=Server (failed)
+c.menu.play.server_players={0} players online
c.menu.play.server_start=Start server
c.menu.play.server_starting=Server is starting…
c.menu.play.server_stop=Stop server
c.menu.play.server_testing=Server (testing)
c.menu.play.server_unavailable=Server (unavailable)
+c.menu.play.server_version_mismatch=Protocol version mismatch
c.menu.play=Play
c.menu.quit=Quit
c.menu.scoreboard.button=Show scoreboard
@@ -104,12 +108,12 @@ c.settings.gameplay.interact_target=Interact Target Behaviour
c.settings.gameplay.interpolate_camera_rotation=Smooth camera rotation
c.settings.gameplay.invert_camera=Invert camera movement
c.settings.gameplay.latch_boost=Always extend boost to maximum duration
+c.settings.gameplay.screenshot_path=Screenshot directory
c.settings.gameplay.setup_completed.button_label=Open setup form
c.settings.gameplay.setup_completed=Initial setup completed
c.settings.gameplay.tutorial_disabled=Disable tutorial
c.settings.gameplay.usernames=Show username tags
c.settings.gameplay.vibration=Enable vibrations
-c.settings.gameplay.screenshot_path=Screenshot directory
c.settings.gameplay=Gameplay
c.settings.graphics.aa.disabled=Disabled
c.settings.graphics.aa.fx=FXAA (computationally cheap but generated artifacts)
@@ -139,16 +143,11 @@ c.settings.graphics.taa=Temporal Anti-Aliasing
c.settings.graphics.ui_blur=Enable UI blur
c.settings.graphics=Graphics
c.settings.input.add=Add new
-c.settings.input.screenshot=Take screenshot
-c.settings.input.sceneshot=Take sceneshot (saves game world as glTF)
-c.settings.input.toggle_overlay=Toggle overlay visibility
-c.settings.input.toggle_debug=Toggle debug overlay
-c.settings.input.toggle_first_person=Toggle first person camera
c.settings.input.backwards=Move Backwards
c.settings.input.boost=Boost movement
c.settings.input.chat=Toggle chat
-c.settings.input.fps_mouse_sensitivity=Mouse Sensitivity (FPS)
c.settings.input.forwards=Move Forwards
+c.settings.input.fps_mouse_sensitivity=Mouse Sensitivity (FPS)
c.settings.input.fullscreen=Toggle fullscreen
c.settings.input.interact_left=Interact (Left hand)
c.settings.input.interact_right=Interact (Right hand)
@@ -170,11 +169,16 @@ c.settings.input.rotate_down=Rotate camera down
c.settings.input.rotate_left=Rotate camera left
c.settings.input.rotate_right=Rotate camera right
c.settings.input.rotate_up=Rotate camera up
+c.settings.input.sceneshot=Take sceneshot (saves game world as glTF)
+c.settings.input.screenshot=Take screenshot
c.settings.input.scroll_down_discrete=Scroll down (discrete)
c.settings.input.scroll_down=Scroll down
c.settings.input.scroll_up_discrete=Scroll up (discrete)
c.settings.input.scroll_up=Scroll up
c.settings.input.start_game=Start game
+c.settings.input.toggle_debug=Toggle debug overlay
+c.settings.input.toggle_first_person=Toggle first person camera
+c.settings.input.toggle_overlay=Toggle overlay visibility
c.settings.input.unknown_event=Unknown event
c.settings.input.zoom_in_discrete=Zoom in (discrete)
c.settings.input.zoom_in=Zoom in
@@ -197,13 +201,13 @@ c.settings.server.name=Server display name
c.settings.server.register=Submit for public listing (requires port forwarding)
c.settings.server.upnp=Automatic port forwarding (requires UPnP)
c.settings.server=Server
+c.settings.ui.hide_overlays=Hide in-game overlays (Orders, timer, etc.)
c.settings.ui.language.system=System default
c.settings.ui.language=Language
c.settings.ui.scale_factor=UI scale factor
c.settings.ui.scale_mode.disabled=Disabled
c.settings.ui.scale_mode.resize=Resize
c.settings.ui.scale_mode=UI scale mode
-c.settings.ui.hide_overlays=Hide in-game overlays (Orders, timer, etc.)
c.settings.ui.touch_controls.automatic=Automatic
c.settings.ui.touch_controls.disabled=Disabled
c.settings.ui.touch_controls.enabled=Enabled
@@ -229,6 +233,8 @@ c.setup.uniform.value=Hairstyle {0}
c.setup.uniform=3. [b]Working Uniform.[/b] You must always have one of the following hairstyles.
c.setup.user_signature.desc=Signature of the Employee:%n%n%n
c.setup.user_signature=Click to sign
+c.system_message.sceneshot_saved=Sceneshot saved to {path}
+c.system_message.screenshot_saved=Screenshot saved to {path}
c.version.arch=Processor Architecture
c.version.distribution=Distribution
c.version.game=Game Version