diff options
| author | tpart <tpart120@proton.me> | 2026-02-26 20:30:49 +0100 |
|---|---|---|
| committer | tpart <tpart120@proton.me> | 2026-02-26 20:49:54 +0100 |
| commit | 04dd47d13a8da9224e7f9ea8ccacf64129717ec1 (patch) | |
| tree | 2a88e646d1b8dfbcd5973092655bf9a0ebc1c625 /client | |
| parent | b91eb2a9bdf4167c69a4d82f2a44855138f58b94 (diff) | |
| download | hurrycurry-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.tres | 2 | ||||
| -rw-r--r-- | client/export_presets.cfg | 339 | ||||
| -rw-r--r-- | client/game.gd | 22 | ||||
| -rw-r--r-- | client/global.gd | 6 | ||||
| -rw-r--r-- | client/gui/menus/entry.tscn | 4 | ||||
| -rw-r--r-- | client/gui/menus/game.tscn | 8 | ||||
| -rw-r--r-- | client/gui/menus/main/background.gd | 16 | ||||
| -rw-r--r-- | client/gui/resources/shaders/paper.tres | 2 | ||||
| -rw-r--r-- | client/gui/resources/theme/theme.tres | 2 | ||||
| -rw-r--r-- | client/map/map.gd | 38 | ||||
| -rw-r--r-- | client/map/map.tscn | 6 | ||||
| -rw-r--r-- | client/map/tile_factory.gd | 6 | ||||
| -rw-r--r-- | client/map/tiles/chair.gd | 9 | ||||
| -rw-r--r-- | client/map/tiles/conveyor.gd | 2 | ||||
| -rw-r--r-- | client/map/tiles/counter.gd | 18 | ||||
| -rw-r--r-- | client/map/tiles/door.gd | 2 | ||||
| -rw-r--r-- | client/map/tiles/generic_tile.gd | 2 | ||||
| -rw-r--r-- | client/map/tiles/grass_side.tres | 2 | ||||
| -rw-r--r-- | client/map/tiles/player_portal.gd | 2 | ||||
| -rw-r--r-- | client/map/tiles/screen/screen.gd | 2 | ||||
| -rw-r--r-- | client/map/tiles/table.gd | 2 | ||||
| -rw-r--r-- | client/map/tiles/unknown_tile.gd | 2 | ||||
| -rw-r--r-- | client/map/tiles/wall_tile.gd | 12 | ||||
| -rw-r--r-- | client/multiplayer.gd | 22 | ||||
| -rw-r--r-- | client/project.godot | 6 |
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" |