diff --git a/assets/audio/music/.gitkeep b/assets/audio/music/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/assets/audio/music/a_warriors_path.ogg b/assets/audio/music/a_warriors_path.ogg new file mode 100644 index 0000000..fc5d9dc Binary files /dev/null and b/assets/audio/music/a_warriors_path.ogg differ diff --git a/assets/audio/music/a_warriors_path.ogg.import b/assets/audio/music/a_warriors_path.ogg.import new file mode 100644 index 0000000..8ffe8bd --- /dev/null +++ b/assets/audio/music/a_warriors_path.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://breoq6c3o026h" +path="res://.godot/imported/a_warriors_path.ogg-36bd9fd77e1f753ee6ce8941aa4a4afc.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/music/a_warriors_path.ogg" +dest_files=["res://.godot/imported/a_warriors_path.ogg-36bd9fd77e1f753ee6ce8941aa4a4afc.oggvorbisstr"] + +[params] + +loop=true +loop_offset=0.0 +bpm=0.0 +beat_count=0 +bar_beats=4 diff --git a/assets/audio/music/the_dungeon.ogg b/assets/audio/music/the_dungeon.ogg new file mode 100644 index 0000000..73c888b Binary files /dev/null and b/assets/audio/music/the_dungeon.ogg differ diff --git a/assets/audio/music/the_dungeon.ogg.import b/assets/audio/music/the_dungeon.ogg.import new file mode 100644 index 0000000..5c9e63a --- /dev/null +++ b/assets/audio/music/the_dungeon.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://dnifhb7u0qakl" +path="res://.godot/imported/the_dungeon.ogg-deb8745639c0c12c7f8c273f43917767.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/music/the_dungeon.ogg" +dest_files=["res://.godot/imported/the_dungeon.ogg-deb8745639c0c12c7f8c273f43917767.oggvorbisstr"] + +[params] + +loop=true +loop_offset=0.0 +bpm=0.0 +beat_count=0 +bar_beats=4 diff --git a/assets/audio/music/the_red_death.ogg b/assets/audio/music/the_red_death.ogg new file mode 100644 index 0000000..69c5603 Binary files /dev/null and b/assets/audio/music/the_red_death.ogg differ diff --git a/assets/audio/music/the_red_death.ogg.import b/assets/audio/music/the_red_death.ogg.import new file mode 100644 index 0000000..fc5c818 --- /dev/null +++ b/assets/audio/music/the_red_death.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://dvfv8rmlylihu" +path="res://.godot/imported/the_red_death.ogg-0783f9b8e1f9ffda7b90d596d272441a.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/music/the_red_death.ogg" +dest_files=["res://.godot/imported/the_red_death.ogg-0783f9b8e1f9ffda7b90d596d272441a.oggvorbisstr"] + +[params] + +loop=true +loop_offset=0.0 +bpm=0.0 +beat_count=0 +bar_beats=4 diff --git a/assets/audio/sfx/Sounds/door_unlocking.ogg b/assets/audio/sfx/Sounds/door_unlocking.ogg new file mode 100644 index 0000000..e611351 Binary files /dev/null and b/assets/audio/sfx/Sounds/door_unlocking.ogg differ diff --git a/assets/audio/sfx/Sounds/door_unlocking.ogg.import b/assets/audio/sfx/Sounds/door_unlocking.ogg.import new file mode 100644 index 0000000..07955ed --- /dev/null +++ b/assets/audio/sfx/Sounds/door_unlocking.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://dlohl0jbjl62b" +path="res://.godot/imported/door_unlocking.ogg-1841c41b0406199ce5cfe86816a219cc.oggvorbisstr" + +[deps] + +source_file="res://assets/audio/sfx/Sounds/door_unlocking.ogg" +dest_files=["res://.godot/imported/door_unlocking.ogg-1841c41b0406199ce5cfe86816a219cc.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0.0 +bpm=0.0 +beat_count=0 +bar_beats=4 diff --git a/assets/fonts/small_pixel_font.ttf b/assets/fonts/small_pixel_font.ttf new file mode 100644 index 0000000..2d1ac57 Binary files /dev/null and b/assets/fonts/small_pixel_font.ttf differ diff --git a/assets/fonts/small_pixel_font.ttf.import b/assets/fonts/small_pixel_font.ttf.import new file mode 100644 index 0000000..3bca2c1 --- /dev/null +++ b/assets/fonts/small_pixel_font.ttf.import @@ -0,0 +1,36 @@ +[remap] + +importer="font_data_dynamic" +type="FontFile" +uid="uid://bi5xxc24a1ll5" +path="res://.godot/imported/small_pixel_font.ttf-903956a3d807b7585d81c5b28f1e6976.fontdata" + +[deps] + +source_file="res://assets/fonts/small_pixel_font.ttf" +dest_files=["res://.godot/imported/small_pixel_font.ttf-903956a3d807b7585d81c5b28f1e6976.fontdata"] + +[params] + +Rendering=null +antialiasing=1 +generate_mipmaps=false +disable_embedded_bitmaps=true +multichannel_signed_distance_field=false +msdf_pixel_range=8 +msdf_size=48 +allow_system_fallback=true +force_autohinter=false +modulate_color_glyphs=false +hinting=3 +subpixel_positioning=4 +keep_rounding_remainders=true +oversampling=0.0 +Fallbacks=null +fallbacks=[] +Compress=null +compress=true +preload=[] +language_support={} +script_support={} +opentype_features={} diff --git a/assets/images/sprites/Enemies/Demon-Samurai/License.txt b/assets/images/sprites/Enemies/Demon-Samurai/License.txt new file mode 100644 index 0000000..281deb0 --- /dev/null +++ b/assets/images/sprites/Enemies/Demon-Samurai/License.txt @@ -0,0 +1,5 @@ +You can use this asset in any game project, personal or commercial. +DO NOT resell or redistribute AS A GAME ASSET, it has to be part of a project. +Credit is not required but it is appreciated. +Modify to suit your needs. +You are NOT allowed to turn any of my assets to an NFT. \ No newline at end of file diff --git a/assets/images/sprites/Enemies/Demons/Demon_Morph.png b/assets/images/sprites/Enemies/Demons/Demon_Morph.png index 6d4c141..ed6184b 100644 Binary files a/assets/images/sprites/Enemies/Demons/Demon_Morph.png and b/assets/images/sprites/Enemies/Demons/Demon_Morph.png differ diff --git a/assets/images/sprites/Enemies/Demons/license.txt b/assets/images/sprites/Enemies/Demons/license.txt new file mode 100644 index 0000000..c9915d1 --- /dev/null +++ b/assets/images/sprites/Enemies/Demons/license.txt @@ -0,0 +1,6 @@ +Blood Demons + +Author: Burrito (immortal-burrito) +Source: https://immortal-burrito.itch.io/blood-demons +License: Creative Commons Attribution 4.0 International (CC-BY 4.0) +License text: https://creativecommons.org/licenses/by/4.0/ \ No newline at end of file diff --git a/assets/images/sprites/Player/License.txt b/assets/images/sprites/Player/License.txt new file mode 100644 index 0000000..281deb0 --- /dev/null +++ b/assets/images/sprites/Player/License.txt @@ -0,0 +1,5 @@ +You can use this asset in any game project, personal or commercial. +DO NOT resell or redistribute AS A GAME ASSET, it has to be part of a project. +Credit is not required but it is appreciated. +Modify to suit your needs. +You are NOT allowed to turn any of my assets to an NFT. \ No newline at end of file diff --git a/assets/images/sprites/World/Dungeon/Assets.png b/assets/images/sprites/World/Dungeon/Assets.png index dcffc3f..80f5589 100644 Binary files a/assets/images/sprites/World/Dungeon/Assets.png and b/assets/images/sprites/World/Dungeon/Assets.png differ diff --git a/assets/images/title-screen.png b/assets/images/title-screen.png deleted file mode 100644 index a159be2..0000000 Binary files a/assets/images/title-screen.png and /dev/null differ diff --git a/assets/images/title-screen_2.png b/assets/images/title-screen_2.png deleted file mode 100644 index 6d2586a..0000000 Binary files a/assets/images/title-screen_2.png and /dev/null differ diff --git a/assets/images/title-screen_2.png.import b/assets/images/title-screen_2.png.import deleted file mode 100644 index 12ce5a2..0000000 --- a/assets/images/title-screen_2.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://ceit66e5fvtsq" -path="res://.godot/imported/title-screen_2.png-80d240d25b8bcdfba0ac931b94467fe8.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://assets/images/title-screen_2.png" -dest_files=["res://.godot/imported/title-screen_2.png-80d240d25b8bcdfba0ac931b94467fe8.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 diff --git a/assets/images/ui/boss_spawn.png b/assets/images/ui/boss_spawn.png new file mode 100644 index 0000000..cda9c5f Binary files /dev/null and b/assets/images/ui/boss_spawn.png differ diff --git a/assets/images/title-screen.png.import b/assets/images/ui/boss_spawn.png.import similarity index 73% rename from assets/images/title-screen.png.import rename to assets/images/ui/boss_spawn.png.import index 3ff2008..5ee28d2 100644 --- a/assets/images/title-screen.png.import +++ b/assets/images/ui/boss_spawn.png.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://ysydrha7qlmx" -path="res://.godot/imported/title-screen.png-bba5c7a86c6bb926f544dfc8100d61cb.ctex" +uid="uid://bbkpcde2m13to" +path="res://.godot/imported/boss_spawn.png-0ec146df4df9a835f423b9f8cc9d7495.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/images/title-screen.png" -dest_files=["res://.godot/imported/title-screen.png-bba5c7a86c6bb926f544dfc8100d61cb.ctex"] +source_file="res://assets/images/ui/boss_spawn.png" +dest_files=["res://.godot/imported/boss_spawn.png-0ec146df4df9a835f423b9f8cc9d7495.ctex"] [params] diff --git a/default_bus_layout.tres b/default_bus_layout.tres new file mode 100644 index 0000000..35d3aaf --- /dev/null +++ b/default_bus_layout.tres @@ -0,0 +1,21 @@ +[gd_resource type="AudioBusLayout" format=3 uid="uid://cljgtdk14fee0"] + +[resource] +bus/1/name = &"Ambient" +bus/1/solo = false +bus/1/mute = false +bus/1/bypass_fx = false +bus/1/volume_db = 0.0 +bus/1/send = &"Master" +bus/2/name = &"SFX" +bus/2/solo = false +bus/2/mute = false +bus/2/bypass_fx = false +bus/2/volume_db = 0.0 +bus/2/send = &"Master" +bus/3/name = &"New Bus" +bus/3/solo = false +bus/3/mute = false +bus/3/bypass_fx = false +bus/3/volume_db = 0.0 +bus/3/send = &"Master" diff --git a/export_presets.cfg b/export_presets.cfg index a8e6b4b..c944c2d 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -4,6 +4,7 @@ Web="Web" "Windows Desktop"="Windows Desktop" Linux="Linux" Android="Android" +macOS="macOS" [preset.0] @@ -14,7 +15,7 @@ custom_features="" export_filter="all_resources" include_filter="" exclude_filter="" -export_path="" +export_path="export/Web/index.html" patches=PackedStringArray() patch_delta_encoding=false patch_delta_compression_level_zstd=19 @@ -35,14 +36,14 @@ custom_template/release="" variant/extensions_support=false variant/thread_support=false vram_texture_compression/for_desktop=true -vram_texture_compression/for_mobile=false +vram_texture_compression/for_mobile=true html/export_icon=true html/custom_html_shell="" html/head_include="" html/canvas_resize_policy=2 html/focus_canvas_on_start=true html/experimental_virtual_keyboard=false -progressive_web_app/enabled=false +progressive_web_app/enabled=true progressive_web_app/ensure_cross_origin_isolation_headers=true progressive_web_app/offline_page="" progressive_web_app/display=1 @@ -63,7 +64,7 @@ custom_features="" export_filter="all_resources" include_filter="" exclude_filter="" -export_path="" +export_path="export/Windows/omens-ascent_v3.exe" patches=PackedStringArray() patch_delta_encoding=false patch_delta_compression_level_zstd=19 @@ -82,7 +83,7 @@ script_export_mode=2 custom_template/debug="" custom_template/release="" debug/export_console_wrapper=1 -binary_format/embed_pck=false +binary_format/embed_pck=true texture_format/s3tc_bptc=true texture_format/etc2_astc=false shader_baker/enabled=false @@ -134,7 +135,7 @@ custom_features="" export_filter="all_resources" include_filter="" exclude_filter="" -export_path="" +export_path="export/Linux/omens-ascent_v3.x86_64" patches=PackedStringArray() patch_delta_encoding=false patch_delta_compression_level_zstd=19 @@ -153,7 +154,7 @@ script_export_mode=2 custom_template/debug="" custom_template/release="" debug/export_console_wrapper=1 -binary_format/embed_pck=false +binary_format/embed_pck=true texture_format/s3tc_bptc=true texture_format/etc2_astc=false shader_baker/enabled=false @@ -396,3 +397,262 @@ permissions/write_sms=false permissions/write_social_stream=false permissions/write_sync_settings=false permissions/write_user_dictionary=false + +[preset.4] + +name="macOS" +platform="macOS" +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +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 +encrypt_pck=false +encrypt_directory=false +script_export_mode=2 + +[preset.4.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="" +application/icon_interpolation=4 +application/bundle_identifier="" +application/signature="" +application/app_category="Games" +application/short_version="" +application/version="" +application/copyright="" +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/project.godot b/project.godot index fcd69b4..8a08cdb 100644 --- a/project.godot +++ b/project.godot @@ -26,7 +26,7 @@ AudioManager="*uid://c8et8kudxum4b" window/size/viewport_width=320 window/size/viewport_height=180 -window/size/window_width_override=1080 +window/size/window_width_override=1280 window/size/window_height_override=720 window/stretch/mode="viewport" @@ -36,12 +36,14 @@ move_left={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":113,"location":0,"echo":false,"script":null) , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } move_right={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":1.0,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } jump={ @@ -49,6 +51,7 @@ jump={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":false,"script":null) , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":122,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) ] } light_attack={ @@ -67,12 +70,14 @@ defend={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":76,"key_label":0,"unicode":108,"location":0,"echo":false,"script":null) , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":4,"axis_value":1.0,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":9,"pressure":0.0,"pressed":false,"script":null) ] } dash={ "deadzone": 0.2, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194325,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":5,"axis_value":1.0,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":10,"pressure":0.0,"pressed":true,"script":null) ] } interact={ @@ -80,6 +85,8 @@ interact={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":1,"pressure":0.0,"pressed":false,"script":null) , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194309,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":67,"key_label":0,"unicode":99,"location":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"script":null) ] } @@ -101,5 +108,7 @@ textures/canvas_textures/default_texture_filter=0 rendering_device/driver.windows="d3d12" renderer/rendering_method="gl_compatibility" renderer/rendering_method.mobile="gl_compatibility" +textures/vram_compression/import_s3tc_bptc=true +textures/vram_compression/import_etc2_astc=true 2d/snap/snap_2d_transforms_to_pixel=true 2d/snap/snap_2d_vertices_to_pixel=true diff --git a/ressources/credits/The_red_death.tres b/ressources/credits/The_red_death.tres new file mode 100644 index 0000000..354b4e9 --- /dev/null +++ b/ressources/credits/The_red_death.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="CreditEntry" format=3 uid="uid://c3u83was2c0b0"] + +[ext_resource type="Script" uid="uid://bule4gelyixkg" path="res://scripts/resources/credit_entry.gd" id="1_b30dd"] + +[resource] +script = ExtResource("1_b30dd") +asset_name = "The Red Death" +used_for = "Boss Music" +artist_name = "MAC Senjah" +metadata/_custom_type_script = "uid://bule4gelyixkg" diff --git a/ressources/credits/a_warriors_path.tres b/ressources/credits/a_warriors_path.tres new file mode 100644 index 0000000..222de20 --- /dev/null +++ b/ressources/credits/a_warriors_path.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="CreditEntry" format=3 uid="uid://bpsl8kyvtklsf"] + +[ext_resource type="Script" uid="uid://bule4gelyixkg" path="res://scripts/resources/credit_entry.gd" id="1_j7yoq"] + +[resource] +script = ExtResource("1_j7yoq") +asset_name = "A warrior's Path" +used_for = "Forest Environment Music" +artist_name = "MAC Senjah" +metadata/_custom_type_script = "uid://bule4gelyixkg" diff --git a/ressources/credits/agis.tres b/ressources/credits/agis.tres new file mode 100644 index 0000000..6f6b120 --- /dev/null +++ b/ressources/credits/agis.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="CreditEntry" format=3 uid="uid://dc6a4f6hsteux"] + +[ext_resource type="Script" uid="uid://bule4gelyixkg" path="res://scripts/resources/credit_entry.gd" id="1_credit_entry"] + +[resource] +script = ExtResource("1_credit_entry") +asset_name = "[Free] Agis" +used_for = "Looming/Mega entity" +artist_name = "papoycore" +link_url = "papoycore.itch.io/free-agis" diff --git a/ressources/credits/autumn_forest.tres b/ressources/credits/autumn_forest.tres new file mode 100644 index 0000000..795d653 --- /dev/null +++ b/ressources/credits/autumn_forest.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="CreditEntry" format=3 uid="uid://brghbhexpp7uf"] + +[ext_resource type="Script" uid="uid://bule4gelyixkg" path="res://scripts/resources/credit_entry.gd" id="1_credit_entry"] + +[resource] +script = ExtResource("1_credit_entry") +asset_name = "Autumn Forest 2D Pixel Art" +used_for = "Forest Environment" +artist_name = "Mattz Art" +link_url = "xzany.itch.io/autumn-forest-2d-pixel-art" diff --git a/ressources/credits/blood_demon.tres b/ressources/credits/blood_demon.tres new file mode 100644 index 0000000..e745cce --- /dev/null +++ b/ressources/credits/blood_demon.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" script_class="CreditEntry" format=3 uid="uid://bau7r86eda7ry"] + +[ext_resource type="Script" uid="uid://bule4gelyixkg" path="res://scripts/resources/credit_entry.gd" id="1_credit_entry"] + +[resource] +script = ExtResource("1_credit_entry") +asset_name = "Blood Demons" +used_for = "Dungeon Enemies" +artist_name = "Burrito" +license_note = "CC-BY 4.0" +link_url = "immortal-burrito.itch.io/blood-demons" diff --git a/ressources/credits/creeper.tres b/ressources/credits/creeper.tres new file mode 100644 index 0000000..af52bca --- /dev/null +++ b/ressources/credits/creeper.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="CreditEntry" format=3 uid="uid://ckqx72pr2rruq"] + +[ext_resource type="Script" uid="uid://bule4gelyixkg" path="res://scripts/resources/credit_entry.gd" id="1_credit_entry"] + +[resource] +script = ExtResource("1_credit_entry") +asset_name = "Dark Fantasy Monster Pack 1" +used_for = "Forest Enemy" +artist_name = "zneeke" +link_url = "zneeke.itch.io/dark-fantasy-monster-pack-1" diff --git a/ressources/credits/demon_samurai.tres b/ressources/credits/demon_samurai.tres new file mode 100644 index 0000000..fa5902e --- /dev/null +++ b/ressources/credits/demon_samurai.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="CreditEntry" format=3 uid="uid://cxue3rikm8e0w"] + +[ext_resource type="Script" uid="uid://bule4gelyixkg" path="res://scripts/resources/credit_entry.gd" id="1_credit_entry"] + +[resource] +script = ExtResource("1_credit_entry") +asset_name = "Demon Samurai 2D Pixel Art" +used_for = "Boss sprite" +artist_name = "Mattz Art" +link_url = "xzany.itch.io/demon-samurai-2d-pxel-art" diff --git a/ressources/credits/generic_dungeon_pack.tres b/ressources/credits/generic_dungeon_pack.tres new file mode 100644 index 0000000..732e7e2 --- /dev/null +++ b/ressources/credits/generic_dungeon_pack.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" script_class="CreditEntry" format=3 uid="uid://cxuml4el83hit"] + +[ext_resource type="Script" uid="uid://bule4gelyixkg" path="res://scripts/resources/credit_entry.gd" id="1_credit_entry"] + +[resource] +script = ExtResource("1_credit_entry") +asset_name = "Generic Dungeon Pack" +used_for = "Dungeon Environment" +artist_name = "Vaca Roxa" +license_note = "CC0" +link_url = "bakudas.itch.io/generic-dungeon-pack" diff --git a/ressources/credits/myself.tres b/ressources/credits/myself.tres new file mode 100644 index 0000000..ae7f59c --- /dev/null +++ b/ressources/credits/myself.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="CreditEntry" format=3 uid="uid://cbcfblwn6kb32"] + +[ext_resource type="Script" uid="uid://bule4gelyixkg" path="res://scripts/resources/credit_entry.gd" id="1_6iu8u"] + +[resource] +script = ExtResource("1_6iu8u") +asset_name = "Game Design, Programming and Level Design" +artist_name = "kodzukye" +link_url = "kodzukye.itch.io/" +metadata/_custom_type_script = "uid://bule4gelyixkg" diff --git a/ressources/credits/samurai_3.tres b/ressources/credits/samurai_3.tres new file mode 100644 index 0000000..d6ad911 --- /dev/null +++ b/ressources/credits/samurai_3.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="CreditEntry" format=3 uid="uid://cxcj85pu0mxx4"] + +[ext_resource type="Script" uid="uid://bule4gelyixkg" path="res://scripts/resources/credit_entry.gd" id="1_credit_entry"] + +[resource] +script = ExtResource("1_credit_entry") +asset_name = "Samurai #3 2D Pixel Art" +used_for = "Player sprite" +artist_name = "Mattz Art" +link_url = "xzany.itch.io/samurai-3-2d-pixel-art" diff --git a/ressources/credits/the_dungeon.tres b/ressources/credits/the_dungeon.tres new file mode 100644 index 0000000..440c9f4 --- /dev/null +++ b/ressources/credits/the_dungeon.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="CreditEntry" format=3 uid="uid://cid0m3juwxeoq"] + +[ext_resource type="Script" uid="uid://bule4gelyixkg" path="res://scripts/resources/credit_entry.gd" id="1_628cd"] + +[resource] +script = ExtResource("1_628cd") +asset_name = "The Dungeon" +used_for = "The Dungeon Music" +artist_name = "MAC Senjah" +metadata/_custom_type_script = "uid://bule4gelyixkg" diff --git a/ressources/dungeon_tileset.tres b/ressources/dungeon_tileset.tres index 613726c..fba8eb4 100644 --- a/ressources/dungeon_tileset.tres +++ b/ressources/dungeon_tileset.tres @@ -2,6 +2,18 @@ [ext_resource type="Texture2D" uid="uid://ni137ub3dv35" path="res://assets/images/sprites/World/Dungeon/Assets.png" id="1_bccdp"] +[sub_resource type="TileMapPattern" id="TileMapPattern_bccdp"] +tile_data = PackedInt32Array(0, 262144, 12, 1, 327680, 12, 2, 393216, 12) + +[sub_resource type="TileMapPattern" id="TileMapPattern_q8huj"] +tile_data = PackedInt32Array(0, 262144, 12, 1, 393216, 12) + +[sub_resource type="TileMapPattern" id="TileMapPattern_yx6o4"] +tile_data = PackedInt32Array(0, 262144, 12, 1, 327680, 12, 2, 327680, 12, 3, 393216, 12) + +[sub_resource type="TileMapPattern" id="TileMapPattern_e581h"] +tile_data = PackedInt32Array(0, 262144, 12, 1, 327680, 12, 2, 327680, 12, 3, 327680, 12, 4, 393216, 12) + [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_yio6f"] texture = ExtResource("1_bccdp") 0:0/0 = 0 @@ -590,23 +602,16 @@ texture = ExtResource("1_bccdp") 11:12/0/terrains_peering_bit/top_side = 2 4:12/0 = 0 4:12/0/terrain_set = 0 -4:12/0/terrain = 0 4:12/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) 4:12/0/physics_layer_0/polygon_0/one_way = true -4:12/0/terrains_peering_bit/right_side = 0 5:12/0 = 0 5:12/0/terrain_set = 0 -5:12/0/terrain = 0 5:12/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) 5:12/0/physics_layer_0/polygon_0/one_way = true -5:12/0/terrains_peering_bit/right_side = 0 -5:12/0/terrains_peering_bit/left_side = 0 6:12/0 = 0 6:12/0/terrain_set = 0 -6:12/0/terrain = 0 6:12/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) 6:12/0/physics_layer_0/polygon_0/one_way = true -6:12/0/terrains_peering_bit/left_side = 0 0:6/size_in_atlas = Vector2i(4, 7) 0:6/0 = 0 0:4/0 = 0 @@ -675,6 +680,10 @@ texture = ExtResource("1_bccdp") 10:5/0 = 0 8:8/0 = 0 +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_bccdp"] +texture = ExtResource("1_bccdp") +0:6/0 = 0 + [resource] physics_layer_0/collision_layer = 1 terrain_set_0/mode = 0 @@ -685,3 +694,8 @@ terrain_set_0/terrain_1/color = Color(0.5, 0.4375, 0.25, 1) terrain_set_0/terrain_2/name = "Wall Purlple" terrain_set_0/terrain_2/color = Color(0.68002987, 0.34954363, 0.5219556, 1) sources/0 = SubResource("TileSetAtlasSource_yio6f") +sources/1 = SubResource("TileSetAtlasSource_bccdp") +pattern_0 = SubResource("TileMapPattern_bccdp") +pattern_1 = SubResource("TileMapPattern_q8huj") +pattern_2 = SubResource("TileMapPattern_yx6o4") +pattern_3 = SubResource("TileMapPattern_e581h") diff --git a/scenes/actors/Creeper.tscn b/scenes/actors/Creeper.tscn index bce83b9..bb16923 100644 --- a/scenes/actors/Creeper.tscn +++ b/scenes/actors/Creeper.tscn @@ -416,6 +416,7 @@ size = Vector2(178.875, 27) size = Vector2(17, 6) [node name="Creeper" type="CharacterBody2D" unique_id=1458442942] +scale = Vector2(1.25, 1.25) collision_layer = 8 script = ExtResource("1_683kk") @@ -425,7 +426,6 @@ max_health = 15 [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=1045569955] position = Vector2(0, -8) -scale = Vector2(1.2, 1.2) sprite_frames = SubResource("SpriteFrames_uvqlf") animation = &"idle" autoplay = "idle" diff --git a/scenes/actors/creeper.gd b/scenes/actors/creeper.gd index 85e8fa0..7046e70 100644 --- a/scenes/actors/creeper.gd +++ b/scenes/actors/creeper.gd @@ -21,6 +21,7 @@ extends CharacterBody2D @export var backoff_min_distance: float = 30.0 @export var attack_hit_frame_start: int = 4 @export var attack_hit_frame_end: int = 5 +@export var heal_amount_on_death: int = 4 # Creeper Runtime Variables var _player: Node2D = null @@ -164,6 +165,7 @@ func _on_died() -> void: _hitbox_collision.set_deferred("disabled", true) remove_from_group("enemies") EventBus.enemy_defeated.emit() + EventBus.player_heal_requested.emit(heal_amount_on_death) func _on_animation_finished() -> void: if _sprite.animation == &"hurt": diff --git a/scenes/actors/demon_samurai.gd b/scenes/actors/demon_samurai.gd new file mode 100644 index 0000000..9d0c445 --- /dev/null +++ b/scenes/actors/demon_samurai.gd @@ -0,0 +1,325 @@ +class_name DemonSamurai +extends CharacterBody2D + +@onready var _hurtbox: HurtBox = $HurtBox +@onready var _health: HealthComponent = $HealthComponent +@onready var _sprite: AnimatedSprite2D = $AnimatedSprite2D +@onready var _detection_area: Area2D = $DetectionArea +@onready var _combo_hitbox: HitBox = $ComboHitBox +@onready var _combo_hitbox_collision: CollisionShape2D = $ComboHitBox/CollisionShape2D +@onready var _combo_attack_range_area: Area2D = $ComboAttackRangeArea +@onready var _jump_attack_hitbox: HitBox = $JumpAttackHitBox +@onready var _jump_attack_hitbox_collision: CollisionShape2D = $JumpAttackHitBox/CollisionShape2D +@onready var _jump_attack_range_area: Area2D = $JumpAttackRangeArea +@onready var _ledge_detector: RayCast2D = $RayCast2D + +# FHit frames for combo +const _COMBO_HIT_FRAMES: Dictionary = { + 1: Vector2i(2, 4), + 2: Vector2i(2, 4), + 3: Vector2i(3, 5), +} + +# Exported Variables +@export_group("Movement") +@export var move_speed: float = 80.0 +@export var patrol_speed: float = 40.0 +@export var ledge_check_offset: float = 10.0 + +@export_group("Combat") +@export var attack_cooldown: float = 0.6 +@export var combo_damage: Array[int] = [2, 2, 2] +@export var jump_attack_damage: int = 4 +@export var jump_attack_lunge_speed: float = 260.0 +@export var jump_attack_hit_frame_start: int = 7 +@export var jump_attack_hit_frame_end: int = 9 +@export var hits_to_trigger_jump_attack: int = 3 + +@export_group("Phase") +@export var flame_phase_health_ratio: float = 0.5 +@export var flame_move_speed_multiplier: float = 1.4 +@export var flame_damage_multiplier: float = 2.0 + +@export_group("Defend") +@export var spam_hit_window: float = 0.65 +@export var block_reaction_time: float = 0.1 +@export var blocks_to_trigger_jump_attack: int = 3 + +# Runtime Variables +var _player: Node2D = null +var _player_in_combo_range: bool = false +var _player_in_jump_range: bool = false +var _combo_step: int = 0 +var _hits_taken: int = 0 +var _is_attacking: bool = false +var _is_jump_attacking: bool = false +var _is_jump_attack_uninterruptible: bool = false +var _is_shouting: bool = false +var _is_hurt: bool = false +var _is_blocking: bool = false +var _is_dead: bool = false +var _is_flame_phase: bool = false +var _attack_cooldown_timer: float = 0.0 +var _time_since_last_action: float = 999.0 +var _block_timer: float = 0.0 +var _block_count: int = 0 +var _facing_direction: float = 1.0 +var _patrol_direction: float = 1.0 + +func _ready() -> void: + add_to_group("enemies") + _hurtbox.hit_received.connect(_on_hurtbox_hit_received) + _health.health_changed.connect(_on_health_changed) + _health.died.connect(_on_died) + _sprite.animation_finished.connect(_on_animation_finished) + _detection_area.body_entered.connect(_on_detection_area_body_entered) + _detection_area.body_exited.connect(_on_detection_area_body_exited) + _combo_attack_range_area.area_entered.connect(_on_combo_range_area_entered) + _combo_attack_range_area.area_exited.connect(_on_combo_range_area_exited) + _jump_attack_range_area.area_entered.connect(_on_jump_range_area_entered) + _jump_attack_range_area.area_exited.connect(_on_jump_range_area_exited) + +func _physics_process(delta: float) -> void: + _apply_gravity(delta) + _update_attack_cooldown(delta) + + if not _is_dead: + _check_phase_transition() + _process_ai() + _update_hitboxes() + + move_and_slide() + +func _update_hitboxes() -> void: + var multiplier: float = flame_damage_multiplier if _is_flame_phase else 1.0 + + var combo_hit_frames: Vector2i = _COMBO_HIT_FRAMES.get(_combo_step, Vector2i(-1, -1)) + var is_combo_hit_frame: bool = _sprite.frame >= combo_hit_frames.x and _sprite.frame <= combo_hit_frames.y + _combo_hitbox_collision.disabled = not (_is_attacking and is_combo_hit_frame) + if _combo_step >= 1 and _combo_step <= combo_damage.size(): + _combo_hitbox.damage = int(round(combo_damage[_combo_step - 1] * multiplier)) + + var is_jump_hit_frame: bool = _sprite.frame >= jump_attack_hit_frame_start \ + and _sprite.frame <= jump_attack_hit_frame_end + _jump_attack_hitbox_collision.disabled = not (_is_jump_attacking and is_jump_hit_frame) + _jump_attack_hitbox.damage = int(round(jump_attack_damage * multiplier)) + +func _apply_gravity(delta: float) -> void: + if not is_on_floor(): + velocity.y += ProjectSettings.get_setting("physics/2d/default_gravity") * delta + +func _update_attack_cooldown(delta: float) -> void: + if _attack_cooldown_timer > 0.0: + _attack_cooldown_timer -= delta + _time_since_last_action += delta + if _is_blocking: + _block_timer -= delta + if _block_timer <= 0.0: + _is_blocking = false + +func _check_phase_transition() -> void: + if _is_flame_phase or _is_shouting or _is_dead: + return + if _health.current_health <= _health.max_health * flame_phase_health_ratio: + _start_shout() + +func _process_ai() -> void: + if _is_hurt or _is_shouting or _is_blocking: + velocity.x = 0.0 + return + + if _is_jump_attacking: + var is_jump_hit_frame: bool = _sprite.frame >= jump_attack_hit_frame_start \ + and _sprite.frame <= jump_attack_hit_frame_end + velocity.x = _facing_direction * jump_attack_lunge_speed if is_jump_hit_frame else 0.0 + return + + if _is_attacking: + velocity.x = 0.0 + return + + if _player_in_jump_range and _hits_taken >= hits_to_trigger_jump_attack and _attack_cooldown_timer <= 0.0: + _start_jump_attack() + return + + if _player_in_combo_range and _attack_cooldown_timer <= 0.0: + _start_combo_attack() + return + + if _player_in_combo_range or _player_in_jump_range: + _facing_direction = signf(_player.global_position.x - global_position.x) + velocity.x = 0.0 + if _sprite.animation != _phase_anim(&"idle"): + _sprite.play(_phase_anim(&"idle")) + _update_facing() + return + + if _player: + _facing_direction = signf(_player.global_position.x - global_position.x) + if _has_ground_ahead(_facing_direction): + velocity.x = _facing_direction * _current_move_speed() + if _sprite.animation != _phase_anim(&"running"): + _sprite.play(_phase_anim(&"running")) + else: + velocity.x = 0.0 + if _sprite.animation != _phase_anim(&"idle"): + _sprite.play(_phase_anim(&"idle")) + else: + _facing_direction = _patrol_direction + velocity.x = _patrol_direction * patrol_speed + if _sprite.animation != _phase_anim(&"running"): + _sprite.play(_phase_anim(&"running")) + + _update_facing() + + if not _player: + _update_patrol_direction() + +func _current_move_speed() -> float: + return move_speed * flame_move_speed_multiplier if _is_flame_phase else move_speed + +func _phase_anim(base_name: StringName) -> StringName: + return StringName(("flame_" if _is_flame_phase else "normal_") + String(base_name)) + +func _update_facing() -> void: + _sprite.flip_h = _facing_direction < 0.0 + _combo_hitbox.scale.x = _facing_direction + _combo_attack_range_area.scale.x = _facing_direction + _jump_attack_hitbox.scale.x = _facing_direction + _jump_attack_range_area.scale.x = _facing_direction + +func _has_ground_ahead(direction: float) -> bool: + _ledge_detector.position.x = ledge_check_offset * direction + _ledge_detector.force_raycast_update() + return _ledge_detector.is_colliding() + +func _update_patrol_direction() -> void: + if is_on_wall() or not _has_ground_ahead(_patrol_direction): + _patrol_direction = -_patrol_direction + +func _start_combo_attack() -> void: + _combo_step = (_combo_step % 3) + 1 + _is_attacking = true + _attack_cooldown_timer = attack_cooldown + velocity.x = 0.0 + _sprite.play(_phase_anim(StringName("attack%d" % _combo_step))) + +func _start_jump_attack(uninterruptible: bool = false) -> void: + _is_jump_attacking = true + _is_jump_attack_uninterruptible = uninterruptible + _hits_taken = 0 + _attack_cooldown_timer = attack_cooldown + velocity.x = 0.0 + _sprite.play(_phase_anim(&"jump_attack")) + +func _trigger_block() -> void: + _block_count += 1 + _is_attacking = false + _combo_step = 0 + _is_blocking = true + _block_timer = block_reaction_time + velocity.x = 0.0 + _sprite.play(&"defend") + + if _block_count >= blocks_to_trigger_jump_attack: + _block_count = 0 + _is_blocking = false + _start_jump_attack(true) + +func _start_shout() -> void: + _is_shouting = true + _is_attacking = false + _is_jump_attacking = false + _is_jump_attack_uninterruptible = false + _is_hurt = false + _is_blocking = false + _combo_step = 0 + _block_count = 0 + velocity.x = 0.0 + _sprite.play(&"shout") + +func _on_detection_area_body_entered(body: Node2D) -> void: + _player = body + +func _on_detection_area_body_exited(body: Node2D) -> void: + if body == _player: + _player = null + +func _on_combo_range_area_entered(area: Area2D) -> void: + if area is HurtBox and area.get_parent() == _player: + _player_in_combo_range = true + +func _on_combo_range_area_exited(area: Area2D) -> void: + if area is HurtBox and area.get_parent() == _player: + _player_in_combo_range = false + +func _on_jump_range_area_entered(area: Area2D) -> void: + if area is HurtBox and area.get_parent() == _player: + _player_in_jump_range = true + +func _on_jump_range_area_exited(area: Area2D) -> void: + if area is HurtBox and area.get_parent() == _player: + _player_in_jump_range = false + +func _on_hurtbox_hit_received(hitbox: HitBox) -> void: + if _is_dead: + return + + if _is_hurt or _is_shouting: + _time_since_last_action = 0.0 + return + + if not _is_jump_attacking and _time_since_last_action < spam_hit_window: + _time_since_last_action = 0.0 + _trigger_block() + return + + _health.take_damage(hitbox.damage) + _hits_taken += 1 + _block_count = 0 + _time_since_last_action = 0.0 + +func _on_health_changed(_new_value: int, _max_value: int) -> void: + if _is_shouting or _is_dead: + return + if _is_jump_attacking and _is_jump_attack_uninterruptible: + return + _is_attacking = false + _is_jump_attacking = false + _is_jump_attack_uninterruptible = false + _combo_step = 0 + _is_hurt = true + _sprite.play(_phase_anim(&"hurt")) + +func _on_died() -> void: + _is_dead = true + _is_blocking = false + velocity = Vector2.ZERO + _hurtbox.set_deferred("monitoring", false) + _combo_hitbox_collision.set_deferred("disabled", true) + _jump_attack_hitbox_collision.set_deferred("disabled", true) + remove_from_group("enemies") + EventBus.enemy_defeated.emit() + _sprite.play(&"death") + await _sprite.animation_finished + SceneManager.change_scene("res://scenes/components/outro.tscn") + +func _on_animation_finished() -> void: + if _sprite.animation == _phase_anim(&"hurt"): + _is_hurt = false + _time_since_last_action = 0.0 + if _is_dead: + _sprite.play(&"death") + elif String(_sprite.animation).ends_with("attack1") or String(_sprite.animation).ends_with("attack2") \ + or String(_sprite.animation).ends_with("attack3"): + _is_attacking = false + if _combo_step == 3: + _combo_step = 0 + elif _sprite.animation == _phase_anim(&"jump_attack"): + _is_jump_attacking = false + _is_jump_attack_uninterruptible = false + elif _sprite.animation == &"shout": + _is_shouting = false + _is_flame_phase = true + elif _sprite.animation == &"death": + queue_free() diff --git a/scenes/actors/demon_samurai.gd.uid b/scenes/actors/demon_samurai.gd.uid new file mode 100644 index 0000000..c8faef9 --- /dev/null +++ b/scenes/actors/demon_samurai.gd.uid @@ -0,0 +1 @@ +uid://datws0ngscowr diff --git a/scenes/actors/demon_samurai.tscn b/scenes/actors/demon_samurai.tscn new file mode 100644 index 0000000..f4988c0 --- /dev/null +++ b/scenes/actors/demon_samurai.tscn @@ -0,0 +1,1234 @@ +[gd_scene format=3 uid="uid://4ue2acsmrn5"] + +[ext_resource type="Script" uid="uid://ev7uglfcbl02" path="res://scenes/components/health_component.gd" id="1_vs17r"] +[ext_resource type="Script" uid="uid://cxsbkcxpnu3t6" path="res://scenes/components/hurt_box.gd" id="2_3f34g"] +[ext_resource type="Texture2D" uid="uid://dty7vmmp4dw3d" path="res://assets/images/sprites/Enemies/Demon-Samurai/IDLE (FLAMING SWORD).png" id="2_5lviy"] +[ext_resource type="Texture2D" uid="uid://c2tf4i45vthgr" path="res://assets/images/sprites/Enemies/Demon-Samurai/ATTACK 1 (FLAMING SWORD).png" id="2_ahoni"] +[ext_resource type="Texture2D" uid="uid://kjd0ixc7tofo" path="res://assets/images/sprites/Enemies/Demon-Samurai/DEATH.png" id="2_kv8by"] +[ext_resource type="Texture2D" uid="uid://3f547c0s00m4" path="res://assets/images/sprites/Enemies/Demon-Samurai/IDLE.png" id="2_oessa"] +[ext_resource type="Texture2D" uid="uid://dvfxdbnbdciqr" path="res://assets/images/sprites/Enemies/Demon-Samurai/ATTACK 2 (FLAMING SWORD).png" id="3_av7q8"] +[ext_resource type="Script" uid="uid://dw1cot7pm0rp6" path="res://scenes/components/hit_box.gd" id="3_oessa"] +[ext_resource type="Script" uid="uid://datws0ngscowr" path="res://scenes/actors/demon_samurai.gd" id="4_dmsam"] +[ext_resource type="Texture2D" uid="uid://7niujmrbwvue" path="res://assets/images/sprites/Enemies/Demon-Samurai/ATTACK 1.png" id="4_rn0yv"] +[ext_resource type="Texture2D" uid="uid://c8dudeu5fnfb6" path="res://assets/images/sprites/Enemies/Demon-Samurai/ATTACK 3 (FLAMING SWORD).png" id="5_yg2y3"] +[ext_resource type="Texture2D" uid="uid://b4kb6papyhf8h" path="res://assets/images/sprites/Enemies/Demon-Samurai/ATTACK 2.png" id="6_l14ao"] +[ext_resource type="Texture2D" uid="uid://cycrvwc861mfl" path="res://assets/images/sprites/Enemies/Demon-Samurai/HURT (FLAMING SWORD).png" id="6_wdvgl"] +[ext_resource type="Texture2D" uid="uid://dqrcj4nym4tv8" path="res://assets/images/sprites/Enemies/Demon-Samurai/JUMP ATTACK (FLAMING SWORD).png" id="8_s0ykf"] +[ext_resource type="Texture2D" uid="uid://3lxk2dr8qhyp" path="res://assets/images/sprites/Enemies/Demon-Samurai/RUN (FLAMING SWORD).png" id="9_suows"] +[ext_resource type="Texture2D" uid="uid://bqvobex3gdhfl" path="res://assets/images/sprites/Enemies/Demon-Samurai/ATTACK 3.png" id="9_wdvgl"] +[ext_resource type="Texture2D" uid="uid://cxqjy8m2a2c3y" path="res://assets/images/sprites/Enemies/Demon-Samurai/DEFEND.png" id="11_dt7k0"] +[ext_resource type="Texture2D" uid="uid://06lbqwhfj4nq" path="res://assets/images/sprites/Enemies/Demon-Samurai/HURT.png" id="11_o7ah7"] +[ext_resource type="Texture2D" uid="uid://doo0bvr0ycxg0" path="res://assets/images/sprites/Enemies/Demon-Samurai/JUMP ATTACK.png" id="15_dt7k0"] +[ext_resource type="Texture2D" uid="uid://qhkvqopoa36r" path="res://assets/images/sprites/Enemies/Demon-Samurai/RUN.png" id="16_iffp0"] +[ext_resource type="Texture2D" uid="uid://dlx2a1tejn4po" path="res://assets/images/sprites/Enemies/Demon-Samurai/SHOUT.png" id="17_kgmxe"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_f7fjb"] +atlas = ExtResource("2_kv8by") +region = Rect2(0, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_l36tl"] +atlas = ExtResource("2_kv8by") +region = Rect2(128, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_sxop3"] +atlas = ExtResource("2_kv8by") +region = Rect2(256, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xmgqn"] +atlas = ExtResource("2_kv8by") +region = Rect2(384, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_icst3"] +atlas = ExtResource("2_kv8by") +region = Rect2(512, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_08xnn"] +atlas = ExtResource("2_kv8by") +region = Rect2(640, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cpmtr"] +atlas = ExtResource("2_kv8by") +region = Rect2(768, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_rl43r"] +atlas = ExtResource("2_kv8by") +region = Rect2(896, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_eogsk"] +atlas = ExtResource("2_kv8by") +region = Rect2(1024, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_q5vr7"] +atlas = ExtResource("2_kv8by") +region = Rect2(1152, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_f72cp"] +atlas = ExtResource("2_kv8by") +region = Rect2(1280, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_og44b"] +atlas = ExtResource("2_kv8by") +region = Rect2(1408, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ppphs"] +atlas = ExtResource("2_kv8by") +region = Rect2(1536, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_85y0d"] +atlas = ExtResource("2_kv8by") +region = Rect2(1664, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_25c5q"] +atlas = ExtResource("2_kv8by") +region = Rect2(1792, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_p6ysp"] +atlas = ExtResource("2_kv8by") +region = Rect2(1920, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_y157a"] +atlas = ExtResource("2_kv8by") +region = Rect2(2048, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2clde"] +atlas = ExtResource("2_kv8by") +region = Rect2(2176, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_sy5n5"] +atlas = ExtResource("2_kv8by") +region = Rect2(2304, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pckxg"] +atlas = ExtResource("2_kv8by") +region = Rect2(2432, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_rk6pv"] +atlas = ExtResource("2_kv8by") +region = Rect2(2560, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0ioai"] +atlas = ExtResource("2_kv8by") +region = Rect2(2688, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cxkaw"] +atlas = ExtResource("2_kv8by") +region = Rect2(2816, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ycgww"] +atlas = ExtResource("2_kv8by") +region = Rect2(2944, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_mu1t4"] +atlas = ExtResource("2_kv8by") +region = Rect2(3072, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_yljyj"] +atlas = ExtResource("2_kv8by") +region = Rect2(3200, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4dbh0"] +atlas = ExtResource("11_dt7k0") +region = Rect2(0, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_sc38g"] +atlas = ExtResource("11_dt7k0") +region = Rect2(128, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_l6tha"] +atlas = ExtResource("11_dt7k0") +region = Rect2(256, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8ncqu"] +atlas = ExtResource("11_dt7k0") +region = Rect2(384, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_15n2c"] +atlas = ExtResource("11_dt7k0") +region = Rect2(512, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_l8jik"] +atlas = ExtResource("11_dt7k0") +region = Rect2(640, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_toefa"] +atlas = ExtResource("2_ahoni") +region = Rect2(0, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_s0ykf"] +atlas = ExtResource("2_ahoni") +region = Rect2(128, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_suows"] +atlas = ExtResource("2_ahoni") +region = Rect2(256, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_dt7k0"] +atlas = ExtResource("2_ahoni") +region = Rect2(384, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_iffp0"] +atlas = ExtResource("2_ahoni") +region = Rect2(512, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kgmxe"] +atlas = ExtResource("2_ahoni") +region = Rect2(640, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_q7pex"] +atlas = ExtResource("2_ahoni") +region = Rect2(768, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_yl3is"] +atlas = ExtResource("3_av7q8") +region = Rect2(0, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bb2oy"] +atlas = ExtResource("3_av7q8") +region = Rect2(128, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_auc63"] +atlas = ExtResource("3_av7q8") +region = Rect2(256, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_w7qea"] +atlas = ExtResource("3_av7q8") +region = Rect2(384, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pd6wn"] +atlas = ExtResource("3_av7q8") +region = Rect2(512, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1u3gm"] +atlas = ExtResource("3_av7q8") +region = Rect2(640, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jid0h"] +atlas = ExtResource("5_yg2y3") +region = Rect2(0, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_nd1km"] +atlas = ExtResource("5_yg2y3") +region = Rect2(128, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tbcf7"] +atlas = ExtResource("5_yg2y3") +region = Rect2(256, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8wbbn"] +atlas = ExtResource("5_yg2y3") +region = Rect2(384, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_n84f6"] +atlas = ExtResource("5_yg2y3") +region = Rect2(512, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jh025"] +atlas = ExtResource("5_yg2y3") +region = Rect2(640, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_dwlei"] +atlas = ExtResource("5_yg2y3") +region = Rect2(768, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_hf848"] +atlas = ExtResource("6_wdvgl") +region = Rect2(0, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1dxcn"] +atlas = ExtResource("6_wdvgl") +region = Rect2(128, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jl6r1"] +atlas = ExtResource("6_wdvgl") +region = Rect2(256, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wxgoo"] +atlas = ExtResource("6_wdvgl") +region = Rect2(384, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kv8by"] +atlas = ExtResource("2_5lviy") +region = Rect2(0, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_yg2y3"] +atlas = ExtResource("2_5lviy") +region = Rect2(128, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wdvgl"] +atlas = ExtResource("2_5lviy") +region = Rect2(256, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_o7ah7"] +atlas = ExtResource("2_5lviy") +region = Rect2(384, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tvum2"] +atlas = ExtResource("2_5lviy") +region = Rect2(512, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_07gfh"] +atlas = ExtResource("2_5lviy") +region = Rect2(640, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7h0k5"] +atlas = ExtResource("8_s0ykf") +region = Rect2(0, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3ka8w"] +atlas = ExtResource("8_s0ykf") +region = Rect2(128, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3xcj5"] +atlas = ExtResource("8_s0ykf") +region = Rect2(256, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ts7ht"] +atlas = ExtResource("8_s0ykf") +region = Rect2(384, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_j7i7y"] +atlas = ExtResource("8_s0ykf") +region = Rect2(512, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0v822"] +atlas = ExtResource("8_s0ykf") +region = Rect2(640, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_f8a4x"] +atlas = ExtResource("8_s0ykf") +region = Rect2(768, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_k1alp"] +atlas = ExtResource("8_s0ykf") +region = Rect2(896, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_24dmw"] +atlas = ExtResource("8_s0ykf") +region = Rect2(1024, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vi31y"] +atlas = ExtResource("8_s0ykf") +region = Rect2(1152, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tq28e"] +atlas = ExtResource("8_s0ykf") +region = Rect2(1280, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ihs6g"] +atlas = ExtResource("9_suows") +region = Rect2(0, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_awpnw"] +atlas = ExtResource("9_suows") +region = Rect2(128, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_eb7tf"] +atlas = ExtResource("9_suows") +region = Rect2(256, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_uj2ku"] +atlas = ExtResource("9_suows") +region = Rect2(384, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8hhqo"] +atlas = ExtResource("9_suows") +region = Rect2(512, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vwt64"] +atlas = ExtResource("9_suows") +region = Rect2(640, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ameyd"] +atlas = ExtResource("9_suows") +region = Rect2(768, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_smcgx"] +atlas = ExtResource("9_suows") +region = Rect2(896, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xaqgm"] +atlas = ExtResource("4_rn0yv") +region = Rect2(0, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_d24pb"] +atlas = ExtResource("4_rn0yv") +region = Rect2(128, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_si5qu"] +atlas = ExtResource("4_rn0yv") +region = Rect2(256, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_mdwk3"] +atlas = ExtResource("4_rn0yv") +region = Rect2(384, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4g6w6"] +atlas = ExtResource("4_rn0yv") +region = Rect2(512, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_c0pkj"] +atlas = ExtResource("4_rn0yv") +region = Rect2(640, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7a2xu"] +atlas = ExtResource("4_rn0yv") +region = Rect2(768, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_455wm"] +atlas = ExtResource("6_l14ao") +region = Rect2(0, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_13jm0"] +atlas = ExtResource("6_l14ao") +region = Rect2(128, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_sa52w"] +atlas = ExtResource("6_l14ao") +region = Rect2(256, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2k6yj"] +atlas = ExtResource("6_l14ao") +region = Rect2(384, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_g3jc6"] +atlas = ExtResource("6_l14ao") +region = Rect2(512, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2vper"] +atlas = ExtResource("9_wdvgl") +region = Rect2(0, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bdwya"] +atlas = ExtResource("9_wdvgl") +region = Rect2(128, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_dps0u"] +atlas = ExtResource("9_wdvgl") +region = Rect2(256, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pdgxx"] +atlas = ExtResource("9_wdvgl") +region = Rect2(384, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_uo0e0"] +atlas = ExtResource("9_wdvgl") +region = Rect2(512, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3iori"] +atlas = ExtResource("9_wdvgl") +region = Rect2(640, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vpbm0"] +atlas = ExtResource("9_wdvgl") +region = Rect2(768, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_yp1dy"] +atlas = ExtResource("11_o7ah7") +region = Rect2(0, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vvdvs"] +atlas = ExtResource("11_o7ah7") +region = Rect2(128, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_rrax3"] +atlas = ExtResource("11_o7ah7") +region = Rect2(256, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_fr2ux"] +atlas = ExtResource("11_o7ah7") +region = Rect2(384, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5lviy"] +atlas = ExtResource("2_oessa") +region = Rect2(0, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ahoni"] +atlas = ExtResource("2_oessa") +region = Rect2(128, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_rn0yv"] +atlas = ExtResource("2_oessa") +region = Rect2(256, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_av7q8"] +atlas = ExtResource("2_oessa") +region = Rect2(384, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_l14ao"] +atlas = ExtResource("2_oessa") +region = Rect2(512, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ifbka"] +atlas = ExtResource("2_oessa") +region = Rect2(640, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_mvxug"] +atlas = ExtResource("15_dt7k0") +region = Rect2(0, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ltt0n"] +atlas = ExtResource("15_dt7k0") +region = Rect2(128, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bncbc"] +atlas = ExtResource("15_dt7k0") +region = Rect2(256, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_y36tf"] +atlas = ExtResource("15_dt7k0") +region = Rect2(384, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wmj73"] +atlas = ExtResource("15_dt7k0") +region = Rect2(512, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tpppe"] +atlas = ExtResource("15_dt7k0") +region = Rect2(640, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_63uql"] +atlas = ExtResource("15_dt7k0") +region = Rect2(768, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jo152"] +atlas = ExtResource("15_dt7k0") +region = Rect2(896, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_v2uio"] +atlas = ExtResource("15_dt7k0") +region = Rect2(1024, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xir3r"] +atlas = ExtResource("15_dt7k0") +region = Rect2(1152, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bdu0b"] +atlas = ExtResource("15_dt7k0") +region = Rect2(1280, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wajhd"] +atlas = ExtResource("15_dt7k0") +region = Rect2(1408, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wnkca"] +atlas = ExtResource("16_iffp0") +region = Rect2(0, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_nmi58"] +atlas = ExtResource("16_iffp0") +region = Rect2(128, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_6wxp8"] +atlas = ExtResource("16_iffp0") +region = Rect2(256, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7dq2t"] +atlas = ExtResource("16_iffp0") +region = Rect2(384, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tv3m1"] +atlas = ExtResource("16_iffp0") +region = Rect2(512, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_35grs"] +atlas = ExtResource("16_iffp0") +region = Rect2(640, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wolpv"] +atlas = ExtResource("16_iffp0") +region = Rect2(768, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_rihh4"] +atlas = ExtResource("16_iffp0") +region = Rect2(896, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5lduo"] +atlas = ExtResource("17_kgmxe") +region = Rect2(0, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qdyd0"] +atlas = ExtResource("17_kgmxe") +region = Rect2(128, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8ffrf"] +atlas = ExtResource("17_kgmxe") +region = Rect2(256, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_eb54u"] +atlas = ExtResource("17_kgmxe") +region = Rect2(384, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_orbnk"] +atlas = ExtResource("17_kgmxe") +region = Rect2(512, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kbkkt"] +atlas = ExtResource("17_kgmxe") +region = Rect2(640, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tp851"] +atlas = ExtResource("17_kgmxe") +region = Rect2(768, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8qt41"] +atlas = ExtResource("17_kgmxe") +region = Rect2(896, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3et15"] +atlas = ExtResource("17_kgmxe") +region = Rect2(1024, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0jvy3"] +atlas = ExtResource("17_kgmxe") +region = Rect2(1152, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3rtfg"] +atlas = ExtResource("17_kgmxe") +region = Rect2(1280, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_y7bw2"] +atlas = ExtResource("17_kgmxe") +region = Rect2(1408, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_skkxw"] +atlas = ExtResource("17_kgmxe") +region = Rect2(1536, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vw2m2"] +atlas = ExtResource("17_kgmxe") +region = Rect2(1664, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3ogej"] +atlas = ExtResource("17_kgmxe") +region = Rect2(1792, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_p6bhp"] +atlas = ExtResource("17_kgmxe") +region = Rect2(1920, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8x652"] +atlas = ExtResource("17_kgmxe") +region = Rect2(2048, 0, 128, 108) + +[sub_resource type="SpriteFrames" id="SpriteFrames_udhr8"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_f7fjb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_l36tl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_sxop3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xmgqn") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_icst3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_08xnn") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cpmtr") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rl43r") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_eogsk") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_q5vr7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_f72cp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_og44b") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ppphs") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_85y0d") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_25c5q") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_p6ysp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_y157a") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2clde") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_sy5n5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pckxg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rk6pv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0ioai") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cxkaw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ycgww") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mu1t4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_yljyj") +}], +"loop": 0, +"name": &"death", +"speed": 7.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_4dbh0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_sc38g") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_l6tha") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8ncqu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_15n2c") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_l8jik") +}], +"loop": 1, +"name": &"defend", +"speed": 10.0 +}, { +"frames": [{ +"duration": 2.0, +"texture": SubResource("AtlasTexture_toefa") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_s0ykf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_suows") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_dt7k0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_iffp0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kgmxe") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_q7pex") +}], +"loop": 0, +"name": &"flame_attack1", +"speed": 9.0 +}, { +"frames": [{ +"duration": 2.0, +"texture": SubResource("AtlasTexture_yl3is") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bb2oy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_auc63") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_w7qea") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pd6wn") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1u3gm") +}], +"loop": 0, +"name": &"flame_attack2", +"speed": 9.0 +}, { +"frames": [{ +"duration": 2.0, +"texture": SubResource("AtlasTexture_jid0h") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nd1km") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tbcf7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8wbbn") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_n84f6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jh025") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_dwlei") +}], +"loop": 0, +"name": &"flame_attack3", +"speed": 9.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_hf848") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1dxcn") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jl6r1") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wxgoo") +}], +"loop": 0, +"name": &"flame_hurt", +"speed": 12.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_kv8by") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_yg2y3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wdvgl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_o7ah7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tvum2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_07gfh") +}], +"loop": 1, +"name": &"flame_idle", +"speed": 7.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_7h0k5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3ka8w") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3xcj5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ts7ht") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_j7i7y") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0v822") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_f8a4x") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_k1alp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_24dmw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vi31y") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tq28e") +}], +"loop": 0, +"name": &"flame_jump_attack", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_ihs6g") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_awpnw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_eb7tf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_uj2ku") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8hhqo") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vwt64") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ameyd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_smcgx") +}], +"loop": 1, +"name": &"flame_running", +"speed": 10.0 +}, { +"frames": [{ +"duration": 2.0, +"texture": SubResource("AtlasTexture_xaqgm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_d24pb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_si5qu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mdwk3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4g6w6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_c0pkj") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7a2xu") +}], +"loop": 0, +"name": &"normal_attack1", +"speed": 7.0 +}, { +"frames": [{ +"duration": 2.0, +"texture": SubResource("AtlasTexture_455wm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_13jm0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_sa52w") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2k6yj") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_g3jc6") +}], +"loop": 0, +"name": &"normal_attack2", +"speed": 7.0 +}, { +"frames": [{ +"duration": 2.0, +"texture": SubResource("AtlasTexture_2vper") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bdwya") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_dps0u") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pdgxx") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_uo0e0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3iori") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vpbm0") +}], +"loop": 0, +"name": &"normal_attack3", +"speed": 7.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_yp1dy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vvdvs") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rrax3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_fr2ux") +}], +"loop": 0, +"name": &"normal_hurt", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_5lviy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ahoni") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rn0yv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_av7q8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_l14ao") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ifbka") +}], +"loop": 1, +"name": &"normal_idle", +"speed": 7.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_mvxug") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ltt0n") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bncbc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_y36tf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wmj73") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tpppe") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_63uql") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jo152") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_v2uio") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xir3r") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bdu0b") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wajhd") +}], +"loop": 0, +"name": &"normal_jump_attack", +"speed": 7.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_wnkca") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nmi58") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6wxp8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7dq2t") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tv3m1") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_35grs") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wolpv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rihh4") +}], +"loop": 1, +"name": &"normal_running", +"speed": 8.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_5lduo") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qdyd0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8ffrf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_eb54u") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_orbnk") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kbkkt") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tp851") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8qt41") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3et15") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0jvy3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3rtfg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_y7bw2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_skkxw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vw2m2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3ogej") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_p6bhp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8x652") +}], +"loop": 0, +"name": &"shout", +"speed": 8.0 +}] + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_wdvgl"] +height = 46.0 + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_f8v3l"] +radius = 9.0 +height = 42.0 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_di6cc"] +size = Vector2(824.21875, 87.5) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_33lk7"] +size = Vector2(21.5, 36) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_s0ykf"] +size = Vector2(40, 64) + +[node name="CharacterBody2D" type="CharacterBody2D" unique_id=1564137690] +collision_layer = 8 +script = ExtResource("4_dmsam") + +[node name="HealthComponent" type="Node" parent="." unique_id=334972245] +script = ExtResource("1_vs17r") +max_health = 80 +metadata/_custom_type_script = "uid://ev7uglfcbl02" + +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=1649019130] +position = Vector2(0, -42) +sprite_frames = SubResource("SpriteFrames_udhr8") +animation = &"normal_attack3" +autoplay = "normal_idle" + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1412521514] +position = Vector2(0, -23) +shape = SubResource("CapsuleShape2D_wdvgl") + +[node name="HurtBox" type="Area2D" parent="." unique_id=77974344] +collision_layer = 4 +collision_mask = 2 +script = ExtResource("2_3f34g") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="HurtBox" unique_id=496690144] +position = Vector2(0, -22) +shape = SubResource("CapsuleShape2D_f8v3l") +debug_color = Color(1, 0, 0, 0.41960785) + +[node name="DetectionArea" type="Area2D" parent="." unique_id=613463268] +collision_layer = 0 +collision_mask = 16 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="DetectionArea" unique_id=1471701880] +position = Vector2(0, -44.25) +shape = SubResource("RectangleShape2D_di6cc") +debug_color = Color(0.77266294, 0.44344115, 3.85046e-07, 0.41960785) + +[node name="ComboHitBox" type="Area2D" parent="." unique_id=1953441663] +collision_layer = 2 +collision_mask = 4 +script = ExtResource("3_oessa") +damage = 2 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="ComboHitBox" unique_id=2093629540] +position = Vector2(35, -20) +shape = SubResource("RectangleShape2D_33lk7") + +[node name="ComboAttackRangeArea" type="Area2D" parent="." unique_id=1251225542] +collision_layer = 0 +collision_mask = 4 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="ComboAttackRangeArea" unique_id=1335782575] +position = Vector2(35.25, -20) +shape = SubResource("RectangleShape2D_33lk7") +debug_color = Color(0.9622, 0.6, 0.1, 0.41960785) + +[node name="JumpAttackHitBox" type="Area2D" parent="." unique_id=71695691] +collision_layer = 2 +collision_mask = 4 +script = ExtResource("3_oessa") +damage = 4 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="JumpAttackHitBox" unique_id=662818131] +position = Vector2(28, -32) +shape = SubResource("RectangleShape2D_s0ykf") + +[node name="JumpAttackRangeArea" type="Area2D" parent="." unique_id=1104519743] +collision_layer = 0 +collision_mask = 4 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="JumpAttackRangeArea" unique_id=1275435843] +position = Vector2(28, -32) +shape = SubResource("RectangleShape2D_s0ykf") + +[node name="RayCast2D" type="RayCast2D" parent="." unique_id=1363425348] +target_position = Vector2(0, 15) diff --git a/scenes/actors/morph_demon.gd b/scenes/actors/morph_demon.gd new file mode 100644 index 0000000..c4c5bd7 --- /dev/null +++ b/scenes/actors/morph_demon.gd @@ -0,0 +1,210 @@ +class_name MorphDemon +extends CharacterBody2D + +const SPRITE_OFFSET: float = 32.0 +const _DEFAULT_COLLISION_LAYER: int = 8 + +@onready var _hurtbox: HurtBox = $HurtBox +@onready var _health: HealthComponent = $HealthComponent +@onready var _sprite: AnimatedSprite2D = $AnimatedSprite2D +@onready var _detection_area: Area2D = $DetectionArea +@onready var _dash_hitbox: HitBox = $DashHitBox +@onready var _dash_hitbox_collision: CollisionShape2D = $DashHitBox/CollisionShape2D +@onready var _dash_attack_range_area: Area2D = $DashAttackRangeArea +@onready var _poison_hitbox: HitBox = $PoisonHitBox +@onready var _poison_hitbox_collision: CollisionShape2D = $PoisonHitBox/CollisionShape2D +@onready var _poison_attack_range_area: Area2D = $PoisonAttackRangeArea +@onready var _ledge_detector: RayCast2D = $RayCast2D + +# Exported Variables +@export_group("Movement") +@export var move_speed: float = 30.0 +@export var patrol_speed: float = 10.0 +@export var ledge_check_offset: float = 10.0 + +@export_group("Combat") +@export var attack_cooldown: float = 1.5 +@export var dash_lunge_speed: float = 220.0 +@export var dash_hit_frame_start: int = 2 +@export var dash_hit_frame_end: int = 4 +@export var poison_hit_frame_start: int = 2 +@export var poison_hit_frame_end: int = 4 + +# Runtime Variables +var _player: Node2D = null +var _player_in_dash_range: bool = false +var _player_in_poison_range: bool = false +var _is_attacking: bool = false +var _is_hurt: bool = false +var _is_dead: bool = false +var _attack_cooldown_timer: float = 0.0 +var _facing_direction: float = 1.0 +var _patrol_direction: float = 1.0 + +func _ready() -> void: + add_to_group("enemies") + _hurtbox.hit_received.connect(_on_hurtbox_hit_received) + _health.health_changed.connect(_on_health_changed) + _health.died.connect(_on_died) + _sprite.animation_finished.connect(_on_animation_finished) + _detection_area.body_entered.connect(_on_detection_area_body_entered) + _detection_area.body_exited.connect(_on_detection_area_body_exited) + _dash_attack_range_area.area_entered.connect(_on_dash_range_area_entered) + _dash_attack_range_area.area_exited.connect(_on_dash_range_area_exited) + _poison_attack_range_area.area_entered.connect(_on_poison_range_area_entered) + _poison_attack_range_area.area_exited.connect(_on_poison_range_area_exited) + +func _physics_process(delta: float) -> void: + _apply_gravity(delta) + _update_attack_cooldown(delta) + + if not _is_dead: + _process_ai() + _update_hitboxes() + + move_and_slide() + +func _update_hitboxes() -> void: + var is_dash_hit_frame: bool = _sprite.animation == &"dash_attack" \ + and _sprite.frame >= dash_hit_frame_start \ + and _sprite.frame <= dash_hit_frame_end + var is_dashing_through: bool = _is_attacking and is_dash_hit_frame + _dash_hitbox_collision.disabled = not is_dashing_through + collision_layer = 0 if is_dashing_through else _DEFAULT_COLLISION_LAYER + + var is_poison_hit_frame: bool = _sprite.animation == &"poison_attack" \ + and _sprite.frame >= poison_hit_frame_start \ + and _sprite.frame <= poison_hit_frame_end + _poison_hitbox_collision.disabled = not (_is_attacking and is_poison_hit_frame) + +func _apply_gravity(delta: float) -> void: + if not is_on_floor(): + velocity.y += ProjectSettings.get_setting("physics/2d/default_gravity") * delta + +func _update_attack_cooldown(delta: float) -> void: + if _attack_cooldown_timer > 0.0: + _attack_cooldown_timer -= delta + +func _process_ai() -> void: + if _is_hurt: + velocity.x = 0.0 + return + + if _is_attacking: + var is_dash_hit_frame: bool = _sprite.animation == &"dash_attack" \ + and _sprite.frame >= dash_hit_frame_start \ + and _sprite.frame <= dash_hit_frame_end + velocity.x = _facing_direction * dash_lunge_speed if is_dash_hit_frame else 0.0 + return + + if _player_in_dash_range and _attack_cooldown_timer <= 0.0: + _start_attack(&"dash_attack") + return + + if _player_in_poison_range and _attack_cooldown_timer <= 0.0: + _start_attack(&"poison_attack") + return + + if _player_in_dash_range or _player_in_poison_range: + _facing_direction = signf(_player.global_position.x - global_position.x) + velocity.x = 0.0 + if _sprite.animation != &"idle": + _sprite.play(&"idle") + _update_facing() + return + + if _player: + _facing_direction = signf(_player.global_position.x - global_position.x) + if _has_ground_ahead(_facing_direction): + velocity.x = _facing_direction * move_speed + if _sprite.animation != &"walk": + _sprite.play(&"walk") + else: + velocity.x = 0.0 + if _sprite.animation != &"idle": + _sprite.play(&"idle") + else: + _facing_direction = _patrol_direction + velocity.x = _patrol_direction * patrol_speed + if _sprite.animation != &"walk": + _sprite.play(&"walk") + + _update_facing() + + if not _player: + _update_patrol_direction() + +func _update_facing() -> void: + _sprite.flip_h = _facing_direction < 0.0 + _sprite.offset.x = -SPRITE_OFFSET if _sprite.flip_h else SPRITE_OFFSET + _dash_hitbox.scale.x = -_facing_direction + _dash_attack_range_area.scale.x = -_facing_direction + _poison_hitbox.scale.x = _facing_direction + _poison_attack_range_area.scale.x = _facing_direction + +func _has_ground_ahead(direction: float) -> bool: + _ledge_detector.position.x = ledge_check_offset * direction + _ledge_detector.force_raycast_update() + return _ledge_detector.is_colliding() + +func _update_patrol_direction() -> void: + if is_on_wall() or not _has_ground_ahead(_patrol_direction): + _patrol_direction = -_patrol_direction + +func _start_attack(attack_animation: StringName) -> void: + _is_attacking = true + _attack_cooldown_timer = attack_cooldown + velocity.x = 0.0 + _sprite.play(attack_animation) + +func _on_detection_area_body_entered(body: Node2D) -> void: + _player = body + +func _on_detection_area_body_exited(body: Node2D) -> void: + if body == _player: + _player = null + +func _on_dash_range_area_entered(area: Area2D) -> void: + if area is HurtBox and area.get_parent() == _player: + _player_in_dash_range = true + +func _on_dash_range_area_exited(area: Area2D) -> void: + if area is HurtBox and area.get_parent() == _player: + _player_in_dash_range = false + +func _on_poison_range_area_entered(area: Area2D) -> void: + if area is HurtBox and area.get_parent() == _player: + _player_in_poison_range = true + +func _on_poison_range_area_exited(area: Area2D) -> void: + if area is HurtBox and area.get_parent() == _player: + _player_in_poison_range = false + +func _on_hurtbox_hit_received(hitbox: HitBox) -> void: + _health.take_damage(hitbox.damage) + +func _on_health_changed(_new_value: int, _max_value: int) -> void: + _is_attacking = false + _is_hurt = true + _sprite.play(&"hurt") + +func _on_died() -> void: + _is_dead = true + velocity = Vector2.ZERO + _hurtbox.set_deferred("monitoring", false) + _dash_hitbox_collision.set_deferred("disabled", true) + _poison_hitbox_collision.set_deferred("disabled", true) + remove_from_group("enemies") + EventBus.enemy_defeated.emit() + +func _on_animation_finished() -> void: + if _sprite.animation == &"hurt": + _is_hurt = false + if _is_dead: + _sprite.play(&"death") + else: + _sprite.play(&"idle") + elif _sprite.animation == &"dash_attack" or _sprite.animation == &"poison_attack": + _is_attacking = false + elif _sprite.animation == &"death": + queue_free() diff --git a/scenes/actors/morph_demon.gd.uid b/scenes/actors/morph_demon.gd.uid new file mode 100644 index 0000000..875a3d3 --- /dev/null +++ b/scenes/actors/morph_demon.gd.uid @@ -0,0 +1 @@ +uid://cvj0lx0ye6s8u diff --git a/scenes/actors/morph_demon.tscn b/scenes/actors/morph_demon.tscn new file mode 100644 index 0000000..dd1d1cc --- /dev/null +++ b/scenes/actors/morph_demon.tscn @@ -0,0 +1,389 @@ +[gd_scene format=3 uid="uid://mh87kxbf8qfg"] + +[ext_resource type="Script" uid="uid://cvj0lx0ye6s8u" path="res://scenes/actors/morph_demon.gd" id="1_2mv40"] +[ext_resource type="Script" uid="uid://ev7uglfcbl02" path="res://scenes/components/health_component.gd" id="1_j57tj"] +[ext_resource type="Texture2D" uid="uid://cnspvi231pekd" path="res://assets/images/sprites/Enemies/Demons/Demon_Morph.png" id="2_2mv40"] +[ext_resource type="Script" uid="uid://cxsbkcxpnu3t6" path="res://scenes/components/hurt_box.gd" id="2_vvnac"] +[ext_resource type="Script" uid="uid://dw1cot7pm0rp6" path="res://scenes/components/hit_box.gd" id="3_2mv40"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_je8q5"] +atlas = ExtResource("2_2mv40") +region = Rect2(0, 192, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_fe67r"] +atlas = ExtResource("2_2mv40") +region = Rect2(128, 192, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_k6a66"] +atlas = ExtResource("2_2mv40") +region = Rect2(256, 192, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ms8dm"] +atlas = ExtResource("2_2mv40") +region = Rect2(384, 192, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_te4c3"] +atlas = ExtResource("2_2mv40") +region = Rect2(512, 192, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2mv40"] +atlas = ExtResource("2_2mv40") +region = Rect2(0, 384, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1jkw4"] +atlas = ExtResource("2_2mv40") +region = Rect2(128, 384, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_u2v8e"] +atlas = ExtResource("2_2mv40") +region = Rect2(256, 384, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_waxpt"] +atlas = ExtResource("2_2mv40") +region = Rect2(384, 384, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wtash"] +atlas = ExtResource("2_2mv40") +region = Rect2(512, 384, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_05e56"] +atlas = ExtResource("2_2mv40") +region = Rect2(640, 384, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_a255e"] +atlas = ExtResource("2_2mv40") +region = Rect2(768, 384, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qbbd0"] +atlas = ExtResource("2_2mv40") +region = Rect2(896, 384, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xfbi4"] +atlas = ExtResource("2_2mv40") +region = Rect2(0, 128, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_s0njy"] +atlas = ExtResource("2_2mv40") +region = Rect2(128, 128, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_f8v3l"] +atlas = ExtResource("2_2mv40") +region = Rect2(0, 0, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_di6cc"] +atlas = ExtResource("2_2mv40") +region = Rect2(128, 0, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_33lk7"] +atlas = ExtResource("2_2mv40") +region = Rect2(256, 0, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7abvi"] +atlas = ExtResource("2_2mv40") +region = Rect2(384, 0, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_brf3s"] +atlas = ExtResource("2_2mv40") +region = Rect2(512, 0, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_087mw"] +atlas = ExtResource("2_2mv40") +region = Rect2(640, 0, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xjcar"] +atlas = ExtResource("2_2mv40") +region = Rect2(0, 256, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jx50b"] +atlas = ExtResource("2_2mv40") +region = Rect2(128, 256, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pvui8"] +atlas = ExtResource("2_2mv40") +region = Rect2(256, 256, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ewei5"] +atlas = ExtResource("2_2mv40") +region = Rect2(384, 256, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_i10qy"] +atlas = ExtResource("2_2mv40") +region = Rect2(512, 256, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ku75a"] +atlas = ExtResource("2_2mv40") +region = Rect2(640, 256, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_aehku"] +atlas = ExtResource("2_2mv40") +region = Rect2(768, 256, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qwjtc"] +atlas = ExtResource("2_2mv40") +region = Rect2(896, 256, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_c1cpx"] +atlas = ExtResource("2_2mv40") +region = Rect2(0, 64, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5swl3"] +atlas = ExtResource("2_2mv40") +region = Rect2(128, 64, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_syam8"] +atlas = ExtResource("2_2mv40") +region = Rect2(256, 64, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_uuuvn"] +atlas = ExtResource("2_2mv40") +region = Rect2(384, 64, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_07spa"] +atlas = ExtResource("2_2mv40") +region = Rect2(512, 64, 128, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_mjveu"] +atlas = ExtResource("2_2mv40") +region = Rect2(640, 64, 128, 64) + +[sub_resource type="SpriteFrames" id="SpriteFrames_bccdp"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_je8q5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_fe67r") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_k6a66") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ms8dm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_te4c3") +}], +"loop": 0, +"name": &"dash_attack", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_2mv40") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1jkw4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_u2v8e") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_waxpt") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wtash") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_05e56") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_a255e") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qbbd0") +}], +"loop": 0, +"name": &"death", +"speed": 7.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_xfbi4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_s0njy") +}], +"loop": 0, +"name": &"hurt", +"speed": 7.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_f8v3l") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_di6cc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_33lk7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7abvi") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_brf3s") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_087mw") +}], +"loop": 1, +"name": &"idle", +"speed": 7.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_xjcar") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jx50b") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pvui8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ewei5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_i10qy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ku75a") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_aehku") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qwjtc") +}], +"loop": 0, +"name": &"poison_attack", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_c1cpx") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5swl3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_syam8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_uuuvn") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_07spa") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mjveu") +}], +"loop": 1, +"name": &"walk", +"speed": 10.0 +}] + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_2mv40"] +radius = 6.0 +height = 18.0 + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_f8v3l"] +radius = 5.0 +height = 16.0 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_di6cc"] +size = Vector2(274.4375, 27) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_f8v3l"] +size = Vector2(12, 20) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_33lk7"] +size = Vector2(47, 20) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_2mv40"] +size = Vector2(42, 21) + +[node name="MorphDemon" type="CharacterBody2D" unique_id=1564137690] +scale = Vector2(1.25, 1.25) +collision_layer = 8 +script = ExtResource("1_2mv40") + +[node name="HealthComponent" type="Node" parent="." unique_id=334972245] +script = ExtResource("1_j57tj") +max_health = 20 +metadata/_custom_type_script = "uid://ev7uglfcbl02" + +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=1649019130] +position = Vector2(0, -16) +sprite_frames = SubResource("SpriteFrames_bccdp") +animation = &"poison_attack" +autoplay = "idle" +frame = 2 +offset = Vector2(32, 0) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1412521514] +position = Vector2(0, -9) +shape = SubResource("CapsuleShape2D_2mv40") + +[node name="HurtBox" type="Area2D" parent="." unique_id=77974344] +collision_layer = 4 +collision_mask = 2 +script = ExtResource("2_vvnac") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="HurtBox" unique_id=496690144] +position = Vector2(0, -10) +shape = SubResource("CapsuleShape2D_f8v3l") +debug_color = Color(1, 0, 0, 0.41960785) + +[node name="DetectionArea" type="Area2D" parent="." unique_id=613463268] +collision_layer = 0 +collision_mask = 16 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="DetectionArea" unique_id=1471701880] +position = Vector2(0, -13) +shape = SubResource("RectangleShape2D_di6cc") +debug_color = Color(0.77266294, 0.44344115, 3.85046e-07, 0.41960785) + +[node name="DashHitBox" type="Area2D" parent="." unique_id=1953441663] +collision_layer = 2 +collision_mask = 4 +script = ExtResource("3_2mv40") +damage = 2 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="DashHitBox" unique_id=2093629540] +position = Vector2(0, -10) +shape = SubResource("RectangleShape2D_f8v3l") + +[node name="DashAttackRangeArea" type="Area2D" parent="." unique_id=1251225542] +collision_layer = 0 +collision_mask = 4 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="DashAttackRangeArea" unique_id=1335782575] +position = Vector2(0, -10) +shape = SubResource("RectangleShape2D_33lk7") +debug_color = Color(0.9622, 0.6, 0.1, 0.41960785) + +[node name="PoisonHitBox" type="Area2D" parent="." unique_id=280274109] +collision_layer = 2 +collision_mask = 4 +script = ExtResource("3_2mv40") +damage = 2 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="PoisonHitBox" unique_id=1981698659] +position = Vector2(37, -14.4) +scale = Vector2(0.99999994, 0.99999994) +shape = SubResource("RectangleShape2D_2mv40") + +[node name="PoisonAttackRangeArea" type="Area2D" parent="." unique_id=2009092151] +collision_layer = 0 +collision_mask = 4 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="PoisonAttackRangeArea" unique_id=406627570] +position = Vector2(37, -14) +scale = Vector2(0.99999994, 0.99999994) +shape = SubResource("RectangleShape2D_2mv40") +debug_color = Color(0.9607843, 0.6, 0.101960786, 0.41960785) + +[node name="RayCast2D" type="RayCast2D" parent="." unique_id=1363425348] +target_position = Vector2(0, 15) diff --git a/scenes/actors/player.gd b/scenes/actors/player.gd index 64c5bcc..ec12c7b 100644 --- a/scenes/actors/player.gd +++ b/scenes/actors/player.gd @@ -39,7 +39,7 @@ const _ATTACK_DAMAGE: Dictionary = { State.DASH_ATTACK: 2, } -# Hitbox-active frame range per attack state +# Les frames ou la Hitbox est active const _ATTACK_HIT_FRAMES: Dictionary = { State.ATTACK_1: Vector2i(2, 4), State.ATTACK_2: Vector2i(2, 4), @@ -48,6 +48,9 @@ const _ATTACK_HIT_FRAMES: Dictionary = { State.HEAVY_ATTACK: Vector2i(6, 8), } +# Frames d'invincibilité lors du DEFEND +const _DEFEND_INVULN_FRAMES: Vector2i = Vector2i(0, 4) + # Player Runtime Variables var direction: float = 0.0 var facing_direction: float = 1.0 @@ -60,6 +63,7 @@ var dash_timer: float = 0.0 var dash_cooldown_timer: float = 0.0 var is_hurt: bool = false var is_dead: bool = false +var is_defending: bool = false # Player Exported Variables @export_group("Movement") @@ -85,6 +89,7 @@ func _ready() -> void: _health.health_changed.connect(_on_health_changed) _health.died.connect(_on_died) _hurtbox.hit_received.connect(_on_hurtbox_hit_received) + EventBus.player_heal_requested.connect(_on_player_heal_requested) if EventBus.has_checkpoint: global_position = EventBus.last_checkpoint_position _on_health_changed.call_deferred(_health.current_health, _health.max_health) @@ -92,6 +97,7 @@ func _ready() -> void: func _physics_process(delta: float) -> void: _apply_gravity(delta) _process_dash_input() + _process_defend_input() _apply_movement(delta) _process_attack_input() _update_combo_timer(delta) @@ -120,6 +126,10 @@ func _apply_movement(delta: float) -> void: velocity.x = facing_direction * attack_move_speed return + if is_defending: + velocity.x = 0.0 + return + direction = Input.get_axis("move_left", "move_right") velocity.x = direction * move_speed if direction != 0.0: @@ -127,13 +137,14 @@ func _apply_movement(delta: float) -> void: if is_on_floor() and Input.is_action_just_pressed("jump"): velocity.y = jump_velocity + AudioManager.play_sfx("jump") func _process_dash_input() -> void: - if is_dashing or is_attacking or is_hurt or is_dead or dash_cooldown_timer > 0.0: + if is_dashing or is_attacking or is_defending or is_hurt or is_dead or dash_cooldown_timer > 0.0: return if not Input.is_action_just_pressed("dash"): return - + is_dashing = true dash_timer = dash_duration dash_cooldown_timer = dash_cooldown @@ -141,8 +152,17 @@ func _process_dash_input() -> void: current_state = State.DASH collision_mask = _DASH_COLLISION_MASK +func _process_defend_input() -> void: + if is_defending or is_attacking or is_dashing or is_hurt or is_dead: + return + if not Input.is_action_just_pressed("defend"): + return + + is_defending = true + current_state = State.DEFEND + func _process_attack_input() -> void: - if is_attacking or is_dashing or is_hurt or is_dead or not Input.is_action_just_pressed("light_attack"): + if is_attacking or is_dashing or is_defending or is_hurt or is_dead or not Input.is_action_just_pressed("light_attack"): return if combo_step > 0 and combo_timer > 0.0: @@ -153,6 +173,7 @@ func _process_attack_input() -> void: is_attacking = true combo_timer = 0.0 current_state = State.values()[State.ATTACK_1 + combo_step - 1] + AudioManager.play_sfx("slash_1") func _update_combo_timer(delta: float) -> void: if combo_timer > 0.0: @@ -175,6 +196,10 @@ func _on_animation_finished() -> void: is_hurt = false return + if current_state == State.DEFEND: + is_defending = false + return + if not is_attacking: return @@ -190,6 +215,8 @@ func _update_state() -> void: if is_hurt: current_state = State.HURT return + if is_defending: + return if is_attacking: return if is_dashing: @@ -220,16 +247,28 @@ func _update_hitbox() -> void: func kill() -> void: _health.kill() +func _on_player_heal_requested(amount: int) -> void: + _health.heal(amount) + func _on_hurtbox_hit_received(hitbox: HitBox) -> void: + if _is_blocking_hit(): + return + _health.take_damage(hitbox.damage) is_attacking = false + is_defending = false if is_dashing: is_dashing = false collision_mask = _DEFAULT_COLLISION_MASK is_hurt = true current_state = State.HURT +func _is_blocking_hit() -> bool: + return is_defending \ + and _sprite.frame >= _DEFEND_INVULN_FRAMES.x \ + and _sprite.frame <= _DEFEND_INVULN_FRAMES.y + func _on_health_changed(current_health: int, max_health: int) -> void: EventBus.player_health_changed.emit(current_health, max_health) diff --git a/scenes/actors/player.tscn b/scenes/actors/player.tscn index 3b874d7..ebee1c9 100644 --- a/scenes/actors/player.tscn +++ b/scenes/actors/player.tscn @@ -570,7 +570,7 @@ animations = [{ }], "loop": 0, "name": &"defend", -"speed": 10.0 +"speed": 12.0 }, { "frames": [{ "duration": 1.0, @@ -767,15 +767,16 @@ max_health = 12 [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=752538207] position = Vector2(0, -33) sprite_frames = SubResource("SpriteFrames_uvqlf") -animation = &"throw" +animation = &"idle" autoplay = "idle" -frame_progress = 0.9020072 [node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=807357149] +visible = false position = Vector2(0, -17) shape = SubResource("CapsuleShape2D_gy2im") [node name="HitBox" type="Area2D" parent="." unique_id=510680537] +visible = false collision_layer = 2 collision_mask = 0 script = ExtResource("14_hitbox") @@ -785,6 +786,7 @@ position = Vector2(25.75, -20.5) shape = SubResource("RectangleShape2D_uvqlf") [node name="HurtBox" type="Area2D" parent="." unique_id=2064020607] +visible = false collision_layer = 4 collision_mask = 2 script = ExtResource("16_0878f") diff --git a/scenes/actors/sword_demon.tscn b/scenes/actors/sword_demon.tscn new file mode 100644 index 0000000..d0a8d57 --- /dev/null +++ b/scenes/actors/sword_demon.tscn @@ -0,0 +1,67 @@ +[gd_scene format=3 uid="uid://3pgc7hhn7dxy"] + +[ext_resource type="Script" uid="uid://ev7uglfcbl02" path="res://scenes/components/health_component.gd" id="1_fbthg"] +[ext_resource type="Script" uid="uid://cxsbkcxpnu3t6" path="res://scenes/components/hurt_box.gd" id="2_hqeu6"] +[ext_resource type="Script" uid="uid://dw1cot7pm0rp6" path="res://scenes/components/hit_box.gd" id="3_5g2xq"] + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_f8v3l"] +radius = 5.0 +height = 16.0 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_di6cc"] +size = Vector2(178.875, 27) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_33lk7"] +size = Vector2(17, 6) + +[node name="CharacterBody2D" type="CharacterBody2D" unique_id=1564137690] +collision_layer = 8 + +[node name="HealthComponent" type="Node" parent="." unique_id=334972245] +script = ExtResource("1_fbthg") +metadata/_custom_type_script = "uid://ev7uglfcbl02" + +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=1649019130] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1412521514] + +[node name="HurtBox" type="Area2D" parent="." unique_id=77974344] +collision_layer = 4 +collision_mask = 2 +script = ExtResource("2_hqeu6") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="HurtBox" unique_id=496690144] +position = Vector2(1, -8) +shape = SubResource("CapsuleShape2D_f8v3l") +debug_color = Color(1, 0, 0, 0.41960785) + +[node name="DetectionArea" type="Area2D" parent="." unique_id=613463268] +collision_layer = 0 +collision_mask = 16 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="DetectionArea" unique_id=1471701880] +position = Vector2(1, -14) +shape = SubResource("RectangleShape2D_di6cc") +debug_color = Color(0.77266294, 0.44344115, 3.85046e-07, 0.41960785) + +[node name="HitBox" type="Area2D" parent="." unique_id=1953441663] +collision_layer = 2 +collision_mask = 4 +script = ExtResource("3_5g2xq") +damage = 1 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="HitBox" unique_id=2093629540] +position = Vector2(-14.5, -14) +shape = SubResource("RectangleShape2D_33lk7") + +[node name="AttackRangeArea" type="Area2D" parent="." unique_id=1251225542] +collision_layer = 0 +collision_mask = 4 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="AttackRangeArea" unique_id=1335782575] +position = Vector2(-14.5, -14) +shape = SubResource("RectangleShape2D_33lk7") +debug_color = Color(0.9622, 0.6, 0.1, 0.41960785) + +[node name="RayCast2D" type="RayCast2D" parent="." unique_id=1363425348] +target_position = Vector2(0, 15) diff --git a/scenes/components/credit_entry_row.gd b/scenes/components/credit_entry_row.gd new file mode 100644 index 0000000..d2a785f --- /dev/null +++ b/scenes/components/credit_entry_row.gd @@ -0,0 +1,38 @@ +class_name CreditEntryRow +extends VBoxContainer + +@onready var _title_label: Label = $TitleLabel +@onready var _used_for_label: Label = $UsedForLabel +@onready var _artist_label: Label = $ArtistLabel +@onready var _license_label: Label = $LicenseLabel +@onready var _link_button: LinkButton = $LinkButton + +func _ready() -> void: + _link_button.pressed.connect(_on_link_button_pressed) + +func setup(entry: CreditEntry) -> void: + _title_label.text = '"' + entry.asset_name + '"' + _artist_label.text = "by " + entry.artist_name + + # Retire les champs vide + _used_for_label.visible = entry.used_for != "" + if _used_for_label.visible: + _used_for_label.text = "Used for " + entry.used_for + + _license_label.visible = entry.license_note != "" + if _license_label.visible: + _license_label.text = "LICENSE: " + entry.license_note + + _link_button.visible = entry.link_url != "" + if _link_button.visible: + _link_button.text = entry.link_url + _link_button.uri = _to_full_uri(entry.link_url) + +func _on_link_button_pressed() -> void: + OS.shell_open(_link_button.uri) + +func _to_full_uri(url: String) -> String: + # So the links can be open, besoin de https askip + if url.begins_with("http://") or url.begins_with("https://"): + return url + return "https://" + url diff --git a/scenes/components/credit_entry_row.gd.uid b/scenes/components/credit_entry_row.gd.uid new file mode 100644 index 0000000..35bc581 --- /dev/null +++ b/scenes/components/credit_entry_row.gd.uid @@ -0,0 +1 @@ +uid://44or741md6bm diff --git a/scenes/components/credit_entry_row.tscn b/scenes/components/credit_entry_row.tscn new file mode 100644 index 0000000..1af289c --- /dev/null +++ b/scenes/components/credit_entry_row.tscn @@ -0,0 +1,43 @@ +[gd_scene format=3 uid="uid://be6htjceekiq7"] + +[ext_resource type="Script" uid="uid://44or741md6bm" path="res://scenes/components/credit_entry_row.gd" id="1_row"] +[ext_resource type="FontFile" uid="uid://cqrxu8aj7ih08" path="res://assets/fonts/pixel_font.ttf" id="2_font"] + +[node name="CreditEntryRow" type="VBoxContainer" unique_id=681256112] +alignment = 1 +script = ExtResource("1_row") + +[node name="TitleLabel" type="Label" parent="." unique_id=670764218] +layout_mode = 2 +theme_override_fonts/font = ExtResource("2_font") +theme_override_font_sizes/font_size = 16 +horizontal_alignment = 1 + +[node name="UsedForLabel" type="Label" parent="." unique_id=2015157385] +layout_mode = 2 +theme_override_fonts/font = ExtResource("2_font") +theme_override_font_sizes/font_size = 16 +horizontal_alignment = 1 + +[node name="ArtistLabel" type="Label" parent="." unique_id=608623817] +layout_mode = 2 +theme_override_fonts/font = ExtResource("2_font") +theme_override_font_sizes/font_size = 16 +horizontal_alignment = 1 + +[node name="LicenseLabel" type="Label" parent="." unique_id=1010367215] +layout_mode = 2 +theme_override_fonts/font = ExtResource("2_font") +theme_override_font_sizes/font_size = 16 +horizontal_alignment = 1 +autowrap_mode = 3 + +[node name="LinkButton" type="LinkButton" parent="." unique_id=933484676] +layout_mode = 2 +size_flags_horizontal = 4 +theme_override_fonts/font = ExtResource("2_font") +theme_override_font_sizes/font_size = 16 + +[node name="Spacer" type="Control" parent="." unique_id=635287140] +custom_minimum_size = Vector2(0, 32) +layout_mode = 2 diff --git a/scenes/components/credits.gd b/scenes/components/credits.gd new file mode 100644 index 0000000..c54bf7b --- /dev/null +++ b/scenes/components/credits.gd @@ -0,0 +1,47 @@ +class_name Credits +extends Control + +signal credits_finished + +const SCROLL_SPEED: float = 40.0 +const FADE_IN_DURATION: float = 1.2 +const ENTRY_ROW_SCENE: PackedScene = preload("res://scenes/components/credit_entry_row.tscn") + +@export var entries: Array[CreditEntry] = [] + +@onready var _scroll_container: Control = $Control +@onready var _entry_container: VBoxContainer = $Control/VBoxContainer +@onready var _fade_in: ColorRect = $FadeIn + +var _scrolling: bool = false + +func _ready() -> void: + _build_entries() + await get_tree().process_frame + _entry_container.position.y = _scroll_container.size.y + + var tween: Tween = create_tween() + tween.tween_property(_fade_in, "color:a", 0.0, FADE_IN_DURATION) + await tween.finished + + _scrolling = true + +func _process(delta: float) -> void: + if not _scrolling: + return + + _entry_container.position.y -= SCROLL_SPEED * delta + + if _entry_container.position.y <= -_entry_container.size.y: + _scrolling = false + _on_credits_finished() + +func _build_entries() -> void: + for entry: CreditEntry in entries: + var row: CreditEntryRow = ENTRY_ROW_SCENE.instantiate() + _entry_container.add_child(row) + row.setup(entry) + +func _on_credits_finished() -> void: + credits_finished.emit() + SceneManager.change_scene("res://scenes/components/title_screen.tscn") diff --git a/scenes/components/credits.gd.uid b/scenes/components/credits.gd.uid new file mode 100644 index 0000000..f5a2a8d --- /dev/null +++ b/scenes/components/credits.gd.uid @@ -0,0 +1 @@ +uid://cs3x6tse0usmh diff --git a/scenes/components/credits.tscn b/scenes/components/credits.tscn new file mode 100644 index 0000000..0d259f8 --- /dev/null +++ b/scenes/components/credits.tscn @@ -0,0 +1,322 @@ +[gd_scene format=4 uid="uid://chsf8cnq3kljc"] + +[ext_resource type="Script" uid="uid://cs3x6tse0usmh" path="res://scenes/components/credits.gd" id="1_credits"] +[ext_resource type="Texture2D" uid="uid://dapligyg1q7vd" path="res://assets/images/sprites/World/Background/Wasteland_Sky.png" id="2_7g8wr"] +[ext_resource type="Script" uid="uid://bule4gelyixkg" path="res://scripts/resources/credit_entry.gd" id="2_trot7"] +[ext_resource type="Texture2D" uid="uid://bk41feg0qdi0t" path="res://assets/images/sprites/World/Background/Wasteland_Mountains_1.png" id="3_igyut"] +[ext_resource type="PackedScene" uid="uid://cwq8mu0hub5qd" path="res://scenes/actors/entity.tscn" id="4_vj4gp"] +[ext_resource type="Texture2D" uid="uid://cdgo042aie21s" path="res://assets/images/sprites/World/Background/Wasteland_Mountains_2.png" id="5_p7nin"] +[ext_resource type="Texture2D" uid="uid://c6nak38doipjr" path="res://assets/images/sprites/World/Forest/Background/2.png" id="6_x85h4"] +[ext_resource type="Texture2D" uid="uid://d1mclnyfhlmh8" path="res://assets/images/sprites/World/Forest/Props/Objects.png" id="7_mnbjv"] +[ext_resource type="TileSet" uid="uid://6ltrd6lvydrw" path="res://ressources/forest_tileset.tres" id="8_yb0lx"] +[ext_resource type="Texture2D" uid="uid://o7gjt82i1tuy" path="res://assets/images/sprites/World/Forest/Props/RedFlag.png" id="9_2i8y1"] +[ext_resource type="Resource" uid="uid://bpsl8kyvtklsf" path="res://ressources/credits/a_warriors_path.tres" id="10_gp6h7"] +[ext_resource type="Texture2D" uid="uid://uxtomds5wl0e" path="res://assets/images/sprites/World/Forest/Props/Props.png" id="10_tmcca"] +[ext_resource type="Resource" uid="uid://cbcfblwn6kb32" path="res://ressources/credits/myself.tres" id="10_trot7"] +[ext_resource type="Resource" uid="uid://cid0m3juwxeoq" path="res://ressources/credits/the_dungeon.tres" id="11_hfqyf"] +[ext_resource type="Texture2D" uid="uid://caguehadpvpe1" path="res://assets/images/sprites/Player/IDLE.png" id="11_trot7"] +[ext_resource type="Resource" uid="uid://c3u83was2c0b0" path="res://ressources/credits/The_red_death.tres" id="12_703xs"] +[ext_resource type="Resource" uid="uid://brghbhexpp7uf" path="res://ressources/credits/autumn_forest.tres" id="credit_autumn_forest"] +[ext_resource type="Resource" uid="uid://ckqx72pr2rruq" path="res://ressources/credits/creeper.tres" id="credit_creeper_1"] +[ext_resource type="Resource" uid="uid://cxue3rikm8e0w" path="res://ressources/credits/demon_samurai.tres" id="credit_demon_samurai"] +[ext_resource type="Resource" uid="uid://dc6a4f6hsteux" path="res://ressources/credits/agis.tres" id="credit_fantazy_30"] +[ext_resource type="Resource" uid="uid://cxuml4el83hit" path="res://ressources/credits/generic_dungeon_pack.tres" id="credit_generic_dungeon_pack"] +[ext_resource type="Resource" uid="uid://cxcj85pu0mxx4" path="res://ressources/credits/samurai_3.tres" id="credit_samurai_3"] +[ext_resource type="Resource" uid="uid://bau7r86eda7ry" path="res://ressources/credits/blood_demon.tres" id="credit_trail_demon"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_jfj7q"] +atlas = ExtResource("7_mnbjv") +region = Rect2(0, 0, 32, 96) + +[sub_resource type="AtlasTexture" id="AtlasTexture_s2vmd"] +atlas = ExtResource("9_2i8y1") +region = Rect2(0, 0, 29, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_yovuv"] +atlas = ExtResource("9_2i8y1") +region = Rect2(29, 0, 29, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_imsda"] +atlas = ExtResource("9_2i8y1") +region = Rect2(58, 0, 29, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4n58a"] +atlas = ExtResource("9_2i8y1") +region = Rect2(87, 0, 29, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_id23q"] +atlas = ExtResource("9_2i8y1") +region = Rect2(116, 0, 29, 64) + +[sub_resource type="AtlasTexture" id="AtlasTexture_31ppy"] +atlas = ExtResource("9_2i8y1") +region = Rect2(145, 0, 29, 64) + +[sub_resource type="SpriteFrames" id="SpriteFrames_kkp38"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_s2vmd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_yovuv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_imsda") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4n58a") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_id23q") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_31ppy") +}], +"loop": 1, +"name": &"default", +"speed": 7.0 +}] + +[sub_resource type="AtlasTexture" id="AtlasTexture_gp6h7"] +atlas = ExtResource("10_tmcca") +region = Rect2(160, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_hfqyf"] +atlas = ExtResource("10_tmcca") +region = Rect2(104, 0, 48, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_703xs"] +atlas = ExtResource("10_tmcca") +region = Rect2(0, 0, 64, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wx5q0"] +atlas = ExtResource("11_trot7") +region = Rect2(0, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_03q4f"] +atlas = ExtResource("11_trot7") +region = Rect2(106, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_j8yb3"] +atlas = ExtResource("11_trot7") +region = Rect2(212, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_f0n5y"] +atlas = ExtResource("11_trot7") +region = Rect2(318, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xaa0h"] +atlas = ExtResource("11_trot7") +region = Rect2(424, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_6x73w"] +atlas = ExtResource("11_trot7") +region = Rect2(530, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_hn6yu"] +atlas = ExtResource("11_trot7") +region = Rect2(636, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_rjgyo"] +atlas = ExtResource("11_trot7") +region = Rect2(742, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bqiuy"] +atlas = ExtResource("11_trot7") +region = Rect2(848, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tky41"] +atlas = ExtResource("11_trot7") +region = Rect2(954, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_v0qcs"] +atlas = ExtResource("11_trot7") +region = Rect2(1060, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_lavtg"] +atlas = ExtResource("11_trot7") +region = Rect2(1166, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_r6n1t"] +atlas = ExtResource("11_trot7") +region = Rect2(1272, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_b5s4q"] +atlas = ExtResource("11_trot7") +region = Rect2(1378, 0, 106, 84) + +[sub_resource type="SpriteFrames" id="SpriteFrames_o7d25"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_wx5q0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_03q4f") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_j8yb3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_f0n5y") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xaa0h") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6x73w") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_hn6yu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rjgyo") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bqiuy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tky41") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_v0qcs") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lavtg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_r6n1t") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_b5s4q") +}], +"loop": 1, +"name": &"player_idle", +"speed": 10.0 +}] + +[node name="Credits" type="Control" unique_id=1794913563] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_credits") +entries = Array[ExtResource("2_trot7")]([ExtResource("credit_samurai_3"), ExtResource("credit_demon_samurai"), ExtResource("credit_autumn_forest"), ExtResource("credit_fantazy_30"), ExtResource("credit_generic_dungeon_pack"), ExtResource("credit_creeper_1"), ExtResource("credit_trail_demon"), ExtResource("10_gp6h7"), ExtResource("11_hfqyf"), ExtResource("12_703xs"), ExtResource("10_trot7")]) + +[node name="Background" type="Node2D" parent="." unique_id=623644446] +position = Vector2(-38, -7) + +[node name="WastelandSky" type="Sprite2D" parent="Background" unique_id=1837093325] +position = Vector2(180, 95) +texture = ExtResource("2_7g8wr") + +[node name="WastelandMountains1" type="Sprite2D" parent="Background" unique_id=1340155195] +position = Vector2(138, 62) +texture = ExtResource("3_igyut") + +[node name="Entity" parent="Background" unique_id=286688007 instance=ExtResource("4_vj4gp")] +position = Vector2(306, 102) +scale = Vector2(0.5, 0.5) + +[node name="WastelandMountains2" type="Sprite2D" parent="Background" unique_id=1097749554] +position = Vector2(223, 68) +texture = ExtResource("5_p7nin") + +[node name="2" type="Sprite2D" parent="Background" unique_id=551587901] +position = Vector2(284, 72) +scale = Vector2(1.59375, 1.4333333) +texture = ExtResource("6_x85h4") + +[node name="3" type="Sprite2D" parent="Background" unique_id=814180887] +position = Vector2(-225, 72) +scale = Vector2(1.59375, 1.4333333) +texture = ExtResource("6_x85h4") + +[node name="Sprite2D" type="Sprite2D" parent="Background" unique_id=683660395] +position = Vector2(152, 116) +texture = SubResource("AtlasTexture_jfj7q") + +[node name="Forest2" type="TileMapLayer" parent="Background" unique_id=564778711] +position = Vector2(16, -31) +tile_map_data = PackedByteArray("AAAFAAYAAQAGAAcAAAAGAAYAAQAHAAcAAAAHAAYAAQAIAAcAAAA=") +tile_set = ExtResource("8_yb0lx") + +[node name="Forest" type="TileMapLayer" parent="Background" unique_id=1548344045] +position = Vector2(16, -31) +tile_map_data = PackedByteArray("AAD//wUAAQACAAYAAAD//wYAAQALAAMAAAAAAAUAAQADAAEAAAAAAAYAAQADAAcAAAAAAAcAAQACAAIAAAABAAYAAQAHAAYAAAABAAcAAQAMAAcAAAACAAYAAQAHAAYAAAACAAcAAQACAAIAAAADAAYAAQAHAAYAAAADAAcAAQAMAAcAAAAEAAYAAQAHAAYAAAAEAAcAAQACAAIAAAAFAAYAAQAHAAYAAAAFAAcAAQAMAAcAAAAGAAYAAQAMAAYAAAAGAAcAAQAHAAcAAAAHAAYAAQAHAAYAAAAHAAcAAQAHAAcAAAAIAAYAAQAHAAYAAAAIAAcAAQAMAAcAAAAJAAYAAQAHAAYAAAAJAAcAAQACAAIAAAAKAAYAAQAHAAYAAAAKAAcAAQAHAAcAAAALAAYAAQAHAAYAAAALAAcAAQAHAAcAAAAMAAYAAQAHAAYAAAAMAAcAAQACAAIAAAAFAAUAAQABAAEAAAAGAAUAAQACAAEAAAAHAAUAAQADAAYAAAA=") +tile_set = ExtResource("8_yb0lx") + +[node name="Flag" type="AnimatedSprite2D" parent="Background" unique_id=1172836343] +position = Vector2(198, 99) +sprite_frames = SubResource("SpriteFrames_kkp38") +autoplay = "default" + +[node name="Sprite2D2" type="Sprite2D" parent="Background" unique_id=1767111181] +position = Vector2(176, 148) +texture = SubResource("AtlasTexture_gp6h7") + +[node name="Sprite2D5" type="Sprite2D" parent="Background" unique_id=2032255107] +position = Vector2(13, 115) +texture = SubResource("AtlasTexture_gp6h7") + +[node name="Sprite2D3" type="Sprite2D" parent="Background" unique_id=527375118] +position = Vector2(342, 148) +texture = SubResource("AtlasTexture_hfqyf") + +[node name="Sprite2D4" type="Sprite2D" parent="Background" unique_id=816963282] +position = Vector2(265, 148) +texture = SubResource("AtlasTexture_703xs") + +[node name="Sprite2D6" type="Sprite2D" parent="Background" unique_id=1587700970] +position = Vector2(102, 149) +texture = SubResource("AtlasTexture_703xs") + +[node name="PlayerSprite" type="AnimatedSprite2D" parent="." unique_id=1633580477] +position = Vector2(190, 131) +sprite_frames = SubResource("SpriteFrames_o7d25") +animation = &"player_idle" +autoplay = "player_idle" +offset = Vector2(0, -40) + +[node name="Camera2D" type="Camera2D" parent="PlayerSprite" unique_id=906654161] +offset = Vector2(-30, -40) +position_smoothing_enabled = true + +[node name="ColorRect" type="ColorRect" parent="." unique_id=1918728818] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_bottom = 10.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 0.7490196) + +[node name="Control" type="Control" parent="." unique_id=725834524] +clip_contents = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="Control" unique_id=1433084312] +layout_mode = 1 +anchors_preset = 10 +anchor_right = 1.0 +grow_horizontal = 2 + +[node name="FadeIn" type="ColorRect" parent="." unique_id=1918728819] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_bottom = 10.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +color = Color(0, 0, 0, 1) diff --git a/scenes/components/death_screen.gd b/scenes/components/death_screen.gd index 1d0c10f..e516891 100644 --- a/scenes/components/death_screen.gd +++ b/scenes/components/death_screen.gd @@ -15,12 +15,18 @@ const OPTIONS_DELAY: float = 1.5 @onready var _background: ColorRect = $FadeOut func _ready() -> void: + AudioManager.stop_ambiance() _reset_sequence() _continue_button.pressed.connect(_on_continue_pressed) _title_screen_button.pressed.connect(_on_title_screen_pressed) _exit_button.pressed.connect(_on_exit_pressed) + for button: Button in [_continue_button, _title_screen_button, _exit_button]: + button.focus_entered.connect(_on_button_focus_entered) _play_sequence() +func _on_button_focus_entered() -> void: + AudioManager.play_sfx("options_move") + func _unhandled_input(event: InputEvent) -> void: if not event.is_action_pressed("interact"): return diff --git a/scenes/components/health_component.gd b/scenes/components/health_component.gd index 945032c..a674722 100644 --- a/scenes/components/health_component.gd +++ b/scenes/components/health_component.gd @@ -33,3 +33,4 @@ func heal(amount: int) -> void: return current_health = min(current_health + amount, max_health) health_changed.emit(current_health, max_health) + AudioManager.play_sfx("heal") diff --git a/scenes/components/locked_door.gd b/scenes/components/locked_door.gd index 7a0cba8..8f13565 100644 --- a/scenes/components/locked_door.gd +++ b/scenes/components/locked_door.gd @@ -18,6 +18,7 @@ func unlock() -> void: is_locked = false collision.set_deferred("disabled", true) sprites.set_deferred("visible", false) + AudioManager.play_jingle("success") func _on_enemy_defeated() -> void: _remaining_enemies -= 1 diff --git a/scenes/components/outro.gd b/scenes/components/outro.gd new file mode 100644 index 0000000..0d1a3a4 --- /dev/null +++ b/scenes/components/outro.gd @@ -0,0 +1,43 @@ +class_name Outro +extends Node + +const DIALOGS: Array[String] = [ + "Well done hero!", + "You saved us all!", + "...", + "Thank you for playing my game!" +] + +const CHAR_DELAY: float = 0.04 +const LINE_PAUSE: float = 2.0 + +var _full_text: String = "" + +@onready var log_label: RichTextLabel = $CanvasLayer/Label +@onready var background: ColorRect = $CanvasLayer/Background +@onready var fade_out: ColorRect = $CanvasLayer/FadeOut + +func _ready() -> void: + log_label.text = "" + _play_sequence() + AudioManager.play_ambiance("act1_section1") + +func _play_sequence() -> void: + for line in DIALOGS: + await _type_line(line) + await get_tree().create_timer(LINE_PAUSE).timeout + _full_text += "\n" + + # Fade out + var tween: Tween = create_tween() + tween.tween_property(fade_out, "color:a", 1.0, 1.2) + await tween.finished + if OS.get_name() == "Web": + JavaScriptBridge.eval("document.querySelector('canvas').focus()") + SceneManager.change_scene("res://scenes/components/credits.tscn") + +func _type_line(line: String) -> void: + for i in line.length(): + _full_text += line[i] + log_label.text = _full_text + await get_tree().create_timer(CHAR_DELAY).timeout diff --git a/scenes/components/outro.gd.uid b/scenes/components/outro.gd.uid new file mode 100644 index 0000000..e8df6dd --- /dev/null +++ b/scenes/components/outro.gd.uid @@ -0,0 +1 @@ +uid://i5pq8ek4jkq diff --git a/scenes/components/outro.tscn b/scenes/components/outro.tscn new file mode 100644 index 0000000..f83e4a3 --- /dev/null +++ b/scenes/components/outro.tscn @@ -0,0 +1,34 @@ +[gd_scene format=3 uid="uid://ceeldscwvns0m"] + +[ext_resource type="Script" uid="uid://i5pq8ek4jkq" path="res://scenes/components/outro.gd" id="1_icxug"] +[ext_resource type="FontFile" uid="uid://cqrxu8aj7ih08" path="res://assets/fonts/pixel_font.ttf" id="2_ocxdx"] + +[sub_resource type="Theme" id="Theme_kol6p"] +default_font = ExtResource("2_ocxdx") + +[node name="Outro" type="Node" unique_id=1077364657] +script = ExtResource("1_icxug") + +[node name="CanvasLayer" type="CanvasLayer" parent="." unique_id=335424006] +follow_viewport_enabled = true + +[node name="Background" type="ColorRect" parent="CanvasLayer" unique_id=2005237130] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 1) + +[node name="Label" type="RichTextLabel" parent="CanvasLayer" unique_id=1899603309] +offset_right = 321.0 +offset_bottom = 182.0 +theme = SubResource("Theme_kol6p") +theme_override_colors/font_outline_color = Color(0, 1, 0.4, 1) +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="FadeOut" type="ColorRect" parent="CanvasLayer" unique_id=642150202] +offset_right = 40.0 +offset_bottom = 40.0 +color = Color(0, 0, 0, 0) diff --git a/scenes/components/spikes.gd b/scenes/components/spikes.gd index 8458aca..f90b90e 100644 --- a/scenes/components/spikes.gd +++ b/scenes/components/spikes.gd @@ -30,7 +30,7 @@ func _ready() -> void: _update_visuals() func _on_body_entered(body: Node2D) -> void: - if _state == State.BLOOD or not body.is_in_group("player"): + if not body.is_in_group("player"): return _state = State.BLOOD diff --git a/scenes/components/title_screen.gd b/scenes/components/title_screen.gd index 9e18606..1faaa7d 100644 --- a/scenes/components/title_screen.gd +++ b/scenes/components/title_screen.gd @@ -8,12 +8,18 @@ extends Control @onready var _background: ColorRect = $FadeOut func _ready() -> void: + AudioManager.stop_ambiance() _start_game_button.pressed.connect(_on_start_game_pressed) _options_button.pressed.connect(_on_options_pressed) _credits_button.pressed.connect(_on_credit_pressed) _exit_button.pressed.connect(_on_exit_pressed) + for button: Button in [_start_game_button, _options_button, _credits_button, _exit_button]: + button.focus_entered.connect(_on_button_focus_entered) _start_game_button.grab_focus() - + +func _on_button_focus_entered() -> void: + AudioManager.play_sfx("options_move") + func _unhandled_input(event: InputEvent) -> void: if not event.is_action_pressed("interact"): return @@ -32,15 +38,19 @@ func _on_start_game_pressed() -> void: await tween.finished if OS.get_name() == "Web": JavaScriptBridge.eval("document.querySelector('canvas').focus()") - - SceneManager.change_scene("res://scenes/components/intro.tscn") func _on_options_pressed() -> void: print('Options Pressed') func _on_credit_pressed() -> void: - print('Credit Pressed') + # Fade out + var tween: Tween = create_tween() + tween.tween_property(_background, "color:a", 1.0, 1.2) + await tween.finished + if OS.get_name() == "Web": + JavaScriptBridge.eval("document.querySelector('canvas').focus()") + SceneManager.change_scene("res://scenes/components/credits.tscn") func _on_exit_pressed() -> void: SceneManager.quit_game() diff --git a/scenes/components/title_screen.tscn b/scenes/components/title_screen.tscn index 7b64e9f..9588708 100644 --- a/scenes/components/title_screen.tscn +++ b/scenes/components/title_screen.tscn @@ -346,7 +346,6 @@ autowrap_trim_flags = 0 [node name="CreditsButton" type="Button" parent="Options" unique_id=2065644118] layout_mode = 2 theme = SubResource("Theme_f0n5y") -disabled = true text = "Credits" flat = true alignment = 0 diff --git a/scenes/levels/act1_section1.tscn b/scenes/levels/act1_section1.tscn index 5de452b..c2232c2 100644 --- a/scenes/levels/act1_section1.tscn +++ b/scenes/levels/act1_section1.tscn @@ -41,7 +41,7 @@ position = Vector2(8, -144) [node name="Dungeon" type="TileMapLayer" parent="." unique_id=807967258] position = Vector2(-12, 0) scale = Vector2(2, 2) -tile_map_data = PackedByteArray("AAAAAPH/AAAFAAEAAAAAAPL/AAAFAAEAAAAAAPP/AAAFAAEAAAAAAPT/AAAFAAEAAAAAAPX/AAAFAAEAAAAAAPb/AAAFAAEAAAAAAPf/AAAFAAEAAAAAAPj/AAAFAAEAAAAAAPn/AAAFAAEAAAAAAPr/AAAFAAEAAAAAAPv/AAAFAAEAAAAAAPz/AAAFAAEAAAAAAP3/AAAFAAEAAAAAAP7/AAAFAAEAAAAAAP//AAAFAAEAAAAAAPD/AAAEAAAAAAAAAO//AAAEAAAAAAAAAO7/AAAEAAAAAAAAAO3/AAAEAAAAAAAAAOz/AAAEAAAAAAAAAOv/AAAEAAAAAAAAAOr/AAAEAAAAAAAAAOn/AAAEAAAAAAAAAOj/AAAEAAAAAAABAOj/AAAEAAAAAAACAOj/AAAEAAAAAAADAOj/AAAEAAAAAAAEAOj/AAAEAAAAAAAFAOj/AAAEAAAAAAAGAOj/AAAEAAAAAAAHAOj/AAAEAAAAAAAIAOj/AAAEAAAAAAAJAOj/AAAEAAAAAAAKAOj/AAAEAAAAAAALAOj/AAAEAAAAAAAMAOj/AAAEAAAAAAANAOj/AAAEAAAAAAAOAOj/AAAEAAAAAAAPAOj/AAAEAAAAAAAQAOj/AAAEAAAAAAARAOj/AAAEAAAAAAASAOj/AAAEAAAAAAATAOj/AAAEAAAAAAAUAOj/AAAEAAAAAAAVAOj/AAAEAAAAAAAWAOj/AAAEAAAAAAAXAOj/AAAEAAAAAAAYAOj/AAAEAAAAAAAZAOj/AAAEAAAAAAAaAOj/AAAEAAAAAAAbAOj/AAAEAAAAAAAcAOj/AAAEAAAAAAAdAOj/AAAEAAAAAAAeAOj/AAAEAAAAAAAfAOj/AAAEAAAAAAAgAOj/AAAEAAAAAAAhAOj/AAAEAAAAAAAiAOj/AAAEAAAAAAAjAOj/AAAEAAAAAAAkAOj/AAAEAAAAAAAlAOj/AAAEAAAAAAAmAOj/AAAEAAAAAAAnAOj/AAAEAAAAAAAoAOj/AAAEAAAAAAApAOj/AAAEAAAAAAAqAOj/AAAEAAAAAAArAOj/AAAEAAAAAAAsAOj/AAAEAAAAAAAtAOj/AAAEAAAAAAAuAOj/AAAEAAAAAAAuAOn/AAAEAAAAAAAuAOr/AAAEAAAAAAAuAOv/AAAEAAAAAAAuAOz/AAAEAAAAAAAuAO3/AAAEAAAAAAAuAO7/AAAEAAAAAAAuAO//AAAEAAAAAAAuAPD/AAAEAAAAAAAuAPH/AAAEAAAAAAAuAPL/AAAEAAAAAAAuAPP/AAAEAAAAAAAuAPT/AAAEAAAAAAAuAPX/AAAEAAAAAAAuAPb/AAAEAAAAAAAuAPf/AAAEAAAAAAAuAPj/AAAEAAAAAAAuAPn/AAAEAAAAAAA=") +tile_map_data = PackedByteArray("AAAAAPH/AAAFAAEAAAAAAPL/AAAFAAEAAAAAAPP/AAAFAAEAAAAAAPT/AAAFAAEAAAAAAPX/AAAFAAEAAAAAAPb/AAAFAAEAAAAAAPf/AAAFAAEAAAAAAPj/AAAFAAEAAAAAAPn/AAAFAAEAAAAAAPr/AAAFAAEAAAAAAPv/AAAFAAEAAAAAAPz/AAAFAAEAAAAAAP3/AAAFAAEAAAAAAP7/AAAFAAEAAAAAAP//AAAFAAEAAAAAAPD/AAAEAAAAAAAAAO//AAAEAAAAAAAAAO7/AAAEAAAAAAAAAO3/AAAEAAAAAAAAAOz/AAAEAAAAAAAAAOv/AAAEAAAAAAAAAOr/AAAEAAAAAAAAAOn/AAAEAAAAAAAAAOj/AAAEAAAAAAABAOj/AAAEAAAAAAACAOj/AAAEAAAAAAADAOj/AAAEAAAAAAAEAOj/AAAEAAAAAAAFAOj/AAAEAAAAAAAGAOj/AAAEAAAAAAAHAOj/AAAEAAAAAAAIAOj/AAAEAAAAAAAJAOj/AAAEAAAAAAAKAOj/AAAEAAAAAAALAOj/AAAEAAAAAAAMAOj/AAAEAAAAAAANAOj/AAAEAAAAAAAOAOj/AAAEAAAAAAAPAOj/AAAEAAAAAAAQAOj/AAAEAAAAAAARAOj/AAAEAAAAAAASAOj/AAAEAAAAAAATAOj/AAAEAAAAAAAUAOj/AAAEAAAAAAAVAOj/AAAEAAAAAAAWAOj/AAAEAAAAAAAXAOj/AAAEAAAAAAAYAOj/AAAEAAAAAAAZAOj/AAAEAAAAAAAaAOj/AAAEAAAAAAAbAOj/AAAEAAAAAAAcAOj/AAAEAAAAAAAdAOj/AAAEAAAAAAAeAOj/AAAEAAAAAAAfAOj/AAAEAAAAAAAgAOj/AAAEAAAAAAAhAOj/AAAEAAAAAAAiAOj/AAAEAAAAAAAjAOj/AAAEAAAAAAAkAOj/AAAEAAAAAAAlAOj/AAAEAAAAAAAmAOj/AAAEAAAAAAAnAOj/AAAEAAAAAAAoAOj/AAAEAAAAAAApAOj/AAAEAAAAAAAqAOj/AAAEAAAAAAArAOj/AAAEAAAAAAAsAOj/AAAEAAAAAAAtAOj/AAAEAAAAAAAuAOj/AAAEAAAAAAAuAOn/AAAEAAAAAAAuAOr/AAAEAAAAAAAuAOv/AAAEAAAAAAAuAOz/AAAEAAAAAAAuAO3/AAAEAAAAAAAuAO7/AAAEAAAAAAAuAO//AAAEAAAAAAAuAPD/AAAEAAAAAAAuAPH/AAAEAAAAAAAuAPL/AAAEAAAAAAAuAPP/AAAEAAAAAAAuAPT/AAAEAAAAAAAuAPX/AAAEAAAAAAAuAPb/AAAEAAAAAAAuAPf/AAAEAAAAAAAuAPj/AAAEAAAAAAAuAPn/AAAEAAAAAAAwAPr/AAABAAIAAAAwAPv/AAABAAIAAAA=") tile_set = ExtResource("1_e8gwx") rendering_quadrant_size = 32 @@ -240,5 +240,4 @@ position = Vector2(1472, -160) [node name="LoadingZone" parent="." unique_id=2123510357 instance=ExtResource("13_wmlmk")] position = Vector2(1496, -160) scale = Vector2(1, 3) -collision_mask = 2 -target_scene = "res://scenes/levels/test_map.tscn" +target_scene = "res://scenes/levels/act2_floor1.tscn" diff --git a/scenes/levels/act2_floor1.tscn b/scenes/levels/act2_floor1.tscn new file mode 100644 index 0000000..5ffd41e --- /dev/null +++ b/scenes/levels/act2_floor1.tscn @@ -0,0 +1,299 @@ +[gd_scene format=4 uid="uid://bp2qa7mic3kf8"] + +[ext_resource type="PackedScene" uid="uid://1hchobb5w872" path="res://scenes/components/death_zone.tscn" id="1_570to"] +[ext_resource type="Texture2D" uid="uid://dapligyg1q7vd" path="res://assets/images/sprites/World/Background/Wasteland_Sky.png" id="2_s46ia"] +[ext_resource type="Texture2D" uid="uid://bk41feg0qdi0t" path="res://assets/images/sprites/World/Background/Wasteland_Mountains_1.png" id="3_4gicu"] +[ext_resource type="TileSet" uid="uid://bf70pewkmg5hy" path="res://ressources/dungeon_tileset.tres" id="3_j5e17"] +[ext_resource type="Texture2D" uid="uid://cdgo042aie21s" path="res://assets/images/sprites/World/Background/Wasteland_Mountains_2.png" id="4_ux0xx"] +[ext_resource type="Texture2D" uid="uid://c6nak38doipjr" path="res://assets/images/sprites/World/Forest/Background/2.png" id="5_fjn0g"] +[ext_resource type="PackedScene" uid="uid://51vdlyyqiph" path="res://scenes/components/checkpoint.tscn" id="6_4gicu"] +[ext_resource type="Texture2D" uid="uid://cg3d5ub47f3o1" path="res://assets/images/sprites/World/Forest/Background/1.png" id="6_qpmxf"] +[ext_resource type="PackedScene" uid="uid://dero2u4tw7mma" path="res://scenes/components/spikes.tscn" id="7_ux0xx"] +[ext_resource type="PackedScene" uid="uid://cwq8mu0hub5qd" path="res://scenes/actors/entity.tscn" id="8_4gicu"] +[ext_resource type="PackedScene" uid="uid://cr7ibxkl174o1" path="res://scenes/actors/Creeper.tscn" id="8_fjn0g"] +[ext_resource type="PackedScene" uid="uid://mh87kxbf8qfg" path="res://scenes/actors/morph_demon.tscn" id="8_v4rdk"] +[ext_resource type="PackedScene" uid="uid://kfcguhpc7lvd" path="res://scenes/actors/player.tscn" id="9_qpmxf"] +[ext_resource type="PackedScene" uid="uid://3bhkncvwd7fa" path="res://scenes/ui/player_hud.tscn" id="10_wt17w"] +[ext_resource type="PackedScene" uid="uid://c7nx1jvktqxvv" path="res://scenes/ui/enemy_counter_hud.tscn" id="11_vuiu1"] +[ext_resource type="PackedScene" uid="uid://d4b83qphgfteg" path="res://scenes/components/locked_door.tscn" id="12_625yc"] +[ext_resource type="PackedScene" uid="uid://b1peufx15gr0v" path="res://scenes/components/loading_zone.tscn" id="13_qr373"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_wt17w"] +atlas = ExtResource("6_qpmxf") +region = Rect2(0, 0, 32, 32) + +[node name="Act2Floor1" type="Node2D" unique_id=1589944633] + +[node name="DeathZone" parent="." unique_id=1427209714 instance=ExtResource("1_570to")] +scale = Vector2(2000, 1) + +[node name="Background" type="Node2D" parent="." unique_id=1910528162] +position = Vector2(8, -144) + +[node name="Sky" type="Parallax2D" parent="Background" unique_id=1106246833] +scroll_scale = Vector2(0, 0) +scroll_offset = Vector2(0, 60) + +[node name="Sprite2D" type="Sprite2D" parent="Background/Sky" unique_id=1524975784] +position = Vector2(200.99998, 110) +scale = Vector2(1.2, 1.2) +texture = ExtResource("2_s46ia") + +[node name="MountainFarthest" type="Parallax2D" parent="Background" unique_id=987357035] +scroll_scale = Vector2(0.1, 0.1) +scroll_offset = Vector2(0, 64) +repeat_size = Vector2(512, 0) +repeat_times = 4 + +[node name="Sprite2D" type="Sprite2D" parent="Background/MountainFarthest" unique_id=1121594248] +position = Vector2(200.99998, 10) +scale = Vector2(1.8, 1.8) +texture = ExtResource("3_4gicu") + +[node name="MountainClosest" type="Parallax2D" parent="Background" unique_id=1097880732] +scroll_scale = Vector2(0.2, 0.2) +scroll_offset = Vector2(0, 55) +repeat_size = Vector2(512, 0) +repeat_times = 4 + +[node name="Sprite2D" type="Sprite2D" parent="Background/MountainClosest" unique_id=396052049] +position = Vector2(183, -13) +scale = Vector2(1.5, 1.5) +texture = ExtResource("4_ux0xx") + +[node name="TreesFarthest" type="Parallax2D" parent="Background" unique_id=1044377804] +scale = Vector2(2, 2) +scroll_scale = Vector2(0.4, 0.4) +scroll_offset = Vector2(0, -127) +repeat_size = Vector2(320, 0) +repeat_times = 10 + +[node name="Sprite2D" type="Sprite2D" parent="Background/TreesFarthest" unique_id=2095024999] +position = Vector2(291, 80) +texture = ExtResource("5_fjn0g") + +[node name="TreesClosest" type="Parallax2D" parent="Background" unique_id=1514740260] +scale = Vector2(2, 2) +scroll_scale = Vector2(0.6, 0.6) +scroll_offset = Vector2(0, -176) +repeat_size = Vector2(320, 0) +repeat_times = 10 + +[node name="Sprite2D" type="Sprite2D" parent="Background/TreesClosest" unique_id=1607403737] +position = Vector2(291, 80) +scale = Vector2(1.2, 1.2) +texture = ExtResource("6_qpmxf") + +[node name="Bottom" type="Node2D" parent="Background" unique_id=415602030] + +[node name="TreeColor" type="Parallax2D" parent="Background/Bottom" unique_id=640862882] +scale = Vector2(2, 2) +scroll_scale = Vector2(0.6, 0.6) +scroll_offset = Vector2(0, -172) +repeat_size = Vector2(32, 0) +repeat_times = 50 + +[node name="Sprite2D" type="Sprite2D" parent="Background/Bottom/TreeColor" unique_id=1549933497] +position = Vector2(291, 171.5) +scale = Vector2(1.2, 1.2) +texture = SubResource("AtlasTexture_wt17w") + +[node name="TreeColor2" type="Parallax2D" parent="Background/Bottom" unique_id=639185705] +scale = Vector2(2, 2) +scroll_scale = Vector2(0.6, 0.6) +scroll_offset = Vector2(0, -114) +repeat_size = Vector2(32, 0) +repeat_times = 50 + +[node name="Sprite2D" type="Sprite2D" parent="Background/Bottom/TreeColor2" unique_id=1386725776] +position = Vector2(291, 171.5) +texture = SubResource("AtlasTexture_wt17w") + +[node name="TreeColor3" type="Parallax2D" parent="Background/Bottom" unique_id=832637998] +scale = Vector2(2, 2) +scroll_scale = Vector2(0.6, 0.6) +scroll_offset = Vector2(0, -57) +repeat_size = Vector2(32, 0) +repeat_times = 50 + +[node name="Sprite2D" type="Sprite2D" parent="Background/Bottom/TreeColor3" unique_id=501729554] +position = Vector2(291, 171.5) +texture = SubResource("AtlasTexture_wt17w") + +[node name="TreeColor4" type="Parallax2D" parent="Background/Bottom" unique_id=1083605011] +scale = Vector2(2, 2) +scroll_scale = Vector2(0.6, 0.6) +scroll_offset = Vector2(0, 1) +repeat_size = Vector2(32, 0) +repeat_times = 50 + +[node name="Sprite2D" type="Sprite2D" parent="Background/Bottom/TreeColor4" unique_id=331341723] +position = Vector2(291, 171.5) +texture = SubResource("AtlasTexture_wt17w") + +[node name="Top" type="Node2D" parent="Background" unique_id=2034865856] +position = Vector2(0, -563) + +[node name="TreeColor" type="Parallax2D" parent="Background/Top" unique_id=985791775] +scale = Vector2(2, 2) +scroll_scale = Vector2(0.6, 0.6) +scroll_offset = Vector2(0, -172) +repeat_size = Vector2(32, 0) +repeat_times = 50 + +[node name="Sprite2D" type="Sprite2D" parent="Background/Top/TreeColor" unique_id=649263930] +position = Vector2(291, 171.5) +texture = SubResource("AtlasTexture_wt17w") + +[node name="TreeColor2" type="Parallax2D" parent="Background/Top" unique_id=1447730746] +scale = Vector2(2, 2) +scroll_scale = Vector2(0.6, 0.6) +scroll_offset = Vector2(0, -114) +repeat_size = Vector2(32, 0) +repeat_times = 50 + +[node name="Sprite2D" type="Sprite2D" parent="Background/Top/TreeColor2" unique_id=486781354] +position = Vector2(291, 171.5) +texture = SubResource("AtlasTexture_wt17w") + +[node name="TreeColor3" type="Parallax2D" parent="Background/Top" unique_id=1233244132] +scale = Vector2(2, 2) +scroll_scale = Vector2(0.6, 0.6) +scroll_offset = Vector2(0, -57) +repeat_size = Vector2(32, 0) +repeat_times = 50 + +[node name="Sprite2D" type="Sprite2D" parent="Background/Top/TreeColor3" unique_id=1962432264] +position = Vector2(291, 171.5) +texture = SubResource("AtlasTexture_wt17w") + +[node name="TreeColor4" type="Parallax2D" parent="Background/Top" unique_id=1797240158] +scale = Vector2(2, 2) +scroll_scale = Vector2(0.6, 0.6) +scroll_offset = Vector2(0, 1) +repeat_size = Vector2(32, 0) +repeat_times = 50 + +[node name="Sprite2D" type="Sprite2D" parent="Background/Top/TreeColor4" unique_id=1327266796] +position = Vector2(291, 171.5) +texture = SubResource("AtlasTexture_wt17w") + +[node name="Entity" parent="." unique_id=286688007 instance=ExtResource("8_4gicu")] +position = Vector2(1280, -1200) + +[node name="Windows" type="TileMapLayer" parent="." unique_id=1532523123] +position = Vector2(16, 0) +scale = Vector2(2, 2) +tile_map_data = PackedByteArray("AAACAPj/AAAAAAYAAAAOAPv/AAAAAAYAAAAZAPv/AAAAAAYAAAAKAPH/AAAAAAYAAAApAPX/AAAAAAYAAAAWAOr/AAAAAAYAAAADAOn/AAAAAAYAAAAcAO//AAAAAAYAAAARAO//AAAAAAYAAAAnAOr/AAAAAAYAAAAnANj/AAAAAAYAAAAhANj/AAAAAAYAAAAbANj/AAAAAAYAAAAVANj/AAAAAAYAAAAPANj/AAAAAAYAAAADANz/AAAAAAYAAAA=") +tile_set = ExtResource("3_j5e17") +rendering_quadrant_size = 32 + +[node name="Walls" type="TileMapLayer" parent="." unique_id=1704125419] +scale = Vector2(2, 2) +tile_map_data = PackedByteArray("AAAuAOj/AQAAAAYAAAABAP3/AQAAAAYAAAABAP7/AQAAAAYAAAABAP//AQAAAAYAAAACAP3/AAAHAAsAAAACAP7/AAAHAAwAAAACAP//AQAAAAYAAAADAP3/AAALAAsAAAADAP7/AAALAAwAAAADAP//AQAAAAYAAAAEAP3/AQAAAAYAAAAEAP7/AQAAAAYAAAAEAP//AQAAAAYAAAAFAP3/AQAAAAYAAAAFAP7/AQAAAAYAAAAFAP//AQAAAAYAAAAGAP3/AAAHAAoAAAAGAP7/AAAHAAsAAAAGAP//AAAHAAwAAAAHAP3/AAAJAAkAAAAHAP7/AAAKAAsAAAAHAP//AAAJAAsAAAAIAP3/AAALAAoAAAAIAP7/AAALAAsAAAAIAP//AAALAAwAAAAJAP3/AQAAAAYAAAAJAP7/AQAAAAYAAAAJAP//AQAAAAYAAAAFAPv/AQAAAAYAAAAFAPz/AQAAAAYAAAAGAPv/AQAAAAYAAAAGAPz/AQAAAAYAAAAHAPv/AAAHAAwAAAAHAPz/AQAAAAYAAAAIAPv/AAALAAwAAAAIAPz/AQAAAAYAAAAJAPv/AQAAAAYAAAAJAPz/AQAAAAYAAAAIAPr/AAALAAoAAAAJAPr/AQAAAAYAAAAKAPr/AAAHAAsAAAAKAPv/AAAHAAwAAAALAPr/AAALAAsAAAALAPv/AAALAAwAAAAMAPr/AQAAAAYAAAAMAPv/AQAAAAYAAAAJAPX/AQAAAAYAAAAJAPb/AQAAAAYAAAAJAPf/AQAAAAYAAAAJAPj/AQAAAAYAAAAJAPn/AQAAAAYAAAAKAPX/AQAAAAYAAAAKAPb/AQAAAAYAAAAKAPf/AQAAAAYAAAAKAPj/AAAHAAoAAAAKAPn/AAAHAAsAAAALAPX/AQAAAAYAAAALAPb/AQAAAAYAAAALAPf/AQAAAAYAAAALAPj/AAALAAoAAAALAPn/AAALAAsAAAAMAPX/AQAAAAYAAAAMAPb/AQAAAAYAAAAMAPf/AQAAAAYAAAAMAPj/AQAAAAYAAAAMAPn/AQAAAAYAAAANAPX/AAALAAcAAAANAPb/AAALAAgAAAANAPf/AQAAAAYAAAANAPj/AQAAAAYAAAANAPn/AQAAAAYAAAAIAPn/AQAAAAYAAAAHAPr/AAAHAAoAAAADAPz/AAALAAoAAAACAPz/AAAHAAoAAAAAAPr/AQAAAAYAAAAAAPv/AQAAAAYAAAAAAO3/AAAHAAoAAAAAAO7/AAAHAAsAAAAAAO//AAAHAAsAAAAAAPD/AAAHAAwAAAAAAPH/AQAAAAYAAAAAAPL/AQAAAAYAAAAAAPP/AQAAAAYAAAABAO3/AAALAAoAAAABAO7/AAALAAsAAAABAO//AAALAAsAAAABAPD/AAALAAwAAAABAPH/AQAAAAYAAAABAPL/AQAAAAYAAAABAPP/AQAAAAYAAAACAO3/AQAAAAYAAAACAO7/AQAAAAYAAAACAO//AQAAAAYAAAACAPD/AQAAAAYAAAACAPH/AQAAAAYAAAACAPL/AQAAAAYAAAACAPP/AQAAAAYAAAADAO3/AQAAAAYAAAADAO7/AQAAAAYAAAADAO//AAAHAAoAAAADAPD/AAAHAAsAAAADAPH/AAAHAAsAAAADAPL/AAAHAAwAAAADAPP/AQAAAAYAAAAEAO3/AQAAAAYAAAAEAO7/AQAAAAYAAAAEAO//AAALAAoAAAAEAPD/AAALAAsAAAAEAPH/AAALAAsAAAAEAPL/AAALAAwAAAAEAPP/AQAAAAYAAAAFAO3/AQAAAAYAAAAFAO7/AQAAAAYAAAAFAO//AQAAAAYAAAAFAPD/AQAAAAYAAAAFAPH/AQAAAAYAAAAFAPL/AQAAAAYAAAAFAPP/AQAAAAYAAAALAP3/AQAAAAYAAAALAP7/AAAOAAYAAAAMAP7/AAAPAAYAAAAMAP3/AQAAAAYAAAARAP3/AQAAAAYAAAASAP7/AQAAAAYAAAATAP7/AQAAAAYAAAATAP3/AAALAAgAAAASAP3/AQAAAAYAAAAUAP3/AAAOAAcAAAAUAP7/AQAAAAYAAAAVAP7/AQAAAAYAAAAVAP3/AAAPAAgAAAARAP7/AQAAAAYAAAAWAP3/AQAAAAYAAAAWAP7/AAALAAYAAAAXAP7/AAAPAAYAAAAXAP3/AQAAAAYAAAAcAPv/AQAAAAYAAAAcAPz/AQAAAAYAAAAdAPz/AAALAAgAAAAdAPv/AAALAAcAAAAeAPv/AAANAAgAAAAeAPz/AAANAAUAAAAeAPr/AAANAAYAAAAfAPr/AAAPAAcAAAAfAPv/AAAPAAcAAAAgAPr/AQAAAAYAAAAgAPv/AQAAAAYAAAAhAPv/AQAAAAYAAAAhAPr/AQAAAAYAAAAhAPn/AQAAAAYAAAAhAPj/AQAAAAYAAAAgAPj/AQAAAAYAAAAgAPn/AQAAAAYAAAAfAPn/AAAPAAYAAAAfAPj/AQAAAAYAAAAnAPj/AQAAAAYAAAAnAPf/AQAAAAYAAAAmAPf/AQAAAAYAAAAlAPf/AQAAAAYAAAAlAPj/AQAAAAYAAAAmAPj/AQAAAAYAAAAlAPn/AQAAAAYAAAAkAPn/AQAAAAYAAAAkAPj/AAAPAAgAAAAjAPj/AAALAAgAAAAjAPn/AQAAAAYAAAAkAPf/AAAPAAcAAAAjAPf/AAALAAcAAAAiAPf/AQAAAAYAAAAiAPj/AQAAAAYAAAAhAPf/AQAAAAYAAAAiAPn/AQAAAAYAAAAQAPP/AQAAAAYAAAAQAPT/AQAAAAYAAAAQAPX/AQAAAAYAAAAQAPb/AQAAAAYAAAAQAPf/AQAAAAYAAAAQAPj/AQAAAAYAAAAQAPn/AQAAAAYAAAAQAPr/AAAHAAoAAAAQAPv/AAAHAAsAAAAQAPz/AAAHAAwAAAARAPP/AQAAAAYAAAARAPT/AQAAAAYAAAARAPX/AQAAAAYAAAARAPb/AQAAAAYAAAARAPf/AQAAAAYAAAARAPj/AQAAAAYAAAARAPn/AQAAAAYAAAARAPr/AAALAAoAAAARAPv/AAALAAsAAAARAPz/AAALAAwAAAASAPP/AQAAAAYAAAASAPT/AQAAAAYAAAASAPX/AAAHAAoAAAASAPb/AAAHAAsAAAASAPf/AAAHAAsAAAASAPj/AAAHAAsAAAASAPn/AAAHAAwAAAASAPr/AQAAAAYAAAASAPv/AQAAAAYAAAASAPz/AQAAAAYAAAATAPP/AQAAAAYAAAATAPT/AQAAAAYAAAATAPX/AAAJAAwAAAATAPb/AAAJAAwAAAATAPf/AAAIAAoAAAATAPj/AAAJAAwAAAATAPn/AAAIAAoAAAATAPr/AQAAAAYAAAATAPv/AQAAAAYAAAATAPz/AAALAAYAAAAUAPP/AQAAAAYAAAAUAPT/AQAAAAYAAAAUAPX/AAALAAoAAAAUAPb/AAALAAsAAAAUAPf/AAALAAsAAAAUAPj/AAALAAsAAAAUAPn/AAALAAwAAAAUAPr/AQAAAAYAAAAUAPv/AQAAAAYAAAAUAPz/AAANAAYAAAAVAPP/AQAAAAYAAAAVAPT/AQAAAAYAAAAVAPX/AQAAAAYAAAAVAPb/AQAAAAYAAAAVAPf/AQAAAAYAAAAVAPj/AQAAAAYAAAAVAPn/AQAAAAYAAAAVAPr/AQAAAAYAAAAVAPv/AQAAAAYAAAAVAPz/AAAPAAYAAAAWAPP/AQAAAAYAAAAWAPT/AAAHAAoAAAAWAPX/AAAHAAwAAAAWAPb/AQAAAAYAAAAWAPf/AQAAAAYAAAAWAPj/AAAHAAoAAAAWAPn/AAAHAAsAAAAWAPr/AAAHAAwAAAAWAPv/AQAAAAYAAAAWAPz/AQAAAAYAAAAXAPP/AQAAAAYAAAAXAPT/AAALAAoAAAAXAPX/AAALAAwAAAAXAPb/AQAAAAYAAAAXAPf/AQAAAAYAAAAXAPj/AAALAAoAAAAXAPn/AAALAAsAAAAXAPr/AAALAAwAAAAXAPv/AQAAAAYAAAAXAPz/AQAAAAYAAAAYAPP/AQAAAAYAAAAYAPT/AQAAAAYAAAAYAPX/AQAAAAYAAAAYAPb/AQAAAAYAAAAYAPf/AQAAAAYAAAAYAPj/AQAAAAYAAAAYAPn/AQAAAAYAAAAYAPr/AQAAAAYAAAAKAPz/AQAAAAYAAAAKAP3/AQAAAAYAAAAKAP7/AAALAAYAAAAKAP//AAALAAgAAAALAPz/AQAAAAYAAAALAP//AAAOAAcAAAAMAPz/AQAAAAYAAAAMAP//AAAPAAgAAAAAAPT/AQAAAAYAAAABAPT/AQAAAAYAAAACAPT/AQAAAAYAAAADAPT/AQAAAAYAAAAEAPT/AQAAAAYAAAAFAPT/AAALAAYAAAAGAPP/AQAAAAYAAAAGAPT/AAAOAAcAAAAHAPP/AQAAAAYAAAAHAPT/AAAPAAYAAAAIAPP/AQAAAAYAAAAIAPT/AQAAAAYAAAAFAPX/AAALAAcAAAAFAPb/AAALAAcAAAAFAPf/AAALAAgAAAAFAPj/AQAAAAYAAAAFAPn/AQAAAAYAAAAGAPX/AAAMAAcAAAAGAPb/AAANAAkAAAAGAPf/AAANAAcAAAAGAPj/AQAAAAYAAAAGAPn/AQAAAAYAAAAHAPX/AAAPAAcAAAAHAPb/AAAPAAcAAAAHAPf/AAAPAAgAAAAHAPj/AQAAAAYAAAAHAPn/AQAAAAYAAAAIAPX/AQAAAAYAAAAIAPb/AQAAAAYAAAAIAPf/AQAAAAYAAAAIAPj/AQAAAAYAAAAAAPz/AQAAAAYAAAAAAP3/AQAAAAYAAAAAAP7/AQAAAAYAAAAAAP//AQAAAAYAAAABAPz/AQAAAAYAAAANAP//AQAAAAYAAAAOAP//AQAAAAYAAAAPAP//AQAAAAYAAAAQAP//AQAAAAYAAAARAP//AQAAAAYAAAASAP//AQAAAAYAAAATAP//AQAAAAYAAAAUAP//AQAAAAYAAAAVAP//AQAAAAYAAAAWAP//AAALAAgAAAAXAP//AAAPAAgAAAAYAP//AQAAAAYAAAAZAP//AQAAAAYAAAAaAP//AQAAAAYAAAAbAP//AQAAAAYAAAAZAPP/AQAAAAYAAAAZAPT/AAALAAYAAAAZAPX/AAALAAcAAAAZAPb/AAALAAgAAAAZAPf/AQAAAAYAAAAaAPP/AQAAAAYAAAAaAPT/AAAPAAYAAAAaAPX/AAAPAAcAAAAaAPb/AAAPAAgAAAAaAPf/AQAAAAYAAAAbAPP/AQAAAAYAAAAbAPT/AQAAAAYAAAAbAPX/AQAAAAYAAAAbAPb/AQAAAAYAAAAbAPf/AQAAAAYAAAAcAPP/AQAAAAYAAAAcAPT/AAAHAAoAAAAcAPX/AAAHAAsAAAAcAPb/AAAHAAsAAAAcAPf/AAAHAAwAAAAdAPP/AQAAAAYAAAAdAPT/AAAJAA0AAAAdAPX/AAAIAAoAAAAdAPb/AAAJAAsAAAAdAPf/AAAJAAsAAAAeAPP/AQAAAAYAAAAeAPT/AAALAAoAAAAeAPX/AAALAAsAAAAeAPb/AAALAAsAAAAeAPf/AAALAAwAAAAfAPP/AQAAAAYAAAAfAPT/AQAAAAYAAAAfAPX/AQAAAAYAAAAfAPb/AQAAAAYAAAAfAPf/AQAAAAYAAAAgAPP/AQAAAAYAAAAgAPT/AAAHAAoAAAAgAPX/AAAHAAwAAAAgAPb/AQAAAAYAAAAgAPf/AQAAAAYAAAAhAPP/AQAAAAYAAAAhAPT/AAALAAoAAAAhAPX/AAALAAwAAAAhAPb/AQAAAAYAAAAiAPP/AQAAAAYAAAAiAPT/AQAAAAYAAAAiAPX/AQAAAAYAAAAiAPb/AQAAAAYAAAAjAPP/AQAAAAYAAAAjAPT/AQAAAAYAAAAjAPX/AQAAAAYAAAAjAPb/AAALAAYAAAAkAPP/AAAHAAoAAAAkAPT/AAAHAAwAAAAkAPX/AQAAAAYAAAAkAPb/AAAPAAYAAAAlAPP/AAALAAoAAAAlAPT/AAALAAwAAAAlAPX/AQAAAAYAAAAlAPb/AQAAAAYAAAAmAPP/AQAAAAYAAAAmAPT/AQAAAAYAAAAmAPX/AQAAAAYAAAAmAPb/AQAAAAYAAAAbAPj/AQAAAAYAAAAbAPn/AQAAAAYAAAAbAPr/AQAAAAYAAAAcAPj/AQAAAAYAAAAcAPn/AQAAAAYAAAAcAPr/AQAAAAYAAAAdAPj/AQAAAAYAAAAdAPn/AAALAAYAAAAdAPr/AAALAAcAAAAeAPj/AQAAAAYAAAAeAPn/AAAMAAgAAAAhAPD/AAANAAUAAAAhAPH/AAANAAYAAAAhAPL/AAANAAkAAAAiAOz/AQAAAAYAAAAiAO3/AQAAAAYAAAAiAO7/AQAAAAYAAAAiAO//AQAAAAYAAAAiAPD/AAAMAAYAAAAiAPH/AAAMAAgAAAAiAPL/AAANAAYAAAAjAOz/AQAAAAYAAAAjAO3/AAAHAAoAAAAjAO7/AAAHAAsAAAAjAO//AAAHAAwAAAAjAPD/AAAPAAYAAAAjAPH/AAAPAAcAAAAjAPL/AAAPAAgAAAAkAOz/AQAAAAYAAAAkAO3/AAALAAoAAAAkAO7/AAALAAsAAAAkAO//AAALAAwAAAAkAPD/AQAAAAYAAAAkAPH/AQAAAAYAAAAkAPL/AQAAAAYAAAAYAOz/AQAAAAYAAAAYAO3/AQAAAAYAAAAYAO7/AQAAAAYAAAAYAO//AQAAAAYAAAAYAPD/AAAPAAYAAAAYAPH/AAAPAAgAAAAYAPL/AQAAAAYAAAAZAOz/AQAAAAYAAAAZAO3/AQAAAAYAAAAZAO7/AQAAAAYAAAAZAO//AQAAAAYAAAAZAPD/AQAAAAYAAAAZAPH/AQAAAAYAAAAZAPL/AQAAAAYAAAAaAPD/AQAAAAYAAAAaAPH/AQAAAAYAAAAaAPL/AQAAAAYAAAAbAPD/AQAAAAYAAAAcAPD/AQAAAAYAAAAOAPP/AQAAAAYAAAAOAPT/AAAOAAcAAAAOAPX/AAAMAAgAAAAOAPb/AAAOAAcAAAAOAPf/AQAAAAYAAAAPAPP/AQAAAAYAAAAPAPT/AAAPAAYAAAAPAPX/AAAPAAcAAAAPAPb/AAAPAAgAAAAPAPf/AQAAAAYAAAAOAOz/AQAAAAYAAAAOAO3/AQAAAAYAAAAOAO7/AQAAAAYAAAAOAO//AQAAAAYAAAAOAPD/AAAPAAYAAAAOAPH/AAAPAAgAAAAOAPL/AQAAAAYAAAAPAOz/AQAAAAYAAAAPAO3/AQAAAAYAAAAPAO7/AQAAAAYAAAAPAO//AQAAAAYAAAAPAPD/AQAAAAYAAAAPAPH/AQAAAAYAAAAPAPL/AQAAAAYAAAAQAOz/AQAAAAYAAAAQAO3/AQAAAAYAAAAQAO7/AQAAAAYAAAAQAO//AQAAAAYAAAAQAPD/AQAAAAYAAAARAO7/AQAAAAYAAAARAO//AQAAAAYAAAARAPD/AQAAAAYAAAASAO7/AQAAAAYAAAASAO//AQAAAAYAAAASAPD/AQAAAAYAAAATAO7/AQAAAAYAAAATAO//AQAAAAYAAAATAPD/AQAAAAYAAAAGAO7/AQAAAAYAAAAGAO//AQAAAAYAAAAGAPD/AAALAAYAAAAGAPH/AAALAAgAAAAGAPL/AQAAAAYAAAAHAO7/AQAAAAYAAAAHAO//AQAAAAYAAAAHAPD/AAAPAAYAAAAHAPH/AAAPAAgAAAAHAPL/AQAAAAYAAAAIAO7/AQAAAAYAAAAIAO//AQAAAAYAAAAIAPD/AQAAAAYAAAAIAPH/AQAAAAYAAAAIAPL/AQAAAAYAAAAGAOz/AQAAAAYAAAAGAO3/AQAAAAYAAAAHAOz/AAALAAcAAAAHAO3/AAALAAgAAAAIAOz/AAAMAAcAAAAIAO3/AAAMAAYAAAAJAOz/AAAOAAgAAAAJAO3/AAANAAYAAAAKAOz/AAAPAAcAAAAKAO3/AAAPAAgAAAALAOz/AQAAAAYAAAALAO3/AQAAAAYAAAAMAOz/AAALAAgAAAAMAO3/AQAAAAYAAAANAOz/AAAPAAgAAAANAO3/AQAAAAYAAAAAAOz/AQAAAAYAAAABAOz/AQAAAAYAAAANAO7/AQAAAAYAAAANAO//AQAAAAYAAAANAPD/AAALAAYAAAANAPH/AAALAAgAAAANAPL/AQAAAAYAAAANAPP/AQAAAAYAAAANAPT/AAALAAYAAAAaAOz/AQAAAAYAAAAaAO3/AQAAAAYAAAAaAO7/AQAAAAYAAAAaAO//AQAAAAYAAAAbAOz/AAAHAAoAAAAbAO3/AAAHAAsAAAAbAO7/AAAHAAsAAAAbAO//AAAHAAwAAAAcAOz/AAAJAAwAAAAcAO3/AAAIAAsAAAAcAO7/AAAJAA0AAAAcAO//AAAIAAsAAAAhAOz/AAALAAsAAAAhAO3/AAALAAwAAAAhAO7/AQAAAAYAAAAhAO//AQAAAAYAAAAZAOr/AQAAAAYAAAAZAOv/AQAAAAYAAAAaAOr/AQAAAAYAAAAaAOv/AQAAAAYAAAAbAOr/AQAAAAYAAAAbAOv/AQAAAAYAAAAcAOr/AQAAAAYAAAAcAOv/AQAAAAYAAAAdAOr/AQAAAAYAAAAdAOv/AQAAAAYAAAAdAOz/AAALAAoAAAAdAO3/AAALAAsAAAAdAO7/AAALAAsAAAAdAO//AAALAAwAAAAdAPD/AQAAAAYAAAAeAOr/AQAAAAYAAAAeAOv/AQAAAAYAAAAeAOz/AQAAAAYAAAAeAO3/AQAAAAYAAAAeAO7/AQAAAAYAAAAeAO//AQAAAAYAAAAeAPD/AQAAAAYAAAAfAOr/AQAAAAYAAAAfAOv/AAAHAAoAAAAfAOz/AAAHAAsAAAAfAO3/AAAHAAwAAAAfAO7/AQAAAAYAAAAfAO//AQAAAAYAAAAfAPD/AQAAAAYAAAAfAPH/AQAAAAYAAAAfAPL/AQAAAAYAAAAgAOr/AQAAAAYAAAAgAOv/AAAIAAoAAAAgAOz/AAAJAA0AAAAgAO3/AAAJAAoAAAAgAO7/AQAAAAYAAAAgAO//AQAAAAYAAAAgAPD/AAALAAYAAAAgAPH/AAALAAcAAAAgAPL/AAALAAgAAAAhAOr/AQAAAAYAAAAhAOv/AAALAAoAAAAiAOr/AQAAAAYAAAAiAOv/AQAAAAYAAAAUAO7/AQAAAAYAAAAUAO//AQAAAAYAAAAUAPD/AQAAAAYAAAAUAPH/AQAAAAYAAAAUAPL/AQAAAAYAAAAVAO7/AQAAAAYAAAAVAO//AQAAAAYAAAAVAPD/AQAAAAYAAAAVAPH/AQAAAAYAAAAVAPL/AQAAAAYAAAAWAO7/AQAAAAYAAAAWAO//AQAAAAYAAAAWAPD/AAALAAYAAAAWAPH/AAALAAgAAAAWAPL/AQAAAAYAAAAXAO7/AQAAAAYAAAAXAO//AQAAAAYAAAAXAPD/AAANAAUAAAAXAPH/AAANAAYAAAAXAPL/AQAAAAYAAAAUAOz/AQAAAAYAAAAUAO3/AQAAAAYAAAAcAP3/AQAAAAYAAAAcAP7/AQAAAAYAAAAcAP//AQAAAAYAAAAdAP3/AQAAAAYAAAAdAP7/AQAAAAYAAAAdAP//AQAAAAYAAAAeAP3/AQAAAAYAAAAeAP7/AQAAAAYAAAAeAP//AQAAAAYAAAAfAPz/AAAPAAgAAAAfAP3/AAAHAAoAAAAfAP7/AAAHAAwAAAAfAP//AQAAAAYAAAAgAPz/AQAAAAYAAAAgAP3/AAAIAAkAAAAgAP7/AAAJAAoAAAAgAP//AQAAAAYAAAAhAPz/AQAAAAYAAAAhAP3/AAALAAoAAAAhAP7/AAALAAwAAAAhAP//AQAAAAYAAAAiAPr/AQAAAAYAAAAiAPv/AQAAAAYAAAAiAPz/AQAAAAYAAAAiAP3/AQAAAAYAAAAiAP7/AQAAAAYAAAAiAP//AQAAAAYAAAAjAPr/AQAAAAYAAAAjAPv/AAAHAAoAAAAjAPz/AAAHAAsAAAAjAP3/AAAHAAsAAAAjAP7/AAAHAAsAAAAjAP//AAAHAAwAAAAkAPr/AQAAAAYAAAAkAPv/AAALAAoAAAAkAPz/AAALAAsAAAAkAP3/AAALAAsAAAAkAP7/AAALAAsAAAAkAP//AAALAAwAAAAlAPr/AQAAAAYAAAAlAPv/AQAAAAYAAAAlAPz/AQAAAAYAAAAlAP3/AQAAAAYAAAAlAP7/AQAAAAYAAAAlAP//AQAAAAYAAAAmAPn/AQAAAAYAAAAmAPr/AQAAAAYAAAAmAPv/AQAAAAYAAAAmAPz/AQAAAAYAAAAmAP3/AQAAAAYAAAAmAP7/AAAHAAoAAAAmAP//AAAHAAwAAAAnAPn/AQAAAAYAAAAnAPr/AAAHAAoAAAAnAPv/AAAHAAsAAAAnAPz/AAAHAAwAAAAnAP3/AQAAAAYAAAAnAP7/AAALAAoAAAAnAP//AAALAAwAAAAoAPn/AQAAAAYAAAAoAPr/AAAKAAsAAAAoAPv/AAAJAAwAAAAoAPz/AAAKAAoAAAAoAP3/AQAAAAYAAAAoAP7/AQAAAAYAAAAoAP//AQAAAAYAAAApAPn/AQAAAAYAAAApAPr/AAAJAA0AAAApAPv/AAAJAAsAAAApAPz/AAAJAA0AAAApAP3/AQAAAAYAAAApAP7/AQAAAAYAAAApAP//AQAAAAYAAAAqAPn/AQAAAAYAAAAqAPr/AAAIAAwAAAAqAPv/AAAIAAoAAAAqAPz/AAAJAAsAAAAqAP3/AQAAAAYAAAAqAP7/AAAHAAoAAAAqAP//AAAHAAwAAAArAPn/AQAAAAYAAAArAPr/AAALAAoAAAArAPv/AAALAAsAAAArAPz/AAALAAwAAAArAP3/AQAAAAYAAAArAP7/AAAJAAoAAAArAP//AAAJAAoAAAAsAPn/AQAAAAYAAAAsAPr/AQAAAAYAAAAsAPv/AQAAAAYAAAAsAPz/AQAAAAYAAAAsAP3/AQAAAAYAAAAsAP7/AAAJAAsAAAAsAP//AAAIAAwAAAAtAPn/AQAAAAYAAAAtAPr/AQAAAAYAAAAtAPv/AQAAAAYAAAAtAPz/AQAAAAYAAAAtAP3/AQAAAAYAAAAtAP7/AAALAAoAAAAtAP//AAALAAwAAAAuAPn/AQAAAAYAAAAuAPr/AQAAAAYAAAAuAPv/AQAAAAYAAAAuAPz/AQAAAAYAAAAuAP3/AQAAAAYAAAAuAP7/AQAAAAYAAAAuAP//AQAAAAYAAAAvAPn/AQAAAAYAAAAvAPr/AQAAAAYAAAAvAPv/AQAAAAYAAAAvAPz/AQAAAAYAAAAvAP3/AQAAAAYAAAAvAP7/AQAAAAYAAAAvAP//AQAAAAYAAAAsAPH/AQAAAAYAAAAsAPL/AAALAAYAAAAsAPP/AAALAAcAAAAsAPT/AAALAAgAAAAsAPX/AQAAAAYAAAAsAPb/AQAAAAYAAAAsAPf/AQAAAAYAAAAsAPj/AQAAAAYAAAAtAPH/AQAAAAYAAAAtAPL/AAAPAAYAAAAtAPP/AAAPAAcAAAAtAPT/AAAPAAgAAAAtAPX/AQAAAAYAAAAtAPb/AAALAAYAAAAtAPf/AAALAAcAAAAtAPj/AAALAAgAAAAuAPH/AQAAAAYAAAAuAPL/AQAAAAYAAAAuAPP/AQAAAAYAAAAuAPT/AQAAAAYAAAAuAPX/AQAAAAYAAAAuAPb/AAAOAAYAAAAuAPf/AAAMAAcAAAAuAPj/AAANAAUAAAAvAPH/AQAAAAYAAAAvAPL/AQAAAAYAAAAvAPP/AQAAAAYAAAAvAPT/AQAAAAYAAAAvAPX/AQAAAAYAAAAvAPb/AAAPAAYAAAAvAPf/AAAPAAcAAAAvAPj/AAAPAAgAAAAnAPH/AAANAAgAAAAnAPL/AQAAAAYAAAAnAPP/AQAAAAYAAAAnAPT/AQAAAAYAAAAnAPX/AQAAAAYAAAAnAPb/AQAAAAYAAAAlAPH/AQAAAAYAAAAlAPL/AQAAAAYAAAAmAPH/AAALAAgAAAAmAPL/AQAAAAYAAAAjAOr/AQAAAAYAAAAjAOv/AQAAAAYAAAAkAOr/AAALAAgAAAAkAOv/AQAAAAYAAAAlAOr/AAAPAAgAAAAlAOv/AQAAAAYAAAAlAOz/AQAAAAYAAAAlAO3/AQAAAAYAAAAlAO7/AQAAAAYAAAAlAO//AQAAAAYAAAAlAPD/AQAAAAYAAAAmAO//AQAAAAYAAAAmAPD/AAALAAYAAAAnAO//AQAAAAYAAAAnAPD/AAANAAkAAAAoAO//AQAAAAYAAAAoAPD/AAAPAAYAAAAoAPH/AAAPAAgAAAApAO7/AAALAAcAAAApAO//AAALAAgAAAApAPD/AQAAAAYAAAApAPH/AQAAAAYAAAAqAOr/AQAAAAYAAAAqAOv/AQAAAAYAAAAqAOz/AAAMAAgAAAAqAO3/AAAOAAcAAAAqAO7/AAAMAAgAAAAqAO//AAANAAYAAAAqAPD/AQAAAAYAAAAqAPH/AQAAAAYAAAArAOr/AQAAAAYAAAArAOv/AQAAAAYAAAArAOz/AAAPAAYAAAArAO3/AAAPAAcAAAArAO7/AAAPAAcAAAArAO//AAAPAAgAAAArAPD/AQAAAAYAAAArAPH/AQAAAAYAAAAsAOr/AQAAAAYAAAAsAOv/AQAAAAYAAAAsAOz/AQAAAAYAAAAsAO3/AQAAAAYAAAAsAO7/AQAAAAYAAAAsAO//AQAAAAYAAAAsAPD/AQAAAAYAAAAtAOr/AQAAAAYAAAAtAOv/AQAAAAYAAAAtAOz/AQAAAAYAAAAtAO3/AQAAAAYAAAAtAO7/AQAAAAYAAAAtAO//AQAAAAYAAAAtAPD/AQAAAAYAAAAuAOr/AQAAAAYAAAAuAOv/AQAAAAYAAAAuAOz/AQAAAAYAAAAuAO3/AQAAAAYAAAAuAO7/AQAAAAYAAAAuAO//AQAAAAYAAAAuAPD/AQAAAAYAAAAvAOr/AQAAAAYAAAAvAOv/AQAAAAYAAAAvAOz/AQAAAAYAAAAvAO3/AQAAAAYAAAAvAO7/AQAAAAYAAAAvAO//AQAAAAYAAAAvAPD/AQAAAAYAAAAZAOT/AQAAAAYAAAAZAOX/AAAPAAYAAAAZAOb/AAAPAAgAAAAZAOf/AQAAAAYAAAAZAOj/AQAAAAYAAAAZAOn/AQAAAAYAAAAaAOT/AQAAAAYAAAAaAOX/AQAAAAYAAAAaAOb/AQAAAAYAAAAaAOf/AQAAAAYAAAAaAOj/AQAAAAYAAAAaAOn/AQAAAAYAAAAbAOT/AQAAAAYAAAAbAOX/AQAAAAYAAAAbAOb/AQAAAAYAAAAbAOf/AAALAAYAAAAbAOj/AAALAAcAAAAbAOn/AAALAAgAAAAcAOT/AQAAAAYAAAAcAOX/AQAAAAYAAAAcAOb/AQAAAAYAAAAcAOf/AAANAAUAAAAcAOj/AAANAAgAAAAcAOn/AAAOAAcAAAAdAOT/AQAAAAYAAAAdAOX/AQAAAAYAAAAdAOb/AQAAAAYAAAAdAOf/AAANAAcAAAAdAOj/AAAMAAcAAAAdAOn/AAAPAAgAAAAeAOT/AQAAAAYAAAAeAOX/AQAAAAYAAAAeAOb/AAALAAYAAAAeAOf/AAANAAkAAAAeAOj/AAAOAAkAAAAeAOn/AQAAAAYAAAAfAOT/AQAAAAYAAAAfAOX/AQAAAAYAAAAfAOb/AAAMAAYAAAAfAOf/AAAOAAcAAAAfAOj/AQAAAAYAAAAfAOn/AQAAAAYAAAAgAOT/AAAHAAwAAAAgAOX/AQAAAAYAAAAgAOb/AAAPAAYAAAAgAOf/AAAPAAgAAAAgAOj/AQAAAAYAAAAgAOn/AQAAAAYAAAAhAOT/AAAJAAsAAAAhAOX/AQAAAAYAAAAhAOb/AQAAAAYAAAAhAOf/AQAAAAYAAAAhAOj/AQAAAAYAAAAhAOn/AQAAAAYAAAAiAOT/AAAJAAoAAAAiAOX/AQAAAAYAAAAiAOb/AQAAAAYAAAAiAOf/AQAAAAYAAAAiAOj/AQAAAAYAAAAiAOn/AQAAAAYAAAAjAOT/AAAJAAkAAAAjAOX/AQAAAAYAAAAjAOb/AQAAAAYAAAAjAOf/AQAAAAYAAAAjAOj/AQAAAAYAAAAjAOn/AQAAAAYAAAAkAOT/AAAKAAsAAAAkAOX/AQAAAAYAAAAkAOb/AAALAAYAAAAkAOf/AAALAAcAAAAkAOj/AAALAAcAAAAkAOn/AAALAAcAAAAlAOT/AAALAAwAAAAlAOX/AQAAAAYAAAAlAOb/AAAPAAYAAAAlAOf/AAAPAAcAAAAlAOj/AAAPAAcAAAAlAOn/AAAPAAcAAAAmAOT/AQAAAAYAAAAmAOX/AQAAAAYAAAAmAOb/AQAAAAYAAAAnAOT/AAAHAAwAAAAnAOX/AQAAAAYAAAAnAOb/AQAAAAYAAAAoAOT/AAAKAAoAAAAoAOX/AQAAAAYAAAAoAOb/AQAAAAYAAAApAOT/AAAJAA0AAAApAOX/AQAAAAYAAAApAOb/AQAAAAYAAAAqAOT/AAALAAwAAAAqAOX/AQAAAAYAAAAqAOb/AQAAAAYAAAAqAOf/AQAAAAYAAAAqAOj/AQAAAAYAAAAqAOn/AQAAAAYAAAArAOT/AQAAAAYAAAArAOX/AAAHAAoAAAArAOb/AAAHAAsAAAArAOf/AAAHAAwAAAArAOj/AQAAAAYAAAArAOn/AQAAAAYAAAAsAOT/AQAAAAYAAAAsAOX/AAAJAAsAAAAsAOb/AAAIAAoAAAAsAOf/AAAIAAsAAAAsAOj/AQAAAAYAAAAsAOn/AQAAAAYAAAAtAOT/AQAAAAYAAAAtAOX/AAALAAoAAAAtAOb/AAALAAsAAAAtAOf/AAALAAwAAAAtAOj/AQAAAAYAAAAtAOn/AQAAAAYAAAAuAOT/AQAAAAYAAAAuAOX/AQAAAAYAAAAuAOb/AQAAAAYAAAAuAOf/AQAAAAYAAAAuAOn/AQAAAAYAAAAvAOT/AQAAAAYAAAAvAOX/AQAAAAYAAAAvAOb/AQAAAAYAAAAvAOf/AQAAAAYAAAAvAOj/AQAAAAYAAAAvAOn/AQAAAAYAAAAOAOf/AQAAAAYAAAAOAOj/AQAAAAYAAAAOAOn/AQAAAAYAAAAOAOr/AQAAAAYAAAAOAOv/AQAAAAYAAAAPAOf/AQAAAAYAAAAPAOj/AAAHAAoAAAAPAOn/AAAHAAsAAAAPAOr/AAAHAAsAAAAPAOv/AAAHAAwAAAAQAOf/AQAAAAYAAAAQAOj/AAAJAAwAAAAQAOn/AAAKAAoAAAAQAOr/AAAKAAwAAAAQAOv/AAAJAAsAAAARAOf/AQAAAAYAAAARAOj/AAAJAA0AAAARAOn/AAAJAAwAAAARAOr/AAAIAAwAAAARAOv/AAAIAAwAAAASAOf/AQAAAAYAAAASAOj/AAALAAoAAAASAOn/AAALAAsAAAASAOr/AAALAAsAAAASAOv/AAALAAwAAAATAOf/AQAAAAYAAAATAOj/AQAAAAYAAAATAOn/AQAAAAYAAAATAOr/AQAAAAYAAAATAOv/AQAAAAYAAAAUAOf/AQAAAAYAAAAUAOj/AQAAAAYAAAAUAOn/AQAAAAYAAAAUAOr/AQAAAAYAAAAUAOv/AQAAAAYAAAAGAOb/AAANAAcAAAAGAOf/AAAOAAgAAAAGAOj/AQAAAAYAAAAGAOn/AQAAAAYAAAAGAOr/AQAAAAYAAAAGAOv/AQAAAAYAAAAHAOb/AAAPAAcAAAAHAOf/AAAPAAgAAAAHAOj/AQAAAAYAAAAHAOn/AQAAAAYAAAAHAOr/AAALAAYAAAAHAOv/AAALAAcAAAAIAOb/AQAAAAYAAAAIAOf/AQAAAAYAAAAIAOj/AQAAAAYAAAAIAOn/AQAAAAYAAAAIAOr/AAAOAAcAAAAIAOv/AAANAAYAAAAJAOb/AQAAAAYAAAAJAOf/AQAAAAYAAAAJAOj/AQAAAAYAAAAJAOn/AQAAAAYAAAAJAOr/AAAOAAYAAAAJAOv/AAAMAAcAAAAKAOb/AAALAAcAAAAKAOf/AAALAAcAAAAKAOj/AAALAAgAAAAKAOn/AQAAAAYAAAAKAOr/AAAPAAYAAAAKAOv/AAAPAAcAAAALAOb/AAANAAYAAAALAOf/AAANAAYAAAALAOj/AAAMAAcAAAALAOn/AQAAAAYAAAALAOr/AQAAAAYAAAALAOv/AQAAAAYAAAAMAOb/AAAPAAcAAAAMAOf/AAAPAAcAAAAMAOj/AAAPAAgAAAAMAOn/AQAAAAYAAAAMAOr/AAALAAYAAAAMAOv/AAALAAcAAAANAOb/AQAAAAYAAAANAOf/AQAAAAYAAAANAOj/AQAAAAYAAAANAOn/AQAAAAYAAAANAOr/AAAPAAYAAAANAOv/AAAPAAcAAAAOAOb/AQAAAAYAAAAPAOb/AQAAAAYAAAAQAOb/AQAAAAYAAAARAOb/AQAAAAYAAAASAOb/AQAAAAYAAAATAOb/AQAAAAYAAAAUAOb/AQAAAAYAAAAGAOT/AQAAAAYAAAAGAOX/AAANAAUAAAAHAOT/AQAAAAYAAAAHAOX/AAAPAAYAAAAIAOT/AQAAAAYAAAAIAOX/AQAAAAYAAAAJAOT/AQAAAAYAAAAJAOX/AQAAAAYAAAAKAOT/AQAAAAYAAAAKAOX/AAALAAYAAAALAOT/AQAAAAYAAAALAOX/AAANAAUAAAAMAOT/AQAAAAYAAAAMAOX/AAAPAAYAAAANAOT/AQAAAAYAAAANAOX/AQAAAAYAAAAOAOT/AQAAAAYAAAAOAOX/AQAAAAYAAAAPAOT/AQAAAAYAAAAPAOX/AQAAAAYAAAAQAOT/AQAAAAYAAAAQAOX/AQAAAAYAAAARAOT/AAALAAgAAAARAOX/AQAAAAYAAAASAOT/AAAMAAgAAAASAOX/AQAAAAYAAAATAOT/AAAPAAgAAAATAOX/AQAAAAYAAAAUAOT/AQAAAAYAAAAUAOX/AQAAAAYAAAAVAOT/AQAAAAYAAAAVAOX/AQAAAAYAAAAVAOb/AQAAAAYAAAAWAOT/AQAAAAYAAAAWAOX/AAALAAYAAAAWAOb/AAALAAgAAAAXAOT/AQAAAAYAAAAXAOX/AAANAAgAAAAXAOb/AAAOAAcAAAAYAOT/AQAAAAYAAAAYAOX/AAAMAAcAAAAYAOb/AAANAAgAAAAAAOT/AQAAAAYAAAAAAOX/AQAAAAYAAAABAOT/AQAAAAYAAAABAOX/AQAAAAYAAAACAOT/AQAAAAYAAAACAOX/AQAAAAYAAAADAOT/AQAAAAYAAAADAOX/AQAAAAYAAAAEAOT/AQAAAAYAAAAEAOX/AQAAAAYAAAAFAOT/AQAAAAYAAAAFAOX/AAALAAYAAAAAAOb/AQAAAAYAAAAAAOf/AQAAAAYAAAAAAOj/AQAAAAYAAAAAAOn/AQAAAAYAAAAAAOr/AQAAAAYAAAAAAOv/AQAAAAYAAAABAOb/AQAAAAYAAAABAOf/AQAAAAYAAAABAOj/AQAAAAYAAAABAOn/AQAAAAYAAAABAOr/AQAAAAYAAAABAOv/AQAAAAYAAAAFAOf/AAALAAgAAAAFAOb/AAALAAcAAAAmAO7/AQAAAAYAAAAnAO7/AQAAAAYAAAAoAO7/AQAAAAYAAAAGANz/AQAAAAYAAAAGAN3/AQAAAAYAAAAGAN7/AAALAAYAAAAGAN//AAALAAcAAAAGAOD/AAALAAcAAAAGAOH/AAALAAgAAAAGAOL/AQAAAAYAAAAGAOP/AQAAAAYAAAAHANz/AQAAAAYAAAAHAN3/AQAAAAYAAAAHAN7/AAANAAkAAAAHAN//AAAOAAgAAAAHAOD/AAAMAAgAAAAHAOH/AAAOAAYAAAAHAOL/AQAAAAYAAAAHAOP/AQAAAAYAAAAIANz/AQAAAAYAAAAIAN3/AQAAAAYAAAAIAN7/AAAMAAgAAAAIAN//AAAOAAYAAAAIAOD/AAANAAkAAAAIAOH/AAAOAAcAAAAIAOL/AQAAAAYAAAAIAOP/AQAAAAYAAAAJANz/AAALAAgAAAAJAN3/AQAAAAYAAAAJAN7/AAAMAAgAAAAJAN//AAAOAAgAAAAJAOD/AAANAAcAAAAJAOH/AAAMAAgAAAAJAOL/AQAAAAYAAAAJAOP/AQAAAAYAAAAKANz/AAAPAAgAAAAKAN3/AQAAAAYAAAAKAN7/AAAPAAYAAAAKAN//AAAPAAcAAAAKAOD/AAAPAAcAAAAKAOH/AAAPAAgAAAAKAOL/AQAAAAYAAAAKAOP/AQAAAAYAAAALANz/AQAAAAYAAAALAN3/AQAAAAYAAAALAN7/AQAAAAYAAAALAN//AQAAAAYAAAALAOD/AQAAAAYAAAALAOH/AQAAAAYAAAALAOL/AQAAAAYAAAALAOP/AQAAAAYAAAAMANz/AAALAAYAAAAMAN3/AAALAAcAAAAMAN7/AAALAAgAAAAMAN//AQAAAAYAAAAMAOD/AQAAAAYAAAAMAOH/AQAAAAYAAAAMAOL/AQAAAAYAAAAMAOP/AQAAAAYAAAANANz/AAAPAAYAAAANAN3/AAAPAAcAAAANAN7/AAAPAAgAAAANAN//AQAAAAYAAAANAOD/AQAAAAYAAAANAOH/AQAAAAYAAAANAOL/AQAAAAYAAAANAOP/AQAAAAYAAAAOANz/AQAAAAYAAAAOAN3/AQAAAAYAAAAOAN7/AAAHAAoAAAAOAN//AAAHAAsAAAAOAOD/AAAHAAwAAAAOAOH/AQAAAAYAAAAOAOL/AQAAAAYAAAAOAOP/AQAAAAYAAAAPANz/AQAAAAYAAAAPAN3/AQAAAAYAAAAPAN7/AAAJAAsAAAAPAN//AAAIAAsAAAAPAOD/AAAJAAoAAAAPAOH/AQAAAAYAAAAPAOL/AQAAAAYAAAAPAOP/AQAAAAYAAAAQANz/AQAAAAYAAAAQAN3/AQAAAAYAAAAQAN7/AAALAAoAAAAQAN//AAALAAsAAAAQAOD/AAALAAwAAAAQAOH/AQAAAAYAAAAQAOL/AQAAAAYAAAAQAOP/AQAAAAYAAAARANz/AAALAAYAAAARAN3/AAALAAgAAAARAN7/AQAAAAYAAAARAN//AQAAAAYAAAARAOD/AQAAAAYAAAARAOH/AQAAAAYAAAARAOL/AAALAAYAAAARAOP/AAALAAcAAAASANz/AAAOAAcAAAASAN3/AAANAAUAAAASAN7/AQAAAAYAAAASAN//AQAAAAYAAAASAOD/AQAAAAYAAAASAOH/AQAAAAYAAAASAOL/AAAMAAcAAAASAOP/AAAOAAcAAAATANz/AAAMAAcAAAATAN3/AAANAAcAAAATAN7/AQAAAAYAAAATAN//AQAAAAYAAAATAOD/AQAAAAYAAAATAOH/AQAAAAYAAAATAOL/AAAPAAYAAAATAOP/AAAOAAcAAAAUANz/AAAPAAYAAAAUAN3/AAAPAAgAAAAUAN7/AQAAAAYAAAAUAN//AAAHAAoAAAAUAOD/AAAHAAsAAAAUAOH/AAAHAAsAAAAUAOL/AAAHAAwAAAAUAOP/AAANAAkAAAAVANz/AQAAAAYAAAAVAN3/AQAAAAYAAAAVAN7/AQAAAAYAAAAVAN//AAALAAoAAAAVAOD/AAALAAsAAAAVAOH/AAALAAsAAAAVAOL/AAALAAwAAAAVAOP/AAAMAAcAAAAWANz/AQAAAAYAAAAWAN3/AQAAAAYAAAAWAN7/AQAAAAYAAAAWAN//AQAAAAYAAAAWAOD/AQAAAAYAAAAWAOH/AQAAAAYAAAAWAOL/AQAAAAYAAAAWAOP/AAAPAAgAAAAXANz/AQAAAAYAAAAXAN3/AAAHAAoAAAAXAN7/AAAHAAsAAAAXAN//AAAHAAwAAAAXAOD/AQAAAAYAAAAXAOH/AQAAAAYAAAAXAOL/AQAAAAYAAAAXAOP/AQAAAAYAAAAYANz/AQAAAAYAAAAYAN3/AAAJAAwAAAAYAN7/AAAJAAwAAAAYAN//AAAKAAsAAAAYAOD/AQAAAAYAAAAYAOH/AQAAAAYAAAAYAOL/AQAAAAYAAAAYAOP/AQAAAAYAAAAZANz/AQAAAAYAAAAZAN3/AAAJAAwAAAAZAN7/AAAIAAsAAAAZAN//AAAJAAwAAAAZAOD/AQAAAAYAAAAZAOH/AAAHAAoAAAAZAOL/AAAHAAwAAAAZAOP/AQAAAAYAAAAaANz/AQAAAAYAAAAaAN3/AAALAAoAAAAaAN7/AAALAAsAAAAaAN//AAALAAwAAAAaAOD/AQAAAAYAAAAaAOH/AAAJAAwAAAAaAOL/AAAIAAwAAAAaAOP/AQAAAAYAAAAbANz/AQAAAAYAAAAbAN3/AQAAAAYAAAAbAN7/AQAAAAYAAAAbAN//AQAAAAYAAAAbAOD/AQAAAAYAAAAbAOH/AAAJAAoAAAAbAOL/AAAKAAwAAAAbAOP/AQAAAAYAAAAcANz/AQAAAAYAAAAcAN3/AQAAAAYAAAAcAN7/AQAAAAYAAAAcAN//AQAAAAYAAAAcAOD/AQAAAAYAAAAcAOH/AAALAAoAAAAcAOL/AAALAAwAAAAcAOP/AQAAAAYAAAAdANz/AQAAAAYAAAAdAN3/AQAAAAYAAAAdAN7/AQAAAAYAAAAdAN//AQAAAAYAAAAdAOD/AQAAAAYAAAAdAOH/AQAAAAYAAAAdAOL/AQAAAAYAAAAdAOP/AQAAAAYAAAAeANz/AAALAAcAAAAeAN3/AAALAAgAAAAeAN7/AQAAAAYAAAAeAN//AAAHAAoAAAAeAOD/AAAHAAwAAAAeAOH/AQAAAAYAAAAeAOL/AQAAAAYAAAAeAOP/AQAAAAYAAAAfANz/AAAPAAcAAAAfAN3/AAAPAAgAAAAfAN7/AQAAAAYAAAAfAN//AAALAAoAAAAfAOD/AAALAAwAAAAfAOH/AQAAAAYAAAAfAOL/AQAAAAYAAAAfAOP/AQAAAAYAAAAgANz/AQAAAAYAAAAgAN3/AQAAAAYAAAAgAN7/AQAAAAYAAAAgAN//AQAAAAYAAAAgAOD/AQAAAAYAAAAgAOH/AAAHAAoAAAAgAOL/AAAHAAsAAAAgAOP/AAAHAAsAAAAhANz/AQAAAAYAAAAhAN3/AAAHAAoAAAAhAN7/AAAHAAsAAAAhAN//AAAHAAwAAAAhAOD/AQAAAAYAAAAhAOH/AAAJAAkAAAAhAOL/AAAJAAwAAAAhAOP/AAAKAAsAAAAiANz/AQAAAAYAAAAiAN3/AAAJAAoAAAAiAN7/AAAKAAwAAAAiAN//AAAKAAsAAAAiAOD/AQAAAAYAAAAiAOH/AAAJAAsAAAAiAOL/AAAJAAkAAAAiAOP/AAAKAAoAAAAjANz/AQAAAAYAAAAjAN3/AAAJAA0AAAAjAN7/AAAKAAoAAAAjAN//AAAKAAoAAAAjAOD/AQAAAAYAAAAjAOH/AAAJAA0AAAAjAOL/AAAJAAwAAAAjAOP/AAAKAAwAAAAkANz/AQAAAAYAAAAkAN3/AAALAAoAAAAkAN7/AAALAAsAAAAkAN//AAALAAwAAAAkAOD/AQAAAAYAAAAkAOH/AAAKAAsAAAAkAOL/AAAJAA0AAAAkAOP/AAAJAAsAAAAlANz/AQAAAAYAAAAlAN3/AQAAAAYAAAAlAN7/AQAAAAYAAAAlAN//AQAAAAYAAAAlAOD/AQAAAAYAAAAlAOH/AAALAAoAAAAlAOL/AAALAAsAAAAlAOP/AAALAAsAAAAmANz/AAALAAYAAAAmAN3/AAALAAgAAAAmAN7/AQAAAAYAAAAmAN//AQAAAAYAAAAmAOD/AQAAAAYAAAAmAOH/AQAAAAYAAAAmAOL/AQAAAAYAAAAmAOP/AQAAAAYAAAAnANz/AAAMAAgAAAAnAN3/AAAMAAgAAAAnAN7/AQAAAAYAAAAnAN//AQAAAAYAAAAnAOD/AQAAAAYAAAAnAOH/AQAAAAYAAAAnAOL/AAAHAAoAAAAnAOP/AAAHAAsAAAAoANz/AAAPAAYAAAAoAN3/AAAPAAgAAAAoAN7/AQAAAAYAAAAoAN//AQAAAAYAAAAoAOD/AQAAAAYAAAAoAOH/AQAAAAYAAAAoAOL/AAAKAAoAAAAoAOP/AAAKAAoAAAApANz/AQAAAAYAAAApAN3/AQAAAAYAAAApAN7/AAAHAAoAAAApAN//AAAHAAsAAAApAOD/AAAHAAwAAAApAOH/AQAAAAYAAAApAOL/AAAJAAsAAAApAOP/AAAKAAoAAAAqANz/AQAAAAYAAAAqAN3/AQAAAAYAAAAqAN7/AAAIAAsAAAAqAN//AAAJAAwAAAAqAOD/AAAJAA0AAAAqAOH/AQAAAAYAAAAqAOL/AAALAAoAAAAqAOP/AAALAAsAAAArANz/AQAAAAYAAAArAN3/AQAAAAYAAAArAN7/AAALAAoAAAArAN//AAALAAsAAAArAOD/AAALAAwAAAArAOH/AQAAAAYAAAArAOL/AQAAAAYAAAArAOP/AQAAAAYAAAAsANz/AQAAAAYAAAAsAN3/AQAAAAYAAAAsAN7/AQAAAAYAAAAsAN//AQAAAAYAAAAsAOD/AQAAAAYAAAAsAOH/AQAAAAYAAAAsAOL/AQAAAAYAAAAsAOP/AQAAAAYAAAAtANz/AQAAAAYAAAAtAN3/AQAAAAYAAAAtAN7/AQAAAAYAAAAtAN//AQAAAAYAAAAtAOD/AQAAAAYAAAAtAOH/AQAAAAYAAAAtAOL/AQAAAAYAAAAtAOP/AQAAAAYAAAAuANz/AQAAAAYAAAAuAN3/AQAAAAYAAAAuAN7/AQAAAAYAAAAuAN//AQAAAAYAAAAuAOD/AQAAAAYAAAAuAOH/AQAAAAYAAAAuAOL/AQAAAAYAAAAuAOP/AQAAAAYAAAAqANX/AQAAAAYAAAAqANb/AQAAAAYAAAAqANf/AQAAAAYAAAAqANj/AAALAAYAAAAqANn/AAALAAcAAAAqANr/AAALAAcAAAAqANv/AAALAAgAAAArANX/AQAAAAYAAAArANb/AQAAAAYAAAArANf/AQAAAAYAAAArANj/AAAPAAYAAAArANn/AAAPAAcAAAArANr/AAAPAAcAAAArANv/AAAPAAgAAAAsANX/AQAAAAYAAAAsANb/AQAAAAYAAAAsANf/AQAAAAYAAAAsANj/AQAAAAYAAAAsANn/AQAAAAYAAAAsANr/AQAAAAYAAAAsANv/AQAAAAYAAAAtANX/AQAAAAYAAAAtANb/AQAAAAYAAAAtANf/AQAAAAYAAAAtANj/AQAAAAYAAAAtANn/AQAAAAYAAAAtANr/AQAAAAYAAAAtANv/AQAAAAYAAAAuANX/AQAAAAYAAAAuANb/AQAAAAYAAAAuANf/AQAAAAYAAAAuANj/AQAAAAYAAAAuANn/AQAAAAYAAAAuANr/AQAAAAYAAAAuANv/AQAAAAYAAAAkANX/AQAAAAYAAAAkANb/AQAAAAYAAAAkANf/AAAPAAYAAAAkANj/AAAPAAcAAAAkANn/AAAPAAcAAAAkANr/AAAPAAgAAAAkANv/AQAAAAYAAAAlANX/AQAAAAYAAAAlANb/AQAAAAYAAAAlANf/AQAAAAYAAAAlANj/AQAAAAYAAAAlANn/AQAAAAYAAAAlANr/AQAAAAYAAAAlANv/AQAAAAYAAAAeANX/AQAAAAYAAAAeANb/AAALAAYAAAAeANf/AAALAAcAAAAeANj/AAALAAgAAAAeANn/AQAAAAYAAAAeANr/AQAAAAYAAAAeANv/AAALAAYAAAAfANX/AQAAAAYAAAAfANb/AAAPAAYAAAAfANf/AAAPAAcAAAAfANj/AAAPAAgAAAAfANn/AQAAAAYAAAAfANr/AQAAAAYAAAAfANv/AAAPAAYAAAAYANX/AAAMAAgAAAAYANb/AAAMAAcAAAAYANf/AQAAAAYAAAAYANj/AQAAAAYAAAAYANn/AAALAAYAAAAYANr/AAALAAcAAAAYANv/AAALAAgAAAAZANX/AAANAAUAAAAZANb/AAAOAAYAAAAZANf/AQAAAAYAAAAZANj/AQAAAAYAAAAZANn/AAAPAAYAAAAZANr/AAAPAAcAAAAZANv/AAAPAAgAAAASANX/AAAOAAgAAAASANb/AAAMAAYAAAASANf/AQAAAAYAAAASANj/AQAAAAYAAAASANn/AQAAAAYAAAASANr/AQAAAAYAAAASANv/AQAAAAYAAAATANX/AAANAAkAAAATANb/AAANAAUAAAATANf/AQAAAAYAAAATANj/AQAAAAYAAAATANn/AQAAAAYAAAATANr/AQAAAAYAAAATANv/AQAAAAYAAAAGANX/AAAOAAYAAAAGANb/AAANAAcAAAAGANf/AAAMAAgAAAAGANj/AAANAAkAAAAGANn/AAANAAkAAAAGANr/AAAMAAYAAAAGANv/AQAAAAYAAAAHANX/AAAPAAYAAAAHANb/AAAPAAcAAAAHANf/AAAPAAcAAAAHANj/AAAPAAcAAAAHANn/AAAPAAcAAAAHANr/AAAPAAgAAAAHANv/AQAAAAYAAAAIANX/AQAAAAYAAAAIANb/AQAAAAYAAAAIANf/AQAAAAYAAAAIANj/AQAAAAYAAAAIANn/AQAAAAYAAAAIANr/AQAAAAYAAAAIANv/AQAAAAYAAAAJANX/AQAAAAYAAAAJANb/AQAAAAYAAAAJANf/AQAAAAYAAAAJANj/AQAAAAYAAAAJANn/AQAAAAYAAAAJANr/AAALAAYAAAAJANv/AAALAAcAAAAKANX/AAALAAcAAAAKANb/AAALAAcAAAAKANf/AAALAAgAAAAKANj/AQAAAAYAAAAKANn/AQAAAAYAAAAKANr/AAAPAAYAAAAKANv/AAAPAAcAAAALANX/AAANAAkAAAALANb/AAANAAkAAAALANf/AAAMAAYAAAALANj/AQAAAAYAAAALANn/AQAAAAYAAAALANr/AQAAAAYAAAALANv/AQAAAAYAAAAMANX/AAAPAAcAAAAMANb/AAAPAAcAAAAMANf/AAAPAAgAAAAMANj/AQAAAAYAAAAMANn/AQAAAAYAAAAMANr/AQAAAAYAAAAMANv/AQAAAAYAAAANANX/AQAAAAYAAAANANb/AQAAAAYAAAANANf/AQAAAAYAAAANANj/AQAAAAYAAAANANn/AQAAAAYAAAANANr/AQAAAAYAAAANANv/AQAAAAYAAAABANX/AQAAAAYAAAABANb/AQAAAAYAAAABANf/AQAAAAYAAAABANj/AQAAAAYAAAACANX/AQAAAAYAAAACANb/AQAAAAYAAAACANf/AQAAAAYAAAACANj/AQAAAAYAAAADANX/AQAAAAYAAAADANb/AQAAAAYAAAADANf/AQAAAAYAAAADANj/AQAAAAYAAAAEANX/AQAAAAYAAAAEANb/AQAAAAYAAAAEANf/AQAAAAYAAAAEANj/AQAAAAYAAAAFANX/AAALAAYAAAAFANb/AAALAAcAAAAFANf/AAALAAcAAAAFANj/AAALAAcAAAABANn/AQAAAAYAAAABANr/AQAAAAYAAAABANv/AQAAAAYAAAABANz/AQAAAAYAAAABAN3/AQAAAAYAAAABAN7/AQAAAAYAAAABAN//AQAAAAYAAAABAOD/AAAOAAYAAAABAOH/AAANAAYAAAABAOL/AAANAAgAAAABAOP/AAAOAAgAAAACAOD/AAAPAAYAAAACAOH/AAAPAAcAAAACAOL/AAAPAAcAAAACAOP/AAAPAAgAAAADAOD/AQAAAAYAAAADAOH/AQAAAAYAAAADAOL/AQAAAAYAAAADAOP/AQAAAAYAAAAEAOD/AQAAAAYAAAAEAOH/AQAAAAYAAAAEAOL/AQAAAAYAAAAEAOP/AQAAAAYAAAAFAOD/AQAAAAYAAAAFAOH/AQAAAAYAAAAFAOL/AQAAAAYAAAAFAOP/AQAAAAYAAAABANT/AQAAAAYAAAACANT/AQAAAAYAAAADANT/AQAAAAYAAAAEANT/AQAAAAYAAAAFANT/AQAAAAYAAAAGANT/AQAAAAYAAAAHANT/AQAAAAYAAAAIANT/AQAAAAYAAAAJANT/AQAAAAYAAAAKANT/AAALAAcAAAALANT/AAAOAAgAAAAMANT/AAAPAAcAAAANANT/AQAAAAYAAAAOANT/AQAAAAYAAAAPANT/AQAAAAYAAAAQANT/AQAAAAYAAAARANT/AAALAAYAAAASANT/AAAMAAgAAAATANT/AAAMAAcAAAAUANT/AAAPAAYAAAAVANT/AQAAAAYAAAAWANT/AQAAAAYAAAAXANT/AQAAAAYAAAAYANT/AQAAAAYAAAAZANT/AQAAAAYAAAAaANT/AQAAAAYAAAAbANT/AQAAAAYAAAAcANT/AQAAAAYAAAAdANT/AQAAAAYAAAAeANT/AQAAAAYAAAAfANT/AQAAAAYAAAAgANT/AQAAAAYAAAAhANT/AQAAAAYAAAAiANT/AQAAAAYAAAAjANT/AQAAAAYAAAAkANT/AQAAAAYAAAAlANT/AQAAAAYAAAAmANT/AQAAAAYAAAAnANT/AQAAAAYAAAAoANT/AQAAAAYAAAApANT/AQAAAAYAAAAqANT/AQAAAAYAAAArANT/AQAAAAYAAAAsANT/AQAAAAYAAAAtANT/AQAAAAYAAAAuANT/AQAAAAYAAAAFANr/AAALAAgAAAAFANn/AAALAAcAAAAMANP/AAAPAAYAAAALANP/AAANAAgAAAAKANP/AAALAAYAAAAAAOP/AAALAAgAAAAAAOL/AAALAAcAAAAAAOH/AAALAAcAAAAAAOD/AAALAAYAAAAUANb/AAAPAAgAAAAUANX/AAAPAAcAAAARANb/AAALAAgAAAARANX/AAALAAcAAAAaANb/AAAPAAgAAAAaANX/AAAPAAYAAAAXANb/AAALAAgAAAAXANX/AAALAAYAAAA=") +tile_set = ExtResource("3_j5e17") +rendering_quadrant_size = 32 + +[node name="Dungeon" type="TileMapLayer" parent="." unique_id=695198645] +scale = Vector2(2, 2) +tile_map_data = PackedByteArray("AAAAAOn/AAAEAAAAAAAAAOr/AAAEAAAAAAAAAOv/AAAEAAAAAAAAAOz/AAAEAAAAAAAAAO3/AAAEAAEAAAAAAPP/AAAEAAMAAAAAAPT/AAAFAAIAAAAAAPX/AAAFAAEAAAAAAPb/AAAFAAEAAAAAAPf/AAAFAAEAAAAAAPj/AAAFAAEAAAAAAPn/AAAFAAEAAAAAAPz/AAAFAAIAAAAAAP3/AAAFAAIAAAAAAP7/AAAFAAIAAAAAAP//AAAFAAIAAAD///r/AAABAAEAAAD///v/AAABAAEAAAABAPz/AAADAAAAAAACAPz/AAADAAAAAAADAPz/AAAGAAAAAAAYAP//AAADAAAAAAAXAP//AAAHAAAAAAAWAP//AAADAAAAAAAVAP//AAAHAAAAAAAUAP//AAADAAAAAAATAP//AAAGAAAAAAASAP//AAADAAAAAAARAP//AAAHAAAAAAAQAP//AAAFAAwAAAANAP//AAAGAAAAAAAMAP//AAAFAAwAAAALAP//AAAHAAAAAAAKAP//AAAEAAEAAAAKAP3/AAAFAAIAAAAKAP7/AAAFAAIAAAAHAPr/AAACAAEAAAAJAPH/AAAEAAwAAAAJAPX/AAACAAAAAAAJAPf/AAABAAIAAAAJAPj/AAACAAEAAAAKAPH/AAAFAAwAAAAKAPX/AAADAAAAAAALAPH/AAAGAAwAAAALAPX/AAADAAAAAAANAPf/AAAFAAIAAAANAPj/AAAEAAQAAAAQAPX/AAABAAIAAAAQAPb/AAABAAIAAAAQAPf/AAABAAIAAAAQAPj/AAABAAIAAAAQAPn/AAABAAIAAAAQAPr/AAABAAIAAAAYAPX/AAAFAAIAAAAYAPb/AAAFAAIAAAAYAPf/AAAGAAAAAAAYAPj/AAAFAAMAAAAEAPb/AAAEAAwAAAAEAPr/AAABAAEAAAAFAPb/AAAFAAwAAAAFAPr/AAAHAAAAAAAGAPb/AAAGAAwAAAAGAPr/AAADAAAAAAAHAPj/AAACAAAAAAAHAPn/AAABAAIAAAAIAPj/AAADAAAAAAAJAPb/AAABAAIAAAAMAPX/AAADAAAAAAANAPX/AAAGAAAAAAANAPb/AAAFAAIAAAAQAPP/AAACAAAAAAAQAPT/AAABAAIAAAARAPP/AAADAAAAAAASAPP/AAADAAAAAAATAPP/AAAHAAAAAAAUAPP/AAADAAAAAAAVAPP/AAAHAAAAAAAWAPP/AAAFAAwAAAAXAPP/AAACAAAAAAAYAPP/AAAEAAAAAAAYAPT/AAAFAAIAAAAKAPz/AAAEAAMAAAALAPz/AAADAAQAAAAMAPz/AAADAAQAAAANAPv/AAAFAAIAAAANAPr/AAAFAAIAAAANAPn/AAAFAAIAAAAEAPv/AAACAAQAAAAEAPz/AAACAAEAAAANAPz/AAAEAAQAAAAQAPz/AAACAAQAAAARAPv/AAACAAMAAAARAPz/AAAIAAAAAAASAPz/AAAIAAYAAAATAPz/AAAJAAYAAAAUAPz/AAAKAAYAAAAVAPz/AAAGAAAAAAAWAPz/AAAJAAYAAAAXAPv/AAAEAAMAAAAXAPz/AAADAAQAAAAYAPv/AAAFAAMAAAAYAPz/AAAEAAQAAAAQAPv/AAABAAIAAAAYAPn/AAAFAAIAAAAYAPr/AAAEAAQAAAAPAP//AAADAAAAAAAOAP//AAAHAAAAAAAFAPL/AAAFAAIAAAAFAPH/AAAFAAMAAAAFAPD/AAAFAAIAAAAFAO//AAAFAAIAAAAFAO7/AAAFAAIAAAAFAO3/AAAFAAEAAAAEAO3/AAADAAAAAAADAO3/AAADAAAAAAACAO3/AAADAAAAAAABAO3/AAADAAAAAAAFAPP/AAAFAAMAAAAEAPP/AAAIAAYAAAADAPP/AAAKAAYAAAACAPP/AAAHAAYAAAABAPP/AAAJAAYAAAAEAPL/AAAEAAMAAAAJAO//AAAFAAwAAAAKAO//AAAGAAwAAAAIAO//AAAEAAwAAAAJAPP/AAAFAAwAAAAKAPP/AAAGAAwAAAAIAPP/AAAEAAwAAAAbAPP/AAACAAAAAAAbAPb/AAABAAIAAAAcAP3/AAACAAAAAAAfAPz/AAACAAAAAAAiAPr/AAACAAAAAAAmAPn/AAACAAAAAAArAPf/AAAEAAwAAAAsAPf/AAAGAAwAAAArAPX/AAAEAAwAAAAsAPX/AAAGAAwAAAArAPP/AAAEAAwAAAAsAPP/AAAGAAwAAAAlAPP/AAAHAAAAAAAkAPP/AAADAAAAAAAjAPP/AAADAAAAAAAiAPP/AAAGAAAAAAAgAPP/AAAGAAAAAAAfAPP/AAAGAAAAAAAeAPP/AAADAAAAAAAdAPP/AAADAAAAAAAcAPP/AAADAAAAAAAbAP//AAADAAAAAAAaAP//AAAHAAAAAAAZAP//AAAHAAAAAAAeAP3/AAAGAAAAAAAdAP3/AAADAAAAAAAhAPz/AAAEAAAAAAAgAPz/AAAHAAAAAAAlAPr/AAADAAAAAAAkAPr/AAAGAAAAAAAjAPr/AAAHAAAAAAAsAPn/AAAHAAAAAAArAPn/AAAGAAAAAAAqAPn/AAAGAAAAAAApAPn/AAADAAAAAAAoAPn/AAAHAAAAAAAnAPn/AAAHAAAAAAAcAP//AAACAAEAAAAcAP7/AAABAAIAAAAiAPv/AAABAAIAAAAbAPr/AAABAAIAAAAbAPn/AAABAAIAAAAbAPj/AAAGAAAAAAAbAPf/AAABAAIAAAAbAPX/AAABAAIAAAAbAPT/AAABAAIAAAAoAPD/AAAFAAwAAAApAPD/AAAGAAwAAAArAPH/AAAEAAwAAAAsAPH/AAAGAAwAAAAgAPf/AAAFAAMAAAAeAPn/AAAFAAMAAAAdAPr/AAAFAAMAAAAdAPn/AAAEAAMAAAAcAPr/AAADAAQAAAAlAPb/AAADAAQAAAAkAPb/AAAGAAAAAAAjAPb/AAADAAQAAAAiAPb/AAADAAQAAAAhAPb/AAADAAQAAAAfAPf/AAADAAQAAAAgAPb/AAAEAAMAAAAeAPf/AAAEAAMAAAAeAPj/AAAFAAIAAAAfAP3/AAACAAEAAAAiAPz/AAACAAEAAAAmAPr/AAACAAEAAAAPAPD/AAADAAQAAAAQAPD/AAADAAQAAAARAPD/AAADAAQAAAASAPD/AAADAAQAAAATAPD/AAADAAQAAAAUAPD/AAADAAQAAAAVAPD/AAADAAQAAAAWAPD/AAADAAQAAAAXAPD/AAADAAQAAAAYAPD/AAADAAQAAAAZAPD/AAADAAQAAAAaAPD/AAADAAQAAAAbAPD/AAADAAQAAAAcAPD/AAADAAQAAAAdAPD/AAADAAQAAAAeAPD/AAADAAQAAAAfAPD/AAAEAAQAAAAiAPD/AAACAAQAAAAjAPD/AAADAAQAAAAkAPD/AAADAAQAAAAlAPD/AAADAAQAAAAmAPD/AAADAAQAAAAnAPD/AAAEAAQAAAAnAO7/AAAEAAAAAAAnAO//AAAFAAIAAAAOAPD/AAABAAMAAAAOAOr/AAABAAIAAAAOAOv/AAABAAIAAAAOAOz/AAABAAIAAAAOAO3/AAABAAIAAAAOAO7/AAABAAIAAAAOAO//AAABAAIAAAAOAOj/AAABAAIAAAAOAOn/AAABAAIAAAAOAOf/AAACAAAAAAAaAOj/AAAEAAAAAAAUAOf/AAAEAAAAAAAWAOf/AAAEAAwAAAAXAOf/AAAGAAwAAAAWAOn/AAAEAAwAAAAXAOn/AAAGAAwAAAAWAOv/AAAEAAwAAAAXAOv/AAAGAAwAAAAmAO7/AAADAAAAAAAlAO7/AAAEAAEAAAAeAOr/AAADAAAAAAAdAOr/AAADAAAAAAAcAOr/AAADAAAAAAAbAOr/AAADAAAAAAATAOf/AAADAAAAAAASAOf/AAADAAAAAAARAOf/AAADAAAAAAAQAOf/AAADAAAAAAAPAOf/AAADAAAAAAAaAOr/AAAEAAEAAAAaAOn/AAAFAAIAAAAZAOj/AAACAAAAAAAZAOn/AAABAAIAAAAZAOr/AAABAAIAAAAZAOv/AAABAAIAAAAZAOz/AAABAAIAAAAXAO7/AAADAAAAAAAWAO7/AAADAAAAAAAVAO7/AAADAAAAAAAUAO7/AAADAAAAAAATAO7/AAADAAAAAAASAO7/AAADAAAAAAARAO7/AAADAAAAAAARAOv/AAADAAQAAAASAOv/AAADAAQAAAATAOv/AAADAAQAAAAUAOv/AAAFAAMAAAAYAO3/AAACAAAAAAAYAO7/AAACAAEAAAAZAO3/AAACAAEAAAAQAO7/AAAEAAEAAAAQAOv/AAAEAAMAAAAQAOz/AAAFAAIAAAAQAO3/AAAFAAIAAAAUAOj/AAAFAAIAAAAUAOn/AAAFAAIAAAAUAOr/AAAFAAIAAAAiAOz/AAAEAAEAAAAjAOz/AAADAAAAAAAhAOr/AAADAAAAAAAiAOr/AAAEAAAAAAAiAOv/AAAFAAIAAAAkAOz/AAADAAAAAAAlAOz/AAAEAAAAAAAlAO3/AAAFAAIAAAAgAOr/AAADAAAAAAAfAOr/AAADAAAAAAAgAO3/AAADAAQAAAAhAO3/AAADAAQAAAAfAO3/AAAEAAMAAAAiAO3/AAACAAMAAAAfAO7/AAAFAAIAAAAfAO//AAAFAAIAAAAiAO7/AAABAAIAAAAiAO//AAABAAIAAAAAAOj/AAAFAAIAAAAAAOf/AAAFAAIAAAAAAOb/AAAFAAIAAAAAAOX/AAAFAAIAAAAAAOT/AAAFAAIAAAAAAOP/AAAFAAIAAAAAAOL/AAAFAAIAAAAAAOH/AAAFAAIAAAAAAOD/AAAFAAIAAAAAAN//AAAFAAIAAAAAAN7/AAAFAAIAAAAAAN3/AAAFAAIAAAAAANz/AAAFAAIAAAAAANv/AAAFAAIAAAAAANr/AAAFAAIAAAAAANn/AAAFAAIAAAAAANj/AAAFAAIAAAAAANf/AAAFAAIAAAAoAPP/AAAGAAAAAAAoAPb/AAADAAQAAAApAPP/AAADAAAAAAApAPX/AAAEAAMAAAApAPb/AAADAAQAAAAqAPP/AAAEAAAAAAAqAPT/AAAFAAIAAAAqAPX/AAAFAAIAAAAqAPb/AAAFAAMAAAAmAPP/AAAHAAAAAAAnAPP/AAADAAAAAAAhAPP/AAADAAAAAAAmAPb/AAADAAQAAAAnAPb/AAADAAQAAAAtAPn/AAACAAEAAAAtAPj/AAABAAIAAAAtAPf/AAABAAIAAAAtAPb/AAABAAIAAAAtAPX/AAABAAIAAAAtAPT/AAABAAIAAAAtAPP/AAABAAIAAAAtAPL/AAABAAIAAAADAOP/AAAGAAwAAAAFAOX/AAAGAAwAAAAHAOf/AAAGAAwAAAACAOP/AAAEAAwAAAAEAOX/AAAEAAwAAAAGAOf/AAAEAAwAAAANAOf/AAAEAAwAAAALAOr/AAAFAAwAAAAMAOr/AAAFAAwAAAANAOr/AAAGAAwAAAAHAOr/AAAEAAwAAAAIAOr/AAAFAAwAAAAJAOr/AAAFAAwAAAAKAOr/AAAFAAwAAAAtAPH/AAABAAIAAAAtAPD/AAABAAIAAAAtAO//AAABAAIAAAAtAO7/AAABAAIAAAAtAO3/AAABAAIAAAAtAOz/AAABAAIAAAAtAOv/AAABAAIAAAAtAOr/AAABAAIAAAAtAOn/AAABAAIAAAAtAOj/AAABAAIAAAAtAOf/AAABAAIAAAAtAOb/AAABAAIAAAAtAOX/AAABAAIAAAAtAOT/AAABAAIAAAAtAOP/AAABAAIAAAAtAOL/AAABAAIAAAAtAOH/AAABAAIAAAAtAOD/AAABAAIAAAAtAN//AAABAAIAAAAtAN7/AAABAAIAAAAtAN3/AAABAAIAAAAtANr/AAAGAAAAAAApAOf/AAADAAQAAAAqAOf/AAADAAQAAAArAOf/AAADAAQAAAAsAOf/AAADAAQAAAAnAOT/AAADAAQAAAAmAOT/AAADAAQAAAAlAOT/AAADAAQAAAAkAOT/AAADAAQAAAAjAOT/AAADAAQAAAAiAOT/AAADAAQAAAAhAOT/AAADAAQAAAAgAOT/AAADAAQAAAAeAOL/AAADAAQAAAAdAOL/AAADAAQAAAAcAOL/AAADAAQAAAAbAOL/AAADAAQAAAAaAOL/AAADAAQAAAAZAOL/AAADAAQAAAAYAOL/AAADAAQAAAAXAOL/AAADAAQAAAAWAOL/AAADAAQAAAAVAOL/AAADAAQAAAAUAOL/AAADAAQAAAATAOL/AAADAAQAAAASAOL/AAADAAQAAAARAOL/AAADAAQAAAAQAOL/AAADAAQAAAAPAOL/AAADAAQAAAAOAOL/AAADAAQAAAAfAOL/AAACAAMAAAAoAOT/AAACAAMAAAAfAOP/AAABAAIAAAAoAOX/AAABAAIAAAAoAOb/AAABAAIAAAAfAOT/AAABAAMAAAAoAOf/AAABAAMAAAAFAOH/AAAEAAwAAAAGAOH/AAAFAAwAAAAHAOH/AAAFAAwAAAAIAOH/AAAGAAwAAAAIAN//AAAEAAwAAAAJAN//AAAFAAwAAAAKAN//AAAFAAwAAAALAN//AAAGAAwAAAANAOH/AAABAAIAAAANAOD/AAABAAIAAAANAN//AAABAAIAAAANAN7/AAABAAIAAAAOAN3/AAADAAAAAAAPAN3/AAADAAAAAAAQAN3/AAADAAAAAAARAN3/AAADAAAAAAASAN3/AAADAAAAAAATAN3/AAADAAAAAAAUAN3/AAADAAAAAAAVAN3/AAADAAAAAAAWAN3/AAADAAAAAAAXAN3/AAADAAAAAAAYAN3/AAADAAAAAAAZAN3/AAADAAAAAAAaAN3/AAADAAAAAAAbAN3/AAADAAAAAAAcAN3/AAADAAAAAAAdAN3/AAADAAAAAAAeAN3/AAADAAAAAAAfAN3/AAADAAAAAAAgAN3/AAADAAAAAAAhAN3/AAADAAAAAAAiAN3/AAADAAAAAAAjAN3/AAADAAAAAAAkAN3/AAADAAAAAAAlAN3/AAADAAAAAAAmAN3/AAADAAAAAAAnAN3/AAADAAAAAAAoAN3/AAADAAAAAAApAN3/AAADAAAAAAAqAN3/AAADAAAAAAArAN3/AAADAAAAAAAsAN3/AAADAAAAAAArANr/AAABAAMAAAAsANr/AAADAAQAAAArANn/AAABAAIAAAArANj/AAABAAIAAAArANf/AAACAAAAAAAgANP/AAADAAQAAAAhANP/AAADAAQAAAAiANP/AAADAAQAAAAjANP/AAADAAQAAAAkANP/AAADAAQAAAAlANP/AAADAAQAAAAmANP/AAADAAQAAAAnANP/AAADAAQAAAAoANP/AAADAAQAAAApANP/AAADAAQAAAAqANP/AAADAAQAAAArANP/AAACAAMAAAAPANP/AAADAAQAAAAQANP/AAADAAQAAAARANP/AAADAAQAAAASANP/AAADAAQAAAATANP/AAADAAQAAAAUANP/AAADAAQAAAAVANP/AAADAAQAAAAWANP/AAADAAQAAAAXANP/AAADAAQAAAAYANP/AAADAAQAAAAZANP/AAADAAQAAAAaANP/AAADAAQAAAAbANP/AAADAAQAAAAcANP/AAADAAQAAAAdANP/AAADAAQAAAAeANP/AAADAAQAAAAfANP/AAADAAQAAAABANP/AAADAAQAAAACANP/AAADAAQAAAADANP/AAADAAQAAAAEANP/AAADAAQAAAAFANP/AAADAAQAAAAGANP/AAADAAQAAAAHANP/AAADAAQAAAAIANP/AAADAAQAAAAJANP/AAADAAQAAAAKANP/AAADAAQAAAALANP/AAADAAQAAAAMANP/AAADAAQAAAANANP/AAADAAQAAAAOANP/AAADAAQAAAAAANT/AAAFAAIAAAAAANX/AAAFAAIAAAAAANb/AAAFAAIAAAAAANP/AAAEAAMAAAArANT/AAABAAIAAAArANX/AAABAAIAAAArANb/AAABAAIAAAAuANv/AAABAAIAAAAuANz/AAABAAIAAAANAN3/AAACAAAAAAANAOL/AAABAAMAAAA=") +tile_set = ExtResource("3_j5e17") +rendering_quadrant_size = 32 + +[node name="Props" type="TileMapLayer" parent="." unique_id=93016221] +position = Vector2(16, 0) +scale = Vector2(2, 2) +tile_map_data = PackedByteArray("AAAfAPn/AAAGAAMAAAABAPT/AAAHAAIAAAABAPb/AAAGAAMAAAAgAO//AAAGAAMAAAArAOv/AAAGAAMAAAApAOv/AAAGAAMAAAAmAOj/AAAGAAMAAAAkAOf/AAAGAAMAAAAdAOX/AAAGAAMAAAAbAOT/AAAGAAMAAAAdAOP/AAAHAAIAAAAkAOX/AAAHAAIAAAAmAOX/AAAHAAIAAAAmAOb/AAAHAAIAAAApAOj/AAAHAAIAAAApAOn/AAAHAAIAAAArAOj/AAAHAAIAAAArAOn/AAAHAAIAAAAKAOP/AAAGAAMAAAAiAOb/AAAGAAMAAAAYAOT/AAAGAAMAAAATAOT/AAAGAAMAAAAPAOT/AAAGAAMAAAAMAO3/AAAGAAMAAAACAOb/AAAGAAMAAAACAOT/AAAHAAIAAAAMAOv/AAAHAAIAAAA=") +tile_set = ExtResource("3_j5e17") +rendering_quadrant_size = 32 + +[node name="Checkpoints" type="Node2D" parent="." unique_id=395498098] + +[node name="Checkpoint" parent="Checkpoints" unique_id=1489150355 instance=ExtResource("6_4gicu")] +position = Vector2(96, -128) + +[node name="Traps" type="Node2D" parent="." unique_id=1841024760] + +[node name="Spikes" parent="Traps" unique_id=71118229 instance=ExtResource("7_ux0xx")] +position = Vector2(464, -112) + +[node name="Spikes2" parent="Traps" unique_id=1365165566 instance=ExtResource("7_ux0xx")] +position = Vector2(496, -112) + +[node name="Spikes3" parent="Traps" unique_id=1572625273 instance=ExtResource("7_ux0xx")] +position = Vector2(240, -720) + +[node name="Spikes10" parent="Traps" unique_id=246628394 instance=ExtResource("7_ux0xx")] +position = Vector2(208, -688) +orientation = 2 + +[node name="Spikes4" parent="Traps" unique_id=1232147250 instance=ExtResource("7_ux0xx")] +position = Vector2(272, -720) + +[node name="Spikes5" parent="Traps" unique_id=1709224549 instance=ExtResource("7_ux0xx")] +position = Vector2(304, -720) + +[node name="Spikes6" parent="Traps" unique_id=127370747 instance=ExtResource("7_ux0xx")] +position = Vector2(336, -720) + +[node name="Spikes7" parent="Traps" unique_id=260608479 instance=ExtResource("7_ux0xx")] +position = Vector2(368, -720) + +[node name="Spikes8" parent="Traps" unique_id=359475131 instance=ExtResource("7_ux0xx")] +position = Vector2(400, -720) + +[node name="Spikes9" parent="Traps" unique_id=1817018182 instance=ExtResource("7_ux0xx")] +position = Vector2(432, -720) + +[node name="Enemies" type="Node2D" parent="." unique_id=1117859655] + +[node name="Creeper" parent="Enemies" unique_id=1458442942 instance=ExtResource("8_fjn0g")] +position = Vector2(56.00003, -608) + +[node name="Creeper5" parent="Enemies" unique_id=6169353 instance=ExtResource("8_fjn0g")] +position = Vector2(368, -1056) + +[node name="Creeper2" parent="Enemies" unique_id=1863955908 instance=ExtResource("8_fjn0g")] +position = Vector2(1247.9999, -224.00003) + +[node name="Creeper3" parent="Enemies" unique_id=63321072 instance=ExtResource("8_fjn0g")] +position = Vector2(976, -704) + +[node name="Creeper4" parent="Enemies" unique_id=1753509495 instance=ExtResource("8_fjn0g")] +position = Vector2(568, -800) + +[node name="MorphDemon" parent="Enemies" unique_id=1564137690 instance=ExtResource("8_v4rdk")] +position = Vector2(488, -32) + +[node name="MorphDemon2" parent="Enemies" unique_id=158463595 instance=ExtResource("8_v4rdk")] +position = Vector2(1120, -416) + +[node name="MorphDemon4" parent="Enemies" unique_id=1651949191 instance=ExtResource("8_v4rdk")] +position = Vector2(808, -1120.0001) + +[node name="MorphDemon3" parent="Enemies" unique_id=659732224 instance=ExtResource("8_v4rdk")] +position = Vector2(656.00006, -576) + +[node name="Player" parent="." unique_id=1267310378 instance=ExtResource("9_qpmxf")] +position = Vector2(50, -130) + +[node name="Camera2D2" type="Camera2D" parent="Player" unique_id=121956990] +offset = Vector2(0, -40) +zoom = Vector2(0.8, 0.8) +limit_left = 0 +limit_top = -1400 +limit_right = 1460 +limit_bottom = 40 +position_smoothing_enabled = true + +[node name="HUD" parent="Player" unique_id=409721474 instance=ExtResource("10_wt17w")] + +[node name="EnemyCounterHUD" parent="Player" unique_id=1115869931 instance=ExtResource("11_vuiu1")] + +[node name="LockedDoor" parent="." unique_id=1484919877 instance=ExtResource("12_625yc")] +position = Vector2(1408, -1152) + +[node name="LoadingZone" parent="." unique_id=2123510357 instance=ExtResource("13_qr373")] +position = Vector2(1432, -1152) +scale = Vector2(1, 3) +target_scene = "res://scenes/levels/boss_arena.tscn" diff --git a/scenes/levels/boss_arena.tscn b/scenes/levels/boss_arena.tscn new file mode 100644 index 0000000..4ddcbe7 --- /dev/null +++ b/scenes/levels/boss_arena.tscn @@ -0,0 +1,159 @@ +[gd_scene format=4 uid="uid://no2r4uv450rv"] + +[ext_resource type="PackedScene" uid="uid://j5y1pb8t167t" path="res://scenes/components/background.tscn" id="1_attd0"] +[ext_resource type="TileSet" uid="uid://bf70pewkmg5hy" path="res://ressources/dungeon_tileset.tres" id="2_lvfa1"] +[ext_resource type="PackedScene" uid="uid://51vdlyyqiph" path="res://scenes/components/checkpoint.tscn" id="3_4atmf"] +[ext_resource type="PackedScene" uid="uid://dero2u4tw7mma" path="res://scenes/components/spikes.tscn" id="4_c4s7r"] +[ext_resource type="PackedScene" uid="uid://kfcguhpc7lvd" path="res://scenes/actors/player.tscn" id="6_8smpv"] +[ext_resource type="PackedScene" uid="uid://4ue2acsmrn5" path="res://scenes/actors/demon_samurai.tscn" id="7_tdbwh"] +[ext_resource type="PackedScene" uid="uid://3bhkncvwd7fa" path="res://scenes/ui/player_hud.tscn" id="7_y6xu3"] +[ext_resource type="PackedScene" uid="uid://cwq8mu0hub5qd" path="res://scenes/actors/entity.tscn" id="8_attd0"] + +[node name="BossArena" type="Node2D" unique_id=605186501] + +[node name="Background" parent="." unique_id=105665021 instance=ExtResource("1_attd0")] +position = Vector2(8, -40) + +[node name="Entity" parent="." unique_id=286688007 instance=ExtResource("8_attd0")] +position = Vector2(1056, -304) + +[node name="Walls" type="TileMapLayer" parent="." unique_id=2069244439] +scale = Vector2(2, 2) +tile_map_data = PackedByteArray("AAAAAPn/AQAAAAYAAAABAPn/AQAAAAYAAAACAPn/AQAAAAYAAAADAPn/AQAAAAYAAAAEAPn/AQAAAAYAAAAFAPn/AQAAAAYAAAAGAPn/AQAAAAYAAAAHAPn/AQAAAAYAAAAIAPn/AQAAAAYAAAAJAPn/AQAAAAYAAAAKAPn/AQAAAAYAAAALAPn/AQAAAAYAAAAMAPn/AQAAAAYAAAANAPn/AQAAAAYAAAAOAPn/AQAAAAYAAAAPAPn/AQAAAAYAAAAQAPn/AQAAAAYAAAARAPn/AQAAAAYAAAASAPn/AQAAAAYAAAATAPn/AQAAAAYAAAAUAPn/AQAAAAYAAAAUAPj/AQAAAAYAAAATAPj/AQAAAAYAAAASAPj/AQAAAAYAAAARAPj/AQAAAAYAAAAQAPj/AQAAAAYAAAAQAPf/AQAAAAYAAAAQAPb/AQAAAAYAAAAQAPX/AQAAAAYAAAAQAPT/AQAAAAYAAAAQAPP/AQAAAAYAAAAQAPL/AQAAAAYAAAALAPj/AQAAAAYAAAALAPf/AQAAAAYAAAALAPb/AQAAAAYAAAALAPX/AQAAAAYAAAALAPT/AQAAAAYAAAALAPP/AQAAAAYAAAALAPL/AQAAAAYAAAAGAPj/AQAAAAYAAAAGAPf/AQAAAAYAAAAGAPb/AQAAAAYAAAAGAPX/AQAAAAYAAAAGAPT/AQAAAAYAAAAGAPP/AQAAAAYAAAAGAPL/AQAAAAYAAAAAAPj/AQAAAAYAAAABAPj/AQAAAAYAAAABAPf/AQAAAAYAAAABAPb/AQAAAAYAAAABAPX/AQAAAAYAAAABAPT/AQAAAAYAAAABAPP/AQAAAAYAAAABAPL/AQAAAAYAAAABAO3/AQAAAAYAAAABAO7/AQAAAAYAAAABAO//AQAAAAYAAAABAPD/AQAAAAYAAAABAPH/AQAAAAYAAAACAO3/AQAAAAYAAAACAO7/AQAAAAYAAAACAO//AQAAAAYAAAACAPD/AQAAAAYAAAACAPH/AQAAAAYAAAADAO3/AQAAAAYAAAADAO7/AQAAAAYAAAADAO//AQAAAAYAAAADAPD/AQAAAAYAAAADAPH/AQAAAAYAAAAEAO3/AQAAAAYAAAAEAO7/AQAAAAYAAAAEAO//AQAAAAYAAAAEAPD/AQAAAAYAAAAEAPH/AQAAAAYAAAAFAO3/AQAAAAYAAAAFAO7/AQAAAAYAAAAFAO//AQAAAAYAAAAFAPD/AQAAAAYAAAAFAPH/AQAAAAYAAAAGAO3/AQAAAAYAAAAGAO7/AQAAAAYAAAAGAO//AQAAAAYAAAAGAPD/AQAAAAYAAAAGAPH/AQAAAAYAAAAHAO3/AQAAAAYAAAAHAO7/AQAAAAYAAAAHAO//AQAAAAYAAAAHAPD/AQAAAAYAAAAHAPH/AQAAAAYAAAAIAO3/AQAAAAYAAAAIAO7/AQAAAAYAAAAIAO//AQAAAAYAAAAIAPD/AQAAAAYAAAAIAPH/AQAAAAYAAAAJAO3/AQAAAAYAAAAJAO7/AQAAAAYAAAAJAO//AQAAAAYAAAAJAPD/AQAAAAYAAAAJAPH/AQAAAAYAAAAKAO3/AQAAAAYAAAAKAO7/AQAAAAYAAAAKAO//AQAAAAYAAAAKAPD/AQAAAAYAAAAKAPH/AQAAAAYAAAALAO3/AQAAAAYAAAALAO7/AQAAAAYAAAALAO//AQAAAAYAAAALAPD/AQAAAAYAAAALAPH/AQAAAAYAAAAMAO3/AQAAAAYAAAAMAO7/AQAAAAYAAAAMAO//AQAAAAYAAAAMAPD/AQAAAAYAAAAMAPH/AQAAAAYAAAANAO3/AQAAAAYAAAANAO7/AQAAAAYAAAANAO//AQAAAAYAAAANAPD/AQAAAAYAAAANAPH/AQAAAAYAAAAOAO3/AQAAAAYAAAAOAO7/AQAAAAYAAAAOAO//AQAAAAYAAAAOAPD/AQAAAAYAAAAOAPH/AQAAAAYAAAAPAO3/AQAAAAYAAAAPAO7/AQAAAAYAAAAPAO//AQAAAAYAAAAPAPD/AQAAAAYAAAAPAPH/AQAAAAYAAAAQAO3/AQAAAAYAAAAQAO7/AQAAAAYAAAAQAO//AQAAAAYAAAAQAPD/AQAAAAYAAAAQAPH/AQAAAAYAAAARAPf/AQAAAAYAAAASAPf/AQAAAAYAAAATAPf/AQAAAAYAAAAUAPf/AQAAAAYAAAARAO3/AQAAAAYAAAARAO7/AQAAAAYAAAARAO//AQAAAAYAAAARAPD/AQAAAAYAAAARAPH/AQAAAAYAAAARAPL/AQAAAAYAAAARAPP/AQAAAAYAAAARAPT/AQAAAAYAAAARAPX/AQAAAAYAAAARAPb/AQAAAAYAAAASAO3/AQAAAAYAAAASAO7/AQAAAAYAAAASAO//AQAAAAYAAAASAPD/AQAAAAYAAAASAPH/AQAAAAYAAAASAPL/AQAAAAYAAAASAPP/AQAAAAYAAAASAPT/AQAAAAYAAAASAPX/AQAAAAYAAAASAPb/AQAAAAYAAAATAO3/AQAAAAYAAAATAO7/AQAAAAYAAAATAO//AQAAAAYAAAATAPD/AQAAAAYAAAATAPH/AQAAAAYAAAATAPL/AQAAAAYAAAATAPP/AQAAAAYAAAATAPT/AQAAAAYAAAATAPX/AQAAAAYAAAATAPb/AQAAAAYAAAAUAO3/AQAAAAYAAAAUAO7/AQAAAAYAAAAUAO//AQAAAAYAAAAUAPD/AQAAAAYAAAAUAPH/AQAAAAYAAAAUAPL/AQAAAAYAAAAUAPP/AQAAAAYAAAAUAPT/AQAAAAYAAAAUAPX/AQAAAAYAAAAUAPb/AQAAAAYAAAAAAPr/AQAAAAYAAAAAAPv/AQAAAAYAAAAAAPz/AQAAAAYAAAAAAP3/AQAAAAYAAAAAAP7/AQAAAAYAAAAAAP//AQAAAAYAAAABAPr/AQAAAAYAAAABAPv/AQAAAAYAAAABAPz/AQAAAAYAAAABAP3/AQAAAAYAAAABAP7/AQAAAAYAAAABAP//AQAAAAYAAAACAPr/AQAAAAYAAAACAPv/AQAAAAYAAAACAPz/AQAAAAYAAAACAP3/AQAAAAYAAAACAP7/AQAAAAYAAAACAP//AQAAAAYAAAADAPr/AQAAAAYAAAADAPv/AQAAAAYAAAADAPz/AQAAAAYAAAADAP3/AQAAAAYAAAADAP7/AQAAAAYAAAADAP//AQAAAAYAAAAEAPr/AQAAAAYAAAAEAPv/AQAAAAYAAAAEAPz/AQAAAAYAAAAEAP3/AQAAAAYAAAAEAP7/AQAAAAYAAAAEAP//AQAAAAYAAAAFAPr/AQAAAAYAAAAFAPv/AQAAAAYAAAAFAPz/AQAAAAYAAAAFAP3/AQAAAAYAAAAFAP7/AQAAAAYAAAAFAP//AQAAAAYAAAAGAPr/AQAAAAYAAAAGAPv/AQAAAAYAAAAGAPz/AQAAAAYAAAAGAP3/AQAAAAYAAAAGAP7/AQAAAAYAAAAGAP//AQAAAAYAAAAHAPr/AQAAAAYAAAAHAPv/AQAAAAYAAAAHAPz/AQAAAAYAAAAHAP3/AQAAAAYAAAAHAP7/AQAAAAYAAAAHAP//AQAAAAYAAAAIAPr/AQAAAAYAAAAIAPv/AQAAAAYAAAAIAPz/AQAAAAYAAAAIAP3/AQAAAAYAAAAIAP7/AQAAAAYAAAAIAP//AQAAAAYAAAAJAPr/AQAAAAYAAAAJAPv/AQAAAAYAAAAJAPz/AQAAAAYAAAAJAP3/AQAAAAYAAAAJAP7/AQAAAAYAAAAJAP//AQAAAAYAAAAKAPr/AQAAAAYAAAAKAPv/AQAAAAYAAAAKAPz/AQAAAAYAAAAKAP3/AQAAAAYAAAAKAP7/AQAAAAYAAAAKAP//AQAAAAYAAAALAPr/AQAAAAYAAAALAPv/AQAAAAYAAAALAPz/AQAAAAYAAAALAP3/AQAAAAYAAAALAP7/AQAAAAYAAAALAP//AQAAAAYAAAAMAPr/AQAAAAYAAAAMAPv/AQAAAAYAAAAMAPz/AQAAAAYAAAAMAP3/AQAAAAYAAAAMAP7/AQAAAAYAAAAMAP//AQAAAAYAAAANAPr/AQAAAAYAAAANAPv/AQAAAAYAAAANAPz/AQAAAAYAAAANAP3/AQAAAAYAAAANAP7/AQAAAAYAAAANAP//AQAAAAYAAAAOAPr/AQAAAAYAAAAOAPv/AQAAAAYAAAAOAPz/AQAAAAYAAAAOAP3/AQAAAAYAAAAOAP7/AQAAAAYAAAAOAP//AQAAAAYAAAAPAPr/AQAAAAYAAAAPAPv/AQAAAAYAAAAPAPz/AQAAAAYAAAAPAP3/AQAAAAYAAAAPAP7/AQAAAAYAAAAPAP//AQAAAAYAAAAQAPr/AQAAAAYAAAAQAPv/AQAAAAYAAAAQAPz/AQAAAAYAAAAQAP3/AQAAAAYAAAAQAP7/AQAAAAYAAAAQAP//AQAAAAYAAAARAPr/AQAAAAYAAAARAPv/AQAAAAYAAAARAPz/AQAAAAYAAAARAP3/AQAAAAYAAAARAP7/AQAAAAYAAAARAP//AQAAAAYAAAASAPr/AQAAAAYAAAASAPv/AQAAAAYAAAASAPz/AQAAAAYAAAASAP3/AQAAAAYAAAASAP7/AQAAAAYAAAASAP//AQAAAAYAAAATAPr/AQAAAAYAAAATAPv/AQAAAAYAAAATAPz/AQAAAAYAAAATAP3/AQAAAAYAAAATAP7/AQAAAAYAAAATAP//AQAAAAYAAAAUAPr/AQAAAAYAAAAUAPv/AQAAAAYAAAAUAPz/AQAAAAYAAAAUAP3/AQAAAAYAAAAUAP7/AQAAAAYAAAAUAP//AQAAAAYAAAAVAPr/AQAAAAYAAAAVAPv/AQAAAAYAAAAVAPz/AQAAAAYAAAAVAP3/AQAAAAYAAAAVAP7/AQAAAAYAAAAVAP//AQAAAAYAAAAWAPr/AQAAAAYAAAAWAPv/AQAAAAYAAAAWAPz/AQAAAAYAAAAWAP3/AQAAAAYAAAAWAP7/AQAAAAYAAAAWAP//AQAAAAYAAAAXAPr/AQAAAAYAAAAXAPv/AQAAAAYAAAAXAPz/AQAAAAYAAAAXAP3/AQAAAAYAAAAXAP7/AQAAAAYAAAAXAP//AQAAAAYAAAAYAPr/AQAAAAYAAAAYAPv/AQAAAAYAAAAYAPz/AQAAAAYAAAAYAP3/AQAAAAYAAAAYAP7/AQAAAAYAAAAYAP//AQAAAAYAAAAZAPr/AQAAAAYAAAAZAPv/AQAAAAYAAAAZAPz/AQAAAAYAAAAZAP3/AQAAAAYAAAAZAP7/AQAAAAYAAAAZAP//AQAAAAYAAAAaAPr/AQAAAAYAAAAaAPv/AQAAAAYAAAAaAPz/AQAAAAYAAAAaAP3/AQAAAAYAAAAaAP7/AQAAAAYAAAAaAP//AQAAAAYAAAAbAPr/AQAAAAYAAAAbAPv/AQAAAAYAAAAbAPz/AQAAAAYAAAAbAP3/AQAAAAYAAAAbAP7/AQAAAAYAAAAbAP//AQAAAAYAAAAcAPr/AQAAAAYAAAAcAPv/AQAAAAYAAAAcAPz/AQAAAAYAAAAcAP3/AQAAAAYAAAAcAP7/AQAAAAYAAAAcAP//AQAAAAYAAAAdAPr/AQAAAAYAAAAdAPv/AQAAAAYAAAAdAPz/AQAAAAYAAAAdAP3/AQAAAAYAAAAdAP7/AQAAAAYAAAAdAP//AQAAAAYAAAAeAPr/AQAAAAYAAAAeAPv/AQAAAAYAAAAeAPz/AQAAAAYAAAAeAP3/AQAAAAYAAAAeAP7/AQAAAAYAAAAeAP//AQAAAAYAAAAfAPr/AQAAAAYAAAAfAPv/AQAAAAYAAAAfAPz/AQAAAAYAAAAfAP3/AQAAAAYAAAAfAP7/AQAAAAYAAAAfAP//AQAAAAYAAAAgAPr/AQAAAAYAAAAgAPv/AQAAAAYAAAAgAPz/AQAAAAYAAAAgAP3/AQAAAAYAAAAgAP7/AQAAAAYAAAAgAP//AQAAAAYAAAAhAPr/AQAAAAYAAAAhAPv/AQAAAAYAAAAhAPz/AQAAAAYAAAAhAP3/AQAAAAYAAAAhAP7/AQAAAAYAAAAhAP//AQAAAAYAAAAiAPr/AQAAAAYAAAAiAPv/AQAAAAYAAAAiAPz/AQAAAAYAAAAiAP3/AQAAAAYAAAAiAP7/AQAAAAYAAAAiAP//AQAAAAYAAAAjAPr/AQAAAAYAAAAjAPv/AQAAAAYAAAAjAPz/AQAAAAYAAAAjAP3/AQAAAAYAAAAjAP7/AQAAAAYAAAAjAP//AQAAAAYAAAAkAPr/AQAAAAYAAAAkAPv/AQAAAAYAAAAkAPz/AQAAAAYAAAAkAP3/AQAAAAYAAAAkAP7/AQAAAAYAAAAkAP//AQAAAAYAAAAlAPr/AQAAAAYAAAAlAPv/AQAAAAYAAAAlAPz/AQAAAAYAAAAlAP3/AQAAAAYAAAAlAP7/AQAAAAYAAAAlAP//AQAAAAYAAAAmAPr/AQAAAAYAAAAmAPv/AQAAAAYAAAAmAPz/AQAAAAYAAAAmAP3/AQAAAAYAAAAmAP7/AQAAAAYAAAAmAP//AQAAAAYAAAAnAPr/AQAAAAYAAAAnAPv/AQAAAAYAAAAnAPz/AQAAAAYAAAAnAP3/AQAAAAYAAAAnAP7/AQAAAAYAAAAnAP//AQAAAAYAAAAoAPr/AQAAAAYAAAAoAPv/AQAAAAYAAAAoAPz/AQAAAAYAAAAoAP3/AQAAAAYAAAAoAP7/AQAAAAYAAAAoAP//AQAAAAYAAAApAPr/AQAAAAYAAAApAPv/AQAAAAYAAAApAPz/AQAAAAYAAAApAP3/AQAAAAYAAAApAP7/AQAAAAYAAAApAP//AQAAAAYAAAAqAPr/AQAAAAYAAAAqAPv/AQAAAAYAAAAqAPz/AQAAAAYAAAAqAP3/AQAAAAYAAAAqAP7/AQAAAAYAAAAqAP//AQAAAAYAAAArAPr/AQAAAAYAAAArAPv/AQAAAAYAAAArAPz/AQAAAAYAAAArAP3/AQAAAAYAAAArAP7/AQAAAAYAAAArAP//AQAAAAYAAAAsAPr/AQAAAAYAAAAsAPv/AQAAAAYAAAAsAPz/AQAAAAYAAAAsAP3/AQAAAAYAAAAsAP7/AQAAAAYAAAAsAP//AQAAAAYAAAAtAPr/AQAAAAYAAAAtAPv/AQAAAAYAAAAtAPz/AQAAAAYAAAAtAP3/AQAAAAYAAAAtAP7/AQAAAAYAAAAtAP//AQAAAAYAAAAtAO3/AQAAAAYAAAAtAO7/AQAAAAYAAAAtAO//AQAAAAYAAAAtAPD/AQAAAAYAAAAtAPH/AQAAAAYAAAAtAPL/AQAAAAYAAAAtAPP/AQAAAAYAAAAtAPT/AQAAAAYAAAAtAPX/AQAAAAYAAAAtAPb/AQAAAAYAAAAtAPf/AQAAAAYAAAAtAPj/AQAAAAYAAAAtAPn/AQAAAAYAAAA=") +tile_set = ExtResource("2_lvfa1") +rendering_quadrant_size = 32 + +[node name="Dungeon" type="TileMapLayer" parent="." unique_id=423877763] +scale = Vector2(2, 2) +tile_map_data = PackedByteArray("AAAAAPH/AAAFAAEAAAAAAPL/AAAFAAEAAAAAAPP/AAAFAAEAAAAAAPT/AAAFAAEAAAAAAPX/AAAFAAEAAAAAAPb/AAAFAAEAAAAAAPf/AAAFAAEAAAAAAPr/AAACAAAAAAAAAPv/AAABAAIAAAAAAPz/AAABAAIAAAAAAP3/AAABAAIAAAAAAP7/AAABAAIAAAAAAP//AAABAAIAAAAAAPD/AAAEAAAAAAAAAO//AAAEAAAAAAAAAO7/AAAEAAAAAAAAAO3/AAAEAAAAAAD///j/AAABAAIAAAD///n/AAABAAIAAAAjAPr/AAAEAAAAAAAiAPr/AAAHAAAAAAAhAPr/AAAHAAAAAAAgAPr/AAAHAAAAAAAfAPr/AAADAAAAAAAeAPr/AAADAAAAAAAdAPr/AAAHAAAAAAAcAPr/AAADAAAAAAAbAPr/AAADAAAAAAAaAPr/AAAHAAAAAAAZAPr/AAADAAAAAAAYAPr/AAAGAAAAAAAXAPr/AAAGAAAAAAAWAPr/AAAHAAAAAAAVAPr/AAAHAAAAAAAUAPr/AAAEAAAAAAATAPr/AAAGAAAAAAASAPr/AAAHAAAAAAARAPr/AAAGAAAAAAAQAPr/AAAHAAAAAAAPAPr/AAAHAAAAAAAOAPr/AAAGAAAAAAANAPr/AAAGAAAAAAAMAPr/AAADAAAAAAALAPr/AAAEAAAAAAAKAPr/AAAGAAAAAAAJAPr/AAADAAAAAAAIAPr/AAAEAAAAAAAHAPr/AAAGAAAAAAAGAPr/AAAHAAAAAAAFAPr/AAAHAAAAAAAEAPr/AAAGAAAAAAADAPr/AAAGAAAAAAACAPr/AAAGAAAAAAABAPr/AAADAAAAAAAtAPr/AAACAAEAAAAsAPr/AAAHAAAAAAArAPr/AAADAAAAAAAqAPr/AAAHAAAAAAApAPr/AAAGAAAAAAAoAPr/AAAGAAAAAAAnAPr/AAAHAAAAAAAmAPr/AAAHAAAAAAAlAPr/AAAHAAAAAAAkAPr/AAAHAAAAAAARAPb/AAABAAIAAAARAPX/AAABAAIAAAARAPT/AAABAAIAAAARAPP/AAABAAIAAAARAPL/AAABAAIAAAARAPH/AAABAAIAAAARAPD/AAABAAIAAAARAO//AAABAAIAAAARAO7/AAABAAIAAAARAO3/AAABAAIAAAAUAO3/AAAFAAIAAAAUAO7/AAAFAAIAAAAUAO//AAAFAAIAAAAUAPD/AAAFAAIAAAAUAPH/AAAFAAIAAAAUAPL/AAAFAAIAAAAUAPP/AAAFAAIAAAAUAPT/AAAFAAIAAAAUAPX/AAAFAAIAAAAUAPb/AAAFAAIAAAASAPf/AAADAAQAAAATAPf/AAADAAQAAAARAPf/AAACAAQAAAAUAPf/AAAEAAQAAAAtAPn/AAABAAIAAAAtAO3/AAABAAIAAAAtAO7/AAABAAIAAAAtAO//AAABAAIAAAAtAPD/AAABAAIAAAAtAPH/AAABAAIAAAAtAPL/AAABAAIAAAAtAPP/AAABAAIAAAAtAPT/AAABAAIAAAAtAPX/AAABAAIAAAAtAPb/AAABAAIAAAAtAPf/AAABAAIAAAAtAPj/AAABAAIAAAA=") +tile_set = ExtResource("2_lvfa1") +rendering_quadrant_size = 32 + +[node name="Windows" type="TileMapLayer" parent="." unique_id=1102091909] +position = Vector2(-16, 0) +scale = Vector2(2, 2) +tile_map_data = PackedByteArray("AAAEAPX/AAAAAAYAAAAOAPX/AAAAAAYAAAAJAPX/AAAAAAYAAAA=") +tile_set = ExtResource("2_lvfa1") +rendering_quadrant_size = 32 + +[node name="Checkpoints" type="Node2D" parent="." unique_id=306465773] + +[node name="Checkpoint" parent="Checkpoints" unique_id=1489150355 instance=ExtResource("3_4atmf")] +position = Vector2(288, -192) + +[node name="Traps" type="Node2D" parent="." unique_id=397993943] + +[node name="Spikes" parent="Traps" unique_id=71118229 instance=ExtResource("4_c4s7r")] +position = Vector2(688, -592) +orientation = 3 + +[node name="Spikes2" parent="Traps" unique_id=2118126707 instance=ExtResource("4_c4s7r")] +position = Vector2(688, -560) +orientation = 3 + +[node name="Spikes3" parent="Traps" unique_id=1321480377 instance=ExtResource("4_c4s7r")] +position = Vector2(688, -528) +orientation = 3 + +[node name="Spikes4" parent="Traps" unique_id=1087541136 instance=ExtResource("4_c4s7r")] +position = Vector2(688, -496) +orientation = 3 + +[node name="Spikes5" parent="Traps" unique_id=2053698160 instance=ExtResource("4_c4s7r")] +position = Vector2(688, -464) +orientation = 3 + +[node name="Spikes6" parent="Traps" unique_id=546130477 instance=ExtResource("4_c4s7r")] +position = Vector2(688, -432) +orientation = 3 + +[node name="Spikes7" parent="Traps" unique_id=1209530002 instance=ExtResource("4_c4s7r")] +position = Vector2(688, -400) +orientation = 3 + +[node name="Spikes8" parent="Traps" unique_id=1725686078 instance=ExtResource("4_c4s7r")] +position = Vector2(688, -368) +orientation = 3 + +[node name="Spikes9" parent="Traps" unique_id=1077471575 instance=ExtResource("4_c4s7r")] +position = Vector2(688, -336) +orientation = 3 + +[node name="Spikes10" parent="Traps" unique_id=1886047784 instance=ExtResource("4_c4s7r")] +position = Vector2(688, -304) +orientation = 3 + +[node name="Spikes11" parent="Traps" unique_id=1396020285 instance=ExtResource("4_c4s7r")] +position = Vector2(688, -272) +orientation = 3 + +[node name="Spikes12" parent="Traps" unique_id=532106570 instance=ExtResource("4_c4s7r")] +position = Vector2(1424, -592) +orientation = 2 + +[node name="Spikes13" parent="Traps" unique_id=225109324 instance=ExtResource("4_c4s7r")] +position = Vector2(1424, -560) +orientation = 2 + +[node name="Spikes14" parent="Traps" unique_id=1053515072 instance=ExtResource("4_c4s7r")] +position = Vector2(1424, -528) +orientation = 2 + +[node name="Spikes15" parent="Traps" unique_id=941790423 instance=ExtResource("4_c4s7r")] +position = Vector2(1424, -496) +orientation = 2 + +[node name="Spikes16" parent="Traps" unique_id=1887314904 instance=ExtResource("4_c4s7r")] +position = Vector2(1424, -464) +orientation = 2 + +[node name="Spikes17" parent="Traps" unique_id=411914541 instance=ExtResource("4_c4s7r")] +position = Vector2(1424, -432) +orientation = 2 + +[node name="Spikes18" parent="Traps" unique_id=257371377 instance=ExtResource("4_c4s7r")] +position = Vector2(1424, -400) +orientation = 2 + +[node name="Spikes19" parent="Traps" unique_id=1083875421 instance=ExtResource("4_c4s7r")] +position = Vector2(1424, -368) +orientation = 2 + +[node name="Spikes20" parent="Traps" unique_id=1694849905 instance=ExtResource("4_c4s7r")] +position = Vector2(1424, -336) +orientation = 2 + +[node name="Spikes21" parent="Traps" unique_id=584730988 instance=ExtResource("4_c4s7r")] +position = Vector2(1424, -304) +orientation = 2 + +[node name="Spikes22" parent="Traps" unique_id=1493879496 instance=ExtResource("4_c4s7r")] +position = Vector2(1424, -272) +orientation = 2 + +[node name="Spikes23" parent="Traps" unique_id=740425691 instance=ExtResource("4_c4s7r")] +position = Vector2(1424, -240) +orientation = 2 + +[node name="Spikes24" parent="Traps" unique_id=1600222237 instance=ExtResource("4_c4s7r")] +position = Vector2(1424, -208) +orientation = 2 + +[node name="Enemies" type="Node2D" parent="." unique_id=960325377] + +[node name="Player" parent="." unique_id=1267310378 instance=ExtResource("6_8smpv")] +position = Vector2(48, -192) + +[node name="Camera2D2" type="Camera2D" parent="Player" unique_id=1139186503] +offset = Vector2(0, -40) +zoom = Vector2(0.8, 0.8) +limit_left = 0 +limit_top = -600 +limit_right = 1460 +limit_bottom = 0 +position_smoothing_enabled = true + +[node name="HUD" parent="Player" unique_id=409721474 instance=ExtResource("7_y6xu3")] + +[node name="CharacterBody2D" parent="." unique_id=1564137690 instance=ExtResource("7_tdbwh")] +position = Vector2(1056, -192) diff --git a/scenes/levels/cover_image.tscn b/scenes/levels/cover_image.tscn new file mode 100644 index 0000000..1abaea3 --- /dev/null +++ b/scenes/levels/cover_image.tscn @@ -0,0 +1,296 @@ +[gd_scene format=4 uid="uid://c7sdfh7qh3mvs"] + +[ext_resource type="Texture2D" uid="uid://dapligyg1q7vd" path="res://assets/images/sprites/World/Background/Wasteland_Sky.png" id="1_l17lw"] +[ext_resource type="Texture2D" uid="uid://bk41feg0qdi0t" path="res://assets/images/sprites/World/Background/Wasteland_Mountains_1.png" id="2_b23ne"] +[ext_resource type="PackedScene" uid="uid://cwq8mu0hub5qd" path="res://scenes/actors/entity.tscn" id="3_opsoa"] +[ext_resource type="Texture2D" uid="uid://cdgo042aie21s" path="res://assets/images/sprites/World/Background/Wasteland_Mountains_2.png" id="4_xcig8"] +[ext_resource type="Texture2D" uid="uid://c6nak38doipjr" path="res://assets/images/sprites/World/Forest/Background/2.png" id="5_xfr73"] +[ext_resource type="Texture2D" uid="uid://d1mclnyfhlmh8" path="res://assets/images/sprites/World/Forest/Props/Objects.png" id="6_3bq2p"] +[ext_resource type="Texture2D" uid="uid://cg3d5ub47f3o1" path="res://assets/images/sprites/World/Forest/Background/1.png" id="6_l17lw"] +[ext_resource type="TileSet" uid="uid://6ltrd6lvydrw" path="res://ressources/forest_tileset.tres" id="7_7ck7r"] +[ext_resource type="Texture2D" uid="uid://uxtomds5wl0e" path="res://assets/images/sprites/World/Forest/Props/Props.png" id="9_1ti1q"] +[ext_resource type="Texture2D" uid="uid://caguehadpvpe1" path="res://assets/images/sprites/Player/IDLE.png" id="10_pjrt0"] +[ext_resource type="Texture2D" uid="uid://3f547c0s00m4" path="res://assets/images/sprites/Enemies/Demon-Samurai/IDLE.png" id="11_2o37d"] +[ext_resource type="FontFile" uid="uid://cqrxu8aj7ih08" path="res://assets/fonts/pixel_font.ttf" id="12_mrowi"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_y3p1k"] +atlas = ExtResource("6_3bq2p") +region = Rect2(0, 0, 32, 96) + +[sub_resource type="AtlasTexture" id="AtlasTexture_suu1v"] +atlas = ExtResource("9_1ti1q") +region = Rect2(104, 0, 48, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_iueyi"] +atlas = ExtResource("9_1ti1q") +region = Rect2(160, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_blvfw"] +atlas = ExtResource("9_1ti1q") +region = Rect2(0, 0, 64, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wx5q0"] +atlas = ExtResource("10_pjrt0") +region = Rect2(0, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_03q4f"] +atlas = ExtResource("10_pjrt0") +region = Rect2(106, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_j8yb3"] +atlas = ExtResource("10_pjrt0") +region = Rect2(212, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_f0n5y"] +atlas = ExtResource("10_pjrt0") +region = Rect2(318, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xaa0h"] +atlas = ExtResource("10_pjrt0") +region = Rect2(424, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_6x73w"] +atlas = ExtResource("10_pjrt0") +region = Rect2(530, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_hn6yu"] +atlas = ExtResource("10_pjrt0") +region = Rect2(636, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_rjgyo"] +atlas = ExtResource("10_pjrt0") +region = Rect2(742, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bqiuy"] +atlas = ExtResource("10_pjrt0") +region = Rect2(848, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tky41"] +atlas = ExtResource("10_pjrt0") +region = Rect2(954, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_v0qcs"] +atlas = ExtResource("10_pjrt0") +region = Rect2(1060, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_lavtg"] +atlas = ExtResource("10_pjrt0") +region = Rect2(1166, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_r6n1t"] +atlas = ExtResource("10_pjrt0") +region = Rect2(1272, 0, 106, 84) + +[sub_resource type="AtlasTexture" id="AtlasTexture_b5s4q"] +atlas = ExtResource("10_pjrt0") +region = Rect2(1378, 0, 106, 84) + +[sub_resource type="SpriteFrames" id="SpriteFrames_tasn5"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_wx5q0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_03q4f") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_j8yb3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_f0n5y") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xaa0h") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6x73w") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_hn6yu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rjgyo") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bqiuy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tky41") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_v0qcs") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lavtg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_r6n1t") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_b5s4q") +}], +"loop": 1, +"name": &"player_idle", +"speed": 10.0 +}] + +[sub_resource type="AtlasTexture" id="AtlasTexture_l1ovs"] +atlas = ExtResource("11_2o37d") +region = Rect2(0, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_uf3hl"] +atlas = ExtResource("11_2o37d") +region = Rect2(128, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jo3vm"] +atlas = ExtResource("11_2o37d") +region = Rect2(256, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qmxhu"] +atlas = ExtResource("11_2o37d") +region = Rect2(384, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4iv4i"] +atlas = ExtResource("11_2o37d") +region = Rect2(512, 0, 128, 108) + +[sub_resource type="AtlasTexture" id="AtlasTexture_mhpyq"] +atlas = ExtResource("11_2o37d") +region = Rect2(640, 0, 128, 108) + +[sub_resource type="SpriteFrames" id="SpriteFrames_3fgd8"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_l1ovs") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_uf3hl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jo3vm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qmxhu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4iv4i") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mhpyq") +}], +"loop": 1, +"name": &"default", +"speed": 7.0 +}] + +[sub_resource type="Theme" id="Theme_38nrg"] +default_font = ExtResource("12_mrowi") +default_font_size = 32 + +[node name="CoverImage" type="Node2D" unique_id=1285750827] + +[node name="Background" type="Node2D" parent="." unique_id=382976582] +position = Vector2(-38, -7) + +[node name="WastelandSky" type="Sprite2D" parent="Background" unique_id=1922942125] +position = Vector2(180, 95) +texture = ExtResource("1_l17lw") + +[node name="WastelandMountains1" type="Sprite2D" parent="Background" unique_id=1209949268] +position = Vector2(138, 62) +texture = ExtResource("2_b23ne") + +[node name="Entity" parent="Background" unique_id=286688007 instance=ExtResource("3_opsoa")] +position = Vector2(198, 87) +scale = Vector2(0.5, 0.5) +autoplay = "" +frame = 6 +frame_progress = 0.0 + +[node name="WastelandMountains2" type="Sprite2D" parent="Background" unique_id=2120961228] +position = Vector2(254, 71) +texture = ExtResource("4_xcig8") + +[node name="2" type="Sprite2D" parent="Background" unique_id=1082590360] +position = Vector2(284, 72) +scale = Vector2(1.59375, 1.4333333) +texture = ExtResource("5_xfr73") + +[node name="3" type="Sprite2D" parent="Background" unique_id=975426812] +position = Vector2(-225, 72) +scale = Vector2(1.59375, 1.4333333) +texture = ExtResource("5_xfr73") + +[node name="1" type="Sprite2D" parent="Background/3" unique_id=1226169847] +position = Vector2(295.52942, -4.883728) +scale = Vector2(0.808, 0.9) +texture = ExtResource("6_l17lw") + +[node name="Sprite2D" type="Sprite2D" parent="Background" unique_id=1265321344] +position = Vector2(78, 119) +texture = SubResource("AtlasTexture_y3p1k") + +[node name="Forest2" type="TileMapLayer" parent="Background" unique_id=102740942] +position = Vector2(16, -31) +tile_set = ExtResource("7_7ck7r") + +[node name="Forest" type="TileMapLayer" parent="Background" unique_id=205145598] +position = Vector2(16, -31) +tile_map_data = PackedByteArray("AAD//wUAAQACAAYAAAD//wYAAQALAAMAAAAAAAUAAQADAAEAAAAAAAYAAQADAAcAAAAAAAcAAQACAAIAAAABAAYAAQAHAAYAAAABAAcAAQAMAAcAAAACAAYAAQAHAAYAAAACAAcAAQACAAIAAAADAAYAAQAHAAYAAAADAAcAAQAMAAcAAAAEAAYAAQAHAAYAAAAEAAcAAQACAAIAAAAFAAYAAQAHAAYAAAAFAAcAAQAMAAcAAAAGAAYAAQAMAAYAAAAGAAcAAQAHAAcAAAAHAAYAAQAHAAYAAAAHAAcAAQAHAAcAAAAIAAYAAQAHAAYAAAAIAAcAAQAMAAcAAAAJAAYAAQAHAAYAAAAJAAcAAQACAAIAAAAKAAYAAQAHAAYAAAAKAAcAAQAHAAcAAAALAAYAAQAHAAYAAAALAAcAAQAHAAcAAAAMAAYAAQAHAAYAAAAMAAcAAQACAAIAAAA=") +tile_set = ExtResource("7_7ck7r") + +[node name="Sprite2D3" type="Sprite2D" parent="Background" unique_id=1912122831] +position = Vector2(182, 149) +texture = SubResource("AtlasTexture_suu1v") + +[node name="Sprite2D2" type="Sprite2D" parent="Background" unique_id=1296032350] +position = Vector2(238, 148) +texture = SubResource("AtlasTexture_iueyi") + +[node name="Sprite2D6" type="Sprite2D" parent="Background" unique_id=696788444] +position = Vector2(80, 149) +texture = SubResource("AtlasTexture_blvfw") + +[node name="Sprite2D7" type="Sprite2D" parent="Background" unique_id=347865985] +position = Vector2(334, 150) +texture = SubResource("AtlasTexture_blvfw") + +[node name="PlayerSprite" type="AnimatedSprite2D" parent="." unique_id=338546137] +position = Vector2(88, 164) +sprite_frames = SubResource("SpriteFrames_tasn5") +animation = &"player_idle" +offset = Vector2(0, -40) + +[node name="SamuraiDemonSprite" type="AnimatedSprite2D" parent="." unique_id=1118559142] +position = Vector2(248, 155) +sprite_frames = SubResource("SpriteFrames_3fgd8") +offset = Vector2(0, -40) +flip_h = true + +[node name="ColorRect" type="ColorRect" parent="." unique_id=5233176] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_bottom = 10.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 0.34509805) + +[node name="Title" type="Label" parent="." unique_id=1408027648] +anchors_preset = 10 +anchor_right = 1.0 +offset_left = 88.0 +offset_top = 12.0 +offset_right = 232.0 +offset_bottom = 46.0 +grow_horizontal = 2 +theme = SubResource("Theme_38nrg") +theme_override_colors/font_shadow_color = Color(0, 0, 0, 0) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 1 +theme_override_constants/shadow_outline_size = 50 +text = "OMEN'S ASCENT" +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/scenes/levels/test_map.tscn b/scenes/levels/test_map.tscn index 8221422..20806e3 100644 --- a/scenes/levels/test_map.tscn +++ b/scenes/levels/test_map.tscn @@ -5,9 +5,9 @@ [ext_resource type="TileSet" uid="uid://6ltrd6lvydrw" path="res://ressources/forest_tileset.tres" id="1_ymjof"] [ext_resource type="PackedScene" uid="uid://kfcguhpc7lvd" path="res://scenes/actors/player.tscn" id="2_s11cq"] [ext_resource type="PackedScene" uid="uid://51vdlyyqiph" path="res://scenes/components/checkpoint.tscn" id="3_puiec"] -[ext_resource type="PackedScene" uid="uid://cr7ibxkl174o1" path="res://scenes/actors/Creeper.tscn" id="3_ymjof"] [ext_resource type="PackedScene" uid="uid://3bhkncvwd7fa" path="res://scenes/ui/player_hud.tscn" id="4_hud"] [ext_resource type="PackedScene" uid="uid://dero2u4tw7mma" path="res://scenes/components/spikes.tscn" id="8_jw8yd"] +[ext_resource type="PackedScene" uid="uid://mh87kxbf8qfg" path="res://scenes/actors/morph_demon.tscn" id="9_x2ch1"] [node name="TestMap" type="Node2D" unique_id=935270288] @@ -30,19 +30,24 @@ position = Vector2(-54, 97) tile_map_data = PackedByteArray("AAAMAAQAAQAHAAcAAAALAAQAAQAHAAcAAAAKAAQAAQACAAIAAAAJAAQAAQAMAAcAAAAIAAQAAQAHAAcAAAAHAAQAAQAHAAcAAAAGAAQAAQAMAAcAAAAFAAQAAQACAAIAAAAEAAQAAQAMAAcAAAADAAQAAQACAAIAAAACAAQAAQAMAAcAAAABAAQAAQALAAIAAAANAAUAAQACAAIAAAANAAQAAQADAAIAAAAMAAUAAQAMAAcAAAALAAUAAQAMAAcAAAAKAAUAAQAMAAcAAAAJAAUAAQACAAIAAAAIAAUAAQAMAAcAAAAHAAUAAQACAAIAAAAGAAUAAQAMAAcAAAAFAAUAAQACAAIAAAAEAAUAAQAHAAcAAAADAAUAAQAMAAcAAAACAAUAAQACAAIAAAABAAUAAQAGAAcAAAAMAAYAAQAIAAIAAAALAAYAAQAEAAIAAAANAAMAAQAMAAEAAAAMAAMAAQALAAEAAAALAAMAAQAMAAEAAAAKAAMAAQAHAAYAAAAJAAMAAQAHAAYAAAAIAAMAAQAHAAYAAAAHAAMAAQAMAAYAAAAGAAMAAQACAAEAAAAFAAMAAQAHAAYAAAAEAAMAAQALAAEAAAADAAMAAQAMAAEAAAACAAMAAQALAAEAAAABAAMAAQANAAgAAAAQAP//AQAEAAQAAAABAAIAAQADAAEAAAAAAAIAAQACAAYAAAAOAAMAAQAIAAYAAAAOAAIAAQAGAAEAAAAAAAMAAQALAAMAAAD//wMAAQAMAAEAAAD+/wMAAQAHAAEAAAD9/wMAAQAHAAMAAAAOAAAAAQAEAAQAAAAFAAEAAQABAAEAAAAFAAIAAQAGAAcAAAAGAAEAAQACAAEAAAAGAAIAAQAHAAcAAAAHAAEAAQADAAYAAAAHAAIAAQANAAcAAAAEAPv/AQAKAAgAAAAFAPv/AQACAAQAAAAGAPv/AQAEAAcAAAA=") tile_set = ExtResource("1_ymjof") -[node name="Creeper" parent="." unique_id=1458442942 instance=ExtResource("3_ymjof")] -position = Vector2(420, 93) -scale = Vector2(1.2, 1.2) - -[node name="Creeper2" parent="." unique_id=1242456659 instance=ExtResource("3_ymjof")] -position = Vector2(72.00003, 92) -scale = Vector2(1.2, 1.2) - [node name="Player" parent="." unique_id=1267310378 instance=ExtResource("2_s11cq")] position = Vector2(228, 34) -[node name="PlayerHUD" parent="." unique_id=1690690477 instance=ExtResource("4_hud")] +[node name="Camera2D2" type="Camera2D" parent="Player" unique_id=1105742075] +offset = Vector2(0, -40) +zoom = Vector2(0.8, 0.8) +limit_enabled = false +limit_left = 0 +limit_top = -750 +limit_right = 1500 +limit_bottom = 40 +position_smoothing_enabled = true + +[node name="HUD" parent="Player" unique_id=409721474 instance=ExtResource("4_hud")] [node name="Spikes" parent="." unique_id=71118229 instance=ExtResource("8_jw8yd")] position = Vector2(655, -80) orientation = 1 + +[node name="MorphDemon" parent="." unique_id=1564137690 instance=ExtResource("9_x2ch1")] +position = Vector2(93, 95.00001) diff --git a/scenes/ui/boss_spawn.tscn b/scenes/ui/boss_spawn.tscn new file mode 100644 index 0000000..a2a7668 --- /dev/null +++ b/scenes/ui/boss_spawn.tscn @@ -0,0 +1,99 @@ +[gd_scene format=3 uid="uid://y0jdxxfvduy5"] + +[ext_resource type="Texture2D" uid="uid://bbkpcde2m13to" path="res://assets/images/ui/boss_spawn.png" id="1_x012g"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_l7xf0"] +atlas = ExtResource("1_x012g") +region = Rect2(0, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_dkjtp"] +atlas = ExtResource("1_x012g") +region = Rect2(32, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_66wys"] +atlas = ExtResource("1_x012g") +region = Rect2(64, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_nsk55"] +atlas = ExtResource("1_x012g") +region = Rect2(96, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_dst3x"] +atlas = ExtResource("1_x012g") +region = Rect2(128, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_s8clg"] +atlas = ExtResource("1_x012g") +region = Rect2(160, 0, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_b0bc2"] +atlas = ExtResource("1_x012g") +region = Rect2(0, 32, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3tma4"] +atlas = ExtResource("1_x012g") +region = Rect2(32, 32, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_uf83g"] +atlas = ExtResource("1_x012g") +region = Rect2(64, 32, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_a110b"] +atlas = ExtResource("1_x012g") +region = Rect2(96, 32, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tq3v6"] +atlas = ExtResource("1_x012g") +region = Rect2(128, 32, 32, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_yhjmf"] +atlas = ExtResource("1_x012g") +region = Rect2(160, 32, 32, 32) + +[sub_resource type="SpriteFrames" id="SpriteFrames_uvqlf"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_l7xf0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_dkjtp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_66wys") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nsk55") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_dst3x") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_s8clg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_b0bc2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3tma4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_uf83g") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_a110b") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tq3v6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_yhjmf") +}], +"loop": 1, +"name": &"default", +"speed": 10.0 +}] + +[node name="BossSpawn" type="AnimatedSprite2D" unique_id=355187649] +sprite_frames = SubResource("SpriteFrames_uvqlf") +frame_progress = 0.023074534 diff --git a/scenes/ui/player_hud.tscn b/scenes/ui/player_hud.tscn index 5382644..43d47ce 100644 --- a/scenes/ui/player_hud.tscn +++ b/scenes/ui/player_hud.tscn @@ -1,16 +1,48 @@ [gd_scene format=3 uid="uid://3bhkncvwd7fa"] [ext_resource type="Script" uid="uid://tpvkmorh4l0h" path="res://scenes/ui/player_hud.gd" id="1_e6e0b"] +[ext_resource type="FontFile" uid="uid://bi5xxc24a1ll5" path="res://assets/fonts/small_pixel_font.ttf" id="2_31ty4"] + +[sub_resource type="Theme" id="Theme_uvqlf"] +default_font = ExtResource("2_31ty4") +default_font_size = 8 [node name="HUD" type="CanvasLayer" unique_id=409721474] script = ExtResource("1_e6e0b") [node name="MarginContainer" type="MarginContainer" parent="." unique_id=1834189152] -offset_left = 8.0 -offset_top = 3.0 -offset_right = 8.0 -offset_bottom = 3.0 [node name="HeartsContainer" type="HBoxContainer" parent="MarginContainer" unique_id=315711027] layout_mode = 2 theme_override_constants/separation = 1 + +[node name="Commands" type="VBoxContainer" parent="." unique_id=1248168345] +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -123.0 +offset_top = -21.0 +offset_right = -3.0 +offset_bottom = -3.0 +grow_horizontal = 0 +grow_vertical = 0 + +[node name="Dash" type="Label" parent="Commands" unique_id=1846770918] +layout_mode = 2 +theme = SubResource("Theme_uvqlf") +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/line_spacing = 0 +theme_override_constants/outline_size = 2 +theme_override_constants/shadow_outline_size = 5 +text = "[SHIFT] to dash" + +[node name="Parry" type="Label" parent="Commands" unique_id=738014683] +layout_mode = 2 +theme = SubResource("Theme_uvqlf") +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/line_spacing = 0 +theme_override_constants/outline_size = 2 +theme_override_constants/shadow_outline_size = 5 +text = "[L] to parry" diff --git a/scripts/autoloads/audio_manager.gd b/scripts/autoloads/audio_manager.gd index bc4214d..6115d3c 100644 --- a/scripts/autoloads/audio_manager.gd +++ b/scripts/autoloads/audio_manager.gd @@ -1,17 +1,31 @@ extends Node -const AMBIANCE_VOLUME_DB: float = -12.0 -const SFX_VOLUME_DB: float = -8.0 +# Will need to be able to adapt volume as it can be too loud +const AMBIANCE_VOLUME_DB: float = -18.0 +const SFX_VOLUME_DB: float = -12.0 const AMBIANCES: Dictionary = { + "act1_section1": preload("res://assets/audio/music/a_warriors_path.ogg"), + "act2_floor1": preload("res://assets/audio/music/the_dungeon.ogg"), + "boss_arena": preload("res://assets/audio/music/the_red_death.ogg") +} + +const JINGLES: Dictionary = { + "success": preload("res://assets/audio/sfx/Jingles/Success.wav") } const SFX: Dictionary = { - "game_over": preload("res://assets/audio/sfx/Jingles/GameOver.wav"), + "game_over": preload("res://assets/audio/sfx/Jingles/GameOver.wav"), + "options_move": preload("res://assets/audio/sfx/Sounds/Move.wav"), + "jump": preload("res://assets/audio/sfx/Sounds/Jump.wav"), + "slash_1": preload("res://assets/audio/sfx/Sounds/Slash.wav"), + "heal": preload("res://assets/audio/sfx/Sounds/HeartBonus.wav"), + "door_unlock": preload("res://assets/audio/sfx/Sounds/door_unlocking.ogg"), } -var music_player : AudioStreamPlayer -var sfx_player : AudioStreamPlayer +var music_player : AudioStreamPlayer +var sfx_player : AudioStreamPlayer +var jingle_player : AudioStreamPlayer func _ready() -> void: process_mode = Node.PROCESS_MODE_ALWAYS @@ -29,6 +43,14 @@ func _ready() -> void: sfx_player.volume_db = SFX_VOLUME_DB add_child(sfx_player) sfx_player.process_mode = Node.PROCESS_MODE_ALWAYS + + jingle_player = AudioStreamPlayer.new() + jingle_player.name = "JinglePlayer" + jingle_player.bus = "Jingle" + jingle_player.volume_db = SFX_VOLUME_DB + add_child(jingle_player) + jingle_player.process_mode = Node.PROCESS_MODE_ALWAYS + music_player.finished.connect(_on_music_finished) func play_ambiance(zone: String) -> void: @@ -57,5 +79,9 @@ func play_sfx(sfx_name: String) -> void: sfx_player.stream = SFX[sfx_name] sfx_player.play() +func play_jingle(jingle_name) -> void: + jingle_player.stream = JINGLES[jingle_name] + jingle_player.play() + func _on_music_finished() -> void: music_player.play() diff --git a/scripts/autoloads/event_bus.gd b/scripts/autoloads/event_bus.gd index 06907cd..e609c2f 100644 --- a/scripts/autoloads/event_bus.gd +++ b/scripts/autoloads/event_bus.gd @@ -4,6 +4,7 @@ signal player_health_changed(new_value: int, max_value: int) signal player_died signal checkpoint_activated(position: Vector2) signal enemy_defeated +signal player_heal_requested(amount: int) var last_level_path: String = "" var has_checkpoint: bool = false diff --git a/scripts/autoloads/scene_manager.gd b/scripts/autoloads/scene_manager.gd index c802a9c..11e055a 100644 --- a/scripts/autoloads/scene_manager.gd +++ b/scripts/autoloads/scene_manager.gd @@ -3,10 +3,28 @@ extends Node signal scene_changed(scene_path: String) +const _LEVEL_MUSIC: Dictionary = { + "res://scenes/levels/act1_section1.tscn": "act1_section1", + "res://scenes/levels/act2_floor1.tscn": "act2_floor1", + "res://scenes/levels/boss_arena.tscn": "boss_arena" +} + +const _PLAYER_SPAWN: Dictionary = { + "res://scenes/levels/act1_section1.tscn": Vector2(301.0, -189.0), + "res://scenes/levels/act2_floor1.tscn": Vector2(50.0, -130), + "res://scenes/levels/boss_arena.tscn": Vector2(48.0, -192.0) +} + func change_scene(scene_path: String) -> void: var error: Error = get_tree().change_scene_to_file(scene_path) if error != OK: return + + if _PLAYER_SPAWN.has(scene_path): + EventBus.last_checkpoint_position = _PLAYER_SPAWN[scene_path] + EventBus.has_checkpoint = true + AudioManager.play_ambiance(_LEVEL_MUSIC[scene_path]) + scene_changed.emit(scene_path) func reload_current_scene() -> void: diff --git a/scripts/resources/.gitkeep b/scripts/resources/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/scripts/resources/credit_entry.gd b/scripts/resources/credit_entry.gd new file mode 100644 index 0000000..d739cda --- /dev/null +++ b/scripts/resources/credit_entry.gd @@ -0,0 +1,8 @@ +class_name CreditEntry +extends Resource + +@export var asset_name: String +@export var used_for: String +@export var artist_name: String +@export_multiline var license_note: String +@export var link_url: String diff --git a/scripts/resources/credit_entry.gd.uid b/scripts/resources/credit_entry.gd.uid new file mode 100644 index 0000000..f3a6f5c --- /dev/null +++ b/scripts/resources/credit_entry.gd.uid @@ -0,0 +1 @@ +uid://bule4gelyixkg diff --git a/scripts/utils/.gitkeep b/scripts/utils/.gitkeep deleted file mode 100644 index e69de29..0000000