aboutsummaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authortpart <tpart120@proton.me>2026-02-26 20:30:49 +0100
committertpart <tpart120@proton.me>2026-02-26 20:49:54 +0100
commit04dd47d13a8da9224e7f9ea8ccacf64129717ec1 (patch)
tree2a88e646d1b8dfbcd5973092655bf9a0ebc1c625 /client
parentb91eb2a9bdf4167c69a4d82f2a44855138f58b94 (diff)
downloadhurrycurry-04dd47d13a8da9224e7f9ea8ccacf64129717ec1.tar
hurrycurry-04dd47d13a8da9224e7f9ea8ccacf64129717ec1.tar.bz2
hurrycurry-04dd47d13a8da9224e7f9ea8ccacf64129717ec1.tar.zst
Implement tile stacks in client; Upgrade to Godot 4.6
Diffstat (limited to 'client')
-rw-r--r--client/default_bus_layout.tres2
-rw-r--r--client/export_presets.cfg339
-rw-r--r--client/game.gd22
-rw-r--r--client/global.gd6
-rw-r--r--client/gui/menus/entry.tscn4
-rw-r--r--client/gui/menus/game.tscn8
-rw-r--r--client/gui/menus/main/background.gd16
-rw-r--r--client/gui/resources/shaders/paper.tres2
-rw-r--r--client/gui/resources/theme/theme.tres2
-rw-r--r--client/map/map.gd38
-rw-r--r--client/map/map.tscn6
-rw-r--r--client/map/tile_factory.gd6
-rw-r--r--client/map/tiles/chair.gd9
-rw-r--r--client/map/tiles/conveyor.gd2
-rw-r--r--client/map/tiles/counter.gd18
-rw-r--r--client/map/tiles/door.gd2
-rw-r--r--client/map/tiles/generic_tile.gd2
-rw-r--r--client/map/tiles/grass_side.tres2
-rw-r--r--client/map/tiles/player_portal.gd2
-rw-r--r--client/map/tiles/screen/screen.gd2
-rw-r--r--client/map/tiles/table.gd2
-rw-r--r--client/map/tiles/unknown_tile.gd2
-rw-r--r--client/map/tiles/wall_tile.gd12
-rw-r--r--client/multiplayer.gd22
-rw-r--r--client/project.godot6
25 files changed, 434 insertions, 100 deletions
diff --git a/client/default_bus_layout.tres b/client/default_bus_layout.tres
index 6c958883..33838b2a 100644
--- a/client/default_bus_layout.tres
+++ b/client/default_bus_layout.tres
@@ -1,4 +1,4 @@
-[gd_resource type="AudioBusLayout" load_steps=3 format=3 uid="uid://cco0uysin1okg"]
+[gd_resource type="AudioBusLayout" format=3 uid="uid://cco0uysin1okg"]
[sub_resource type="AudioEffectLowPassFilter" id="AudioEffectLowPassFilter_j3pel"]
resource_name = "LowPassFilter"
diff --git a/client/export_presets.cfg b/client/export_presets.cfg
index efeb6228..0f6416f7 100644
--- a/client/export_presets.cfg
+++ b/client/export_presets.cfg
@@ -3,7 +3,6 @@
name="wasm32-unknown-unknown"
platform="Web"
runnable=true
-advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
@@ -11,6 +10,11 @@ include_filter="*.ini, *.ini1"
exclude_filter=""
export_path=""
patches=PackedStringArray()
+patch_delta_encoding=false
+patch_delta_compression_level_zstd=19
+patch_delta_min_reduction=0.1
+patch_delta_include_filters="*"
+patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
@@ -49,14 +53,18 @@ threads/godot_pool_size=4
name="x86_64-unknown-linux-gnu"
platform="Linux"
runnable=true
-advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter="*.ini, *.ini1"
exclude_filter=""
-export_path=""
+export_path="../../hurrycurry.x86_64"
patches=PackedStringArray()
+patch_delta_encoding=false
+patch_delta_compression_level_zstd=19
+patch_delta_min_reduction=0.1
+patch_delta_include_filters="*"
+patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
@@ -91,7 +99,6 @@ texture_format/etc2=false
name="aarch64-unknown-linux-gnu"
platform="Linux"
runnable=false
-advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
@@ -99,6 +106,11 @@ include_filter="*.ini, *.ini1"
exclude_filter=""
export_path=""
patches=PackedStringArray()
+patch_delta_encoding=false
+patch_delta_compression_level_zstd=19
+patch_delta_min_reduction=0.1
+patch_delta_include_filters="*"
+patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
@@ -133,7 +145,6 @@ texture_format/etc2=false
name="armv7-unknown-linux-gnueabi"
platform="Linux"
runnable=false
-advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
@@ -141,6 +152,11 @@ include_filter="*.ini, *.ini1"
exclude_filter=""
export_path=""
patches=PackedStringArray()
+patch_delta_encoding=false
+patch_delta_compression_level_zstd=19
+patch_delta_min_reduction=0.1
+patch_delta_include_filters="*"
+patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
@@ -175,7 +191,6 @@ texture_format/etc2=false
name="i686-unknown-linux-gnu"
platform="Linux"
runnable=false
-advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
@@ -183,6 +198,11 @@ include_filter="*.ini, *.ini1"
exclude_filter=""
export_path=""
patches=PackedStringArray()
+patch_delta_encoding=false
+patch_delta_compression_level_zstd=19
+patch_delta_min_reduction=0.1
+patch_delta_include_filters="*"
+patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
@@ -217,7 +237,6 @@ texture_format/etc2=false
name="x86_64-pc-windows-gnu"
platform="Windows Desktop"
runnable=true
-advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
@@ -225,6 +244,11 @@ include_filter="*.ini, *.ini1"
exclude_filter=""
export_path=""
patches=PackedStringArray()
+patch_delta_encoding=false
+patch_delta_compression_level_zstd=19
+patch_delta_min_reduction=0.1
+patch_delta_include_filters="*"
+patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
@@ -289,7 +313,6 @@ texture_format/etc2=false
name="i686-pc-windows-gnu"
platform="Windows Desktop"
runnable=false
-advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
@@ -297,6 +320,11 @@ include_filter="*.ini, *.ini1"
exclude_filter=""
export_path=""
patches=PackedStringArray()
+patch_delta_encoding=false
+patch_delta_compression_level_zstd=19
+patch_delta_min_reduction=0.1
+patch_delta_include_filters="*"
+patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
@@ -361,7 +389,6 @@ texture_format/etc2=false
name="aarch64-linux-android"
platform="Android"
runnable=true
-advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
@@ -369,6 +396,11 @@ include_filter="*.ini, *.ini1"
exclude_filter=""
export_path="../../aaabuild/hurrycurry.apk"
patches=PackedStringArray()
+patch_delta_encoding=false
+patch_delta_compression_level_zstd=19
+patch_delta_min_reduction=0.1
+patch_delta_include_filters="*"
+patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
@@ -498,6 +530,7 @@ permissions/manage_accounts=false
permissions/manage_app_tokens=false
permissions/manage_documents=false
permissions/manage_external_storage=false
+permissions/manage_media=false
permissions/master_clear=false
permissions/media_content_control=false
permissions/modify_audio_settings=false
@@ -582,7 +615,6 @@ permissions/write_user_dictionary=false
name="armv7-linux-androideabi"
platform="Android"
runnable=false
-advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
@@ -590,6 +622,11 @@ include_filter="*.ini, *.ini1"
exclude_filter=""
export_path=""
patches=PackedStringArray()
+patch_delta_encoding=false
+patch_delta_compression_level_zstd=19
+patch_delta_min_reduction=0.1
+patch_delta_include_filters="*"
+patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
@@ -719,6 +756,7 @@ permissions/manage_accounts=false
permissions/manage_app_tokens=false
permissions/manage_documents=false
permissions/manage_external_storage=false
+permissions/manage_media=false
permissions/master_clear=false
permissions/media_content_control=false
permissions/modify_audio_settings=false
@@ -803,7 +841,6 @@ permissions/write_user_dictionary=false
name="x86_64-linux-android"
platform="Android"
runnable=false
-advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
@@ -811,6 +848,11 @@ include_filter="*.ini, *.ini1"
exclude_filter=""
export_path=""
patches=PackedStringArray()
+patch_delta_encoding=false
+patch_delta_compression_level_zstd=19
+patch_delta_min_reduction=0.1
+patch_delta_include_filters="*"
+patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
@@ -940,6 +982,7 @@ permissions/manage_accounts=false
permissions/manage_app_tokens=false
permissions/manage_documents=false
permissions/manage_external_storage=false
+permissions/manage_media=false
permissions/master_clear=false
permissions/media_content_control=false
permissions/modify_audio_settings=false
@@ -1024,7 +1067,6 @@ permissions/write_user_dictionary=false
name="i686-linux-android"
platform="Android"
runnable=false
-advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
@@ -1032,6 +1074,11 @@ include_filter="*.ini, *.ini1"
exclude_filter=""
export_path=""
patches=PackedStringArray()
+patch_delta_encoding=false
+patch_delta_compression_level_zstd=19
+patch_delta_min_reduction=0.1
+patch_delta_include_filters="*"
+patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
@@ -1161,6 +1208,7 @@ permissions/manage_accounts=false
permissions/manage_app_tokens=false
permissions/manage_documents=false
permissions/manage_external_storage=false
+permissions/manage_media=false
permissions/master_clear=false
permissions/media_content_control=false
permissions/modify_audio_settings=false
@@ -1245,7 +1293,6 @@ permissions/write_user_dictionary=false
name="all-linux-android"
platform="Android"
runnable=false
-advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
@@ -1253,6 +1300,11 @@ include_filter="*.ini, *.ini1"
exclude_filter=""
export_path=""
patches=PackedStringArray()
+patch_delta_encoding=false
+patch_delta_compression_level_zstd=19
+patch_delta_min_reduction=0.1
+patch_delta_include_filters="*"
+patch_delta_exclude_filters=""
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
@@ -1382,6 +1434,7 @@ permissions/manage_accounts=false
permissions/manage_app_tokens=false
permissions/manage_documents=false
permissions/manage_external_storage=false
+permissions/manage_media=false
permissions/master_clear=false
permissions/media_content_control=false
permissions/modify_audio_settings=false
@@ -1460,3 +1513,263 @@ permissions/write_sms=false
permissions/write_social_stream=false
permissions/write_sync_settings=false
permissions/write_user_dictionary=false
+
+[preset.12]
+
+name="macOS"
+platform="macOS"
+runnable=true
+dedicated_server=false
+custom_features=""
+export_filter="all_resources"
+include_filter="*.ini, *.ini1"
+exclude_filter=""
+export_path="../../../hurrycurry.zip"
+patches=PackedStringArray()
+patch_delta_encoding=false
+patch_delta_compression_level_zstd=19
+patch_delta_min_reduction=0.1
+patch_delta_include_filters="*"
+patch_delta_exclude_filters=""
+encryption_include_filters=""
+encryption_exclude_filters=""
+seed=0
+encrypt_pck=false
+encrypt_directory=false
+script_export_mode=2
+
+[preset.12.options]
+
+export/distribution_type=1
+binary_format/architecture="universal"
+custom_template/debug=""
+custom_template/release=""
+debug/export_console_wrapper=1
+application/liquid_glass_icon=""
+application/icon="uid://b1hb26s0blceb"
+application/icon_interpolation=4
+application/bundle_identifier="org.hurrycurry.client"
+application/signature=""
+application/app_category="Games"
+application/short_version="3.0.1"
+application/version="3.0.1"
+application/copyright="Copyright (c) 2026 Hurry Curry! Contributors"
+application/copyright_localized={}
+application/min_macos_version_x86_64="10.12"
+application/min_macos_version_arm64="11.00"
+application/export_angle=0
+display/high_res=true
+shader_baker/enabled=false
+application/additional_plist_content=""
+xcode/platform_build="14C18"
+xcode/sdk_version="13.1"
+xcode/sdk_build="22C55"
+xcode/sdk_name="macosx13.1"
+xcode/xcode_version="1420"
+xcode/xcode_build="14C18"
+codesign/codesign=1
+codesign/installer_identity=""
+codesign/apple_team_id=""
+codesign/identity=""
+codesign/entitlements/custom_file=""
+codesign/entitlements/allow_jit_code_execution=false
+codesign/entitlements/allow_unsigned_executable_memory=false
+codesign/entitlements/allow_dyld_environment_variables=false
+codesign/entitlements/disable_library_validation=false
+codesign/entitlements/audio_input=false
+codesign/entitlements/camera=false
+codesign/entitlements/location=false
+codesign/entitlements/address_book=false
+codesign/entitlements/calendars=false
+codesign/entitlements/photos_library=false
+codesign/entitlements/apple_events=false
+codesign/entitlements/debugging=false
+codesign/entitlements/app_sandbox/enabled=false
+codesign/entitlements/app_sandbox/network_server=false
+codesign/entitlements/app_sandbox/network_client=false
+codesign/entitlements/app_sandbox/device_usb=false
+codesign/entitlements/app_sandbox/device_bluetooth=false
+codesign/entitlements/app_sandbox/files_downloads=0
+codesign/entitlements/app_sandbox/files_pictures=0
+codesign/entitlements/app_sandbox/files_music=0
+codesign/entitlements/app_sandbox/files_movies=0
+codesign/entitlements/app_sandbox/files_user_selected=0
+codesign/entitlements/app_sandbox/helper_executables=[]
+codesign/entitlements/additional=""
+codesign/custom_options=PackedStringArray()
+notarization/notarization=0
+privacy/microphone_usage_description=""
+privacy/microphone_usage_description_localized={}
+privacy/camera_usage_description=""
+privacy/camera_usage_description_localized={}
+privacy/location_usage_description=""
+privacy/location_usage_description_localized={}
+privacy/address_book_usage_description=""
+privacy/address_book_usage_description_localized={}
+privacy/calendar_usage_description=""
+privacy/calendar_usage_description_localized={}
+privacy/photos_library_usage_description=""
+privacy/photos_library_usage_description_localized={}
+privacy/desktop_folder_usage_description=""
+privacy/desktop_folder_usage_description_localized={}
+privacy/documents_folder_usage_description=""
+privacy/documents_folder_usage_description_localized={}
+privacy/downloads_folder_usage_description=""
+privacy/downloads_folder_usage_description_localized={}
+privacy/network_volumes_usage_description=""
+privacy/network_volumes_usage_description_localized={}
+privacy/removable_volumes_usage_description=""
+privacy/removable_volumes_usage_description_localized={}
+privacy/tracking_enabled=false
+privacy/tracking_domains=PackedStringArray()
+privacy/collected_data/name/collected=false
+privacy/collected_data/name/linked_to_user=false
+privacy/collected_data/name/used_for_tracking=false
+privacy/collected_data/name/collection_purposes=0
+privacy/collected_data/email_address/collected=false
+privacy/collected_data/email_address/linked_to_user=false
+privacy/collected_data/email_address/used_for_tracking=false
+privacy/collected_data/email_address/collection_purposes=0
+privacy/collected_data/phone_number/collected=false
+privacy/collected_data/phone_number/linked_to_user=false
+privacy/collected_data/phone_number/used_for_tracking=false
+privacy/collected_data/phone_number/collection_purposes=0
+privacy/collected_data/physical_address/collected=false
+privacy/collected_data/physical_address/linked_to_user=false
+privacy/collected_data/physical_address/used_for_tracking=false
+privacy/collected_data/physical_address/collection_purposes=0
+privacy/collected_data/other_contact_info/collected=false
+privacy/collected_data/other_contact_info/linked_to_user=false
+privacy/collected_data/other_contact_info/used_for_tracking=false
+privacy/collected_data/other_contact_info/collection_purposes=0
+privacy/collected_data/health/collected=false
+privacy/collected_data/health/linked_to_user=false
+privacy/collected_data/health/used_for_tracking=false
+privacy/collected_data/health/collection_purposes=0
+privacy/collected_data/fitness/collected=false
+privacy/collected_data/fitness/linked_to_user=false
+privacy/collected_data/fitness/used_for_tracking=false
+privacy/collected_data/fitness/collection_purposes=0
+privacy/collected_data/payment_info/collected=false
+privacy/collected_data/payment_info/linked_to_user=false
+privacy/collected_data/payment_info/used_for_tracking=false
+privacy/collected_data/payment_info/collection_purposes=0
+privacy/collected_data/credit_info/collected=false
+privacy/collected_data/credit_info/linked_to_user=false
+privacy/collected_data/credit_info/used_for_tracking=false
+privacy/collected_data/credit_info/collection_purposes=0
+privacy/collected_data/other_financial_info/collected=false
+privacy/collected_data/other_financial_info/linked_to_user=false
+privacy/collected_data/other_financial_info/used_for_tracking=false
+privacy/collected_data/other_financial_info/collection_purposes=0
+privacy/collected_data/precise_location/collected=false
+privacy/collected_data/precise_location/linked_to_user=false
+privacy/collected_data/precise_location/used_for_tracking=false
+privacy/collected_data/precise_location/collection_purposes=0
+privacy/collected_data/coarse_location/collected=false
+privacy/collected_data/coarse_location/linked_to_user=false
+privacy/collected_data/coarse_location/used_for_tracking=false
+privacy/collected_data/coarse_location/collection_purposes=0
+privacy/collected_data/sensitive_info/collected=false
+privacy/collected_data/sensitive_info/linked_to_user=false
+privacy/collected_data/sensitive_info/used_for_tracking=false
+privacy/collected_data/sensitive_info/collection_purposes=0
+privacy/collected_data/contacts/collected=false
+privacy/collected_data/contacts/linked_to_user=false
+privacy/collected_data/contacts/used_for_tracking=false
+privacy/collected_data/contacts/collection_purposes=0
+privacy/collected_data/emails_or_text_messages/collected=false
+privacy/collected_data/emails_or_text_messages/linked_to_user=false
+privacy/collected_data/emails_or_text_messages/used_for_tracking=false
+privacy/collected_data/emails_or_text_messages/collection_purposes=0
+privacy/collected_data/photos_or_videos/collected=false
+privacy/collected_data/photos_or_videos/linked_to_user=false
+privacy/collected_data/photos_or_videos/used_for_tracking=false
+privacy/collected_data/photos_or_videos/collection_purposes=0
+privacy/collected_data/audio_data/collected=false
+privacy/collected_data/audio_data/linked_to_user=false
+privacy/collected_data/audio_data/used_for_tracking=false
+privacy/collected_data/audio_data/collection_purposes=0
+privacy/collected_data/gameplay_content/collected=false
+privacy/collected_data/gameplay_content/linked_to_user=false
+privacy/collected_data/gameplay_content/used_for_tracking=false
+privacy/collected_data/gameplay_content/collection_purposes=0
+privacy/collected_data/customer_support/collected=false
+privacy/collected_data/customer_support/linked_to_user=false
+privacy/collected_data/customer_support/used_for_tracking=false
+privacy/collected_data/customer_support/collection_purposes=0
+privacy/collected_data/other_user_content/collected=false
+privacy/collected_data/other_user_content/linked_to_user=false
+privacy/collected_data/other_user_content/used_for_tracking=false
+privacy/collected_data/other_user_content/collection_purposes=0
+privacy/collected_data/browsing_history/collected=false
+privacy/collected_data/browsing_history/linked_to_user=false
+privacy/collected_data/browsing_history/used_for_tracking=false
+privacy/collected_data/browsing_history/collection_purposes=0
+privacy/collected_data/search_history/collected=false
+privacy/collected_data/search_history/linked_to_user=false
+privacy/collected_data/search_history/used_for_tracking=false
+privacy/collected_data/search_history/collection_purposes=0
+privacy/collected_data/user_id/collected=false
+privacy/collected_data/user_id/linked_to_user=false
+privacy/collected_data/user_id/used_for_tracking=false
+privacy/collected_data/user_id/collection_purposes=0
+privacy/collected_data/device_id/collected=false
+privacy/collected_data/device_id/linked_to_user=false
+privacy/collected_data/device_id/used_for_tracking=false
+privacy/collected_data/device_id/collection_purposes=0
+privacy/collected_data/purchase_history/collected=false
+privacy/collected_data/purchase_history/linked_to_user=false
+privacy/collected_data/purchase_history/used_for_tracking=false
+privacy/collected_data/purchase_history/collection_purposes=0
+privacy/collected_data/product_interaction/collected=false
+privacy/collected_data/product_interaction/linked_to_user=false
+privacy/collected_data/product_interaction/used_for_tracking=false
+privacy/collected_data/product_interaction/collection_purposes=0
+privacy/collected_data/advertising_data/collected=false
+privacy/collected_data/advertising_data/linked_to_user=false
+privacy/collected_data/advertising_data/used_for_tracking=false
+privacy/collected_data/advertising_data/collection_purposes=0
+privacy/collected_data/other_usage_data/collected=false
+privacy/collected_data/other_usage_data/linked_to_user=false
+privacy/collected_data/other_usage_data/used_for_tracking=false
+privacy/collected_data/other_usage_data/collection_purposes=0
+privacy/collected_data/crash_data/collected=false
+privacy/collected_data/crash_data/linked_to_user=false
+privacy/collected_data/crash_data/used_for_tracking=false
+privacy/collected_data/crash_data/collection_purposes=0
+privacy/collected_data/performance_data/collected=false
+privacy/collected_data/performance_data/linked_to_user=false
+privacy/collected_data/performance_data/used_for_tracking=false
+privacy/collected_data/performance_data/collection_purposes=0
+privacy/collected_data/other_diagnostic_data/collected=false
+privacy/collected_data/other_diagnostic_data/linked_to_user=false
+privacy/collected_data/other_diagnostic_data/used_for_tracking=false
+privacy/collected_data/other_diagnostic_data/collection_purposes=0
+privacy/collected_data/environment_scanning/collected=false
+privacy/collected_data/environment_scanning/linked_to_user=false
+privacy/collected_data/environment_scanning/used_for_tracking=false
+privacy/collected_data/environment_scanning/collection_purposes=0
+privacy/collected_data/hands/collected=false
+privacy/collected_data/hands/linked_to_user=false
+privacy/collected_data/hands/used_for_tracking=false
+privacy/collected_data/hands/collection_purposes=0
+privacy/collected_data/head/collected=false
+privacy/collected_data/head/linked_to_user=false
+privacy/collected_data/head/used_for_tracking=false
+privacy/collected_data/head/collection_purposes=0
+privacy/collected_data/other_data_types/collected=false
+privacy/collected_data/other_data_types/linked_to_user=false
+privacy/collected_data/other_data_types/used_for_tracking=false
+privacy/collected_data/other_data_types/collection_purposes=0
+ssh_remote_deploy/enabled=false
+ssh_remote_deploy/host="user@host_ip"
+ssh_remote_deploy/port="22"
+ssh_remote_deploy/extra_args_ssh=""
+ssh_remote_deploy/extra_args_scp=""
+ssh_remote_deploy/run_script="#!/usr/bin/env bash
+unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
+open \"{temp_dir}/{exe_name}.app\" --args {cmd_args}"
+ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
+pkill -x -f \"{temp_dir}/{exe_name}.app/Contents/MacOS/{exe_name} {cmd_args}\"
+rm -rf \"{temp_dir}\""
diff --git a/client/game.gd b/client/game.gd
index c1a99a6c..ebcb688e 100644
--- a/client/game.gd
+++ b/client/game.gd
@@ -46,7 +46,7 @@ var item_names: Array = []
var item_index_by_name: Dictionary = {}
var tile_names: Array = []
var tile_index_by_name: Dictionary = {}
-var tile_walkable: Dictionary = {}
+var tile_collide: Dictionary = {}
var tile_placeable_items: Dictionary = {}
var tile_interactable_empty: Dictionary = {}
var maps: Array = []
@@ -93,8 +93,8 @@ func handle_packet(p):
"data":
item_names = p["data"]["item_names"]
tile_names = p["data"]["tile_names"]
- tile_walkable = {}
- for tile in p["data"]["tile_walkable"]: tile_walkable[int(tile)] = true
+ tile_collide = {}
+ for tile in p["data"]["tile_collide"]: tile_collide[int(tile)] = true
tile_interactable_empty = {}
for tile in p["data"]["tile_interactable_empty"]: tile_interactable_empty[int(tile)] = true
tile_placeable_items = {}
@@ -227,11 +227,15 @@ func handle_packet(p):
pl.finish(h)
pl.set_item(null, h)
"update_map":
- var neighbors: Array = p["neighbors"]
- if neighbors != null: neighbors = neighbors.map(func(x): return tile_names[x] if x != null else null)
- if p.kind != null: map.set_tile(p.tile, tile_names[p.kind], neighbors)
- else: map.set_tile(p.tile)
- "flush_map":
+ var pending_changes: Dictionary[Vector2i, Array] = {} # Dictionary[Vector2i, Array[String]]
+ for change in p["changes"]:
+ var pos := Vector2i(change[0][0], change[0][1])
+ var tiles: Array = change[1].map(func(x): return tile_names[int(x)] if x != null else null) # : Array[String]
+ pending_changes[pos] = tiles
+
+ for pos: Vector2i in pending_changes:
+ map.set_tiles(pos, pending_changes[pos], pending_changes)
+
map.flush()
"communicate":
# TODO: use MessageParser
@@ -437,7 +441,7 @@ func _process(delta):
func get_tile_collision(pos: Vector2i) -> bool:
var t = map.get_tile_name(pos)
if t == null: return true
- else: return not tile_walkable.has(tile_index_by_name[t])
+ else: return tile_collide.has(tile_index_by_name[t])
func is_tile_interactive(pos: Vector2i, hands: Array) -> bool:
var tile_name = map.get_tile_name(pos)
diff --git a/client/global.gd b/client/global.gd
index 91696d34..478c9d93 100644
--- a/client/global.gd
+++ b/client/global.gd
@@ -179,3 +179,9 @@ static func rem_euclid(i: int, mod: int) -> int:
num += mod
num %= mod
return num
+
+static func has_one(arr: Array, items: Array):
+ for item in items:
+ if arr.has(item):
+ return true
+ return false
diff --git a/client/gui/menus/entry.tscn b/client/gui/menus/entry.tscn
index f4eced3e..a4e74f5e 100644
--- a/client/gui/menus/entry.tscn
+++ b/client/gui/menus/entry.tscn
@@ -1,8 +1,8 @@
-[gd_scene load_steps=2 format=3 uid="uid://cd52sr1cmo8oj"]
+[gd_scene format=3 uid="uid://cd52sr1cmo8oj"]
[ext_resource type="Script" uid="uid://yxaynnimyxgr" path="res://gui/menus/entry.gd" id="1_kibw2"]
-[node name="Entry" type="Control"]
+[node name="Entry" type="Control" unique_id=1447244984]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
diff --git a/client/gui/menus/game.tscn b/client/gui/menus/game.tscn
index 44efef21..f0322454 100644
--- a/client/gui/menus/game.tscn
+++ b/client/gui/menus/game.tscn
@@ -1,10 +1,10 @@
-[gd_scene load_steps=4 format=3 uid="uid://bbjwoxs71fnsk"]
+[gd_scene format=3 uid="uid://bbjwoxs71fnsk"]
[ext_resource type="Script" uid="uid://bmno0s2du3ie6" path="res://gui/menus/game.gd" id="1_cdpsh"]
[ext_resource type="PackedScene" uid="uid://c6krh36hoqfg8" path="res://game.tscn" id="2_uojcy"]
[ext_resource type="PackedScene" uid="uid://cr26jennm5c0c" path="res://gui/overlays/overlays.tscn" id="3_eaud4"]
-[node name="GameMenu" type="Control"]
+[node name="GameMenu" type="Control" unique_id=348091771]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
@@ -14,7 +14,7 @@ grow_vertical = 2
script = ExtResource("1_cdpsh")
auto_anim = false
-[node name="Game" parent="." instance=ExtResource("2_uojcy")]
+[node name="Game" parent="." unique_id=229241562 instance=ExtResource("2_uojcy")]
-[node name="Overlays" parent="." instance=ExtResource("3_eaud4")]
+[node name="Overlays" parent="." unique_id=553707754 instance=ExtResource("3_eaud4")]
layout_mode = 1
diff --git a/client/gui/menus/main/background.gd b/client/gui/menus/main/background.gd
index e2a0d3be..6bf31ef9 100644
--- a/client/gui/menus/main/background.gd
+++ b/client/gui/menus/main/background.gd
@@ -26,7 +26,7 @@ func _ready():
if !Global.on_vulkan():
environment.environment.tonemap_exposure = 0.25
- var tiles: Dictionary[Vector2i, Variant] = {} # : Dictionary[Vector2i, String?]
+ var tiles: Dictionary[Vector2i, Array] = {} # : Dictionary[Vector2i, Array[String]]
var item_counters := []
for x in range(-10, 11):
for y in range(-10, 11):
@@ -37,19 +37,11 @@ func _ready():
if k > 0.4: tile = choose(CRATES) if randf() > 0.7 else "counter"
if k > 0.6: tile = choose(TOOLS)
if tile != null:
- tiles[Vector2i(x,y)] = tile
+ tiles[Vector2i(x,y)] = [tile]
if tile == "counter" and randf() > 0.5 and w > 0.45:
item_counters.push_back(Vector2i(x, y))
- var get_tile := func (cs: Vector2i):
- return tiles.get(cs)
- for tile_pos: Vector2i in tiles.keys():
- var x := tile_pos.x
- var y := tile_pos.y
- var tile = get_tile.call(tile_pos)
- if tile != null:
- map.set_tile(Vector2i(x,y), tile,
- [Vector2i(x,y-1),Vector2i(x-1,y),Vector2i(x,y+1),Vector2i(x+1,y)].map(get_tile))
-
+ for pos: Vector2i in tiles:
+ map.set_tiles(Vector2i(pos.x, pos.y), tiles[pos], tiles)
map.flush()
for v: Vector2i in item_counters:
diff --git a/client/gui/resources/shaders/paper.tres b/client/gui/resources/shaders/paper.tres
index f99aec03..c2102a14 100644
--- a/client/gui/resources/shaders/paper.tres
+++ b/client/gui/resources/shaders/paper.tres
@@ -1,4 +1,4 @@
-[gd_resource type="NoiseTexture2D" load_steps=3 format=3 uid="uid://chxkwohi56cxx"]
+[gd_resource type="NoiseTexture2D" format=3 uid="uid://chxkwohi56cxx"]
[sub_resource type="Gradient" id="Gradient_pkrjd"]
colors = PackedColorArray(0.917969, 0.866454, 0.770122, 1, 0.832031, 0.781817, 0.666307, 1)
diff --git a/client/gui/resources/theme/theme.tres b/client/gui/resources/theme/theme.tres
index fba6ba2a..fdde8f70 100644
--- a/client/gui/resources/theme/theme.tres
+++ b/client/gui/resources/theme/theme.tres
@@ -1,4 +1,4 @@
-[gd_resource type="Theme" load_steps=12 format=3 uid="uid://b0qmvo504e457"]
+[gd_resource type="Theme" format=3 uid="uid://b0qmvo504e457"]
[ext_resource type="FontFile" uid="uid://5ixo6b3bd3km" path="res://gui/resources/fonts/font-josefin-sans.woff2" id="1_f8qb0"]
[ext_resource type="StyleBox" uid="uid://b86kbd3pfkd5w" path="res://gui/resources/style/focus_style.tres" id="1_x88rs"]
diff --git a/client/map/map.gd b/client/map/map.gd
index 4dd76ec4..afac0a1b 100644
--- a/client/map/map.gd
+++ b/client/map/map.gd
@@ -23,12 +23,14 @@ class TileInfo:
var name: String
var tile: Tile
var neighbours: Array
+
+const NEIGHBOR_OFFSETS: Array[Vector2i] = [Vector2i.UP, Vector2i.LEFT, Vector2i.DOWN, Vector2i.RIGHT]
var tile_by_pos: Dictionary[Vector2i, TileInfo] = {}
var autoflush = false
var currently_baked = false
var floor_node := MeshInstance3D.new()
-var tile_factory = TileFactory.new()
+var tile_factory := TileFactory.new()
func get_tile_name(pos: Vector2i): # -> String?
var e = tile_by_pos.get(pos)
@@ -39,22 +41,36 @@ func get_tile_instance(pos: Vector2i) -> Tile:
if e != null: return e.tile
else: return null
-func set_tile(pos: Vector2i, tilename = null, neighbors: Array = [null,null,null,null]):
+func set_tiles(pos: Vector2i, tiles: Array = [], pending_changes: Dictionary[Vector2i, Array] = {}): # tiles: Array[String]
var inst = get_tile_instance(pos)
- if inst and tilename: if inst.change(tilename): return # instance handled change itself
+ if inst != null and not tiles.is_empty():
+ for tile: String in tiles:
+ # TODO: Don't return, but handle changes which weren't handled by the instance below.
+ if inst.change(tile):
+ return # Instance handled change itself!
_remove_tile(pos)
- if tilename: _add_tile(pos, tilename, neighbors)
+ if not tiles.is_empty(): _add_tiles(pos, tiles, pending_changes)
if autoflush: flush()
-func _add_tile(pos: Vector2i, tilename: String, neighbors: Array) -> Tile:
- var tile := tile_factory.produce(tilename, pos, neighbors)
- add_child(tile)
- tile.position = Vector3(pos.x, 0, pos.y)
- tile_by_pos[pos] = TileInfo.new(pos, tilename, tile, neighbors)
- return tile
+func _add_tiles(pos: Vector2i, tiles: Array, pending_changes: Dictionary[Vector2i, Array] = {}) -> void:
+ # Find neighbor tile names
+ var neighbors: Array[Array] = [] # Array[Array[String]]
+ for offset: Vector2i in NEIGHBOR_OFFSETS:
+ var neighbor_pos: Vector2i = pos + offset
+ if pending_changes.has(neighbor_pos):
+ neighbors.append(pending_changes[neighbor_pos])
+ elif tile_by_pos.has(neighbor_pos):
+ neighbors.append(tile_by_pos[neighbor_pos])
+ else: neighbors.append([])
+
+ for tile_name: String in tiles:
+ var tile := tile_factory.produce(tile_name, pos, neighbors)
+ add_child(tile)
+ tile.position = Vector3(pos.x, 0, pos.y)
+ tile_by_pos[pos] = TileInfo.new(pos, tile_name, tile, neighbors)
func _remove_tile(pos: Vector2i):
- var tile = get_tile_instance(pos)
+ var tile := get_tile_instance(pos)
if tile == null: return
if tile.item != null: tile.item.queue_free()
if tile is FloorLike:
diff --git a/client/map/map.tscn b/client/map/map.tscn
index 84a4f09b..27cd3900 100644
--- a/client/map/map.tscn
+++ b/client/map/map.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=4 format=3 uid="uid://b4gone8fu53r7"]
+[gd_scene format=3 uid="uid://b4gone8fu53r7"]
[ext_resource type="Script" uid="uid://bxuukjyme1git" path="res://map/map.gd" id="1_3en0a"]
@@ -6,9 +6,9 @@
[sub_resource type="VoxelGIData" id="VoxelGIData_m5j5n"]
-[node name="Map" type="Node3D"]
+[node name="Map" type="Node3D" unique_id=764657840]
script = ExtResource("1_3en0a")
-[node name="VoxelGI" type="VoxelGI" parent="."]
+[node name="VoxelGI" type="VoxelGI" parent="." unique_id=1789448607]
camera_attributes = SubResource("CameraAttributesPractical_kwk4i")
data = SubResource("VoxelGIData_m5j5n")
diff --git a/client/map/tile_factory.gd b/client/map/tile_factory.gd
index ad415cfc..1640e512 100644
--- a/client/map/tile_factory.gd
+++ b/client/map/tile_factory.gd
@@ -43,7 +43,11 @@ func produce(raw_name: String, position: Vector2i, neighbors: Array) -> Tile:
var ctx := TileCC.new()
ctx.tile_name = tile_name
ctx.position = position
- ctx.neighbors = neighbors.map(func(n): return null if n == null else TileName.new(n).name)
+ ctx.neighbors = neighbors.map(func(a):
+ if a != null:
+ return a.map(func(b): return null if b == null else TileName.new(b).name)
+ else: return null
+ )
ctx.floor_meshers = floor_meshers
match tile_name.name:
diff --git a/client/map/tiles/chair.gd b/client/map/tiles/chair.gd
index 45b45638..4cd28cf7 100644
--- a/client/map/tiles/chair.gd
+++ b/client/map/tiles/chair.gd
@@ -14,17 +14,16 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
class_name Chair
-extends Floor
+extends Tile
func _init(ctx: TileFactory.TileCC):
super(ctx)
var chair = preload("res://map/tiles/chair.tscn").instantiate()
var facing = 0;
for i in range(4):
- match ctx.neighbors[i]:
- "coveyor", "table", "counter":
- facing = i
- break
+ if G.has_one(ctx.neighbors[i], ["coveyor", "table", "counter"]):
+ facing = i
+ break
base.add_child(chair)
turn_facing(facing)
diff --git a/client/map/tiles/conveyor.gd b/client/map/tiles/conveyor.gd
index 60505425..8f2c6d12 100644
--- a/client/map/tiles/conveyor.gd
+++ b/client/map/tiles/conveyor.gd
@@ -14,7 +14,7 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
class_name Conveyor
-extends Floor
+extends Tile
var conveyor: ConveyorModel = preload("res://map/tiles/conveyor.tscn").instantiate()
diff --git a/client/map/tiles/counter.gd b/client/map/tiles/counter.gd
index bd16c7a3..fc302694 100644
--- a/client/map/tiles/counter.gd
+++ b/client/map/tiles/counter.gd
@@ -14,7 +14,7 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
class_name Counter
-extends Floor
+extends Tile
const COUNTERS: Array = [
"counter",
@@ -52,7 +52,7 @@ func _init(ctx: TileFactory.TileCC):
for start in range(4):
var series = 0
for i in range(4):
- if Counter.is_floor(ctx.neighbors[(start + i) % 4]):
+ if not is_attachable(ctx.neighbors[(start + i) % 4]):
series += 1
else:
break
@@ -64,7 +64,7 @@ func _init(ctx: TileFactory.TileCC):
# backsplash
facing = max_idx
if max_series == 1:
- if WallTile.WALLS.has(ctx.neighbors[(max_idx + 2) % 4]):
+ if G.has_one(WallTile.WALLS, ctx.neighbors[(max_idx + 2) % 4]):
kind = CounterKind.STRAIGHT_BACKSPLASH
else:
kind = CounterKind.STRAIGHT
@@ -73,10 +73,8 @@ func _init(ctx: TileFactory.TileCC):
turn_facing(facing)
-static func is_counter(tile_name_t) -> bool:
- if tile_name_t == null:
- return false
- return tile_name_t.ends_with("crate") or COUNTERS.has(tile_name_t)
-
-static func is_floor(floor_name) -> bool:
- return FLOORS.has(floor_name)
+static func is_attachable(neighbor: Array) -> bool:
+ for tile: String in neighbor:
+ if tile.ends_with("crate"): return true
+ if COUNTERS.has(tile): return true
+ return false
diff --git a/client/map/tiles/door.gd b/client/map/tiles/door.gd
index 7fe23c93..0473c337 100644
--- a/client/map/tiles/door.gd
+++ b/client/map/tiles/door.gd
@@ -21,7 +21,7 @@ func _init(ctx: TileFactory.TileCC):
var new_facing = 0
for i in range(4):
- if ctx.neighbors[i] == "door":
+ if ctx.neighbors[i].has("door"):
new_facing = i
turn_facing(new_facing)
add_dyed_mesh(ctx, load("res://map/tiles/door.tscn").instantiate(), "Door", 1)
diff --git a/client/map/tiles/generic_tile.gd b/client/map/tiles/generic_tile.gd
index abcb4d05..33c01cdb 100644
--- a/client/map/tiles/generic_tile.gd
+++ b/client/map/tiles/generic_tile.gd
@@ -14,7 +14,7 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
class_name GenericTile
-extends Floor
+extends Tile
func _init(ctx: TileFactory.TileCC, scene: PackedScene):
super(ctx)
diff --git a/client/map/tiles/grass_side.tres b/client/map/tiles/grass_side.tres
index 3f29e10e..52042308 100644
--- a/client/map/tiles/grass_side.tres
+++ b/client/map/tiles/grass_side.tres
@@ -1,4 +1,4 @@
-[gd_resource type="ArrayMesh" load_steps=4 format=3 uid="uid://l2by4gv4wpd1"]
+[gd_resource type="ArrayMesh" format=3 uid="uid://l2by4gv4wpd1"]
[ext_resource type="Texture2D" uid="uid://p35o0tkyfmrl" path="res://map/tiles/grass_side.webp" id="1_d17wb"]
diff --git a/client/map/tiles/player_portal.gd b/client/map/tiles/player_portal.gd
index 8339a797..c78bcf0a 100644
--- a/client/map/tiles/player_portal.gd
+++ b/client/map/tiles/player_portal.gd
@@ -14,7 +14,7 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
class_name PlayerPortal
-extends Floor
+extends Tile
var model: PortalModel = load("res://map/tiles/portal.tscn").instantiate()
func _init(ctx: TileFactory.TileCC):
diff --git a/client/map/tiles/screen/screen.gd b/client/map/tiles/screen/screen.gd
index c1d93e03..c95f0753 100644
--- a/client/map/tiles/screen/screen.gd
+++ b/client/map/tiles/screen/screen.gd
@@ -14,7 +14,7 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
class_name Screen
-extends Floor
+extends Tile
func _init(ctx: TileFactory.TileCC):
super(ctx)
diff --git a/client/map/tiles/table.gd b/client/map/tiles/table.gd
index 43e3dbea..046749d7 100644
--- a/client/map/tiles/table.gd
+++ b/client/map/tiles/table.gd
@@ -14,7 +14,7 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
class_name Table
-extends Floor
+extends Tile
func _init(ctx: TileFactory.TileCC):
super(ctx)
diff --git a/client/map/tiles/unknown_tile.gd b/client/map/tiles/unknown_tile.gd
index 0a11efc6..f3524834 100644
--- a/client/map/tiles/unknown_tile.gd
+++ b/client/map/tiles/unknown_tile.gd
@@ -14,7 +14,7 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
class_name UnknownTile
-extends Floor
+extends Tile
func _init(ctx: TileFactory.TileCC):
super(ctx)
diff --git a/client/map/tiles/wall_tile.gd b/client/map/tiles/wall_tile.gd
index b8109516..244b2294 100644
--- a/client/map/tiles/wall_tile.gd
+++ b/client/map/tiles/wall_tile.gd
@@ -14,7 +14,7 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
class_name WallTile
-extends Floor
+extends Tile
static func create_material(color: Color):
var mat = StandardMaterial3D.new()
@@ -56,8 +56,8 @@ func _init(ctx: TileFactory.TileCC):
for start in range(4):
var series = 0
for i in range(4):
- var i_name = ctx.neighbors[(start + i) % 4]
- if is_wall(i_name):
+ var neighbor: Array = ctx.neighbors[(start + i) % 4]
+ if is_wall(neighbor):
series += 1
else:
break
@@ -68,7 +68,7 @@ func _init(ctx: TileFactory.TileCC):
if max_series == 1:
facing = max_idx
kind = WallKind.STRAIGHT
- if not env.is_empty() and env.has(ctx.neighbors[(facing + 1) % 4]) or ctx.neighbors[(facing + 1) % 4] == null:
+ if not env.is_empty() and G.has_one(env, ctx.neighbors[(facing + 1) % 4]) or ctx.neighbors[(facing + 1) % 4].is_empty():
facing = (facing + 2) % 4
elif max_series == 2:
facing = max_idx
@@ -86,5 +86,5 @@ func add_dyed_mesh(ctx: TileFactory.TileCC, node: Node3D, node_name = "Mesh", su
meshi.set_surface_override_material(surface, MATERIALS.get(ctx.tile_name.variant, MATERIALS["green"]))
base.add_child(node)
-func is_wall(tile_name_t) -> bool:
- return walls.has(tile_name_t)
+func is_wall(neighbor: Array) -> bool:
+ return G.has_one(neighbor, walls)
diff --git a/client/multiplayer.gd b/client/multiplayer.gd
index a0260df5..9b5b30b9 100644
--- a/client/multiplayer.gd
+++ b/client/multiplayer.gd
@@ -96,25 +96,23 @@ func _process(_delta):
connection_closed.emit("c.error.connection_closed")
connected = false
-func fix_packet_types(val):
+func fix_packet_types(val: Variant):
match typeof(val):
TYPE_FLOAT: return val
TYPE_STRING: return val
TYPE_BOOL: return val
TYPE_ARRAY: return val.map(fix_packet_types)
TYPE_DICTIONARY:
- var newval = {}
+ var new_dict = {}
for k in val.keys():
- if typeof(val[k]) == TYPE_ARRAY and val[k].size() == 2 and typeof(val[k][0]) == TYPE_FLOAT and typeof(val[k][1]) == TYPE_FLOAT:
- if k in ["tile"]: newval[k] = Vector2i(val[k][0], val[k][1])
- elif k in ["pos", "position", "dir"]: newval[k] = Vector2(val[k][0], val[k][1])
- else: newval[k] = val[k]
- # TODO reenable when fixed
- # elif k in ["player", "id"] and typeof(val[k]) == TYPE_FLOAT:
- # newval[k] = int(val[k])
- else:
- newval[k] = fix_packet_types(val[k])
- return newval
+ if val[k] is Array and val[k].size() == 2:
+ # A Vector2 is represented as an array with 2 elements in our protocol.
+ # We need to convert it to Godot's Vector2 type for easier handling.
+ if k in ["tile"]: new_dict[k] = Vector2i(val[k][0], val[k][1]) # TODO: Are these still necessary?
+ elif k in ["pos", "position", "dir"]: new_dict[k] = Vector2(val[k][0], val[k][1])
+ else: new_dict[k] = fix_packet_types(val[k])
+ else: new_dict[k] = fix_packet_types(val[k])
+ return new_dict
func handle_packet(coded):
var p = decode_packet(coded)
diff --git a/client/project.godot b/client/project.godot
index efc2abc6..0fecf73d 100644
--- a/client/project.godot
+++ b/client/project.godot
@@ -13,10 +13,14 @@ config_version=5
config/name="hurrycurry"
run/main_scene="res://gui/menus/entry.tscn"
config/quit_on_go_back=false
-config/features=PackedStringArray("4.5", "Forward Plus")
+config/features=PackedStringArray("4.6", "Forward Plus")
boot_splash/image="res://icons/main.png"
config/icon="res://icons/main.png"
+[audio]
+
+buses/default_bus_layout="uid://cco0uysin1okg"
+
[autoload]
Global="*res://global.gd"