From 0c0998cd054be1618024cd2f700b76bdc7847aa6 Mon Sep 17 00:00:00 2001 From: Elrinth Date: Tue, 13 Jan 2026 22:47:30 +0100 Subject: [PATCH] Added touchscreen controls! --- .../TouchScreenButtonControl.gd | 135 ++++ .../TouchScreenButtonControl.gd.uid | 1 + .../TouchScreenButtonControl.svg | 1 + .../TouchScreenButtonControl.svg.import | 43 ++ .../TouchScreenButtonControl.tscn | 6 + .../TouchScreenButtonControlPlugin.gd | 15 + .../TouchScreenButtonControlPlugin.gd.uid | 1 + .../button_style.tres | 13 + src/addons/touchscreenbuttoncontrol/icon.svg | 1 + .../touchscreenbuttoncontrol/icon.svg.import | 43 ++ .../touchscreenbuttoncontrol/plugin.cfg | 7 + src/addons/virtual_joystick/icon.svg | 1 + src/addons/virtual_joystick/icon.svg.import | 43 ++ src/addons/virtual_joystick/plugin.cfg | 8 + src/addons/virtual_joystick/plugin.gd | 11 + src/addons/virtual_joystick/plugin.gd.uid | 1 + .../resources/textures/joystick_texture_1.png | Bin 0 -> 59935 bytes .../textures/joystick_texture_1.png.import | 40 + .../resources/textures/joystick_texture_2.png | Bin 0 -> 79951 bytes .../textures/joystick_texture_2.png.import | 40 + .../resources/textures/joystick_texture_3.png | Bin 0 -> 7959 bytes .../textures/joystick_texture_3.png.import | 40 + .../resources/textures/joystick_texture_4.png | Bin 0 -> 63610 bytes .../textures/joystick_texture_4.png.import | 40 + .../resources/textures/joystick_texture_5.png | Bin 0 -> 8565 bytes .../textures/joystick_texture_5.png.import | 40 + .../resources/textures/joystick_texture_6.png | Bin 0 -> 68083 bytes .../textures/joystick_texture_6.png.import | 40 + .../resources/textures/stick_texture_1.png | Bin 0 -> 24811 bytes .../textures/stick_texture_1.png.import | 40 + .../resources/textures/stick_texture_2.png | Bin 0 -> 13993 bytes .../textures/stick_texture_2.png.import | 40 + .../resources/textures/stick_texture_3.png | Bin 0 -> 16680 bytes .../textures/stick_texture_3.png.import | 40 + .../resources/textures/stick_texture_4.png | Bin 0 -> 15561 bytes .../textures/stick_texture_4.png.import | 40 + .../resources/textures/stick_texture_5.png | Bin 0 -> 15995 bytes .../textures/stick_texture_5.png.import | 40 + .../resources/textures/stick_texture_6.png | Bin 0 -> 15881 bytes .../textures/stick_texture_6.png.import | 40 + .../virtual_joystick/virtual_joystick.gd | 496 +++++++++++++ .../virtual_joystick/virtual_joystick.gd.uid | 1 + src/export_presets.cfg | 50 ++ src/project.godot | 8 + src/scenes/chat_ui.tscn | 24 +- src/scenes/game_world.tscn | 4 - src/scenes/ingame_hud.tscn | 153 ++++ src/scenes/test.tscn | 20 + src/scripts/chat_ui.gd | 33 +- src/scripts/game_world.gd | 10 - src/scripts/inspiration_scripts/coin.gd | 161 ---- src/scripts/inspiration_scripts/coin.gd.uid | 1 - .../inspiration_scripts/dungeon_generator.gd | 617 ---------------- .../dungeon_generator.gd.uid | 1 - src/scripts/inspiration_scripts/inventory.gd | 491 ------------- .../inspiration_scripts/inventory.gd.uid | 1 - .../inspiration_scripts/inventory.tscn | 693 ------------------ .../inventory.tscn3980824984.tmp | 692 ----------------- src/scripts/inspiration_scripts/loot.gd | 167 ----- src/scripts/inspiration_scripts/loot.gd.uid | 1 - .../pot.tscn30323093389.tmp | 152 ---- src/scripts/mobile_input.gd | 56 ++ src/scripts/mobile_input.gd.uid | 1 + src/scripts/player.gd | 40 +- src/scripts/room_lighting_system.gd | 259 ------- 65 files changed, 1672 insertions(+), 3270 deletions(-) create mode 100644 src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.gd create mode 100644 src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.gd.uid create mode 100644 src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.svg create mode 100644 src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.svg.import create mode 100644 src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.tscn create mode 100644 src/addons/touchscreenbuttoncontrol/TouchScreenButtonControlPlugin.gd create mode 100644 src/addons/touchscreenbuttoncontrol/TouchScreenButtonControlPlugin.gd.uid create mode 100644 src/addons/touchscreenbuttoncontrol/button_style.tres create mode 100644 src/addons/touchscreenbuttoncontrol/icon.svg create mode 100644 src/addons/touchscreenbuttoncontrol/icon.svg.import create mode 100644 src/addons/touchscreenbuttoncontrol/plugin.cfg create mode 100644 src/addons/virtual_joystick/icon.svg create mode 100644 src/addons/virtual_joystick/icon.svg.import create mode 100644 src/addons/virtual_joystick/plugin.cfg create mode 100644 src/addons/virtual_joystick/plugin.gd create mode 100644 src/addons/virtual_joystick/plugin.gd.uid create mode 100644 src/addons/virtual_joystick/resources/textures/joystick_texture_1.png create mode 100644 src/addons/virtual_joystick/resources/textures/joystick_texture_1.png.import create mode 100644 src/addons/virtual_joystick/resources/textures/joystick_texture_2.png create mode 100644 src/addons/virtual_joystick/resources/textures/joystick_texture_2.png.import create mode 100644 src/addons/virtual_joystick/resources/textures/joystick_texture_3.png create mode 100644 src/addons/virtual_joystick/resources/textures/joystick_texture_3.png.import create mode 100644 src/addons/virtual_joystick/resources/textures/joystick_texture_4.png create mode 100644 src/addons/virtual_joystick/resources/textures/joystick_texture_4.png.import create mode 100644 src/addons/virtual_joystick/resources/textures/joystick_texture_5.png create mode 100644 src/addons/virtual_joystick/resources/textures/joystick_texture_5.png.import create mode 100644 src/addons/virtual_joystick/resources/textures/joystick_texture_6.png create mode 100644 src/addons/virtual_joystick/resources/textures/joystick_texture_6.png.import create mode 100644 src/addons/virtual_joystick/resources/textures/stick_texture_1.png create mode 100644 src/addons/virtual_joystick/resources/textures/stick_texture_1.png.import create mode 100644 src/addons/virtual_joystick/resources/textures/stick_texture_2.png create mode 100644 src/addons/virtual_joystick/resources/textures/stick_texture_2.png.import create mode 100644 src/addons/virtual_joystick/resources/textures/stick_texture_3.png create mode 100644 src/addons/virtual_joystick/resources/textures/stick_texture_3.png.import create mode 100644 src/addons/virtual_joystick/resources/textures/stick_texture_4.png create mode 100644 src/addons/virtual_joystick/resources/textures/stick_texture_4.png.import create mode 100644 src/addons/virtual_joystick/resources/textures/stick_texture_5.png create mode 100644 src/addons/virtual_joystick/resources/textures/stick_texture_5.png.import create mode 100644 src/addons/virtual_joystick/resources/textures/stick_texture_6.png create mode 100644 src/addons/virtual_joystick/resources/textures/stick_texture_6.png.import create mode 100644 src/addons/virtual_joystick/virtual_joystick.gd create mode 100644 src/addons/virtual_joystick/virtual_joystick.gd.uid create mode 100644 src/scenes/test.tscn delete mode 100644 src/scripts/inspiration_scripts/coin.gd delete mode 100644 src/scripts/inspiration_scripts/coin.gd.uid delete mode 100644 src/scripts/inspiration_scripts/dungeon_generator.gd delete mode 100644 src/scripts/inspiration_scripts/dungeon_generator.gd.uid delete mode 100644 src/scripts/inspiration_scripts/inventory.gd delete mode 100644 src/scripts/inspiration_scripts/inventory.gd.uid delete mode 100644 src/scripts/inspiration_scripts/inventory.tscn delete mode 100644 src/scripts/inspiration_scripts/inventory.tscn3980824984.tmp delete mode 100644 src/scripts/inspiration_scripts/loot.gd delete mode 100644 src/scripts/inspiration_scripts/loot.gd.uid delete mode 100644 src/scripts/inspiration_scripts/pot.tscn30323093389.tmp create mode 100644 src/scripts/mobile_input.gd create mode 100644 src/scripts/mobile_input.gd.uid delete mode 100644 src/scripts/room_lighting_system.gd diff --git a/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.gd b/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.gd new file mode 100644 index 0000000..0fdae28 --- /dev/null +++ b/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.gd @@ -0,0 +1,135 @@ +@tool +@icon("TouchScreenButtonControl.svg") +class_name TouchScreenButtonControl +extends TextureButton + +const DefaultValues := { + "expand": true, + "ignore_texture_size": true, + "stretch_mode": TextureButton.STRETCH_KEEP_ASPECT_CENTERED, + "action_mode": TextureButton.ACTION_MODE_BUTTON_PRESS, + "focus_mode": TextureButton.FOCUS_NONE, +} + +@export var use_default_values := true +@export var touchscreen_only := false + +# The actual variable that holds the data +var input_action: String = "" + +# 2. MATCHED the property name here... +func _get_property_list() -> Array: + var properties: Array = [] + + if Engine.is_editor_hint(): + InputMap.load_from_project_settings() + + # Get actions and format them for the dropdown + var actions = InputMap.get_actions() + var action_list = ",".join(actions) + + properties.append({ + "name": "input_action", + "type": TYPE_STRING, + "hint": PROPERTY_HINT_ENUM_SUGGESTION, + "hint_string": ",".join(actions), + "usage": PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_EDITOR + }) + + return properties + +func _set(property: StringName, value: Variant) -> bool: + if property == "input_action": + input_action = value + return true + return false + +func _get(property: StringName) -> Variant: + if property == "input_action": + return input_action + return null + +# Track multiple simultaneous touches for multitouch support +var active_touches := {} # Dictionary: touch_index -> bool (true if pressed) +var initial_press_touches := {} # Dictionary: touch_index -> bool (true if this button was pressed on initial touch) + +func _init(): + if use_default_values: + for k in DefaultValues.keys(): + self.set(k, DefaultValues.get(k)) + + # Set mouse_filter to IGNORE so the button doesn't consume touch events + # This allows multiple buttons to detect the same touch simultaneously + mouse_filter = Control.MOUSE_FILTER_IGNORE + + if touchscreen_only and not DisplayServer.is_touchscreen_available(): + hide() + +func press(): + var input_event: InputEvent = InputMap.action_get_events(input_action)[0] + input_event.pressed = true + Input.parse_input_event(input_event) + +func release(): + var input_event: InputEvent = InputMap.action_get_events(input_action)[0] + input_event.pressed = false + Input.parse_input_event(input_event) + +func is_in(pos: Vector2) -> bool: + # Get the global rect of this Control node in screen coordinates + var global_rect = get_global_rect() + # Check if the touch position is within the button's global rect + if pos.x >= global_rect.position.x and pos.x <= global_rect.position.x + global_rect.size.x: + if pos.y >= global_rect.position.y and pos.y <= global_rect.position.y + global_rect.size.y: + return true + return false + +func _input(event): + # Use _input to receive all touch events + # IMPORTANT: _input is called on ALL nodes in the scene tree, so multiple buttons + # can receive the same event. We don't consume the event so others can too. + if event is InputEventScreenTouch: + if event.pressed: + # Check if this touch is within this button's bounds + if is_in(event.position): + # Start tracking this touch for this button + if event.index not in active_touches: + active_touches[event.index] = true + initial_press_touches[event.index] = true # Mark as initial press + press() + else: + # Touch released - check if we were tracking it + if event.index in active_touches: + # This touch was being tracked by this button, release it + active_touches.erase(event.index) + initial_press_touches.erase(event.index) + # Only release the action if no other touches are active for this button + if active_touches.is_empty(): + release() + elif event is InputEventScreenDrag: + # Handle touch drag with smart re-activation logic + if event.index in active_touches: + # We're tracking this touch + if initial_press_touches.has(event.index): + # This was an initial press - keep it active even if touch moves outside + # Don't release until touch ends + pass + else: + # This was a re-activation (touch moved back into bounds) + # Check if touch moved back out of bounds + if not is_in(event.position): + # Touch moved out of bounds, release this re-activated button + active_touches.erase(event.index) + if active_touches.is_empty(): + release() + else: + # We're not tracking this touch - check if it moved into our bounds + # This allows "tapping" behavior - touch can re-enter and activate button + if is_in(event.position): + # Touch moved into bounds, start tracking (but not as initial press) + active_touches[event.index] = true + press() + + # CRITICAL: Never call get_viewport().set_input_as_handled() here + # This would prevent other buttons from receiving the same touch event + # mouse_filter is set to IGNORE so the TextureButton doesn't consume mouse/touch events diff --git a/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.gd.uid b/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.gd.uid new file mode 100644 index 0000000..37e884e --- /dev/null +++ b/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.gd.uid @@ -0,0 +1 @@ +uid://bh5a3ydiu51eo diff --git a/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.svg b/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.svg new file mode 100644 index 0000000..ed7c755 --- /dev/null +++ b/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.svg.import b/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.svg.import new file mode 100644 index 0000000..dc380c2 --- /dev/null +++ b/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ckvwnehwdvwyq" +path="res://.godot/imported/TouchScreenButtonControl.svg-ec8e7f48e271699010d76650daf1583d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/touchscreenbuttoncontrol/TouchScreenButtonControl.svg" +dest_files=["res://.godot/imported/TouchScreenButtonControl.svg-ec8e7f48e271699010d76650daf1583d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.tscn b/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.tscn new file mode 100644 index 0000000..95938ee --- /dev/null +++ b/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControl.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://dsj828xm2e28w"] + +[ext_resource type="Script" path="res://addons/touchscreenbuttoncontrol/TouchScreenButtonControl.gd" id="1_5k641"] + +[node name="TouchScreenButtonControl" type="TextureButton"] +script = ExtResource("1_5k641") diff --git a/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControlPlugin.gd b/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControlPlugin.gd new file mode 100644 index 0000000..d594c0e --- /dev/null +++ b/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControlPlugin.gd @@ -0,0 +1,15 @@ +@tool +extends EditorPlugin + +var MyCustomNode = preload("res://addons/touchscreenbuttoncontrol/TouchScreenButtonControl.gd") + +func _enter_tree(): + add_custom_type( + "TouchScreenButtonControl", + "Control", + TouchScreenButtonControl, + preload("res://addons/touchscreenbuttoncontrol/TouchScreenButtonControl.svg") + ) + +func _exit_tree(): + remove_custom_type("TouchScreenButtonControl") diff --git a/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControlPlugin.gd.uid b/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControlPlugin.gd.uid new file mode 100644 index 0000000..a9e0ed5 --- /dev/null +++ b/src/addons/touchscreenbuttoncontrol/TouchScreenButtonControlPlugin.gd.uid @@ -0,0 +1 @@ +uid://cq0bml8epsqa diff --git a/src/addons/touchscreenbuttoncontrol/button_style.tres b/src/addons/touchscreenbuttoncontrol/button_style.tres new file mode 100644 index 0000000..52a9a3f --- /dev/null +++ b/src/addons/touchscreenbuttoncontrol/button_style.tres @@ -0,0 +1,13 @@ +[gd_resource type="StyleBoxFlat" format=3 uid="uid://cv5o175a2677e"] + +[resource] +bg_color = Color(0.3, 0.3, 0.3, 0.7) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.8, 0.8, 0.8, 0.9) +corner_radius_top_left = 40 +corner_radius_top_right = 40 +corner_radius_bottom_right = 40 +corner_radius_bottom_left = 40 diff --git a/src/addons/touchscreenbuttoncontrol/icon.svg b/src/addons/touchscreenbuttoncontrol/icon.svg new file mode 100644 index 0000000..ed7c755 --- /dev/null +++ b/src/addons/touchscreenbuttoncontrol/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/addons/touchscreenbuttoncontrol/icon.svg.import b/src/addons/touchscreenbuttoncontrol/icon.svg.import new file mode 100644 index 0000000..1b95715 --- /dev/null +++ b/src/addons/touchscreenbuttoncontrol/icon.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://x5ggo5vlsqwn" +path="res://.godot/imported/icon.svg-e7770945a21c9fca528355bbf6b1708f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/touchscreenbuttoncontrol/icon.svg" +dest_files=["res://.godot/imported/icon.svg-e7770945a21c9fca528355bbf6b1708f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/src/addons/touchscreenbuttoncontrol/plugin.cfg b/src/addons/touchscreenbuttoncontrol/plugin.cfg new file mode 100644 index 0000000..faffc24 --- /dev/null +++ b/src/addons/touchscreenbuttoncontrol/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="TouchScreenButtonControl" +description="A Control Node version to TouchScreenButton2D" +author="Matata.exe" +version="1.0" +script="TouchScreenButtonControlPlugin.gd" diff --git a/src/addons/virtual_joystick/icon.svg b/src/addons/virtual_joystick/icon.svg new file mode 100644 index 0000000..bd9b8e1 --- /dev/null +++ b/src/addons/virtual_joystick/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/addons/virtual_joystick/icon.svg.import b/src/addons/virtual_joystick/icon.svg.import new file mode 100644 index 0000000..912cd8e --- /dev/null +++ b/src/addons/virtual_joystick/icon.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ndaordejurrl" +path="res://.godot/imported/icon.svg-3eaf29e1973fdc580c89279657f85e37.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/virtual_joystick/icon.svg" +dest_files=["res://.godot/imported/icon.svg-3eaf29e1973fdc580c89279657f85e37.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/src/addons/virtual_joystick/plugin.cfg b/src/addons/virtual_joystick/plugin.cfg new file mode 100644 index 0000000..f9cfc04 --- /dev/null +++ b/src/addons/virtual_joystick/plugin.cfg @@ -0,0 +1,8 @@ +[plugin] + +name="Virtual Joystick" +description="Virtual Joystick is a lightweight and fully configurable plugin that adds a virtual joystick to the screen, ideal for mobile games or touch-based interfaces. +With it, you can control player movement or any other input action using a simple, responsive, and customizable visual stick." +author="Saulo de Souza" +version="1.0.7" +script="plugin.gd" diff --git a/src/addons/virtual_joystick/plugin.gd b/src/addons/virtual_joystick/plugin.gd new file mode 100644 index 0000000..575cfe6 --- /dev/null +++ b/src/addons/virtual_joystick/plugin.gd @@ -0,0 +1,11 @@ +@tool +extends EditorPlugin + +var icon = preload("res://addons/virtual_joystick/icon.svg") +var script_main = preload("res://addons/virtual_joystick/virtual_joystick.gd") + +func _enter_tree(): + add_custom_type("VirtualJoystick", "Control", script_main, icon) + +func _exit_tree(): + remove_custom_type("VirtualJoystick") diff --git a/src/addons/virtual_joystick/plugin.gd.uid b/src/addons/virtual_joystick/plugin.gd.uid new file mode 100644 index 0000000..6403728 --- /dev/null +++ b/src/addons/virtual_joystick/plugin.gd.uid @@ -0,0 +1 @@ +uid://e7m2yqefj838 diff --git a/src/addons/virtual_joystick/resources/textures/joystick_texture_1.png b/src/addons/virtual_joystick/resources/textures/joystick_texture_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e5629812963db63ad427689b7a8b9a5a8975e492 GIT binary patch literal 59935 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

} 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%0A`$4zY$phi$q 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 z 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 literal 0 HcmV?d00001 diff --git a/src/addons/virtual_joystick/resources/textures/joystick_texture_3.png.import b/src/addons/virtual_joystick/resources/textures/joystick_texture_3.png.import new file mode 100644 index 0000000..5fbba47 --- /dev/null +++ b/src/addons/virtual_joystick/resources/textures/joystick_texture_3.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ct6r0wagtmapd" +path="res://.godot/imported/joystick_texture_3.png-d28d8fdffe3dd01bcd800f8da8ffad5c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/virtual_joystick/resources/textures/joystick_texture_3.png" +dest_files=["res://.godot/imported/joystick_texture_3.png-d28d8fdffe3dd01bcd800f8da8ffad5c.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/src/addons/virtual_joystick/resources/textures/joystick_texture_4.png b/src/addons/virtual_joystick/resources/textures/joystick_texture_4.png new file mode 100644 index 0000000000000000000000000000000000000000..54672be5baeac0f6a336de3aa25d771d40ca3ab4 GIT binary patch literal 63610 zcmX7PXH-+q*Y!;x^rq4U#D>yQdJiaq^j<>CPozul0U>~bf(X*3h87_75_$<1dau$^ zgaDyKq{GYqc|Xj$>z=h{?mB1gnK`rfo{zfPsQ~&_bzEpdz4*($J|1}D-Ys=FL zZ20wq(p}BW3jnBZ{jY(5v<%j3Bgji%RT(HBCLN*Xp(`OC z{6&TO;EATxWwP5)ca`Xn{Lvhnxowh7;_H&q>Ov{^;CWx@2SMO~K$ocVt0z&E?gud2 zez2wE0$DJkqe^+3lG2;6A(KWJM(+1Kr`{)LY2j

Us;h*~n+x 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 A`2YX_ literal 0 HcmV?d00001 diff --git a/src/addons/virtual_joystick/resources/textures/joystick_texture_4.png.import b/src/addons/virtual_joystick/resources/textures/joystick_texture_4.png.import new file mode 100644 index 0000000..a33562b --- /dev/null +++ b/src/addons/virtual_joystick/resources/textures/joystick_texture_4.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://rxah3fc1lih3" +path="res://.godot/imported/joystick_texture_4.png-288403f1a78edebf82b0917d63d71545.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/virtual_joystick/resources/textures/joystick_texture_4.png" +dest_files=["res://.godot/imported/joystick_texture_4.png-288403f1a78edebf82b0917d63d71545.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/src/addons/virtual_joystick/resources/textures/joystick_texture_5.png b/src/addons/virtual_joystick/resources/textures/joystick_texture_5.png new file mode 100644 index 0000000000000000000000000000000000000000..5afe13cb6a06fc9440dfd0134f650f74a3438da1 GIT binary patch literal 8565 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 L5w7@>UBv$bZ{b6Z literal 0 HcmV?d00001 diff --git a/src/addons/virtual_joystick/resources/textures/joystick_texture_5.png.import b/src/addons/virtual_joystick/resources/textures/joystick_texture_5.png.import new file mode 100644 index 0000000..313700d --- /dev/null +++ b/src/addons/virtual_joystick/resources/textures/joystick_texture_5.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://01qhightlcso" +path="res://.godot/imported/joystick_texture_5.png-b4d7bb661b1dfa9d44580770afad2948.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/virtual_joystick/resources/textures/joystick_texture_5.png" +dest_files=["res://.godot/imported/joystick_texture_5.png-b4d7bb661b1dfa9d44580770afad2948.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/src/addons/virtual_joystick/resources/textures/joystick_texture_6.png b/src/addons/virtual_joystick/resources/textures/joystick_texture_6.png new file mode 100644 index 0000000000000000000000000000000000000000..8f1b90f446473ff7f66671b27ecf2d07ccc5b0a0 GIT binary patch literal 68083 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«n3IN_N**fTAz%9#(tE+v`^IA$3$=ZkO?S@z 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�U)MJlIMQ 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 literal 0 HcmV?d00001 diff --git a/src/addons/virtual_joystick/resources/textures/joystick_texture_6.png.import b/src/addons/virtual_joystick/resources/textures/joystick_texture_6.png.import new file mode 100644 index 0000000..5bff998 --- /dev/null +++ b/src/addons/virtual_joystick/resources/textures/joystick_texture_6.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://don118m3unno4" +path="res://.godot/imported/joystick_texture_6.png-2b34481992ebc7f5529547a31713f9e4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/virtual_joystick/resources/textures/joystick_texture_6.png" +dest_files=["res://.godot/imported/joystick_texture_6.png-2b34481992ebc7f5529547a31713f9e4.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/src/addons/virtual_joystick/resources/textures/stick_texture_1.png b/src/addons/virtual_joystick/resources/textures/stick_texture_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e486508222ff84719408e3681973b648fe79cadc GIT binary patch literal 24811 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 literal 0 HcmV?d00001 diff --git a/src/addons/virtual_joystick/resources/textures/stick_texture_1.png.import b/src/addons/virtual_joystick/resources/textures/stick_texture_1.png.import new file mode 100644 index 0000000..fcd1e16 --- /dev/null +++ b/src/addons/virtual_joystick/resources/textures/stick_texture_1.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dv7m8ofd7vjkg" +path="res://.godot/imported/stick_texture_1.png-b7322c6c9fa9ceca47042e9525a31e3d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/virtual_joystick/resources/textures/stick_texture_1.png" +dest_files=["res://.godot/imported/stick_texture_1.png-b7322c6c9fa9ceca47042e9525a31e3d.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/src/addons/virtual_joystick/resources/textures/stick_texture_2.png b/src/addons/virtual_joystick/resources/textures/stick_texture_2.png new file mode 100644 index 0000000000000000000000000000000000000000..8b6826f8c323fbce99ef04c52372647a7ae5bbc5 GIT binary patch literal 13993 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 P00000NkvXXu0mjf7@$4j literal 0 HcmV?d00001 diff --git a/src/addons/virtual_joystick/resources/textures/stick_texture_2.png.import b/src/addons/virtual_joystick/resources/textures/stick_texture_2.png.import new file mode 100644 index 0000000..57f7c8c --- /dev/null +++ b/src/addons/virtual_joystick/resources/textures/stick_texture_2.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bra3aeybagspi" +path="res://.godot/imported/stick_texture_2.png-56a0dc5972515a4c813acb0018d59897.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/virtual_joystick/resources/textures/stick_texture_2.png" +dest_files=["res://.godot/imported/stick_texture_2.png-56a0dc5972515a4c813acb0018d59897.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/src/addons/virtual_joystick/resources/textures/stick_texture_3.png b/src/addons/virtual_joystick/resources/textures/stick_texture_3.png new file mode 100644 index 0000000000000000000000000000000000000000..fa345e59ed58447ec5bba4309805e4a9b040469a GIT binary patch literal 16680 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

|J{l#f`uj)x%** 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 D!ppwF literal 0 HcmV?d00001 diff --git a/src/addons/virtual_joystick/resources/textures/stick_texture_3.png.import b/src/addons/virtual_joystick/resources/textures/stick_texture_3.png.import new file mode 100644 index 0000000..3f16d56 --- /dev/null +++ b/src/addons/virtual_joystick/resources/textures/stick_texture_3.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b76m3oio3bpve" +path="res://.godot/imported/stick_texture_3.png-ac8c0e09219e9294012c766efb28a6dd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/virtual_joystick/resources/textures/stick_texture_3.png" +dest_files=["res://.godot/imported/stick_texture_3.png-ac8c0e09219e9294012c766efb28a6dd.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/src/addons/virtual_joystick/resources/textures/stick_texture_4.png b/src/addons/virtual_joystick/resources/textures/stick_texture_4.png new file mode 100644 index 0000000000000000000000000000000000000000..3b13e51817675536435f5f1bca3241f432b27509 GIT binary patch literal 15561 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

ORi1XU|se+?*P2 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 literal 0 HcmV?d00001 diff --git a/src/addons/virtual_joystick/resources/textures/stick_texture_4.png.import b/src/addons/virtual_joystick/resources/textures/stick_texture_4.png.import new file mode 100644 index 0000000..2b9e125 --- /dev/null +++ b/src/addons/virtual_joystick/resources/textures/stick_texture_4.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dt4ujdvuod0ei" +path="res://.godot/imported/stick_texture_4.png-ea228bad22a241c375a4eb387cc66da7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/virtual_joystick/resources/textures/stick_texture_4.png" +dest_files=["res://.godot/imported/stick_texture_4.png-ea228bad22a241c375a4eb387cc66da7.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/src/addons/virtual_joystick/resources/textures/stick_texture_5.png b/src/addons/virtual_joystick/resources/textures/stick_texture_5.png new file mode 100644 index 0000000000000000000000000000000000000000..a2fec7a11043ed9ebe268d749cb03baff86495b8 GIT binary patch literal 15995 zcmV->K7_%EP)41^@s6P>A$*00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yP1IKeZ5G4g@p-$Nbob_9WwpByHr`V1R7A2_l=_#B4T>fJt_ClYvQgCRwCS zW*r$e8X}sByvbTRV35JbG()vj4OD*B|obS8$)~)|~ z>iw&__r~xiGHGRHW%=ftZ+_rg-}=_-=H}*d4tg-gcqso?{<>p24%4 zFCSl8S`siG%E#J2`Mv;804HIJ%Bc4a9XceSOcyR(;66D^B4?XnI>VX3Xj^)#%8GOewSe6A`TbQdFT*z-u^T36F4&+%sg5rwq&}!2INsPlkJPyJiM)^;|Jq;+Cwp>Qa6P)(`S; zEuX%6>C&aOZ-V&0VS%Y&%%?xiT=DUIJgnG=TU6ufxe+$vmc&&Dy7ksu)17zTIRNwX z&p!`YcN~xgcpQmv0N!vJ%2+5cF%2KH*#AX7|G#I?o;?|EP`crO`S8OJ3uk;XgYoIG z;EWX^$QkL_#0emd0mUg4&IXk3y6dj^?Qeg35anY0WIZ!5AQgam%_1EDSvjS0T??S) zd?V|mujJ#&4AM8k4MaBtFbj7)A)-289?zhZ;8Z|Z^+W(70xUszg!_y@MZJ zz-t-GrS)DuHhF}CYdJ?9RRNmMPv$hIGDz3MbxPMIFg-wKO6uZKfEpkTg`)#AqA!YDeIXvKN8V;&YZFyQN)+91mZiQ9txZ^&`-io<-_yuyz|Zn z;X0%13YZAU{1g2#0r&)PkpLM=oCxB*v91Gv*|=W;h~i#>Dd~0`5baEbAPKxPI7BRmbt`oX0fGL2?BJ-zNpZjUPJggiK zLFoN7UT{Ra3>G$* z=*JO+at}my<$Ms%0IUFG{ZlC}9POCjNaO>%9Ll@njyq})15?97E3zvXQ*y2H#?XQD zCT;<~6~ECxQ)?ulh~L-ZeP04IuU(5%{P}z;ONB|fVFA_vHr6LS5grX6CUC@Zh?WE0 zve<`k`O5~+;JfSrGcNShhARdV;pLtw)=_s1WcZNCZuC;%o{6|;1W=0~^!eZX<~J{e zeMb8Vn8GEq9{F_hzNWtwi}BZI4{8TJ8Pb6|?aoh{qva;H2i97qU2SUDd8 z&Eb}wv6CR)NY_+~V*{zVA41*G5v87D^wb*#aOcmTAGJ?_DcoO0F{a^jC&YauJuNdYYNO_;JhA-#f@Mjz*Wxah;&}rsn^UU0hE)g zKnzR`S4$j8t~WNuV<~a7K8i~|mLX&UwSY?FG@#RX2FMtQjf#K^Z#xA2~HAhI(q_L4>>6R#>>yjqN0bn+qvz%|_<1=~H=#_8{=%#QD z=+Q?XeJ+c`f69Y&P{f=Lw1QKv)v!?D0XQ{oA`Tl%+7ai?c}2*(mVxQ047B_k@FOUN z@VqQTjwnw+X^-X`wH*=kXey^p8fZ)OCQ%5Xxfd4_grx-fdxt~tC#NXUe|`7ecZZKY z`sj^tmFcPj^RdSs`-j}%zeUiL<4BB`K}!VIq(CcaqXkR=XdPe+lu#ZTTLX|n%aN@C zY%F~bm~v0n(8gqHm92Gd0p*EEVjF-MBN;mdgpJc2t@Wh|H&O`p&Z0HRBbI(P&f-?8}DuA-e z5JU6^L+7lbUXCEPBZ_$v(F$%oBGB1+J{-zr0}j2fb?uQS%7vtUD$YYOdh{Hw1JrBe zX9W(A(j&%pX|`d&(NGHl=$6z6cz-mBa~1E+?ynyoIdbH+EZX-JoO{YK!5#Dff(^J| z)fWMoG6!4L{{T@{?;J-B7IQ z^k{Kv7V#J!7VaR=d9GsE^I=vFn(LpH5z=Tq7dN(!_hy6c-t6amHS99& zIxvf$@&t3mrG?M30iwl06==*I$w*?gAo4)s05Ip)usJj(hIf;^azHw$!BmrII%pRH zP$z0LX+vvVX&HKN==an`ZUNZ1M3zv%kC+oInRb&pk0wq#Vz#z^Y1W=Szf1RkVdk~V{G-(0GlQVjFv$#+FOa%Zge=92SyCH zbX!d?=W2jx7@niyfcInU>#=iHh)x~}t#LATlDdJ=03ze2I@#5j!fSBC56AqImx29o zHy#(hVqmUpxrKg}2WQ0qWQwggM`LFs&VdVXyoli;*e)QCGbP8W_PCK4TVQaF;^Dbv z=vZ+$oPV6AS6{15M)~F{5?k1Y`E>5D;DMV-+%vq%boLM z62-VO6Af`3tZ+>aVt!zM$YHT;5K)1`UB6;9M5LVS%8a~OLyowq!~%}RmGM62?SYq# zG0fMaNTS@~md&=h7+dR_`T+ZIu7FTBR0t3~ZZ^dQRi}(II3_M-ZWr`cetg~|OXU$l z5!?~sqjMG6DAElFyd2Nvu}bgb>Ag%eyA z_^oA-Vm%sl8eQW6%kwwo8JsSdkUW4`_oJZ$THv(GvC8z?!C`ofN4*uo=&f@BboH7~ zne;;%?fX*iVSHdRrV=M&yGq$Q5#)WOFX!X&umjqWD9^5;XLF_gW~p7x@f_xfe2$e9 zS}QupWqGzoMfr9cnajxrn(po~xny#TnYkj|iaQ5^BK`k`ZPK=ZSw#51FL#Q(c%N> znyIZU`ZXhkH{1Ba0=$2b{hR+M8$;tqNISF?wn-T{&*j7NQo9eZF?@&{28xq9=M7WT zPEk;nbGPG_RBY?Jg{H)@5^r?Scnk!s7S^(KP_;NE0IUn;g^X=}Nd z)vZWOMw!LvN6aL}_IWJX>vuA2leWb%^OECB>bKRz;$=a#2}2svB?JrOC| z`eO*e-B=x!)9Nth-^!6AN8ZR>b3M$Y?Q+cL;z9=uIFqD;FiR>Rm&WVi%?!hIfkcGI zRrsEga7h6r8aH!6868n;an31@YH`cp)Y&2{oe*vYMnZ1v<;7tkjC_z57fkvKA)s_@ z#?(kxnGl4(ypk7V!c3aYF~9%)??0ChPm<0!RNeq!WUd;=8#@}qr*w=7O1;+3(`)1~ zqDzWDvd3{SAI_Jr8LU>^UU(0Hb0*7n%CN*U)*r8_O{gj*x`&*xO0Y0px6!jprJTcA zihc3XM<1<)88i!+V({d{iy45+IvZ%VL=eZ(F>2zH{S0}{qcpy>HAM!MoU{K>j{2aN z#RWSYV|3jEaZ3HozE=F+{i*nK^Wu2cghHY|L9Q0zIxeC&ZYRteE&N!(-Na2)@qD?O z$LgOqHa7f+qYBLu8jBa!gx)$YzQz#rjp#3^kU%X zJC9hbvdH87<{UYF&xpZzT&5Mq=e>GjIE#4Bt9;MWB%I{I=p(&{#`(mN~HCJhN*9IX=%wFfM^&j z7B}&@p~o3HZJMDb%;A7Nj@O$oR$QI9LNVIDQfxEEg=6F6R1sayn{f+a@#H7m<2Bxq9C>~hR(P&~av z&Tj-^bRMD5*|O9+*JEt;O6-*60j1op9V|L!4;(#C#c8ZTRPs3J6bH8Md0cu9*JIA? zwbd$9+xO*{Uz%-T(&yiye{j6feyB%2kF9QsV~+8L&*Fp*b%B{X{{ZePE3Hvnw6HrVGrn%CmypP7Bn+Lg9R5fTYeWLSNaC zR<}@LhgsXi#77z9*ckGF!(o921h2j06c{jV>%Ld!R9x%1a{fsiwAQ&E+MlXY z0f-VGhiO2 zZE&k1=0;-E0_og*t>c`yJs&TsMAoJa7U|p;J&Jl&+PzrufH4Fq*z^%GuO=SJ$W6j@PYhT2S=BgV$p0@I9R2R(NmVxeSYwS@#u`J-1RyebL*i zi?y?f>(pB?(CY{yIg);>Kl#oj=gkDKj2Q^VypfU!x)P58SzoN6VUVYIXiTnY0<*AK zHg@OBH%Y&mOXVu5tdlIID_2pR!1v(^(~>x*O& zI;-ybDPp`SL_1cAE6a`NXGoGGI#sXa4ofq+9g~%ZrAlyJdxJg&KCf;TN1mIv)uzzt z537wT(!EI{q_0yfR8fYOH;lXKP70xJ6sc+fgb9i3=qR^q1k7CMlTcs;P8eX8R0lc~ zI#Pn+H_SGzl+IR*8|k_17GloEor{C&<%4m1nzmK+Yw<$39>cwV_ooA6Ru zD=toaWh`a*6M|5}Ed!U%Q#6dAlI1Fk^9Gn%DLx9ot2Lzs{=|TUS&s|$Rq;*GYWj}% z2sDy~`YbI#^*9sehu2md9ss^Zpjc{0FMTi1xs$Co3A`{)YsKfbu_0vT%PT@UPC{yb z$a(a2O$Mt zO-%yeFq8G=Fso0zdV6g_$zzpofz#S1hjEIbicF_+LA{QoPa1|VKAn(CU6J!XiRCje zkKqMnis7{a7!R&1H%*J4jHqy1ov7Th2b?*;z-y$b`xw>(YHy&eGQIL+^dBL%0N!f{ z0?lg!_Bj&jnhbITCsK_5myLDYv8<)VBRG}8A@d3zF!K_myq5Zbun^TMf~_USrVyxX zqX^@D@rh~UAgpPuKKIR?g!wZ7b_!VQ+5?v-%IAX6n*jW?^weISy~$&h$Nh)pvHOVQ z;%ZQ#NKC6SioggOu1kW^zE8M!=%I%mTGhZMDCL+Oz*pIz8jx*??Pd*}W~GYphz++o zSRN+h`y5BFnXG}ffHO6)JrG)xW~y8(9=mU>w)C#8_zW~I*K0EZ)0+f(O@7TG82r}A zjH)|P2-ef&_DmNx0?`J&u9-moXf1%>_P3?jikt5L9Qh3RuCJ%RZ(Nhgyh! z8Man?cov|p*(kM<);u9BF<5aXatCT>2{7?GIa~(gu%kK7Febb@;8ELz`CxslFOz5FF*3gBM-=lE?BM@ zthf?7QUSP;wn5c;2B$GzCzWq3b_d$h%c7yob3Q%rS%b-CdIQwU*UP`hX+2Q!WMG;C zDCcLDk9qO_SSEHY89>zV>KZ~3PHC+TAjjo=Ktu-EQH-w{QUN19Q@JM=6c)x#tzeI1 z3aJ>k?kgws((?5jfLLj{JUlYcwGX&lj*sC&z1=}xy*Y2|zLlP@v2MLdCBVb?hH`$+ zvQ}jb=Jgra&AsKZYPIwoQiY{z8I@Nmv z#nj_=(b36z0MK|C?hUY4e(#=F9s`d-fpv);z1Yg%yJv+rfj}1M|okZJTX}q z6M9<^bk#DC3zblTk-|a?s9d*PKQ0#)n3^}ESu@3JJYt-<&@*e{EMB?8^<@P-6Jtkd z_dtmE_&7Cy-ZcW+%7f$0$rs7uqI&FcJ)U@+)|-f48?`QSF3d#7#i?_BiJI06!3SX# zoCYaQG`_w-Z2;y{*|@Q6uwJZuDjDgo7ET4=`EcZ|{M=dAYXULe94?CSJdn=Wfn=54 z+xF(wfy1^F-@4c93onhOlTP)Yo?AXmoCshuB)|r$d5DpS_=&AS6haGJiL<=2va)<2 z7xK7OS>%4m5yJwU3u~uUUMowNFt*~jL)3Q(Y26OBxG2vhR28i9Fdm0nAmQ}AxKm|v zdKgHz-rOG+XJ*UZ;xAs?7<9@pWAxuMkGiC0gGUM<7Hvx2i6lfqF018dn`1?Qxm@(b z#)^V#&ZuGG*kKS}{g;+bspoRU_YPUq<0xJ_kE`_ZjD~3JmCtFt`dewI%Cf*~wVmTm zwcESLX;sQO0<>~t)bQw-fF%xmDgam2IG87@0vVXAqGPTanQ7$6mD8{V_7YdF&Kmsw zwbdD@$MnF0VOEEE+<>VU&l_+rE)sL!Xy~O3NDH9b0aBbWmND3eds_wSuP?Kt)-^nAgV{L2W!0%?`7uMy#Up25_p`{bBEi0dv%yz(A**+r&re5?0DXbtBOMsI zt4&`0ruqo)s{!QY<&liLcv|GAJLF-P{D2h@??d(>jJ}5Ppy-%~OA4>j);6{w{?gX_ zFzd_zdt?n%?C3>vMBSW0=Wsn*Yt&vIJH4K&pEubopjdIONi_xRxf4wvDd|aoDH43h z#&7xM6{SIXUb=KipI2`TWj!zDJRqX{a4g&7DBsE*Be;!ZCdd-v%{SkiCecV_xizdo z(CfK_>Tv=-kB+fn4Kmh|^Xb*uy5?h#lX-Qq^6!CcDvznWaIAKNl#AYa>#f6+44;4g z`S4Q%8R|EPeBqdfv|?1z8X!QFWhy~F>XKmwc>uHq+!KA6k7W=|ahWv1MY(Lwug5K> zz=;$cW5{cl1z607Cpp(4O-$t8ghm~c`{YVV@O0?Vq2ZUse7tbsLip^n&yt+07C8VD z^g%5-$!_ut#3(OG6;U0ofO;L^b)H_cc=7V+?x8ELhE81?6rI=f@ zoX>Hs-4ewfr?AA_98O_{VSaN4Xf7zH>f6iH%FE+!UVrg@Pp7of34nH+M8xOcpl2Qs zAl`P{ZBf{2*{r*JiUp822;Km&*y6YxW^ooPU$1VK`1VA)HTakp*FDWpO{Tb8ZxVW8 z*1g`+r`1lbuLtg(l34!&NHL1?QI;%+jXwtjp~6Bx{q$4!3lLXA=o0D~A4nF*wC<;w zT+Yke8Vn_i>&%%XmX&OAGpkH%QX!mcLR|6vaYn1DP~xo6FQ)U$%XiuB(5M?-9qq%i5-zO^R!dYiK}rj z4Tfe8ChO=Y{gHN%jcFz#Yr(|0?lbB=EH5~Jkb)L(*NgRg8NimLuzY> z(0n6kI2Ir0uu*tD|5i%GTH)fgA9gAiC;Alwlq-#uXK-*D@0|6tDRsdDpr;F3U{{*j zHrEU1dh`H0HQ_MKaQQXun$meOPEXADh+cW!yvk4z3HwA|J|)(J5mG&pkB6@Hl-qnnOw)MkL26eVV~IC#%=h!n2P6W%9!5DS02Y^xhA@dQOOu+e_@UhWiB@Ou z;Pk{8H`t>ou<$+ac_XV%R-2N;Q7y6P)s0mWudZHsbI9vYt8VyyQUoQ|x4eoxDQ`2{ zGT??LTlDG!^yz_|!H2rCY_-yQ_n79?gTak)Jau8JKP;M>D4x3E^&8gD>o+KodB=80i z^PQ?Q0uamR`f%N>I$=H-Z%%v$mX*#@eb`;d_aXnN0Hc1xCl?}=h2hBnz67re>_4E4 z>vkkSGjmD}AM&OOqfVLPU8cY-jIjUHq;e_=tFeV z&(a%4b(gdv+POjA494qDW16&l?hS?&?kV?E`FrAfDlbn$c=b!bO_{b+A1`gsEhXXn z<~=45<@lsy?3JnUL#SW#O$chmT&~+`5#^_~J`l0V7j%Idj|xpts1_9X?HyQ2>>wU6 z{&BiwaECddwDRl4v1qDJy>qWD4P!mjD|>FfmISiW@I8ET)r!L}W7TnoII-8(62Edx zNTUpIV<}tJ>zX!%_Ps-xDJ!^C0rcQ&p#$lAiIOvuyssu$V4Xt}Pq~c6Z7`lUK)s2= z>9mw|16c9>rZ47q=pcW? z(;DAGEH0~Eq9D~Ra3$TE{Hd0^Rtkyezl27QUVhXWq+vFIIUc34vJ%ApMoin=)^EkP zI?Wrv-lXuTxAl$7z@rtP!?hlqCU%_rz5F?@M^+geAHN(T6lo<*7fr~us9dmdH|mBC zsGEY=aw`q-vh-Y+mDhA4KNjS928D(#bv@g zdH_$(jPFfA-o)#H&%2%iaxcAg&&tOtm+#>b)h>@o6po6SRgqkPh();Th#BFhN!I){(R0jyVV1pJ(InAQukfHJ2J zG^x9j!YaE5(kXB&X+HorY~pFXWDN0zts#syX*6yltS*Ej(`zjAT+W&%sKCtNdA&rc zramLRa5fD@Z@+>$85J8&SVYvD(Dy{&Y7o*dAp zG>;Q{>G7U057i%8Ki5?t{C<2PbHyhumZ=pNvDcT7eyx_NC%H0jG-z7r29a4b70O49 zSH*f3=a_eM)N}760=@Gduq{WlH?VT_9MO26>)optPmGk(j)7*C5si%;zI zE1|yb*0$bYS>aknr@ihyz4n~ly|S@ftDl(AWtNi9F{g|)0bQ^C@&n)wYF;^yPM=1r zK57_i9O}C@tTO}i)kNFar~?xenv8hOjuANlH`DOi8U6yAc7k?9?_*V%uJ`leVIG{H zRfcsR^Yh$0);Y(Sa+{?Ia9eqL^|bm@!}X19(b&JKR9>PsB!lHetL$OS4JUuagxV-_ z1baoUU&S&TU}oiZEgv=@(?kt!ShE6^I&2f_CWiOiVLVBD?dp{!WT`nlfC{(tc6dRY1ox6t|5Wm+oDiM?id_Ffl?h(DbZHIS z(Ew96bcC(t$)+>4!A8Y#2599HgE54~+hp(dFf3v*WOXtUzqv(=Ib_FRfL+vKA@MD zl$x1>m7!UH6|CXdDf-wacNQKux8B@fK5@C(*<8$dTKRed!Rh95uczcBW@{VzBwz;q*oxb1YoPzS~zgdXmskRA(~jZ zCJ!*XY0&A8fVC`EB?cA7Fp z^GRZv=&#cO;12M7c~%&wwaT*Yr3s*F-8}Fx5G>-jR+(1&xGzGmCsuKko5m#)NVHVi zRdvS_KN;mk<(hI6{FWotuKeCVd-m*FFvxw^V9r!nth#;_>83@7*I2k=iD^TJ6Iq+} zL^_h{nmkZ!1X=6lSVyW~bItKJKPw(zdtlz&+?-v0FMlsBQtzJL7Ykf~iK>v*cVZNk zb@KsGC0xfbS&nk>#?;ln5Jqe1ktW^?!66rznT?;yg>7ho0L}!!tLMpH{lSU`Y>4)k z_%%_ab0_maTYymFYo5^UsMjjBiW}rlTBEF@l?Xu>X^RjrCvu`q!oy7jl7FjGz|-nE&c9#e!)EP)a2Fd4~{z zb2y6osOJL0vM}$S>xIu5pcc@F3K?A21A|x26nMDq7|!kQNeQbyUim1Qlw)%L3f*6pCvjZLQqs|wxp$fT{ zf#-N_IsL7;)}T-6Y#x{_;Cf|xN9s4Xe!co=o2`0zBrYM*)P{qHZ|efQn6dVf5G<|C#7j?E|7bf#$-#g7=jv}FjF zEmiUjLU|FF$30Q!vj#DCb{ARUJisybA3NYQ5gx1HdU`Zf#?-YHj&)s?`OZ7?Xc!=L z=tO*UlshjO9LVWJ_lI#YZ!0~9Pq}qAjh#?dd{!s8O}%z_>7ud1Bw!R3Y3g125?{D! z@ma=2@Itz!1;Ds%k;YtCc32-xP-n^ag)l)kO+^r{`Q7h+_h8QSD8BNAxMc*csk2Ud z61iz@JaAXcW3U{{_XfMJB&Hq*wE$^drec$BVBP$=|>z(DH&Xv@8Pv4f|J2LIS+LDd+97NdG+NyxGYa? zk^WOoiGZ{wu8t&- zefQmWI%oXX`E*%92n|&bHil1JL}UXga99YPGTsKlRMv2_jU2LdXG3}EzVzknLhbXFL1&q@eROB`w%zSjdpV@A74F{!H3>ZDFHlh*1O$iO|sMKEOs&!|USz=3>W69R=w~(T5l`LYtfZ zJBsKtAI*JZcDvRt{&oI(fXlbMBG%%R)gnfS+{&GY?HPPOrfkR{8B`ED4+UM@r~kGJ0P|?XCpea zf2gxYpw@KKkMjHpg43cn)?G*3(*lHs`VyMW(#Fz40#B~u> zNI;1%W5qE5KsH7C3m67gL=CRGH!wB9X3Pl8!$IGQ}aidmJyu zdDguLTnQ83qO?yp^z)UOJ(Q@vzVv^?qQ{4b(X2jeIM~0Lq81XFBF^eeIoSmth|YSeSDjFkLcKT?(eP=F-5qv(M6Ic2Y|9@o@O8zQ>ltH}vD zf&$0^R$>E2fm=9g16U&uP5(h=6hGP6*ti_7fTk6*8T9bO53l5o{#9=OvMeV`$COS^ z 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 literal 0 HcmV?d00001 diff --git a/src/addons/virtual_joystick/resources/textures/stick_texture_5.png.import b/src/addons/virtual_joystick/resources/textures/stick_texture_5.png.import new file mode 100644 index 0000000..be99b9e --- /dev/null +++ b/src/addons/virtual_joystick/resources/textures/stick_texture_5.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dywm4x5vqdtsm" +path="res://.godot/imported/stick_texture_5.png-f76da9fbec9ae506d29c25a5b2e273b4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/virtual_joystick/resources/textures/stick_texture_5.png" +dest_files=["res://.godot/imported/stick_texture_5.png-f76da9fbec9ae506d29c25a5b2e273b4.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/src/addons/virtual_joystick/resources/textures/stick_texture_6.png b/src/addons/virtual_joystick/resources/textures/stick_texture_6.png new file mode 100644 index 0000000000000000000000000000000000000000..39259e8048977490ca9046a2ca458f412a74aff5 GIT binary patch literal 15881 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 literal 0 HcmV?d00001 diff --git a/src/addons/virtual_joystick/resources/textures/stick_texture_6.png.import b/src/addons/virtual_joystick/resources/textures/stick_texture_6.png.import new file mode 100644 index 0000000..0470110 --- /dev/null +++ b/src/addons/virtual_joystick/resources/textures/stick_texture_6.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://fts4nb53arsl" +path="res://.godot/imported/stick_texture_6.png-0fdb4087c1eca258d05fa6e2a535cbbe.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/virtual_joystick/resources/textures/stick_texture_6.png" +dest_files=["res://.godot/imported/stick_texture_6.png-0fdb4087c1eca258d05fa6e2a535cbbe.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/src/addons/virtual_joystick/virtual_joystick.gd b/src/addons/virtual_joystick/virtual_joystick.gd new file mode 100644 index 0000000..049369d --- /dev/null +++ b/src/addons/virtual_joystick/virtual_joystick.gd @@ -0,0 +1,496 @@ +@tool +@icon("res://addons/virtual_joystick/icon.svg") +class_name VirtualJoystick +extends Control + +#region Signals ================================================= +## Emitted when the stick is moved. +signal analogic_changed( + value: Vector2, + distance: float, + angle: float, + angle_clockwise: float, + angle_not_clockwise: float +) + +## Emitted when the stick enters the dead zone. +signal deadzone_enter + +## Emitted when the stick leaves the dead zone. +signal deadzone_leave +#endregion Signals =============================================== + + +#region Private Properties ====================================== +var _joystick: VirtualJoystickCircle +var _stick: VirtualJoystickCircle + +var _joystick_radius: float = 100.0 +var _joystick_border_width: float = 10.0 +var _joystick_start_position: Vector2 = Vector2(_joystick_radius + _joystick_border_width, _joystick_radius + _joystick_border_width) + +var _stick_radius: float = 45.0 +var _stick_border_width: float = -1.0 +var _stick_start_position: Vector2 = _joystick_start_position + +var _drag_started_inside := false +var _click_in := false +var _delta: Vector2 = Vector2.ZERO +var _in_deadzone: bool = false: + set(value): + if value != _in_deadzone: + _in_deadzone = value + if not active: + return + if _in_deadzone: + deadzone_enter.emit() + else: + deadzone_leave.emit() + +var _real_size: Vector2 = size * scale +var _warnings: PackedStringArray = [] + +var _DEFAULT_JOYSTICK_TEXTURE = preload("res://addons/virtual_joystick/resources/textures/joystick_texture_1.png") +var _JOYSTICK_TEXTURE_2 = preload("res://addons/virtual_joystick/resources/textures/joystick_texture_2.png") +var _JOYSTICK_TEXTURE_3 = preload("res://addons/virtual_joystick/resources/textures/joystick_texture_3.png") +var _JOYSTICK_TEXTURE_4 = preload("res://addons/virtual_joystick/resources/textures/joystick_texture_4.png") +var _JOYSTICK_TEXTURE_5 = preload("res://addons/virtual_joystick/resources/textures/joystick_texture_5.png") +var _JOYSTICK_TEXTURE_6 = preload("res://addons/virtual_joystick/resources/textures/joystick_texture_6.png") + +var _DEFAULT_STICK_TEXTURE = preload("res://addons/virtual_joystick/resources/textures/stick_texture_1.png") +var _STICK_TEXTURE_2 = preload("res://addons/virtual_joystick/resources/textures/stick_texture_2.png") +var _STICK_TEXTURE_3 = preload("res://addons/virtual_joystick/resources/textures/stick_texture_3.png") +var _STICK_TEXTURE_4 = preload("res://addons/virtual_joystick/resources/textures/stick_texture_4.png") +var _STICK_TEXTURE_5 = preload("res://addons/virtual_joystick/resources/textures/stick_texture_5.png") +var _STICK_TEXTURE_6 = preload("res://addons/virtual_joystick/resources/textures/stick_texture_6.png") + +enum _preset_enum { + ## Nothing + NONE, + ## Default preset texture + PRESET_DEFAULT, + ## Texture 2 + PRESET_2, + ## Texture 3 + PRESET_3, + ## Texture 4 + PRESET_4, + ## Texture 5 + PRESET_5, + ## Texture 6 + PRESET_6, + +} +#endregion Private Properties ==================================== + + +#region Public Properties ======================================= +## Normalized joystick direction vector (X, Y). +var value: Vector2 = Vector2.ZERO + +## Distance of the stick from the joystick center (0.0 to 1.0). +var distance: float = 0.0 + +## Angle in degrees (universal reference, 0° = right). +var angle_degrees: float = 0.0 + +## Angle in degrees, measured clockwise. +var angle_degrees_clockwise: float = 0.0 + +## Angle in degrees, measured counter-clockwise. +var angle_degrees_not_clockwise: float = 0.0 +#endregion Public Properties ===================================== + + +#region Exports =================================================== +@export_category("Virtual Joystick") +## Enables or disables the joystick input. +@export var active: bool = true +## Deadzone threshold (0.0 = off, 1.0 = full range). +@export_range(0.0, 0.9, 0.001, "suffix:length") var deadzone: float = 0.1 +## Global scale factor of the joystick. +@export_range(0.1, 2.0, 0.001, "suffix:x", "or_greater") var scale_factor: float = 1.0: + set(value): + scale_factor = value + scale = Vector2(value, value) + _update_real_size() + queue_redraw() +## If true, the Joystick will only be displayed on the screen on mobile devices. +@export var only_mobile: bool = false: + set(value): + only_mobile = value + if only_mobile == true and OS.get_name().to_lower() not in ["android", "ios"]: + visible = false + else: + visible = true + +@export_category("Joystick") +## Enable the use of textures for the joystick. +@export var joystick_use_textures: bool = true: + set(value): + joystick_use_textures = value + if value and joystick_texture == null: + _set_joystick_preset(joystick_preset_texture) + _verify_can_use_border() + update_configuration_warnings() + queue_redraw() +## Select one of the available models. More models will be available soon. +@export var joystick_preset_texture: _preset_enum = _preset_enum.PRESET_5: set = _set_joystick_preset +## Select a texture for the joystick figure. +@export var joystick_texture: Texture2D = _JOYSTICK_TEXTURE_5: + set(value): + joystick_texture = value + update_configuration_warnings() + _verify_can_use_border() + queue_redraw() +## Base color of the joystick background. +@export_color_no_alpha() var joystick_color: Color = Color.WHITE: + set(value): + joystick_color = value + if _joystick: + _joystick.color = value + _joystick.opacity = joystick_opacity + queue_redraw() +## Opacity of the joystick base. +@export_range(0.0, 1.0, 0.001, "suffix:alpha") var joystick_opacity: float = 0.8: + set(value): + joystick_opacity = value + if _joystick: + _joystick.opacity = value + queue_redraw() +## Width of the joystick base border. +@export_range(1.0, 20.0, 0.01, "suffix:px", "or_greater") var joystick_border: float = 1.0: + set(value): + joystick_border = value + _joystick.width = value + _joystick_border_width = value + _joystick_start_position = Vector2(_joystick_radius + _joystick_border_width, _joystick_radius + _joystick_border_width) + _joystick.position = _joystick_start_position + _stick_start_position = Vector2(_joystick_radius + _joystick_border_width, _joystick_radius + _joystick_border_width) + _stick.position = _stick_start_position + update_configuration_warnings() + queue_redraw() + + +@export_category("Stick") +## Enable the use of textures for the stick. +@export var stick_use_textures: bool = true: + set(value): + stick_use_textures = value + if value and stick_texture == null: + _set_stick_preset(stick_preset_texture) + update_configuration_warnings() + queue_redraw() +## Select one of the available models. More models will be available soon. +@export var stick_preset_texture: _preset_enum = _preset_enum.PRESET_5: set = _set_stick_preset +## Select a texture for the stick figure. +@export var stick_texture: Texture2D = _STICK_TEXTURE_5: + set(value): + stick_texture = value + update_configuration_warnings() + queue_redraw() +## Stick (thumb) color. +@export_color_no_alpha() var stick_color: Color = Color.WHITE: + set(value): + stick_color = value + if _stick: + _stick.color = value + _stick.opacity = stick_opacity + queue_redraw() +## Opacity of the stick. +@export_range(0.0, 1.0, 0.001, "suffix:alpha") var stick_opacity: float = 0.8: + set(value): + stick_opacity = value + if _stick: + _stick.opacity = value + queue_redraw() +#endregion Exports ================================================= + + +#region Engine Methods ============================================= +func _init() -> void: + _joystick = VirtualJoystickCircle.new(_joystick_start_position, _joystick_radius, _joystick_border_width, false, joystick_color, joystick_opacity) + _stick = VirtualJoystickCircle.new(_stick_start_position, _stick_radius, _stick_border_width, true, stick_color, stick_opacity) + queue_redraw() + + +func _ready() -> void: + set_size(Vector2(_joystick_radius * 2 + _joystick_border_width * 2, _joystick_radius * 2 + _joystick_border_width * 2)) + _update_real_size() + + +func _draw() -> void: + if joystick_use_textures and joystick_texture: + var base_size = joystick_texture.get_size() + var base_scale = (_joystick_radius * 2) / base_size.x + draw_set_transform(_joystick.position, 0, Vector2(base_scale, base_scale)) + draw_texture(joystick_texture, -base_size / 2, Color(joystick_color.r, joystick_color.g, joystick_color.b, joystick_opacity)) + draw_set_transform(Vector2.ZERO, 0, Vector2.ONE) + else: + _joystick.draw(self, false) + + if stick_use_textures and stick_texture: + var stick_size = stick_texture.get_size() + var stick_scale = (_stick_radius * 2) / stick_size.x + draw_set_transform(_stick.position, 0, Vector2(stick_scale, stick_scale)) + draw_texture(stick_texture, -stick_size / 2, Color(stick_color.r, stick_color.g, stick_color.b, stick_opacity)) + draw_set_transform(Vector2.ZERO, 0, Vector2.ONE) + else: + _stick.draw(self, false) + + scale = Vector2(scale_factor, scale_factor) + set_size(Vector2((_joystick_radius * 2) + (_joystick_border_width * 2), (_joystick_radius * 2) + (_joystick_border_width * 2))) + + +func _gui_input(event: InputEvent) -> void: + if event is InputEventScreenTouch: + if event.pressed: + distance = event.position.distance_to(_joystick.position) + _drag_started_inside = distance <= _joystick.radius + _joystick.width / 2 + if _drag_started_inside: + _click_in = true + _update_stick(event.position) + else: + _click_in = false + else: + if _click_in: + _reset_values() + _update_emit_signals() + _click_in = false + _drag_started_inside = false + _stick.position = _stick_start_position + queue_redraw() + + elif event is InputEventScreenDrag: + if _drag_started_inside: + _update_stick(event.position) + + +func _get_configuration_warnings() -> PackedStringArray: + _warnings = [] + if joystick_use_textures and (joystick_texture == null): + _warnings.append("The joystick_texture properties must be set when using joystick_use_textures = true.") + if stick_use_textures and (stick_texture == null): + _warnings.append("The stick_texture properties must be set when using stick_use_textures = true.") + if joystick_use_textures and joystick_texture != null and joystick_preset_texture != _preset_enum.NONE and joystick_border > 1.0: + _warnings.append("When using a texture preset, the ideal border height would be 1.0.") + return _warnings + +#endregion Engine Methods ============================================= + + +#region Private Methods ============================================ +func _update_stick(_position: Vector2) -> void: + _delta = _position - _stick_start_position + if _delta.length() > _joystick.radius: + _delta = _delta.normalized() * _joystick.radius + _stick.position = _stick_start_position + _delta + queue_redraw() + + var processed = _apply_deadzone(_delta / _joystick.radius) + value = processed.value + distance = processed.distance + angle_degrees = processed.angle_degrees + angle_degrees_clockwise = processed.angle_clockwise + angle_degrees_not_clockwise = processed.angle_not_clockwise + + _update_emit_signals() + + +func _reset_values() -> void: + _delta = Vector2.ZERO + value = Vector2.ZERO + distance = 0.0 + angle_degrees = 0.0 + angle_degrees_clockwise = 0.0 + angle_degrees_not_clockwise = 0.0 + _stick.position = _stick_start_position + + var length = (_delta / _joystick.radius).length() + var dz = clamp(deadzone, 0.0, 0.99) + if length <= dz: + _in_deadzone = true + + queue_redraw() + + +## Applies linear deadzone adjustment and calculates resulting angles. +func _apply_deadzone(input_value: Vector2) -> Dictionary: + var length = input_value.length() + var result = Vector2.ZERO + var dz = clamp(deadzone, 0.0, 0.99) + + if length <= dz: + _in_deadzone = true + result = Vector2.ZERO + length = 0.0 + else: + _in_deadzone = false + # Re-scale linearly between deadzone and full range + var adjusted = (length - dz) / (1.0 - dz) + result = input_value.normalized() * adjusted + length = adjusted + + var angle_cw = _get_angle_delta(result * _joystick.radius, true, true) + var angle_ccw = _get_angle_delta(result * _joystick.radius, true, false) + var angle = _get_angle_delta(result * _joystick.radius, false, false) + + if active: + return { + "value": result, + "distance": length, + "angle_clockwise": angle_cw, + "angle_not_clockwise": angle_ccw, + "angle_degrees": angle + } + else: + return { + "value": Vector2.ZERO, + "distance": 0.0, + "angle_clockwise": 0.0, + "angle_not_clockwise": 0.0, + "angle_degrees": 0.0 + } + + +func _update_emit_signals() -> void: + if not active: + return + if _in_deadzone: + analogic_changed.emit( + Vector2.ZERO, + 0.0, + 0.0, + 0.0, + 0.0 + ) + else: + analogic_changed.emit( + value, + distance, + angle_degrees, + angle_degrees_clockwise, + angle_degrees_not_clockwise + ) + + +func _update_real_size() -> void: + _real_size = size * scale + pivot_offset = size / 2 + + +## Calculates the angle of a vector in degrees. +func _get_angle_delta(delta: Vector2, continuous: bool, clockwise: bool) -> float: + var angle_deg = 0.0 + if continuous and not clockwise: + angle_deg = rad_to_deg(atan2(-delta.y, delta.x)) + else: + angle_deg = rad_to_deg(atan2(delta.y, delta.x)) + if continuous and angle_deg < 0.0: + angle_deg += 360.0 + return angle_deg + + +func _set_joystick_preset(_value: _preset_enum) -> void: + joystick_preset_texture = _value + match (_value): + _preset_enum.PRESET_DEFAULT: + joystick_texture = _DEFAULT_JOYSTICK_TEXTURE + _preset_enum.PRESET_2: + joystick_texture = _JOYSTICK_TEXTURE_2 + _preset_enum.PRESET_3: + joystick_texture = _JOYSTICK_TEXTURE_3 + _preset_enum.PRESET_4: + joystick_texture = _JOYSTICK_TEXTURE_4 + _preset_enum.PRESET_5: + joystick_texture = _JOYSTICK_TEXTURE_5 + _preset_enum.PRESET_6: + joystick_texture = _JOYSTICK_TEXTURE_6 + _preset_enum.NONE: + if joystick_texture in [_DEFAULT_JOYSTICK_TEXTURE, _JOYSTICK_TEXTURE_2, _JOYSTICK_TEXTURE_3, _JOYSTICK_TEXTURE_4, _JOYSTICK_TEXTURE_5, _JOYSTICK_TEXTURE_6]: + joystick_texture = null + _verify_can_use_border() + update_configuration_warnings() + +func _set_stick_preset(_value: _preset_enum) -> void: + stick_preset_texture = _value + match (_value): + _preset_enum.PRESET_DEFAULT: + stick_texture = _DEFAULT_STICK_TEXTURE + _preset_enum.PRESET_2: + stick_texture = _STICK_TEXTURE_2 + _preset_enum.PRESET_3: + stick_texture = _STICK_TEXTURE_3 + _preset_enum.PRESET_4: + stick_texture = _STICK_TEXTURE_4 + _preset_enum.PRESET_5: + stick_texture = _STICK_TEXTURE_5 + _preset_enum.PRESET_6: + stick_texture = _STICK_TEXTURE_6 + _preset_enum.NONE: + if stick_texture in [_DEFAULT_STICK_TEXTURE, _STICK_TEXTURE_2, _STICK_TEXTURE_3, _STICK_TEXTURE_4, _STICK_TEXTURE_5, _STICK_TEXTURE_6]: + stick_texture = null + + +func _verify_can_use_border() -> bool: + if joystick_use_textures and not joystick_texture == null: + joystick_border = 1.0 + return false + return true +#endregion Private Methods =========================================== + + +#region Public Methods ============================================= +## Returns the current joystick vector value. +func get_value() -> Vector2: + return value + + +## Returns the joystick distance (0 to 1). +func get_distance() -> float: + return distance + + +## Returns the current joystick angle (clockwise). +func get_angle_degrees_clockwise() -> float: + return angle_degrees_clockwise + + +## Returns the current joystick angle (counter-clockwise). +func get_angle_degrees_not_clockwise() -> float: + return angle_degrees_not_clockwise + + +## Returns a specific angle configuration. +func get_angle_degrees(continuous: bool = true, clockwise: bool = false) -> float: + return _get_angle_delta(_delta, continuous, clockwise) +#endregion Public Methods ============================================ + + +#region Classes ==================================================== +class VirtualJoystickCircle extends RefCounted: + var position: Vector2 + var radius: float + var color: Color + var width: float + var filled: bool + var antialiased: bool + var opacity: float: + set(value): + opacity = value + self.color.a = opacity + + func _init(_position: Vector2, _radius: float, _width: float = -1.0, _filled: bool = true, _color: Color = Color.WHITE, _opacity: float = 1.0, _antialiased: bool = true): + self.position = _position + self.radius = _radius + self.color = _color + self.width = _width + self.filled = _filled + self.antialiased = _antialiased + self.opacity = _opacity + self.color.a = _opacity + + func draw(canvas_item: CanvasItem, offset: bool) -> void: + var pos = self.position + (Vector2(self.radius, self.radius) if offset else Vector2.ZERO) + canvas_item.draw_circle(pos, self.radius, self.color, self.filled, self.width, self.antialiased) +#endregion Classes =================================================== diff --git a/src/addons/virtual_joystick/virtual_joystick.gd.uid b/src/addons/virtual_joystick/virtual_joystick.gd.uid new file mode 100644 index 0000000..5acc943 --- /dev/null +++ b/src/addons/virtual_joystick/virtual_joystick.gd.uid @@ -0,0 +1 @@ +uid://dhn1uax7qtt1v diff --git a/src/export_presets.cfg b/src/export_presets.cfg index e5bccec..12cf959 100644 --- a/src/export_presets.cfg +++ b/src/export_presets.cfg @@ -69,3 +69,53 @@ Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorActi ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue Remove-Item -Recurse -Force '{temp_dir}'" + +[preset.1] + +name="Web" +platform="Web" +runnable=true +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="../export/www/index.html" +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.1.options] + +custom_template/debug="" +custom_template/release="" +variant/extensions_support=false +variant/thread_support=true +vram_texture_compression/for_desktop=true +vram_texture_compression/for_mobile=false +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/ensure_cross_origin_isolation_headers=true +progressive_web_app/offline_page="" +progressive_web_app/display=1 +progressive_web_app/orientation=1 +progressive_web_app/icon_144x144="" +progressive_web_app/icon_180x180="" +progressive_web_app/icon_512x512="" +progressive_web_app/background_color=Color(0, 0, 0, 1) +threads/emscripten_pool_size=8 +threads/godot_pool_size=4 diff --git a/src/project.godot b/src/project.godot index 5b5d96f..26a9571 100644 --- a/src/project.godot +++ b/src/project.godot @@ -32,6 +32,10 @@ window/size/viewport_height=720 window/stretch/mode="canvas_items" window/stretch/scale_mode="integer" +[editor_plugins] + +enabled=PackedStringArray("res://addons/touchscreenbuttoncontrol/plugin.cfg", "res://addons/virtual_joystick/plugin.cfg") + [input] move_left={ @@ -74,6 +78,10 @@ attack={ ] } +[input_devices] + +pointing/emulate_touch_from_mouse=true + [physics] 3d/physics_engine="Jolt Physics" diff --git a/src/scenes/chat_ui.tscn b/src/scenes/chat_ui.tscn index a5d0b53..b88616d 100644 --- a/src/scenes/chat_ui.tscn +++ b/src/scenes/chat_ui.tscn @@ -12,15 +12,6 @@ layer = 200 script = ExtResource("1_chat_ui") [node name="ChatContainer" type="Control" parent="." unique_id=-1294967296] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 1 - -[node name="BottomLeft" type="MarginContainer" parent="ChatContainer" unique_id=-294967296] layout_mode = 1 anchors_preset = 2 anchor_top = 1.0 @@ -31,6 +22,16 @@ offset_right = 400.0 offset_bottom = -10.0 grow_horizontal = 0 grow_vertical = 0 +mouse_filter = 1 + +[node name="BottomLeft" type="MarginContainer" parent="ChatContainer" unique_id=-294967296] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 1 [node name="Background" type="ColorRect" parent="ChatContainer/BottomLeft" unique_id=705032704] visible = false @@ -40,16 +41,21 @@ color = Color(0, 0, 0, 0.5) [node name="VBox" type="VBoxContainer" parent="ChatContainer/BottomLeft" unique_id=1705032704] layout_mode = 2 +mouse_filter = 2 [node name="MessageScroll" type="ScrollContainer" parent="ChatContainer/BottomLeft/VBox" unique_id=-1589934592] custom_minimum_size = Vector2(380, 150) layout_mode = 2 size_flags_vertical = 3 +mouse_filter = 1 +scroll_horizontal_enabled = false +scroll_vertical_enabled = true [node name="MessageList" type="VBoxContainer" parent="ChatContainer/BottomLeft/VBox/MessageScroll" unique_id=-589934592] layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 +mouse_filter = 1 [node name="ChatInput" type="LineEdit" parent="ChatContainer/BottomLeft/VBox" unique_id=1410065408] visible = false diff --git a/src/scenes/game_world.tscn b/src/scenes/game_world.tscn index 5293148..e0233c6 100644 --- a/src/scenes/game_world.tscn +++ b/src/scenes/game_world.tscn @@ -4,7 +4,6 @@ [ext_resource type="PackedScene" uid="uid://cxfvw8y7jqn2p" path="res://scenes/player.tscn" id="2"] [ext_resource type="Script" uid="uid://db58xcyo4cjk" path="res://scripts/game_world.gd" id="4"] [ext_resource type="Script" uid="uid://wff5063ctp7g" path="res://scripts/debug_overlay.gd" id="5"] -[ext_resource type="Script" path="res://scripts/room_lighting_system.gd" id="6"] [ext_resource type="AudioStream" uid="uid://dthr2w8x0cj6v" path="res://assets/audio/sfx/ambience/wind-castle-loop.wav.mp3" id="6_6c6v5"] [ext_resource type="TileSet" uid="uid://dqem5tbvooxrg" path="res://assets/gfx/RPG DUNGEON VOL 3.tres" id="9"] @@ -40,8 +39,5 @@ light_mask = 1048575 visibility_layer = 1048575 color = Color(0.4140625, 0.4140625, 0.4140625, 1) -[node name="RoomLightingSystem" type="Node2D" parent="." unique_id=1234567893] -script = ExtResource("6") - [node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="." unique_id=1141138343] stream = ExtResource("6_6c6v5") diff --git a/src/scenes/ingame_hud.tscn b/src/scenes/ingame_hud.tscn index e6b574e..753e39b 100644 --- a/src/scenes/ingame_hud.tscn +++ b/src/scenes/ingame_hud.tscn @@ -3,7 +3,13 @@ [ext_resource type="Script" uid="uid://da5sp508nk1tx" path="res://scripts/ingame_hud.gd" id="1_hud_script"] [ext_resource type="FontFile" uid="uid://bajcvmidrnc33" path="res://assets/fonts/standard_font.png" id="2_standard_font"] [ext_resource type="Texture2D" uid="uid://dkisxs8ecfaul" path="res://assets/gfx/ui/hearts_filled.png" id="4_hearts_filled"] +[ext_resource type="Script" uid="uid://5hepk3l8u2eg" path="res://scripts/mobile_input.gd" id="5_44yxk"] +[ext_resource type="Script" uid="uid://dhn1uax7qtt1v" path="res://addons/virtual_joystick/virtual_joystick.gd" id="5_i0hld"] [ext_resource type="Texture2D" uid="uid://dkpritx47nd4m" path="res://assets/gfx/pickups/items_n_shit.png" id="5_key_texture"] +[ext_resource type="Texture2D" uid="uid://01qhightlcso" path="res://addons/virtual_joystick/resources/textures/joystick_texture_5.png" id="6_yeruy"] +[ext_resource type="Texture2D" uid="uid://dywm4x5vqdtsm" path="res://addons/virtual_joystick/resources/textures/stick_texture_5.png" id="7_44yxk"] +[ext_resource type="Script" uid="uid://bh5a3ydiu51eo" path="res://addons/touchscreenbuttoncontrol/TouchScreenButtonControl.gd" id="8_cu5yl"] +[ext_resource type="StyleBox" uid="uid://cv5o175a2677e" path="res://addons/touchscreenbuttoncontrol/button_style.tres" id="8_yeruy"] [sub_resource type="Theme" id="Theme_standard_font"] default_font = ExtResource("2_standard_font") @@ -15,6 +21,7 @@ region = Rect2(160, 208, 16, 16) margin = Rect2(0, -2, 0, 0) [node name="IngameHUD" type="CanvasLayer" unique_id=846985801] +layer = 201 script = ExtResource("1_hud_script") [node name="UpperLeft" type="MarginContainer" parent="." unique_id=22752255] @@ -128,3 +135,149 @@ horizontal_alignment = 1 [node name="TextureProgressBarBossHP" type="TextureProgressBar" parent="UpperRight/HBoxContainer/VBoxContainerBoss" unique_id=1266602557] layout_mode = 2 texture_progress = ExtResource("4_hearts_filled") + +[node name="MobileInput" type="Control" parent="." unique_id=1373461519] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 1 +script = ExtResource("5_44yxk") + +[node name="VirtualJoystick" type="Control" parent="MobileInput" unique_id=1151061008] +z_index = 4096 +layout_mode = 1 +anchors_preset = 4 +anchor_top = 0.5 +anchor_bottom = 0.5 +offset_left = 48.0 +offset_top = -114.0 +offset_right = 250.0 +offset_bottom = 88.0 +grow_vertical = 2 +pivot_offset = Vector2(101, 101) +script = ExtResource("5_i0hld") +joystick_texture = ExtResource("6_yeruy") +joystick_opacity = 0.235 +stick_texture = ExtResource("7_44yxk") +stick_opacity = 0.746 +metadata/_custom_type_script = "uid://dhn1uax7qtt1v" + +[node name="Control" type="Control" parent="MobileInput" unique_id=131649841] +layout_mode = 1 +anchors_preset = 6 +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +offset_left = -40.0 +offset_top = -20.0 +offset_bottom = 20.0 +grow_horizontal = 0 +grow_vertical = 2 + +[node name="MarginContainer" type="MarginContainer" parent="MobileInput/Control" unique_id=710364056] +layout_mode = 1 +anchors_preset = 6 +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +offset_left = -205.765 +offset_top = -94.475 +offset_right = -5.7649994 +offset_bottom = 25.525024 +grow_horizontal = 0 +grow_vertical = 2 +theme_override_constants/margin_right = 42 + +[node name="B_ButtonContainer" type="Control" parent="MobileInput/Control/MarginContainer" unique_id=297390115] +layout_mode = 2 + +[node name="B_Circle" type="Panel" parent="MobileInput/Control/MarginContainer/B_ButtonContainer" unique_id=2138926309] +layout_mode = 1 +anchors_preset = 4 +anchor_top = 0.5 +anchor_bottom = 0.5 +offset_top = -32.0 +offset_right = 64.0 +offset_bottom = 32.0 +grow_vertical = 2 +theme_override_styles/panel = ExtResource("8_yeruy") + +[node name="B_Label" type="Label" parent="MobileInput/Control/MarginContainer/B_ButtonContainer/B_Circle" unique_id=1440094044] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "B" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="TouchScreenButtonControl" type="TextureButton" parent="MobileInput/Control/MarginContainer/B_ButtonContainer/B_Circle" unique_id=1583063757] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +focus_mode = 0 +mouse_filter = 2 +action_mode = 0 +ignore_texture_size = true +stretch_mode = 5 +script = ExtResource("8_cu5yl") +touchscreen_only = true +input_action = "attack" +metadata/_custom_type_script = "uid://bh5a3ydiu51eo" + +[node name="A_ButtonContainer" type="Control" parent="MobileInput/Control/MarginContainer" unique_id=1039434657] +layout_mode = 2 + +[node name="A_Circle" type="Panel" parent="MobileInput/Control/MarginContainer/A_ButtonContainer" unique_id=1415076009] +layout_mode = 1 +anchors_preset = 6 +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +offset_left = -64.0 +offset_top = -32.0 +offset_bottom = 32.0 +grow_horizontal = 0 +grow_vertical = 2 +theme_override_styles/panel = ExtResource("8_yeruy") + +[node name="A_Label" type="Label" parent="MobileInput/Control/MarginContainer/A_ButtonContainer/A_Circle" unique_id=619215455] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "A" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="TouchScreenButtonControl" type="TextureButton" parent="MobileInput/Control/MarginContainer/A_ButtonContainer/A_Circle" unique_id=322194330] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +focus_mode = 0 +mouse_filter = 2 +action_mode = 0 +ignore_texture_size = true +stretch_mode = 5 +script = ExtResource("8_cu5yl") +touchscreen_only = true +input_action = "grab" +metadata/_custom_type_script = "uid://bh5a3ydiu51eo" + +[connection signal="analogic_changed" from="MobileInput/VirtualJoystick" to="MobileInput" method="_on_virtual_joystick_analogic_changed"] diff --git a/src/scenes/test.tscn b/src/scenes/test.tscn new file mode 100644 index 0000000..14164e9 --- /dev/null +++ b/src/scenes/test.tscn @@ -0,0 +1,20 @@ +[gd_scene format=3 uid="uid://o8cbi1whsbo0"] + +[ext_resource type="Script" uid="uid://dhn1uax7qtt1v" path="res://addons/virtual_joystick/virtual_joystick.gd" id="1_iyx0m"] +[ext_resource type="Texture2D" uid="uid://01qhightlcso" path="res://addons/virtual_joystick/resources/textures/joystick_texture_5.png" id="2_74lek"] +[ext_resource type="Texture2D" uid="uid://dywm4x5vqdtsm" path="res://addons/virtual_joystick/resources/textures/stick_texture_5.png" id="3_j5jx5"] + +[node name="Test" type="Node2D" unique_id=459289533] + +[node name="VirtualJoystick" type="Control" parent="." unique_id=322625393] +layout_mode = 3 +anchors_preset = 0 +offset_left = 391.0 +offset_top = 172.0 +offset_right = 611.0 +offset_bottom = 392.0 +pivot_offset = Vector2(110, 110) +script = ExtResource("1_iyx0m") +joystick_texture = ExtResource("2_74lek") +stick_texture = ExtResource("3_j5jx5") +metadata/_custom_type_script = "uid://dhn1uax7qtt1v" diff --git a/src/scripts/chat_ui.gd b/src/scripts/chat_ui.gd index f031d86..972728a 100644 --- a/src/scripts/chat_ui.gd +++ b/src/scripts/chat_ui.gd @@ -57,7 +57,7 @@ func _ready(): visible = true # Chat UI is always visible (background and messages fade) - # Hide scrollbar by default (will show when chat is opened) + # Hide scrollbar permanently if message_scroll: var scroll_bar = message_scroll.get_v_scroll_bar() if scroll_bar: @@ -71,6 +71,23 @@ func _input(event): else: _send_and_close_chat() get_viewport().set_input_as_handled() + + # Don't consume touch events outside chat area - let them pass through to joystick + # Only consume keyboard events for chat + if event is InputEventScreenTouch or event is InputEventScreenDrag: + # Check if touch is in chat area + if chat_container: + var bottom_left = chat_container.get_node_or_null("BottomLeft") + if bottom_left: + var chat_rect = bottom_left.get_global_rect() + if event is InputEventScreenTouch: + if not chat_rect.has_point(event.position): + # Touch is outside chat area, don't consume it + return + elif event is InputEventScreenDrag: + if not chat_rect.has_point(event.position): + # Drag is outside chat area, don't consume it + return func _open_chat(): chat_open = true @@ -79,11 +96,15 @@ func _open_chat(): chat_input.grab_focus() background.visible = true - # Show scrollbar when chat is open + # Enable scrolling when chat is open if message_scroll: + message_scroll.mouse_filter = Control.MOUSE_FILTER_STOP # Allow scrolling + # Keep scrollbar hidden var scroll_bar = message_scroll.get_v_scroll_bar() if scroll_bar: - scroll_bar.visible = true + scroll_bar.visible = false + if message_list: + message_list.mouse_filter = Control.MOUSE_FILTER_STOP # Allow interaction # Make all messages fully visible when chat is opened _show_all_messages() @@ -101,11 +122,15 @@ func _send_and_close_chat(): chat_input.visible = false chat_input.release_focus() - # Hide scrollbar when chat is closed + # Disable scrolling when chat is closed (so it doesn't block joystick) if message_scroll: + message_scroll.mouse_filter = Control.MOUSE_FILTER_IGNORE # Don't block input + # Keep scrollbar hidden var scroll_bar = message_scroll.get_v_scroll_bar() if scroll_bar: scroll_bar.visible = false + if message_list: + message_list.mouse_filter = Control.MOUSE_FILTER_IGNORE # Don't block input # Unlock player controls _lock_player_controls(false) diff --git a/src/scripts/game_world.gd b/src/scripts/game_world.gd index 38bfa0f..889631f 100644 --- a/src/scripts/game_world.gd +++ b/src/scripts/game_world.gd @@ -688,11 +688,6 @@ func _generate_dungeon(): # Restore players (make visible and restore collision) _restore_all_players() - # Reinitialize room lighting system for new level - var room_lighting = get_node_or_null("RoomLightingSystem") - if room_lighting and room_lighting.has_method("reinitialize"): - room_lighting.reinitialize() - # Update camera immediately to ensure it's looking at the players await get_tree().process_frame # Wait a frame for players to be fully in scene tree _update_camera() @@ -1141,11 +1136,6 @@ func _sync_dungeon(dungeon_data_sync: Dictionary, seed_value: int, level: int, h # Spawn room triggers on client _spawn_room_triggers() - # Reinitialize room lighting system for new level (client) - var room_lighting = get_node_or_null("RoomLightingSystem") - if room_lighting and room_lighting.has_method("reinitialize"): - room_lighting.reinitialize() - # Wait a frame to ensure all enemies and objects are properly added to scene tree and initialized await get_tree().process_frame await get_tree().process_frame # Wait an extra frame to ensure enemies are fully ready diff --git a/src/scripts/inspiration_scripts/coin.gd b/src/scripts/inspiration_scripts/coin.gd deleted file mode 100644 index 7c5d361..0000000 --- a/src/scripts/inspiration_scripts/coin.gd +++ /dev/null @@ -1,161 +0,0 @@ -extends CharacterBody2D - -var friction = 8.0 # Lower values make the slowdown more gradual -var is_collected = false -var bounceTimer = 0.0 -var timeBeforePickup = 0.8 -@onready var damage_number_scene = preload("res://assets/scripts/components/damage_number.tscn") - -# Z-axis variables -var positionZ = 4.0 # Start slightly in the air -var velocityZ = 10.0 # Initial upward velocity -var accelerationZ = -300.0 # Gravity -var bounceRestitution = 0.6 # How much bounce energy is retained (0-1) -var minBounceVelocity = 40.0 # Minimum velocity needed to bounce - -var bodyToPickUp:Node2D = null - -var sync_position := Vector2() -var sync_velocity := Vector2() -var sync_positionZ: float = 4.0 -var sync_velocityZ: float = 10.0 - -func _ready() -> void: - add_to_group("coins") - $Area2DCollision.set_deferred("monitoring", false) - update_sprite_scale() - - # Start animation - $AnimationPlayer.play("idle") - -func _process(delta: float) -> void: - if bodyToPickUp != null and !is_collected and timeBeforePickup == 0 and positionZ < 5: - visible = false - $SfxCoinCollect.play() - is_collected = true - $Area2DCollision.set_deferred("monitoring", false) - - var damage_number = damage_number_scene.instantiate() as Label - if damage_number: - get_tree().current_scene.add_child(damage_number) - damage_number.global_position = global_position + Vector2(0, -16) - if "direction" in damage_number: - damage_number.direction = Vector2(0, -1) - damage_number.move_duration = 1.0 - if "label" in damage_number: - damage_number.label = "+1 COIN" - if "color" in damage_number: - damage_number.color = Color.YELLOW - if "stats" in bodyToPickUp: - bodyToPickUp.stats.add_coin(1) - await $SfxCoinCollect.finished - call_deferred("queue_free") - return - if is_collected: - return - if timeBeforePickup > 0.0: - timeBeforePickup -= delta - if timeBeforePickup < 0: - $Area2DCollision.set_deferred("monitoring", true) - timeBeforePickup = 0 - if bounceTimer > 0.0: - bounceTimer -= delta - if bounceTimer < 0: - bounceTimer = 0 - - # Update vertical movement - velocityZ += accelerationZ * delta - positionZ += velocityZ * delta - - # Ground collision and bounce - if positionZ <= 0: - velocity = velocity.lerp(Vector2.ZERO, 1.0 - exp(-friction * delta)) # only slow down if on floor - positionZ = 0 - if abs(velocityZ) > minBounceVelocity: - #print(velocityZ) - $SfxCoinBounce.volume_db = -1 + (-10 - (velocityZ * 0.1)) - $SfxCoinBounce.play() - velocityZ = -velocityZ * bounceRestitution - else: - velocityZ = 0 - - update_sprite_scale() - move_and_slide() -' -func _physics_process(delta: float) -> void: - if multiplayer.is_server(): - for peer_id in multiplayer.get_peers(): - sync_coin.rpc_id(peer_id, position, velocity, positionZ, velocityZ) - if !multiplayer.is_server(): - position = position.lerp(sync_position, delta * 15.0) - velocity = velocity.lerp(sync_velocity, delta * 15.0) - positionZ = sync_positionZ - velocityZ = sync_velocityZ - if positionZ <= 0: - velocity = velocity.lerp(Vector2.ZERO, 1.0 - exp(-friction * delta)) # only slow down if on floor - positionZ = 0 - if abs(velocityZ) > minBounceVelocity: - #print(velocityZ) - $SfxCoinBounce.volume_db = -1 + (-10 - (velocityZ * 0.1)) - $SfxCoinBounce.play() - - update_sprite_scale() - pass -' -@rpc("unreliable") -func sync_coin(pos: Vector2, vel: Vector2, posZ: float, velZ: float): - sync_position = pos - sync_velocity = vel - sync_positionZ = posZ - sync_velocityZ = velZ - pass - -func update_sprite_scale() -> void: - # Calculate scale based on height - # Maximum height will have scale 1.3, ground will have scale 1.0 - var height_factor = positionZ / 50.0 # Assuming 20 is max height - var posY = 0.0 + (2 * positionZ) - var sc = 1.0 + (0.8 * height_factor) - $Sprite2D.scale = Vector2(sc, sc) - $Sprite2D.position.y = -posY - -func _on_area_2d_collision_body_entered(_body: Node2D) -> void: - if bounceTimer == 0: - $SfxCoinBounce.play() - bounceTimer = 0.08 - # inverse the direction and slow down slightly - var collision_shape = $Area2DCollision.get_overlapping_bodies() - - if collision_shape.size() > 0: - var collider = collision_shape[0] - var normal = (global_position - collider.global_position).normalized() - velocity = velocity.bounce(normal) - - pass # Replace with function body. - -@rpc("any_peer", "reliable") -func pick_up(_char: CharacterBody2D): - # does nothing... handled by coin itself! - return false - -func _on_area_2d_pickup_body_entered(body: Node2D) -> void: - if !is_collected: - bodyToPickUp = body.get_parent() - - pass # Replace with function body. - - -func _on_area_2d_pickup_body_exited(_body: Node2D) -> void: - bodyToPickUp = null - pass # Replace with function body. - - -func _on_area_2d_pickup_area_entered(area: Area2D) -> void: - if !is_collected: - bodyToPickUp = area.get_parent() - pass # Replace with function body. - - -func _on_area_2d_pickup_area_exited(_area: Area2D) -> void: - bodyToPickUp = null - pass # Replace with function body. diff --git a/src/scripts/inspiration_scripts/coin.gd.uid b/src/scripts/inspiration_scripts/coin.gd.uid deleted file mode 100644 index c6c4820..0000000 --- a/src/scripts/inspiration_scripts/coin.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dxkd5t8jbbmdm diff --git a/src/scripts/inspiration_scripts/dungeon_generator.gd b/src/scripts/inspiration_scripts/dungeon_generator.gd deleted file mode 100644 index 8ebf198..0000000 --- a/src/scripts/inspiration_scripts/dungeon_generator.gd +++ /dev/null @@ -1,617 +0,0 @@ -extends RefCounted # Using RefCounted instead of Node since this is a utility class - -enum DUNGEON_ENTITY_TYPES { - ENEMY, - OBJECT, - TRAP -} - -# Constants -const DOOR_MODIFIERS = [ - {"name": "Locked Door", "type": "Locked"}, - {"name": "Bomb Wall", "type": "Bombable"} -] - -const FLOOR_TILES = [ - 7,8,9,10,11,12, - 25,26,27,28,29,30,31, - 44,45,46,47,48,49,50, - 63,64,65,66,67,68,69 -] - -const WALL_VARIATIONS = [ - 0.45, - 0.15, - 0.15, - 0.15, - 0.1 -] - -const OBJECT_TYPES = [ - {"name": "Barrel", "ti": [70], "ti2": [89], "openable": false, "liftable": true, "throwable": false, "hp": - 1, "pushable": true, "size": {"x": 1, "y": 1}}, - {"name": "Pot", "ti": [13, 14, 15], "ti2": [51, 52, 53], "openable": false, "liftable": true, "throwable": true, "hp": 1, "pushable": true, "size": {"x": 1, "y": 1}}, - {"name": "Chest", "ti": [108], "ti2": [127], "openable": true, "liftable": false, "throwable": false, "hp": - 1, "pushable": false, "size": {"x": 1, "y": 1}}, - {"name": "Bench", "ti": [35, 36], "ti2": [16, 17], "openable": false, "liftable": false, "throwable": false, "hp": - 1, "pushable": false, "size": {"x": 2, "y": 1}} -] - -const MONSTER_TYPES = [ - { - "name": "Goblin", - }, - { - "name": "Slime", - }, - # ... other monster types similar to JS version -] - -const TRAP_TYPES = [ - {"name": "Spike Trap", "description": "Spikes shoot up from the floor when triggered."}, - {"name": "Arrow Trap", "description": "Arrows fire from the walls when a player steps on a pressure plate."}, - # ... other trap types -] - -const ROOM_MODIFIERS = [ - {"name": "Player Start", "description": "The players start here.", "type": "START", "negative_modifiers": {"min": 0, "max": 0}}, - {"name": "Exit", "description": "Room contains an exit.", "type": "EXIT", "negative_modifiers": {"min": 0, "max": 0}}, - # ... other room modifiers -] - -# Main generation function -func generate_dungeon(map_size: Vector2, _num_rooms: int, min_room_size: int, max_room_size: int) -> Dictionary: - # Initialize grid - var grid = [] - var randgrid = [] - for x in range(map_size.x): - grid.append([]) - randgrid.append([]) - for y in range(map_size.y): - grid[x].append(0) - randgrid[x].append(0) - - var all_rooms = [] - var all_doors = [] - - # 1. Create first room at a random position - var first_w = rand_range_i(min_room_size, max_room_size) - var first_h = rand_range_i(min_room_size, max_room_size) - var first_room = { - "x": rand_range_i(4, map_size.x - first_w - 4), # Random position with buffer - "y": rand_range_i(4, map_size.y - first_h - 4), - "w": first_w, - "h": first_h, - "modifiers": [] - } - - set_floor(first_room, grid, map_size) - all_rooms.append(first_room) - - var nrOfDoorErrors = 0 - var nrOfRoomErrors = 0 - - # 2. Try to place rooms until we can't fit any more - var attempts = 1000 # Prevent infinite loops - while attempts > 0 and all_rooms.size() > 0: - # Pick a random existing room - var source_room = all_rooms[randi() % all_rooms.size()] - - # Try to place a new room near it - var new_room = try_place_room_near(source_room, grid, map_size, min_room_size, max_room_size) - if new_room.w > 0: # Valid room created - set_floor(new_room, grid, map_size) - all_rooms.append(new_room) - - attempts -= 1 - if attempts <= 0: - nrOfRoomErrors += 1 - break - - # 3. Connect rooms with corridors/doors - if all_rooms.size() > 1: - var connected_rooms = {} - for room in all_rooms: - connected_rooms[room] = [] - - # First pass: try to connect each room to its closest neighbors - for room in all_rooms: - var closest_rooms = find_closest_rooms(room, all_rooms) - #print("Connecting room at ", room.x, ",", room.y) - - var connection_attempts = 0 - var max_connection_attempts = 3 # Try to connect to multiple neighbors - - for target_room in closest_rooms: - if connection_attempts >= max_connection_attempts: - break - - if not rooms_are_connected(room, target_room, all_doors): - var door = create_corridor_between_rooms(room, target_room, grid) - if door.size() > 0: - #print("Created direct connection between rooms") - set_door(door, grid) - all_doors.append(door) - connected_rooms[room].append(target_room) - connected_rooms[target_room].append(room) - connection_attempts += 1 - - # Second pass: ensure all rooms are connected - var attempts2 = 100 - while attempts2 > 0: - var reachable = find_reachable_rooms(all_rooms[0], all_rooms, all_doors) - #print("Reachable rooms: ", reachable.size(), "/", all_rooms.size()) - - if reachable.size() == all_rooms.size(): - #print("All rooms connected!") - break - - # Find an unreachable room and try to connect it - for room in all_rooms: - if not reachable.has(room): - var connected = false - - # Try to connect to each reachable room until success - for target_room in reachable: - var door = create_corridor_between_rooms(room, target_room, grid) - if door.size() > 0: - set_door(door, grid) - all_doors.append(door) - connected = true - break - - if not connected: - # Try creating intermediate room with multiple positions - for offset_x in [-2, 0, 2]: - for offset_y in [-2, 0, 2]: - var mid_room = create_intermediate_room(room, reachable[0], offset_x, offset_y) - if is_valid_room_position(mid_room, grid, map_size): - set_floor(mid_room, grid, map_size) - all_rooms.append(mid_room) - - var door1 = create_corridor_between_rooms(room, mid_room, grid) - var door2 = create_corridor_between_rooms(mid_room, reachable[0], grid) - - if door1.size() > 0 and door2.size() > 0: - set_door(door1, grid) - set_door(door2, grid) - all_doors.append(door1) - all_doors.append(door2) - connected = true - break - if connected: - break - - if connected: - break - - attempts2 -= 1 - if attempts2 <= 0: - nrOfDoorErrors += 1 - break - - for x in range(map_size.x): - for y in range(map_size.y): - if grid[x][y] == 0: # wall - var rand = randf() - var sum:float = 0.0 - for i in WALL_VARIATIONS.size(): - sum += WALL_VARIATIONS[i]; - if rand <= sum: - randgrid[x][y] = i - break - elif grid[x][y] == 1: # floor - if randf() < 0.6: - randgrid[x][y] = 0 - else: - randgrid[x][y] = randi_range(1,FLOOR_TILES.size()-1) - elif grid[x][y] == 2: # door - randgrid[x][y] = 0 # we dont care about these... only have 1 variant - - var startRoomIndex = randi_range(0,all_rooms.size()-1) - all_rooms[startRoomIndex].modifiers.push_back(ROOM_MODIFIERS[0]) - - var farthestRoom = null - var maxDistance = 0 - var exitRoomIndex = -1 - var roomIndex = 0 - for r in all_rooms: - var distance = abs(r.x - all_rooms[startRoomIndex].x) + abs(r.y - all_rooms[startRoomIndex].y) - if (distance > maxDistance): - maxDistance = distance - farthestRoom = r - exitRoomIndex = roomIndex - roomIndex+=1 - pass - - farthestRoom.modifiers.push_back(ROOM_MODIFIERS[1]) - - var entities = [] - var TILE_SIZE = 16 - - roomIndex = 0 - #populate rooms and decide modifiers for rooms - for r in all_rooms: - if roomIndex != startRoomIndex and roomIndex != exitRoomIndex: - var validRoomLocations = [] - var min_x = (r.x + 1) - var max_x = ((r.x + r.w) - 1) - var min_y = (r.y + 1) - var max_y = ((r.y + r.h) - 1) - for rw in range(min_x,max_x): - for rh in range(min_y, max_y): - validRoomLocations.push_back(Vector2(rw*TILE_SIZE - 8, rh*TILE_SIZE - 8)) # we assume entities are 16x16 are centered - # bigger rooms can have a larger content number! - var randNrOfEntities = randi_range(0, 4) - - for entI in randNrOfEntities: - - var enttype:DUNGEON_ENTITY_TYPES = randi_range(0, DUNGEON_ENTITY_TYPES.size()-1) as DUNGEON_ENTITY_TYPES - var entStats = {} - # hand code to only be enemies atm - if enttype == DUNGEON_ENTITY_TYPES.TRAP: - enttype = DUNGEON_ENTITY_TYPES.OBJECT - #enttype = DUNGEON_ENTITY_TYPES.OBJECT ## only objects now... - var subtype = "goblin" - if enttype == DUNGEON_ENTITY_TYPES.ENEMY: - var randType = randi_range(0, 1) - var cStats = CharacterStats.new() - if randType == 1: - cStats.hp = 2 - subtype = "slime" - else: - cStats.hp = 3 - cStats.skin = "res://assets/gfx/Puny-Characters/Layer 0 - Skins/Orc1.png" - cStats.skin = "res://assets/gfx/Puny-Characters/Layer 0 - Skins/Orc2.png" - - var hair = 0 - if randf() > 0.6: - hair = randi_range(1,13) - cStats.setHair(hair, randi_range(0,8)) - var facialhair = 0 - if randf() > 0.75: # very uncommon for facial hair on goblins - facialhair = randi_range(1,3) - cStats.setFacialHair(facialhair, randi_range(0, 4)) - - #cStats.add_on = "res://assets/gfx/Puny-Characters/Layer 7 - Add-ons/Orc Add-ons/GoblinEars1.png" - cStats.add_on = "res://assets/gfx/Puny-Characters/Layer 7 - Add-ons/Orc Add-ons/GoblinEars2.png" - #cStats.add_on = "res://assets/gfx/Puny-Characters/Layer 7 - Add-ons/Orc Add-ons/OrcJaw1.png" - #cStats.add_on = "res://assets/gfx/Puny-Characters/Layer 7 - Add-ons/Orc Add-ons/OrcJaw2.png" - # randomize if the goblin will have a weapon like dagger or sword - # randomize if the goblin will have bow and arrows also - # randomize if the goblin will have an armour and helmet etc. - - entStats = cStats.save() - elif enttype == DUNGEON_ENTITY_TYPES.OBJECT: - subtype = "pot" - else: - subtype = "spike" - - var posI = randi_range(0, validRoomLocations.size()-1) - - var entity = { - "type": enttype, - "subtype": subtype, - "stats": entStats, - "position": { - "x": validRoomLocations[posI].x, - "y": validRoomLocations[posI].y - } - } - entities.push_back(entity) - validRoomLocations.remove_at(posI) # this is now occupied... don't allow anything else spawn on it. - - # fill up modifiers per room - if ROOM_MODIFIERS.size() > 2: - r.modifiers.push_back(ROOM_MODIFIERS[randi_range(2, ROOM_MODIFIERS.size()-2)]) - pass - roomIndex += 1 - - - - return { - "rooms": all_rooms, - "entities": entities, - "doors": all_doors, - "grid": grid, - "randgrid": randgrid, # grid containing actual tile index-ish(ish) - "mapSize": map_size, - "nrOfDoorErrors": nrOfDoorErrors, - "nrOfRoomErrors": nrOfRoomErrors - } - -# Helper functions -func create_random_room(map_size: Vector2, min_size: int, max_size: int) -> Dictionary: - var x = randi() % (int(map_size.x) - max_size - 2) + 1 - var y = randi() % (int(map_size.y) - max_size - 2) + 1 - var w = rand_range_i(min_size, max_size) - var h = rand_range_i(min_size, max_size) - return {"x": x, "y": y, "w": w, "h": h, "modifiers": []} - -func rand_range_i(min_val: int, max_val: int) -> int: - return min_val + (randi() % (max_val - min_val + 1)) - -func set_floor(room: Dictionary, grid: Array, map_size: Vector2) -> void: - for x in range(room.x, room.x + room.w): - for y in range(room.y, room.y + room.h): - if x >= 0 and x < map_size.x and y >= 0 and y < map_size.y: - grid[x][y] = 1 # Set as floor tile - -# ... Additional helper functions and implementation details would follow ... -# ... previous code ... - -func try_place_room_near(source_room: Dictionary, grid: Array, map_size: Vector2, - min_room_size: int, max_room_size: int) -> Dictionary: - var attempts = 20 - while attempts > 0: - var w = rand_range_i(min_room_size, max_room_size) - var h = rand_range_i(min_room_size, max_room_size) - - # Try all four sides of the source room - var sides = ["N", "S", "E", "W"] - sides.shuffle() - - for side in sides: - var x = source_room.x - var y = source_room.y - - match side: - "N": - x = source_room.x + (randi() % max(1, source_room.w - w)) - y = source_room.y - h - 4 # 4 tiles away - "S": - x = source_room.x + (randi() % max(1, source_room.w - w)) - y = source_room.y + source_room.h + 4 - "W": - x = source_room.x - w - 4 - y = source_room.y + (randi() % max(1, source_room.h - h)) - "E": - x = source_room.x + source_room.w + 4 - y = source_room.y + (randi() % max(1, source_room.h - h)) - - if is_valid_room_position({"x": x, "y": y, "w": w, "h": h}, grid, map_size): - return {"x": x, "y": y, "w": w, "h": h, "modifiers": []} - - attempts -= 1 - - return {"x": 0, "y": 0, "w": 0, "h": 0, "modifiers": []} - -func find_closest_rooms(room: Dictionary, all_rooms: Array) -> Array: - if all_rooms.size() <= 1: - return [] - - var distances = [] - for other in all_rooms: - if other == room: - continue - var dist = abs(room.x - other.x) + abs(room.y - other.y) - distances.append({"room": other, "distance": dist}) - - # Sort by distance - if distances.size() > 0: - distances.sort_custom(func(a, b): return a.distance < b.distance) - # Return the rooms only, in order of distance - return distances.map(func(item): return item.room) - - return [] - -func rooms_are_connected(room1: Dictionary, room2: Dictionary, doors: Array) -> bool: - for door in doors: - if (door.room1 == room1 and door.room2 == room2) or \ - (door.room1 == room2 and door.room2 == room1): - return true - return false - -func create_corridor_between_rooms(room1: Dictionary, room2: Dictionary, _grid: Array) -> Dictionary: - # Determine if rooms are more horizontal or vertical from each other - var dx = abs(room2.x - room1.x) - var dy = abs(room2.y - room1.y) - - # Check if rooms are too far apart (more than 8 tiles) - if dx > 8 and dy > 8: - return {} - - if dx > dy: - # Horizontal corridor - var leftRoom = room1 if room1.x < room2.x else room2 - var rightRoom = room2 if room1.x < room2.x else room1 - - # Check if rooms are horizontally adjacent (gap should be reasonable) - if rightRoom.x - (leftRoom.x + leftRoom.w) > 8: - return {} - - # Door must start at the right edge of left room plus 1 tile gap - var door_x = leftRoom.x + leftRoom.w - - # Door y must be within both rooms' height ranges, accounting for walls - var min_y = max(leftRoom.y + 1, rightRoom.y + 1) # +1 to account for walls - var max_y = min(leftRoom.y + leftRoom.h - 2, rightRoom.y + rightRoom.h - 2) # -2 to ensure both tiles fit - - # Make sure we have a valid range - if max_y < min_y: - return {} - - # Pick a valid y position within the range - var door_y = min_y + (randi() % max(1, max_y - min_y + 1)) - - # Calculate actual width needed (distance between rooms) - var door_width = rightRoom.x - (leftRoom.x + leftRoom.w + 1) - # Use the larger of minimum width (4) or actual distance - door_width = max(4, door_width + 1) - - # Create door with calculated width - var door = { - "x": door_x, - "y": door_y, - "w": door_width, # Use calculated width - "h": 2, # Fixed height for horizontal doors - "dir": "E" if leftRoom == room1 else "W", - "room1": room1, - "room2": room2 - } - - return door - else: - # Vertical corridor - var topRoom = room1 if room1.y < room2.y else room2 - var bottomRoom = room2 if room1.y < room2.y else room1 - - # Check if rooms are vertically adjacent (gap should be reasonable) - if bottomRoom.y - (topRoom.y + topRoom.h) > 8: - return {} - - # Door must start at the bottom edge of top room plus 1 tile gap - var door_y = topRoom.y + topRoom.h - - # Door x must be within both rooms' width ranges, accounting for walls - var min_x = max(topRoom.x + 1, bottomRoom.x + 1) # +1 to account for walls - var max_x = min(topRoom.x + topRoom.w - 2, bottomRoom.x + bottomRoom.w - 2) # -2 to ensure both tiles fit - - # Make sure we have a valid range - if max_x < min_x: - return {} - - # Pick a valid x position within the range - var door_x = min_x + (randi() % max(1, max_x - min_x + 1)) - - # Calculate actual height needed (distance between rooms) - var door_height = bottomRoom.y - (topRoom.y + topRoom.h + 1) - # Use the larger of minimum height (4) or actual distance - door_height = max(4, door_height + 1) - - # Create door with calculated height - var door = { - "x": door_x, - "y": door_y, - "w": 2, # Fixed width for vertical doors - "h": door_height, # Use calculated height - "dir": "S" if topRoom == room1 else "N", - "room1": room1, - "room2": room2 - } - - return door - - -func add_room_modifiers(rooms: Array) -> void: - # Add start room modifier to first room - rooms[0].modifiers.append(ROOM_MODIFIERS[0]) # START modifier - - # Add exit to last room - rooms[-1].modifiers.append(ROOM_MODIFIERS[1]) # EXIT modifier - - # Add random modifiers to other rooms - for i in range(1, rooms.size() - 1): - if randf() < 0.3: # 30% chance for a modifier - var available_modifiers = ROOM_MODIFIERS.slice(2, ROOM_MODIFIERS.size()) - # Only add modifier if there are available ones - if available_modifiers.size() > 0: - rooms[i].modifiers.append(available_modifiers[randi() % available_modifiers.size()]) - -func generate_all_room_objects(rooms: Array, doors: Array) -> Array: - var room_objects = [] - - # Generate objects for each room - for room in rooms: - var objects = generate_room_objects(room) - room_objects.append_array(objects) - - # Add door modifiers - for door in doors: - if randf() < 0.2: # 20% chance for door modifier - var modifier = DOOR_MODIFIERS[randi() % DOOR_MODIFIERS.size()] - room_objects.append({ - "type": "Door", - "x": door.x, - "y": door.y, - "modifier": modifier - }) - - return room_objects - -func generate_room_objects(room: Dictionary) -> Array: - var objects = [] - var max_objects = int((room.w * room.h) / 16) # Roughly one object per 16 tiles - - for _i in range(max_objects): - if randf() < 0.7: # 70% chance to place each potential object - var obj_type = OBJECT_TYPES[randi() % OBJECT_TYPES.size()] - var x = rand_range_i(room.x + 1, room.x + room.w - obj_type.size.x - 1) - var y = rand_range_i(room.y + 1, room.y + room.h - obj_type.size.y - 1) - - # Check if position is free - var can_place = true - for obj in objects: - if abs(obj.x - x) < 2 and abs(obj.y - y) < 2: - can_place = false - break - - if can_place: - objects.append({ - "type": obj_type.name, - "x": x, - "y": y, - "properties": obj_type - }) - - return objects - -func set_door(door: Dictionary, grid: Array) -> void: - match door.dir: - "N", "S": - if door.h > 4: - # Set 2x4 corridor - for dx in range(2): - for dy in range(door.h): - #if grid[door.x + dx][door.y + dy] != 1: # Don't overwrite room - grid[door.x + dx][door.y + dy] = 2 - "E", "W": - if door.w > 4: - # Set 4x2 corridor - for dx in range(door.w): - for dy in range(2): - #if grid[door.x + dx][door.y + dy] != 1: # Don't overwrite room - grid[door.x + dx][door.y + dy] = 2 - -func is_valid_room_position(room: Dictionary, grid: Array, map_size: Vector2) -> bool: - # Check if room is within map bounds with buffer - if room.x < 4 or room.y < 4 or room.x + room.w >= map_size.x - 4 or room.y + room.h >= map_size.y - 4: - #print("Room outside map bounds") - return false - - # Check if room overlaps with existing rooms or corridors - # Check the actual room area plus 4-tile buffer for spacing - for x in range(room.x - 4, room.x + room.w + 4): - for y in range(room.y - 4, room.y + room.h + 4): - if x >= 0 and x < map_size.x and y >= 0 and y < map_size.y: - if grid[x][y] != 0: # If tile is not empty - #print("Room overlaps at ", Vector2(x, y)) - return false - - return true - -# Add this helper function to check room connectivity -func find_reachable_rooms(start_room: Dictionary, _all_rooms: Array, all_doors: Array) -> Array: - var reachable = [start_room] - var queue = [start_room] - - while queue.size() > 0: - var current = queue.pop_front() - for door in all_doors: - var next_room = null - if door.room1 == current: - next_room = door.room2 - elif door.room2 == current: - next_room = door.room1 - - if next_room != null and not reachable.has(next_room): - reachable.append(next_room) - queue.append(next_room) - - return reachable - -func create_intermediate_room(room1: Dictionary, room2: Dictionary, offset_x: int, offset_y: int) -> Dictionary: - return { - "x": room1.x + (room2.x - room1.x) / 2 + offset_x, - "y": room1.y + (room2.y - room1.y) / 2 + offset_y, - "w": 6, - "h": 6, - "modifiers": [] - } diff --git a/src/scripts/inspiration_scripts/dungeon_generator.gd.uid b/src/scripts/inspiration_scripts/dungeon_generator.gd.uid deleted file mode 100644 index e56aab8..0000000 --- a/src/scripts/inspiration_scripts/dungeon_generator.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dj0n3aevweyhu diff --git a/src/scripts/inspiration_scripts/inventory.gd b/src/scripts/inspiration_scripts/inventory.gd deleted file mode 100644 index 30c4f19..0000000 --- a/src/scripts/inspiration_scripts/inventory.gd +++ /dev/null @@ -1,491 +0,0 @@ -extends CanvasLayer - -var is_showing_inventory = true -var finished_tween = true - -var selectedItem:Item = null -var selectedEquipment:Item = null -var lastPressedItem:Item = null -var lastPressedType = "Item" - -var timerSelect:float = 0.0 - -func bindInventory(): - if GameManager.character_data.is_connected("character_changed", _charChanged): - GameManager.character_data.disconnect("character_changed", _charChanged) - GameManager.character_data.connect("character_changed", _charChanged) - pass - -func _ready() -> void: - - is_showing_inventory = false - var move_range = -119 - $ControlContainer/ControlStats.position.x += move_range - move_range = 80 - $ControlContainer/ControlInventory.position.x += move_range - move_range = 33 - $ControlContainer/ControlInfo.position.y += move_range - - $ControlContainer.mouse_filter = Control.MOUSE_FILTER_IGNORE - - - # Set up multiplayer peer - ' - GameManager.host(21212, false) - - GameManager.character_data.connect("character_changed", _charChanged) - - #$Player.position = Vector2(30, 30) - - var item = Item.new() - item.item_type = Item.ItemType.Equippable - item.equipment_type = Item.EquipmentType.ARMOUR - item.item_name = "Leather Armour" - item.description = "A nice leather armour" - item.spriteFrame = 12 - item.modifiers["def"] = 2 - item.equipmentPath = "res://assets/gfx/Puny-Characters/Layer 2 - Clothes/Tunic Body/BrownTunic.png" - GameManager.character_data.add_item(item) - - - var item2 = Item.new() - item2.item_type = Item.ItemType.Equippable - item2.equipment_type = Item.EquipmentType.HEADGEAR - item2.item_name = "Leather helm" - item2.description = "A nice leather helm" - item2.spriteFrame = 31 - item2.modifiers["def"] = 1 - item2.equipmentPath = "res://assets/gfx/Puny-Characters/Layer 6 - Headgears/Basic Mage/MageHatRed.png" - item2.colorReplacements = [ - { "original": Color(255/255.0, 39/255.0, 44/255.0), "replace": Color(255/255.0,106/255.0,39/255.0)}, - { "original": Color(182/255.0, 0, 0), "replace": Color(182/255.0,106/255.0,0)}, - { "original": Color(118/255.0, 1/255.0, 0), "replace": Color(118/255.0,66/255.0,0)}, - { "original": Color(72/255.0, 0, 12/255.0), "replace": Color(72/255.0,34/255.0,0)} - ] - GameManager.character_data.add_item(item2) - - var item3 = Item.new() - item3.item_type = Item.ItemType.Equippable - item3.equipment_type = Item.EquipmentType.MAINHAND - item3.weapon_type = Item.WeaponType.SWORD - item3.item_name = "Dagger" - item3.description = "A sharp dagger" - item3.spriteFrame = 5*20 + 10 - item3.modifiers["dmg"] = 2 - GameManager.character_data.add_item(item3) - - var item4 = Item.new() - item4.item_type = Item.ItemType.Equippable - item4.equipment_type = Item.EquipmentType.MAINHAND - item4.weapon_type = Item.WeaponType.AXE - item4.item_name = "Hand Axe" - item4.description = "A sharp hand axe" - item4.spriteFrame = 5*20 + 11 - item4.modifiers["dmg"] = 4 - GameManager.character_data.add_item(item4) - - var item5 = Item.new() - item5.item_type = Item.ItemType.Equippable - item5.equipment_type = Item.EquipmentType.OFFHAND - item5.weapon_type = Item.WeaponType.AMMUNITION - item5.quantity = 13 - item5.can_have_multiple_of = true - item5.item_name = "Iron Arrow" - item5.description = "A sharp arrow made of iron and feathers from pelican birds" - item5.spriteFrame = 7*20 + 11 - item5.modifiers["dmg"] = 3 - GameManager.character_data.add_item(item5) - - var item6 = Item.new() - item6.item_type = Item.ItemType.Equippable - item6.equipment_type = Item.EquipmentType.MAINHAND - item6.weapon_type = Item.WeaponType.BOW - item6.item_name = "Wooden Bow" - item6.description = "A wooden bow made of elfish lembas trees" - item6.spriteFrame = 6*20 + 16 - item6.modifiers["dmg"] = 3 - GameManager.character_data.add_item(item6) - - var item7 = Item.new() - item7.item_type = Item.ItemType.Equippable - item7.equipment_type = Item.EquipmentType.BOOTS - item7.weapon_type = Item.WeaponType.NONE - item7.item_name = "Sandals" - item7.description = "A pair of shitty sandals" - item7.equipmentPath = "res://assets/gfx/Puny-Characters/Layer 1 - Shoes/ShoesBrown.png" - item7.spriteFrame = 2*20 + 10 - item7.modifiers["def"] = 1 - GameManager.character_data.add_item(item7) - ' - - # clear default stuff - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/Control/Sprite2DItem.texture = null - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/LabelItemDescription.text = "" - - pass - -func _charChanged(iChar:CharacterStats): - # update all stats: - $ControlContainer/ControlStats/MarginContainer/VBoxContainer/HBoxContainer/LabelBaseStatsValue.text = str(iChar.level) + "\r\n" + \ - "\r\n" + \ - str(floori(iChar.hp)) + "/" + str(floori(iChar.maxhp)) + "\r\n" + \ - str(floori(iChar.mp)) + "/" + str(floori(iChar.maxmp)) + "\r\n" + \ - "\r\n" + \ - str(iChar.baseStats.str) + "\r\n" + \ - str(iChar.baseStats.dex) + "\r\n" + \ - str(iChar.baseStats.end) + "\r\n" + \ - str(iChar.baseStats.int) + "\r\n" + \ - str(iChar.baseStats.wis) + "\r\n" + \ - str(iChar.baseStats.lck) - - $ControlContainer/ControlStats/MarginContainer/VBoxContainer/HBoxContainer/LabelDerivedStatsValue.text = str(floori(iChar.xp)) + "/" + str(floori(iChar.xp_to_next_level)) + "\r\n" + \ - str(iChar.coin) + "\r\n" + \ - "\r\n" + \ - "\r\n" + \ - "\r\n" + \ - str(iChar.damage) + "\r\n" + \ - str(iChar.defense) + "\r\n" + \ - str(iChar.move_speed) + "\r\n" + \ - str(iChar.attack_speed) + "\r\n" + \ - str(iChar.sight) + "\r\n" + \ - str(iChar.spell_amp) + "\r\n" + \ - str(iChar.crit_chance) + "%" - - # read inventory and populate inventory - var vboxInvent = $ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory - for child in vboxInvent.find_child("HBoxControl1").get_children(): - child.get_parent().remove_child(child) - child.propagate_call("queue_free", []) - for child in vboxInvent.find_child("HBoxControl2").get_children(): - child.get_parent().remove_child(child) - child.propagate_call("queue_free", []) - for child in vboxInvent.find_child("HBoxControl3").get_children(): - child.get_parent().remove_child(child) - child.propagate_call("queue_free", []) - - var selected_tex = preload("res://assets/gfx/ui/inventory_slot_kenny_white.png") - var styleBoxHover:StyleBox = StyleBoxTexture.new() - var styleBoxFocused:StyleBox = StyleBoxTexture.new() - var styleBoxPressed:StyleBox = StyleBoxTexture.new() - var styleBoxEmpty:StyleBox = StyleBoxEmpty.new() - styleBoxHover.texture = selected_tex - styleBoxFocused.texture = selected_tex - styleBoxPressed.texture = selected_tex - - var quantityFont:Font = load("res://assets/fonts/dmg_numbers.png") - for item:Item in iChar.inventory: - var btn:Button = Button.new() - btn.add_theme_stylebox_override("normal", styleBoxEmpty) - btn.add_theme_stylebox_override("hover", styleBoxHover) - btn.add_theme_stylebox_override("focus", styleBoxFocused) - btn.add_theme_stylebox_override("pressed", styleBoxPressed) - btn.custom_minimum_size = Vector2(24, 24) - btn.size = Vector2(24, 24) - - vboxInvent.find_child("HBoxControl1").add_child(btn) - var spr:Sprite2D = Sprite2D.new() - spr.texture = load(item.spritePath) - spr.hframes = item.spriteFrames.x - spr.vframes = item.spriteFrames.y - spr.frame = item.spriteFrame - spr.centered = false - spr.position = Vector2(4,4) - btn.add_child(spr) - - if item.can_have_multiple_of: - var lblQuantity:Label = Label.new() - lblQuantity.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT - lblQuantity.size = Vector2(24, 24) - lblQuantity.custom_minimum_size = Vector2(0,0) - lblQuantity.position = Vector2(10, 2) - lblQuantity.text = str(item.quantity) - lblQuantity.add_theme_font_override("font", quantityFont) - lblQuantity.add_theme_font_size_override("font", 8) - lblQuantity.scale = Vector2(0.5, 0.5) - btn.add_child(lblQuantity) - pass - - btn.connect("pressed", _selectItem.bind(item, true)) - btn.connect("focus_entered", _selectItem.bind(item, false)) - - pass - # clear eq container... - var eqContainer = $ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer - for child in eqContainer.get_children(): - child.get_parent().remove_child(child) - child.propagate_call("queue_free", []) - '"mainhand": null, - "offhand": null, - "headgear": null, - "armour": null, - "boots": null, - "accessory": null' - addEq(iChar, "mainhand", eqContainer, styleBoxEmpty, styleBoxHover, styleBoxFocused, styleBoxPressed, quantityFont) - addEq(iChar, "offhand", eqContainer, styleBoxEmpty, styleBoxHover, styleBoxFocused, styleBoxPressed, quantityFont) - addEq(iChar, "headgear", eqContainer, styleBoxEmpty, styleBoxHover, styleBoxFocused, styleBoxPressed, quantityFont) - addEq(iChar, "armour", eqContainer, styleBoxEmpty, styleBoxHover, styleBoxFocused, styleBoxPressed, quantityFont) - addEq(iChar, "boots", eqContainer, styleBoxEmpty, styleBoxHover, styleBoxFocused, styleBoxPressed, quantityFont) - addEq(iChar, "accessory", eqContainer, styleBoxEmpty, styleBoxHover, styleBoxFocused, styleBoxPressed, quantityFont) - - pass - -func addEq(iChar:CharacterStats, iPiece:String, eqContainer:Control, styleBoxEmpty: StyleBox, styleBoxHover: StyleBox, styleBoxFocused: StyleBox, styleBoxPressed: StyleBox, quantityFont: Font): - if iChar.equipment[iPiece] != null: - var btn:Button = Button.new() - btn.add_theme_stylebox_override("normal", styleBoxEmpty) - btn.add_theme_stylebox_override("hover", styleBoxHover) - btn.add_theme_stylebox_override("focus", styleBoxFocused) - btn.add_theme_stylebox_override("pressed", styleBoxPressed) - btn.custom_minimum_size = Vector2(24, 24) - btn.position = Vector2(1,9) - match iPiece: - "armour": - btn.position = Vector2(28, 9) - pass - "offhand": - btn.position = Vector2(55, 9) - pass - "headgear": - btn.position = Vector2(1, 36) - pass - "boots": - btn.position = Vector2(28, 36) - pass - "accessory": - btn.position = Vector2(55, 36) - pass - pass - - eqContainer.add_child(btn) - var spr:Sprite2D = Sprite2D.new() - spr.texture = load(iChar.equipment[iPiece].spritePath) - spr.hframes = iChar.equipment[iPiece].spriteFrames.x - spr.vframes = iChar.equipment[iPiece].spriteFrames.y - spr.frame = iChar.equipment[iPiece].spriteFrame - spr.centered = false - spr.position = Vector2(4,4) - btn.add_child(spr) - btn.connect("pressed", _selectEquipment.bind(iChar.equipment[iPiece], true)) - btn.connect("focus_entered", _selectEquipment.bind(iChar.equipment[iPiece], false)) - - if iChar.equipment[iPiece].can_have_multiple_of: - var lblQuantity:Label = Label.new() - lblQuantity.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT - lblQuantity.size = Vector2(24, 24) - lblQuantity.custom_minimum_size = Vector2(0,0) - lblQuantity.position = Vector2(10, 2) - lblQuantity.text = str(iChar.equipment[iPiece].quantity) - lblQuantity.add_theme_font_override("font", quantityFont) - lblQuantity.add_theme_font_size_override("font", 8) - lblQuantity.scale = Vector2(0.5, 0.5) - btn.add_child(lblQuantity) - pass - pass - pass - - # draw equipment buttons (for unequipping) -func _selectEquipment(item:Item, isPress: bool): - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/ButtonDrop.visible = true - if !is_showing_inventory: - return - if lastPressedItem == item and lastPressedType == "Equipment" and timerSelect > 0: - $SfxUnequip.play() - GameManager.character_data.unequip_item(selectedEquipment) - selectedItem = selectedEquipment - lastPressedItem = null - selectedEquipment = null - lastPressedType = "Item" - var vboxInvent = $ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory - for child in vboxInvent.find_child("HBoxControl1").get_children(): - child.grab_focus() - break - return - lastPressedType = "Equipment" - selectedEquipment = item - # update description in bottom - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/Control/Sprite2DItem.texture = load(item.spritePath) - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/Control/Sprite2DItem.hframes = item.spriteFrames.x - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/Control/Sprite2DItem.vframes = item.spriteFrames.y - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/Control/Sprite2DItem.frame = item.spriteFrame - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/LabelItemDescription.text = item.description - if isPress: - lastPressedItem = item - timerSelect = 0.4 - # unequip item - pass - -func _selectItem(item:Item, isPress: bool): - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/ButtonDrop.visible = true - if !is_showing_inventory: - return - if lastPressedItem == item and lastPressedType == "Item" and timerSelect > 0: - timerSelect = 0 - $SfxEquip.play() - GameManager.character_data.equip_item(selectedItem) - selectedEquipment = selectedItem - selectedItem = null - lastPressedItem = null - lastPressedType = "Equipment" - var eqContainer = $ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer - for child in eqContainer.get_children(): - child.grab_focus() - break - return - lastPressedType = "Item" - selectedItem = item - # update description in bottom - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/Control/Sprite2DItem.texture = load(item.spritePath) - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/Control/Sprite2DItem.hframes = item.spriteFrames.x - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/Control/Sprite2DItem.vframes = item.spriteFrames.y - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/Control/Sprite2DItem.frame = item.spriteFrame - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/LabelItemDescription.text = item.description - if isPress: - lastPressedItem = item - timerSelect = 0.4 - pass - -func _process(delta: float) -> void: - if timerSelect > 0: - timerSelect -= delta - if timerSelect <= 0: - timerSelect = 0 - pass - -func _input(_event: InputEvent): - #print("connected to newtwork:", GameManager.is_network_connected) - #print("finished tween:", finished_tween) - if !GameManager.is_network_connected or finished_tween == false: - return - if is_showing_inventory: - if !$ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/ButtonDrop.has_focus(): - if lastPressedType == "Equipment" and selectedEquipment != null and Input.is_action_just_pressed("ui_accept"): - $SfxUnequip.play() - GameManager.character_data.unequip_item(selectedEquipment) - selectedItem = selectedEquipment - selectedEquipment = null - lastPressedItem = null - lastPressedType = "Item" - var vboxInvent = $ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory - for child in vboxInvent.find_child("HBoxControl1").get_children(): - child.grab_focus() - break - return - if lastPressedType == "Item" and selectedItem != null and Input.is_action_just_pressed("ui_accept"): - $SfxEquip.play() - GameManager.character_data.equip_item(selectedItem) - selectedEquipment = selectedItem - selectedItem = null - lastPressedItem = null - lastPressedType = "Equipment" - var eqContainer = $ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer - for child in eqContainer.get_children(): - child.grab_focus() - break - return - - if Input.is_action_just_pressed("inventory") and finished_tween == true: - finished_tween = false - var move_range = 119 - var move_duration = 0.3 - if is_showing_inventory: - move_range = -move_range - #stats movement - var move_tween = get_tree().create_tween() - move_tween.tween_property($ControlContainer/ControlStats, "position:x",$ControlContainer/ControlStats.position.x + move_range,move_duration).from($ControlContainer/ControlStats.position.x).set_trans(Tween.TRANS_EXPO).set_ease(Tween.EASE_IN_OUT) - move_range = -80 - if is_showing_inventory: - move_range = -move_range - #inventory movement - var move_tween2 = get_tree().create_tween() - move_tween2.tween_property($ControlContainer/ControlInventory, "position:x",$ControlContainer/ControlInventory.position.x + move_range,move_duration).from($ControlContainer/ControlInventory.position.x).set_trans(Tween.TRANS_EXPO).set_ease(Tween.EASE_IN_OUT) - - move_range = -33 - if is_showing_inventory: - $SfxInventoryClose.play() - move_range = -move_range - else: - $SfxInventoryOpen.play() - #info movement - var move_tween3 = get_tree().create_tween() - move_tween3.tween_property($ControlContainer/ControlInfo, "position:y",$ControlContainer/ControlInfo.position.y + move_range,move_duration).from($ControlContainer/ControlInfo.position.y).set_trans(Tween.TRANS_EXPO).set_ease(Tween.EASE_IN_OUT) - - is_showing_inventory = !is_showing_inventory - await move_tween3.finished - finished_tween = true - - if is_showing_inventory: - # preselect first item - var vboxInvent = $ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory - var hadInventoryItem = false - for child in vboxInvent.find_child("HBoxControl1").get_children(): - child.grab_focus() - hadInventoryItem = true - break - lastPressedType = "Item" - if hadInventoryItem == false: - # preselect something in equipment instead - selectedItem = null - lastPressedItem = null - lastPressedType = "Equipment" - var eqContainer = $ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer - for child in eqContainer.get_children(): - child.grab_focus() - break - pass - - pass - ' - if Input.is_action_just_pressed("ui_right"): - $ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer. - pass - if Input.is_action_just_pressed("ui_left"): - - pass' - ' - if Input.is_action_just_pressed("ui_up"): - $ControlContainer/ControlInventory/Sprite2DSelector.position.y -= 20 - pass - - if Input.is_action_just_pressed("ui_down"): - $ControlContainer/ControlInventory/Sprite2DSelector.position.y += 20 - pass' - - -func _on_button_drop_pressed() -> void: - if !is_showing_inventory: - return - if lastPressedType == "Item": - if selectedItem != null: - GameManager.character_data.drop_item(selectedItem) - selectedItem = null - # clear default stuff - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/Control/Sprite2DItem.texture = null - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/LabelItemDescription.text = "" - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/ButtonDrop.visible = false - else: - if selectedEquipment != null: - GameManager.character_data.drop_equipment(selectedEquipment) - selectedEquipment = null - # clear default stuff - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/Control/Sprite2DItem.texture = null - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/LabelItemDescription.text = "" - $ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/ButtonDrop.visible = false - - var vboxInvent = $ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory - var hadInventoryItem = false - for child in vboxInvent.find_child("HBoxControl1").get_children(): - child.grab_focus() - hadInventoryItem = true - break - lastPressedType = "Item" - if hadInventoryItem == false: - selectedItem = null - lastPressedItem = null - lastPressedType = "Equipment" - var eqContainer = $ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer - for child in eqContainer.get_children(): - child.grab_focus() - break - - - pass # Replace with function body. diff --git a/src/scripts/inspiration_scripts/inventory.gd.uid b/src/scripts/inspiration_scripts/inventory.gd.uid deleted file mode 100644 index 6e3ef11..0000000 --- a/src/scripts/inspiration_scripts/inventory.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://20kfmxrtt20e diff --git a/src/scripts/inspiration_scripts/inventory.tscn b/src/scripts/inspiration_scripts/inventory.tscn deleted file mode 100644 index 25fac6f..0000000 --- a/src/scripts/inspiration_scripts/inventory.tscn +++ /dev/null @@ -1,693 +0,0 @@ -[gd_scene format=3 uid="uid://du1cpug8yag6w"] - -[ext_resource type="Texture2D" uid="uid://b7u7dbiaub8lp" path="res://assets/gfx/ruinborn_mImwZSNWBM.png" id="1_0amil"] -[ext_resource type="Script" uid="uid://20kfmxrtt20e" path="res://assets/scripts/ui/inventory.gd" id="1_k81k7"] -[ext_resource type="Texture2D" uid="uid://hib38y541eog" path="res://assets/gfx/items_n_shit.png" id="2_7vwhs"] -[ext_resource type="Texture2D" uid="uid://ct0rllwve2s1y" path="res://assets/gfx/ui/inventory_panel_small.png" id="2_voqm7"] -[ext_resource type="Texture2D" uid="uid://who0clhmi5cl" path="res://assets/gfx/ui/inventory_panel.png" id="4_nlhqn"] -[ext_resource type="Texture2D" uid="uid://cxend0ndnfn32" path="res://assets/gfx/ui/inventory_slot_kenny_white.png" id="4_nxmsh"] -[ext_resource type="Texture2D" uid="uid://bsnfadlf1dgnw" path="res://assets/gfx/ui/inventory_slot_kenny_black_sword.png" id="6_k81k7"] -[ext_resource type="FontFile" uid="uid://cbmcfue0ek0tk" path="res://assets/fonts/dmg_numbers.png" id="7_kiwfx"] -[ext_resource type="Texture2D" uid="uid://tdivehfcj0el" path="res://assets/gfx/ui/inventory_slot_kenny_black_shield.png" id="7_vardb"] -[ext_resource type="Texture2D" uid="uid://b1l30o2ljhl2t" path="res://assets/gfx/ui/inventory_slot_kenny_black_armour.png" id="8_mnwqb"] -[ext_resource type="Texture2D" uid="uid://jgbrhnsaxvg" path="res://assets/gfx/ui/inventory_slot_kenny_black_helm.png" id="9_nbh80"] -[ext_resource type="Texture2D" uid="uid://b71gs7h2v0rdi" path="res://assets/gfx/ui/inventory_slot_kenny_black_ring.png" id="10_kiwfx"] -[ext_resource type="Texture2D" uid="uid://ckctmypotajtf" path="res://assets/gfx/ui/inventory_slot_kenny_black_shoes.png" id="11_ylqbh"] -[ext_resource type="Texture2D" uid="uid://c21a60s4funrr" path="res://assets/gfx/ui/inventory_info_panel.png" id="13_vardb"] -[ext_resource type="AudioStream" uid="uid://x6lxrywls7e2" path="res://assets/audio/sfx/inventory/inventory_open.mp3" id="14_mnwqb"] -[ext_resource type="AudioStream" uid="uid://cfsubtwvpi7yn" path="res://assets/audio/sfx/inventory/inventory_open_inverted.mp3" id="14_nbh80"] -[ext_resource type="AudioStream" uid="uid://djw6c5rb4mm60" path="res://assets/audio/sfx/cloth/leather_cloth_02.wav.mp3" id="17_51fgf"] -[ext_resource type="AudioStream" uid="uid://umoxmryvbm01" path="res://assets/audio/sfx/cloth/leather_cloth_01.wav.mp3" id="18_qk47y"] - -[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_nbh80"] -texture = ExtResource("4_nxmsh") -modulate_color = Color(0.511719, 0.511719, 0.511719, 1) - -[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_kiwfx"] -texture = ExtResource("4_nxmsh") -modulate_color = Color(0, 0, 0, 1) - -[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_ylqbh"] -texture = ExtResource("4_nxmsh") - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_nbh80"] - -[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_51fgf"] -texture = ExtResource("4_nxmsh") - -[node name="Inventory" type="CanvasLayer"] -layer = 21 -script = ExtResource("1_k81k7") - -[node name="Sprite2D" type="Sprite2D" parent="."] -visible = false -modulate = Color(0.980057, 0.975295, 1, 1) -z_index = -2 -z_as_relative = false -position = Vector2(164.625, 92.75) -scale = Vector2(0.258803, 0.263268) -texture = ExtResource("1_0amil") - -[node name="ControlContainer" type="Control" parent="."] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="ControlStats" type="Control" parent="ControlContainer"] -layout_mode = 1 -anchors_preset = 9 -anchor_bottom = 1.0 -grow_vertical = 2 - -[node name="Sprite2DPanelz" type="Sprite2D" parent="ControlContainer/ControlStats"] -texture = ExtResource("4_nlhqn") -centered = false - -[node name="MarginContainer" type="MarginContainer" parent="ControlContainer/ControlStats"] -layout_mode = 0 -offset_right = 40.0 -offset_bottom = 40.0 -theme_override_constants/margin_left = 3 -theme_override_constants/margin_top = 3 -theme_override_constants/margin_right = 3 -theme_override_constants/margin_bottom = 3 - -[node name="VBoxContainer" type="VBoxContainer" parent="ControlContainer/ControlStats/MarginContainer"] -layout_mode = 2 - -[node name="LabelPlayerName" type="Label" parent="ControlContainer/ControlStats/MarginContainer/VBoxContainer"] -layout_mode = 2 -theme_override_font_sizes/font_size = 6 -text = "Fronko" -horizontal_alignment = 1 - -[node name="HBoxContainer" type="HBoxContainer" parent="ControlContainer/ControlStats/MarginContainer/VBoxContainer"] -layout_mode = 2 - -[node name="LabelBaseStats" type="Label" parent="ControlContainer/ControlStats/MarginContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -theme_override_constants/line_spacing = 0 -theme_override_font_sizes/font_size = 6 -text = "Level - -Hp -Mp - -Str -Dex -End -Int -Wis -Lck" - -[node name="LabelBaseStatsValue" type="Label" parent="ControlContainer/ControlStats/MarginContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -theme_override_constants/line_spacing = 0 -theme_override_font_sizes/font_size = 6 -text = "1 - -30 / 30 -20 / 20 - -10 -10 -10 -10 -10 -10" -horizontal_alignment = 2 - -[node name="LabelDerivedStats" type="Label" parent="ControlContainer/ControlStats/MarginContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -theme_override_constants/line_spacing = 0 -theme_override_font_sizes/font_size = 6 -text = "Exp -Coin - - - -Damage -Defense -MovSpd -AtkSpd -Sight -SpellAmp -CritChance" - -[node name="LabelDerivedStatsValue" type="Label" parent="ControlContainer/ControlStats/MarginContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -theme_override_constants/line_spacing = 0 -theme_override_font_sizes/font_size = 6 -text = "400 / 1000 -1 - - - -2 -3 -2.1 -1.4 -7.0 -3.0 -12.0%" -horizontal_alignment = 2 - -[node name="ControlInventory" type="Control" parent="ControlContainer"] -custom_minimum_size = Vector2(80, 0) -layout_mode = 1 -anchors_preset = 11 -anchor_left = 1.0 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 0 -grow_vertical = 2 - -[node name="Sprite2DPanel" type="Sprite2D" parent="ControlContainer/ControlInventory"] -modulate = Color(0, 0, 0, 0.862745) -texture = ExtResource("2_voqm7") -centered = false - -[node name="MarginContainer" type="MarginContainer" parent="ControlContainer/ControlInventory"] -custom_minimum_size = Vector2(80, 0) -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/margin_left = 2 -theme_override_constants/margin_top = 2 -theme_override_constants/margin_right = 2 -theme_override_constants/margin_bottom = 2 - -[node name="VBoxContainer" type="VBoxContainer" parent="ControlContainer/ControlInventory/MarginContainer"] -layout_mode = 2 -theme_override_constants/separation = 0 - -[node name="LabelInventory" type="Label" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer"] -layout_mode = 2 -theme_override_font_sizes/font_size = 6 -text = "Inventory" -horizontal_alignment = 1 - -[node name="ControlInventory" type="Control" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer"] -custom_minimum_size = Vector2(0, 72) -layout_mode = 2 - -[node name="MarginContainer" type="MarginContainer" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory"] -layout_mode = 2 -offset_left = 2.0 -offset_top = 2.0 -offset_right = 78.0 -offset_bottom = 70.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/margin_left = 2 -theme_override_constants/margin_top = 2 -theme_override_constants/margin_right = 2 -theme_override_constants/margin_bottom = 2 - -[node name="ScrollContainer" type="ScrollContainer" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer"] -layout_mode = 2 -follow_focus = true - -[node name="VBoxContainerInventory" type="VBoxContainer" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer"] -layout_mode = 2 -theme_override_constants/separation = -4 - -[node name="HBoxControl1" type="HBoxContainer" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/separation = 0 - -[node name="Button3" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl1"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl1/Button3"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="LabelStack" type="Label" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl1/Button3"] -layout_mode = 1 -anchors_preset = 1 -anchor_left = 1.0 -anchor_right = 1.0 -offset_left = -26.0 -offset_top = 2.0 -offset_right = -2.0 -offset_bottom = 26.0 -grow_horizontal = 0 -theme_override_fonts/font = ExtResource("7_kiwfx") -theme_override_font_sizes/font_size = 8 -text = "5" -horizontal_alignment = 2 - -[node name="Button6" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl1"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl1/Button6"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button5" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl1"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl1/Button5"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button4" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl1"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl1/Button4"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="HBoxControl2" type="HBoxContainer" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/separation = 0 - -[node name="Button3" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl2"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl2/Button3"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button5" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl2"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl2/Button5"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button4" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl2"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl2/Button4"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="HBoxControl3" type="HBoxContainer" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/separation = 0 - -[node name="Button3" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl3"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl3/Button3"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button5" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl3"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl3/Button5"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button4" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl3"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl3/Button4"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="ControlEquipment" type="Control" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer"] -custom_minimum_size = Vector2(80, 64) -layout_mode = 2 - -[node name="Label" type="Label" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment"] -layout_mode = 1 -anchors_preset = 5 -anchor_left = 0.5 -anchor_right = 0.5 -offset_left = -21.5 -offset_right = 21.5 -offset_bottom = 23.0 -grow_horizontal = 2 -theme_override_font_sizes/font_size = 6 -text = "Equipment" -horizontal_alignment = 1 - -[node name="Sprite2D" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment"] -modulate = Color(1, 1, 1, 0.670588) -position = Vector2(13, 21) -texture = ExtResource("6_k81k7") - -[node name="Sprite2D2" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment"] -modulate = Color(1, 1, 1, 0.670588) -position = Vector2(67, 21) -texture = ExtResource("7_vardb") - -[node name="Sprite2D3" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment"] -modulate = Color(1, 1, 1, 0.670588) -position = Vector2(40, 21) -texture = ExtResource("8_mnwqb") - -[node name="Sprite2D4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment"] -modulate = Color(1, 1, 1, 0.670588) -position = Vector2(13, 48) -texture = ExtResource("9_nbh80") - -[node name="Sprite2D9" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment"] -modulate = Color(1, 1, 1, 0.670588) -position = Vector2(67, 48) -texture = ExtResource("10_kiwfx") - -[node name="Sprite2D5" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment"] -modulate = Color(1, 1, 1, 0.670588) -position = Vector2(40, 48) -texture = ExtResource("11_ylqbh") - -[node name="ControlEquipmentContainer" type="Control" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Button" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 0 -offset_left = 1.0 -offset_top = 9.0 -offset_right = 25.0 -offset_bottom = 33.0 -theme_override_styles/normal = SubResource("StyleBoxTexture_51fgf") - -[node name="Sprite2DShield3" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer/Button"] -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button2" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 0 -offset_left = 28.0 -offset_top = 9.0 -offset_right = 52.0 -offset_bottom = 33.0 -theme_override_styles/normal = SubResource("StyleBoxTexture_51fgf") - -[node name="Sprite2DShield3" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer/Button2"] -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button3" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 0 -offset_left = 55.0 -offset_top = 9.0 -offset_right = 79.0 -offset_bottom = 33.0 -theme_override_styles/normal = SubResource("StyleBoxTexture_51fgf") - -[node name="Sprite2DShield3" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer/Button3"] -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button4" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 0 -offset_left = 1.0 -offset_top = 36.0 -offset_right = 25.0 -offset_bottom = 60.0 -theme_override_styles/normal = SubResource("StyleBoxTexture_51fgf") - -[node name="Sprite2DShield3" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer/Button4"] -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button5" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 0 -offset_left = 28.0 -offset_top = 36.0 -offset_right = 52.0 -offset_bottom = 60.0 -theme_override_styles/normal = SubResource("StyleBoxTexture_51fgf") - -[node name="Sprite2DShield3" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer/Button5"] -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button6" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 0 -offset_left = 55.0 -offset_top = 36.0 -offset_right = 79.0 -offset_bottom = 60.0 -theme_override_styles/normal = SubResource("StyleBoxTexture_51fgf") - -[node name="Sprite2DShield3" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer/Button6"] -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="ControlInfo" type="Control" parent="ControlContainer"] -custom_minimum_size = Vector2(0, 33) -layout_mode = 1 -anchors_preset = 12 -anchor_top = 1.0 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 0 - -[node name="Control" type="Control" parent="ControlContainer/ControlInfo"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Sprite2D" type="Sprite2D" parent="ControlContainer/ControlInfo/Control"] -texture = ExtResource("13_vardb") -centered = false - -[node name="MarginContainer" type="MarginContainer" parent="ControlContainer/ControlInfo/Control"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/margin_left = 5 -theme_override_constants/margin_top = 5 -theme_override_constants/margin_right = 5 -theme_override_constants/margin_bottom = 5 - -[node name="HBoxContainer" type="HBoxContainer" parent="ControlContainer/ControlInfo/Control/MarginContainer"] -layout_mode = 2 - -[node name="Control" type="Control" parent="ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_vertical = 4 - -[node name="Sprite2DSelector" type="Sprite2D" parent="ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/Control"] -modulate = Color(0.20704, 0.205805, 0.214844, 1) -texture = ExtResource("4_nxmsh") -centered = false - -[node name="Sprite2DItem" type="Sprite2D" parent="ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/Control"] -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="LabelItemDescription" type="Label" parent="ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer"] -layout_mode = 2 -size_flags_vertical = 1 -theme_override_font_sizes/font_size = 6 -text = "A small, but sturdy wooden shield. + 1 DEF" - -[node name="ButtonDrop" type="Button" parent="ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer"] -layout_mode = 2 -theme_override_font_sizes/font_size = 8 -text = "Drop" - -[node name="SfxInventoryClose" type="AudioStreamPlayer2D" parent="."] -stream = ExtResource("14_nbh80") -volume_db = -10.0 - -[node name="SfxInventoryOpen" type="AudioStreamPlayer2D" parent="."] -stream = ExtResource("14_mnwqb") -volume_db = -10.0 - -[node name="SfxUnequip" type="AudioStreamPlayer2D" parent="."] -stream = ExtResource("17_51fgf") - -[node name="SfxEquip" type="AudioStreamPlayer2D" parent="."] -stream = ExtResource("18_qk47y") - -[connection signal="pressed" from="ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/ButtonDrop" to="." method="_on_button_drop_pressed"] diff --git a/src/scripts/inspiration_scripts/inventory.tscn3980824984.tmp b/src/scripts/inspiration_scripts/inventory.tscn3980824984.tmp deleted file mode 100644 index c796774..0000000 --- a/src/scripts/inspiration_scripts/inventory.tscn3980824984.tmp +++ /dev/null @@ -1,692 +0,0 @@ -[gd_scene load_steps=24 format=3 uid="uid://du1cpug8yag6w"] - -[ext_resource type="Texture2D" uid="uid://b7u7dbiaub8lp" path="res://assets/gfx/ruinborn_mImwZSNWBM.png" id="1_0amil"] -[ext_resource type="Script" uid="uid://20kfmxrtt20e" path="res://assets/scripts/ui/inventory.gd" id="1_k81k7"] -[ext_resource type="Texture2D" uid="uid://hib38y541eog" path="res://assets/gfx/items_n_shit.png" id="2_7vwhs"] -[ext_resource type="Texture2D" uid="uid://ct0rllwve2s1y" path="res://assets/gfx/ui/inventory_panel_small.png" id="2_voqm7"] -[ext_resource type="Texture2D" uid="uid://who0clhmi5cl" path="res://assets/gfx/ui/inventory_panel.png" id="4_nlhqn"] -[ext_resource type="Texture2D" uid="uid://cxend0ndnfn32" path="res://assets/gfx/ui/inventory_slot_kenny_white.png" id="4_nxmsh"] -[ext_resource type="Texture2D" uid="uid://bsnfadlf1dgnw" path="res://assets/gfx/ui/inventory_slot_kenny_black_sword.png" id="6_k81k7"] -[ext_resource type="FontFile" uid="uid://cbmcfue0ek0tk" path="res://assets/fonts/dmg_numbers.png" id="7_kiwfx"] -[ext_resource type="Texture2D" uid="uid://tdivehfcj0el" path="res://assets/gfx/ui/inventory_slot_kenny_black_shield.png" id="7_vardb"] -[ext_resource type="Texture2D" uid="uid://b1l30o2ljhl2t" path="res://assets/gfx/ui/inventory_slot_kenny_black_armour.png" id="8_mnwqb"] -[ext_resource type="Texture2D" uid="uid://jgbrhnsaxvg" path="res://assets/gfx/ui/inventory_slot_kenny_black_helm.png" id="9_nbh80"] -[ext_resource type="Texture2D" uid="uid://b71gs7h2v0rdi" path="res://assets/gfx/ui/inventory_slot_kenny_black_ring.png" id="10_kiwfx"] -[ext_resource type="Texture2D" uid="uid://ckctmypotajtf" path="res://assets/gfx/ui/inventory_slot_kenny_black_shoes.png" id="11_ylqbh"] -[ext_resource type="Texture2D" uid="uid://c21a60s4funrr" path="res://assets/gfx/ui/inventory_info_panel.png" id="13_vardb"] -[ext_resource type="AudioStream" uid="uid://x6lxrywls7e2" path="res://assets/audio/sfx/inventory/inventory_open.mp3" id="14_mnwqb"] -[ext_resource type="AudioStream" uid="uid://cfsubtwvpi7yn" path="res://assets/audio/sfx/inventory/inventory_open_inverted.mp3" id="14_nbh80"] -[ext_resource type="AudioStream" uid="uid://djw6c5rb4mm60" path="res://assets/audio/sfx/cloth/leather_cloth_02.wav.mp3" id="17_51fgf"] -[ext_resource type="AudioStream" uid="uid://umoxmryvbm01" path="res://assets/audio/sfx/cloth/leather_cloth_01.wav.mp3" id="18_qk47y"] - -[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_nbh80"] -texture = ExtResource("4_nxmsh") -modulate_color = Color(0.511719, 0.511719, 0.511719, 1) - -[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_kiwfx"] -texture = ExtResource("4_nxmsh") -modulate_color = Color(0, 0, 0, 1) - -[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_ylqbh"] -texture = ExtResource("4_nxmsh") - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_nbh80"] - -[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_51fgf"] -texture = ExtResource("4_nxmsh") - -[node name="Inventory" type="CanvasLayer"] -layer = 21 -script = ExtResource("1_k81k7") - -[node name="Sprite2D" type="Sprite2D" parent="."] -visible = false -modulate = Color(0.980057, 0.975295, 1, 1) -z_index = -2 -z_as_relative = false -position = Vector2(164.625, 92.75) -scale = Vector2(0.258803, 0.263268) -texture = ExtResource("1_0amil") - -[node name="ControlContainer" type="Control" parent="."] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="ControlStats" type="Control" parent="ControlContainer"] -layout_mode = 1 -anchors_preset = 9 -anchor_bottom = 1.0 -grow_vertical = 2 - -[node name="Sprite2DPanelz" type="Sprite2D" parent="ControlContainer/ControlStats"] -texture = ExtResource("4_nlhqn") -centered = false - -[node name="MarginContainer" type="MarginContainer" parent="ControlContainer/ControlStats"] -layout_mode = 0 -offset_right = 40.0 -offset_bottom = 40.0 -theme_override_constants/margin_left = 3 -theme_override_constants/margin_top = 3 -theme_override_constants/margin_right = 3 -theme_override_constants/margin_bottom = 3 - -[node name="VBoxContainer" type="VBoxContainer" parent="ControlContainer/ControlStats/MarginContainer"] -layout_mode = 2 - -[node name="LabelPlayerName" type="Label" parent="ControlContainer/ControlStats/MarginContainer/VBoxContainer"] -layout_mode = 2 -theme_override_font_sizes/font_size = 6 -text = "Fronko" -horizontal_alignment = 1 - -[node name="HBoxContainer" type="HBoxContainer" parent="ControlContainer/ControlStats/MarginContainer/VBoxContainer"] -layout_mode = 2 - -[node name="LabelBaseStats" type="Label" parent="ControlContainer/ControlStats/MarginContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -theme_override_constants/line_spacing = 0 -theme_override_font_sizes/font_size = 6 -text = "Level - -Hp -Mp - -Str -Dex -End -Int -Wis -Lck" - -[node name="LabelBaseStatsValue" type="Label" parent="ControlContainer/ControlStats/MarginContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -theme_override_constants/line_spacing = 0 -theme_override_font_sizes/font_size = 6 -text = "1 - -30 / 30 -20 / 20 - -10 -10 -10 -10 -10 -10" -horizontal_alignment = 2 - -[node name="LabelDerivedStats" type="Label" parent="ControlContainer/ControlStats/MarginContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -theme_override_constants/line_spacing = 0 -theme_override_font_sizes/font_size = 6 -text = "Exp -Coin - - - -Damage -Defense -MovSpd -AtkSpd -Sight -SpellAmp -CritChance" - -[node name="LabelDerivedStatsValue" type="Label" parent="ControlContainer/ControlStats/MarginContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -theme_override_constants/line_spacing = 0 -theme_override_font_sizes/font_size = 6 -text = "400 / 1000 -1 - - - -2 -3 -2.1 -1.4 -7.0 -3.0 -12.0%" -horizontal_alignment = 2 - -[node name="ControlInventory" type="Control" parent="ControlContainer"] -custom_minimum_size = Vector2(80, 0) -layout_mode = 1 -anchors_preset = 11 -anchor_left = 1.0 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 0 -grow_vertical = 2 - -[node name="Sprite2DPanel" type="Sprite2D" parent="ControlContainer/ControlInventory"] -modulate = Color(0, 0, 0, 0.862745) -texture = ExtResource("2_voqm7") -centered = false - -[node name="MarginContainer" type="MarginContainer" parent="ControlContainer/ControlInventory"] -custom_minimum_size = Vector2(80, 0) -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/margin_left = 2 -theme_override_constants/margin_top = 2 -theme_override_constants/margin_right = 2 -theme_override_constants/margin_bottom = 2 - -[node name="VBoxContainer" type="VBoxContainer" parent="ControlContainer/ControlInventory/MarginContainer"] -layout_mode = 2 -theme_override_constants/separation = 0 - -[node name="LabelInventory" type="Label" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer"] -layout_mode = 2 -theme_override_font_sizes/font_size = 6 -text = "Inventory" -horizontal_alignment = 1 - -[node name="ControlInventory" type="Control" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer"] -custom_minimum_size = Vector2(0, 72) -layout_mode = 2 - -[node name="MarginContainer" type="MarginContainer" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory"] -layout_mode = 2 -offset_left = 2.0 -offset_top = 2.0 -offset_right = 78.0 -offset_bottom = 70.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/margin_left = 2 -theme_override_constants/margin_top = 2 -theme_override_constants/margin_right = 2 -theme_override_constants/margin_bottom = 2 - -[node name="ScrollContainer" type="ScrollContainer" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer"] -layout_mode = 2 -follow_focus = true - -[node name="VBoxContainerInventory" type="VBoxContainer" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer"] -layout_mode = 2 -theme_override_constants/separation = -4 - -[node name="HBoxControl1" type="HBoxContainer" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/separation = 0 - -[node name="Button3" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl1"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl1/Button3"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="LabelStack" type="Label" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl1/Button3"] -layout_mode = 1 -anchors_preset = 1 -anchor_left = 1.0 -anchor_right = 1.0 -offset_left = -26.0 -offset_top = 2.0 -offset_right = -2.0 -offset_bottom = 26.0 -grow_horizontal = 0 -theme_override_fonts/font = ExtResource("7_kiwfx") -theme_override_font_sizes/font_size = 8 -text = "5" -horizontal_alignment = 2 - -[node name="Button6" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl1"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl1/Button6"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button5" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl1"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl1/Button5"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button4" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl1"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl1/Button4"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="HBoxControl2" type="HBoxContainer" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/separation = 0 - -[node name="Button3" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl2"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl2/Button3"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button5" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl2"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl2/Button5"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button4" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl2"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl2/Button4"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="HBoxControl3" type="HBoxContainer" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_constants/separation = 0 - -[node name="Button3" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl3"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl3/Button3"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button5" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl3"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl3/Button5"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button4" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl3"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_styles/focus = SubResource("StyleBoxTexture_nbh80") -theme_override_styles/hover = SubResource("StyleBoxTexture_kiwfx") -theme_override_styles/pressed = SubResource("StyleBoxTexture_ylqbh") -theme_override_styles/normal = SubResource("StyleBoxEmpty_nbh80") -text = " " - -[node name="Sprite2DShield4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlInventory/MarginContainer/ScrollContainer/VBoxContainerInventory/HBoxControl3/Button4"] -process_mode = 4 -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="ControlEquipment" type="Control" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer"] -custom_minimum_size = Vector2(80, 64) -layout_mode = 2 - -[node name="Label" type="Label" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment"] -layout_mode = 1 -anchors_preset = 5 -anchor_left = 0.5 -anchor_right = 0.5 -offset_left = -21.5 -offset_right = 21.5 -offset_bottom = 23.0 -grow_horizontal = 2 -theme_override_font_sizes/font_size = 6 -text = "Equipment" -horizontal_alignment = 1 - -[node name="Sprite2D" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment"] -modulate = Color(1, 1, 1, 0.670588) -position = Vector2(13, 21) -texture = ExtResource("6_k81k7") - -[node name="Sprite2D2" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment"] -modulate = Color(1, 1, 1, 0.670588) -position = Vector2(67, 21) -texture = ExtResource("7_vardb") - -[node name="Sprite2D3" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment"] -modulate = Color(1, 1, 1, 0.670588) -position = Vector2(40, 21) -texture = ExtResource("8_mnwqb") - -[node name="Sprite2D4" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment"] -modulate = Color(1, 1, 1, 0.670588) -position = Vector2(13, 48) -texture = ExtResource("9_nbh80") - -[node name="Sprite2D9" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment"] -modulate = Color(1, 1, 1, 0.670588) -position = Vector2(67, 48) -texture = ExtResource("10_kiwfx") - -[node name="Sprite2D5" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment"] -modulate = Color(1, 1, 1, 0.670588) -position = Vector2(40, 48) -texture = ExtResource("11_ylqbh") - -[node name="ControlEquipmentContainer" type="Control" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Button" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 0 -offset_left = 1.0 -offset_top = 9.0 -offset_right = 25.0 -offset_bottom = 33.0 -theme_override_styles/normal = SubResource("StyleBoxTexture_51fgf") - -[node name="Sprite2DShield3" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer/Button"] -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button2" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 0 -offset_left = 28.0 -offset_top = 9.0 -offset_right = 52.0 -offset_bottom = 33.0 -theme_override_styles/normal = SubResource("StyleBoxTexture_51fgf") - -[node name="Sprite2DShield3" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer/Button2"] -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button3" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 0 -offset_left = 55.0 -offset_top = 9.0 -offset_right = 79.0 -offset_bottom = 33.0 -theme_override_styles/normal = SubResource("StyleBoxTexture_51fgf") - -[node name="Sprite2DShield3" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer/Button3"] -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button4" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 0 -offset_left = 1.0 -offset_top = 36.0 -offset_right = 25.0 -offset_bottom = 60.0 -theme_override_styles/normal = SubResource("StyleBoxTexture_51fgf") - -[node name="Sprite2DShield3" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer/Button4"] -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button5" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 0 -offset_left = 28.0 -offset_top = 36.0 -offset_right = 52.0 -offset_bottom = 60.0 -theme_override_styles/normal = SubResource("StyleBoxTexture_51fgf") - -[node name="Sprite2DShield3" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer/Button5"] -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="Button6" type="Button" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 0 -offset_left = 55.0 -offset_top = 36.0 -offset_right = 79.0 -offset_bottom = 60.0 -theme_override_styles/normal = SubResource("StyleBoxTexture_51fgf") - -[node name="Sprite2DShield3" type="Sprite2D" parent="ControlContainer/ControlInventory/MarginContainer/VBoxContainer/ControlEquipment/ControlEquipmentContainer/Button6"] -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="ControlInfo" type="Control" parent="ControlContainer"] -custom_minimum_size = Vector2(0, 33) -layout_mode = 1 -anchors_preset = 12 -anchor_top = 1.0 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 0 - -[node name="Control" type="Control" parent="ControlContainer/ControlInfo"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Sprite2D" type="Sprite2D" parent="ControlContainer/ControlInfo/Control"] -texture = ExtResource("13_vardb") -centered = false - -[node name="MarginContainer" type="MarginContainer" parent="ControlContainer/ControlInfo/Control"] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/margin_left = 5 -theme_override_constants/margin_top = 5 -theme_override_constants/margin_right = 5 -theme_override_constants/margin_bottom = 5 - -[node name="HBoxContainer" type="HBoxContainer" parent="ControlContainer/ControlInfo/Control/MarginContainer"] -layout_mode = 2 - -[node name="Control" type="Control" parent="ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_vertical = 4 - -[node name="Sprite2DSelector" type="Sprite2D" parent="ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/Control"] -modulate = Color(0.20704, 0.205805, 0.214844, 1) -texture = ExtResource("4_nxmsh") -centered = false - -[node name="Sprite2DItem" type="Sprite2D" parent="ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer/Control"] -position = Vector2(4, 4) -texture = ExtResource("2_7vwhs") -centered = false -hframes = 20 -vframes = 14 -frame = 8 - -[node name="LabelItemDescription" type="Label" parent="ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer"] -layout_mode = 2 -size_flags_vertical = 1 -theme_override_font_sizes/font_size = 6 -text = "A small, but sturdy wooden shield. + 1 DEF" - -[node name="ButtonEquip" type="Button" parent="ControlContainer/ControlInfo/Control/MarginContainer/HBoxContainer"] -visible = false -layout_mode = 2 -theme_override_font_sizes/font_size = 8 -text = "Equip" - -[node name="SfxInventoryClose" type="AudioStreamPlayer2D" parent="."] -stream = ExtResource("14_nbh80") -volume_db = -10.0 - -[node name="SfxInventoryOpen" type="AudioStreamPlayer2D" parent="."] -stream = ExtResource("14_mnwqb") -volume_db = -10.0 - -[node name="SfxUnequip" type="AudioStreamPlayer2D" parent="."] -stream = ExtResource("17_51fgf") - -[node name="SfxEquip" type="AudioStreamPlayer2D" parent="."] -stream = ExtResource("18_qk47y") diff --git a/src/scripts/inspiration_scripts/loot.gd b/src/scripts/inspiration_scripts/loot.gd deleted file mode 100644 index 9b5f7b6..0000000 --- a/src/scripts/inspiration_scripts/loot.gd +++ /dev/null @@ -1,167 +0,0 @@ -extends CharacterBody2D - -var it: Item = null -@export var sync_has_been_picked_up: bool = false - -var friction = 8.0 # Lower values make the slowdown more gradual -var bounceTimer = 0.0 -# Z-axis variables -var positionZ = 4.0 # Start slightly in the air -var velocityZ = 10.0 # Initial upward velocity -var accelerationZ = -330.0 # Gravity -var bounceRestitution = 0.3 # How much bounce energy is retained (0-1) -var minBounceVelocity = 60.0 # Minimum velocity needed to bounce - -var sync_position := Vector2() -var sync_velocity := Vector2() -var sync_positionZ: float = 4.0 - - -func _ready() -> void: - add_to_group("loot") - - # Initialize item if needed - if it == null: - setItem() - -func _process(delta: float) -> void: - if multiplayer.is_server(): - if bounceTimer > 0.0: - bounceTimer -= delta - if bounceTimer < 0: - bounceTimer = 0 - - # Update vertical movement - velocityZ += accelerationZ * delta - positionZ += velocityZ * delta - - # Ground collision and bounce - if positionZ <= 0: - velocity = velocity.lerp(Vector2.ZERO, 1.0 - exp(-friction * delta)) # only slow down if on floor - positionZ = 0 - if abs(velocityZ) > minBounceVelocity: - #Bounce sound here for items: - #$SfxCoinBounce.volume_db = -1 + (-10-(velocityZ*0.1)) - #$SfxCoinBounce.play() - velocityZ = -velocityZ * bounceRestitution - else: - velocityZ = 0 - - update_sprite_scale() - move_and_slide() - pass - -func _physics_process(_delta: float) -> void: - if multiplayer.is_server(): - for peer_id in multiplayer.get_peers(): - sync_loot.rpc_id(peer_id, position, velocity, positionZ) - if !multiplayer.is_server(): - position = sync_position - velocity = sync_velocity - positionZ = sync_positionZ - update_sprite_scale() - pass - -@rpc("unreliable") -func sync_loot(pos: Vector2, vel: Vector2, posZ: float): - sync_position = pos - sync_velocity = vel - sync_positionZ = posZ - pass - -func update_sprite_scale() -> void: - # Calculate scale based on height - # Maximum height will have scale 1.3, ground will have scale 1.0 - var height_factor = positionZ / 50.0 # Assuming 20 is max height - var posY = 0.0 + (2 * positionZ) - var sc = 1.0 + (0.8 * height_factor) - $Sprite2D.scale = Vector2(sc, sc) - $Sprite2D.position.y = -posY - pass - -func setItem(iItem: Item = null) -> void: - $Label.visible = false - if iItem != null: - it = iItem - else: - it = Item.new() - if $Sprite2D.texture != null or $Sprite2D.texture.resource_path != it.spritePath: - $Sprite2D.texture = load(it.spritePath) - $Sprite2D.frame = it.spriteFrame - pass - -@rpc("any_peer", "reliable", "call_local") -func request_pickup(_player_id: int): - if multiplayer.is_server(): - sync_has_been_picked_up = true - visible = false - # Tell all clients to remove the loot - remove_loot.rpc() - $SfxPickup.play() - await $SfxPickup.finished - # Remove loot on server too - queue_free() - -# Called locally by the player picking up the item -func pick_up_local(player_id: int): - if sync_has_been_picked_up: - return - var player = MultiplayerManager.playersNode.get_node(str(player_id)) - if player: - sync_has_been_picked_up = true - visible = false - # Add item to local inventory - player.stats.add_item(it) - # Tell server about pickup - if not multiplayer.is_server(): - request_pickup.rpc_id(1, player_id) - else: - # Tell all clients to remove the loot - remove_loot.rpc() - $SfxPickup.play() - await $SfxPickup.finished - # Remove loot locally immediately - queue_free() - -@rpc("authority", "reliable") -func remove_loot(): - visible = false - sync_has_been_picked_up = true - - $SfxPickup.play() - await $SfxPickup.finished - queue_free() - -func _on_area_2d_body_entered(_body: Node2D) -> void: - $Label.visible = true - pass # Replace with function body. - - -func _on_area_2d_body_exited(_body: Node2D) -> void: - $Label.visible = false - pass # Replace with function body. - - -func _on_area_2d_collision_body_entered(_body: Node2D) -> void: - if bounceTimer == 0: - #$SfxCoinBounce.play() - bounceTimer = 0.08 - # inverse the direction and slow down slightly - var collision_shape = $Area2DCollision.get_overlapping_bodies() - - if collision_shape.size() > 0: - var collider = collision_shape[0] - var normal = (global_position - collider.global_position).normalized() - velocity = velocity.bounce(normal) - - pass # Replace with function body. - - -func _on_area_2d_pickup_area_entered(_area: Area2D) -> void: - $Label.visible = true - pass # Replace with function body. - - -func _on_area_2d_pickup_area_exited(_area: Area2D) -> void: - $Label.visible = false - pass # Replace with function body. diff --git a/src/scripts/inspiration_scripts/loot.gd.uid b/src/scripts/inspiration_scripts/loot.gd.uid deleted file mode 100644 index 21c74d4..0000000 --- a/src/scripts/inspiration_scripts/loot.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bawxh5vhj4ii3 diff --git a/src/scripts/inspiration_scripts/pot.tscn30323093389.tmp b/src/scripts/inspiration_scripts/pot.tscn30323093389.tmp deleted file mode 100644 index 003ecda..0000000 --- a/src/scripts/inspiration_scripts/pot.tscn30323093389.tmp +++ /dev/null @@ -1,152 +0,0 @@ -[gd_scene load_steps=21 format=3 uid="uid://bdlg5orah64m5"] - -[ext_resource type="Script" uid="uid://bj0ueurl3vovc" path="res://scripts/entities/world/pot.gd" id="1_hsjxb"] -[ext_resource type="Texture2D" uid="uid://bu4dq78f8lgj5" path="res://assets/gfx/sheet_18.png" id="1_rxnv2"] -[ext_resource type="AudioStream" uid="uid://fl0rfi4in3n4" path="res://assets/audio/sfx/environment/pot/Drunk lad destroys plant pot.mp3" id="3_vktry"] -[ext_resource type="AudioStream" uid="uid://dejjc0uqthi1b" path="res://assets/audio/sfx/environment/pot/pot_destroy_sound1.mp3" id="4_nb533"] -[ext_resource type="AudioStream" uid="uid://iuxunaogc8xr" path="res://assets/audio/sfx/environment/pot/pot_destroy_sound2.mp3" id="5_cmff4"] -[ext_resource type="AudioStream" uid="uid://bfqusej0pbxem" path="res://assets/audio/sfx/environment/pot/pot_destroy_sound3.mp3" id="6_lq20m"] -[ext_resource type="AudioStream" uid="uid://dq461vpiih3lc" path="res://assets/audio/sfx/environment/pot/pot_destroy_sound4.mp3" id="7_76fyq"] -[ext_resource type="AudioStream" uid="uid://cg1ndvx4t7xtd" path="res://assets/audio/sfx/environment/pot/pot_destroy_sound5.mp3" id="8_m11t2"] -[ext_resource type="AudioStream" uid="uid://bt5npaenq15h2" path="res://assets/audio/sfx/environment/pot/smaller_pot_crash.mp3" id="9_sb38x"] -[ext_resource type="Texture2D" uid="uid://b1twy68vd7f20" path="res://assets/gfx/pickups/indicator.png" id="10_nb533"] - -[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_hsjxb"] -properties/0/path = NodePath(".:position") -properties/0/spawn = true -properties/0/replication_mode = 2 - -[sub_resource type="Gradient" id="Gradient_nb533"] -offsets = PackedFloat32Array(0.847255, 0.861575) -colors = PackedColorArray(0, 0, 0, 0.764706, 0, 0, 0, 0) - -[sub_resource type="GradientTexture2D" id="GradientTexture2D_87nuj"] -gradient = SubResource("Gradient_nb533") -width = 16 -height = 6 -fill = 1 -fill_from = Vector2(0.504274, 0.478632) -fill_to = Vector2(0.897436, 0.0769231) - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_hsjxb"] -size = Vector2(12, 8) - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_87nuj"] -size = Vector2(18, 15) - -[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_ui3li"] -streams_count = 7 -stream_0/stream = ExtResource("3_vktry") -stream_1/stream = ExtResource("4_nb533") -stream_2/stream = ExtResource("5_cmff4") -stream_3/stream = ExtResource("6_lq20m") -stream_4/stream = ExtResource("7_76fyq") -stream_5/stream = ExtResource("8_m11t2") -stream_6/stream = ExtResource("9_sb38x") - -[sub_resource type="Animation" id="Animation_cmff4"] -resource_name = "indicate" -length = 0.8 -loop_mode = 1 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:offset") -tracks/0/interp = 2 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0, 0.4, 0.8), -"transitions": PackedFloat32Array(1, 1, 1), -"update": 0, -"values": [Vector2(0, 0), Vector2(0, -1), Vector2(0, 0)] -} - -[sub_resource type="Animation" id="Animation_lq20m"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath(".:offset") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Vector2(0, 0)] -} - -[sub_resource type="AnimationLibrary" id="AnimationLibrary_76fyq"] -_data = { -&"RESET": SubResource("Animation_lq20m"), -&"indicate": SubResource("Animation_cmff4") -} - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_nb533"] -size = Vector2(14, 9) - -[node name="Pot" type="CharacterBody2D"] -collision_layer = 128 -collision_mask = 64 -script = ExtResource("1_hsjxb") - -[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="."] -replication_config = SubResource("SceneReplicationConfig_hsjxb") - -[node name="Sprite2DShadow" type="Sprite2D" parent="."] -position = Vector2(0, 3) -texture = SubResource("GradientTexture2D_87nuj") - -[node name="Sprite2D" type="Sprite2D" parent="."] -position = Vector2(0, -4) -texture = ExtResource("1_rxnv2") -hframes = 19 -vframes = 19 -frame = 14 - -[node name="CollisionShape2D" type="CollisionShape2D" parent="."] -position = Vector2(0, -1) -shape = SubResource("RectangleShape2D_hsjxb") - -[node name="Area2DPickup" type="Area2D" parent="."] -collision_layer = 1024 -collision_mask = 512 - -[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2DPickup"] -position = Vector2(0, -1) -shape = SubResource("RectangleShape2D_87nuj") -debug_color = Color(0.688142, 0.7, 0.0440007, 0.42) - -[node name="SfxShatter" type="AudioStreamPlayer2D" parent="."] -stream = SubResource("AudioStreamRandomizer_ui3li") -attenuation = 9.84915 -panning_strength = 1.46 -bus = &"Sfx" - -[node name="SfxThrow" type="AudioStreamPlayer2D" parent="."] - -[node name="SfxDrop" type="AudioStreamPlayer2D" parent="."] - -[node name="Indicator" type="Sprite2D" parent="."] -position = Vector2(0, -11) -texture = ExtResource("10_nb533") - -[node name="AnimationPlayer" type="AnimationPlayer" parent="Indicator"] -libraries = { -&"": SubResource("AnimationLibrary_76fyq") -} -autoplay = "indicate" - -[node name="Area2DCollision" type="Area2D" parent="."] -collision_layer = 1024 -collision_mask = 704 - -[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2DCollision"] -position = Vector2(0, -1) -shape = SubResource("RectangleShape2D_nb533") -debug_color = Color(0.7, 0.132592, 0.232379, 0.42) - -[connection signal="body_entered" from="Area2DPickup" to="." method="_on_area_2d_pickup_body_entered"] -[connection signal="body_exited" from="Area2DPickup" to="." method="_on_area_2d_pickup_body_exited"] -[connection signal="body_entered" from="Area2DCollision" to="." method="_on_area_2d_collision_body_entered"] -[connection signal="body_exited" from="Area2DCollision" to="." method="_on_area_2d_collision_body_exited"] diff --git a/src/scripts/mobile_input.gd b/src/scripts/mobile_input.gd new file mode 100644 index 0000000..f07530f --- /dev/null +++ b/src/scripts/mobile_input.gd @@ -0,0 +1,56 @@ +extends Control + +# Store the current joystick input value +var virtual_joystick_input: Vector2 = Vector2.ZERO + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + _update_visibility() + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(_delta: float) -> void: + pass + +func _update_visibility() -> void: + # Check if touchscreen is available + var has_touchscreen = DisplayServer.is_touchscreen_available() + + # Check if running on mobile platform + var os_name = OS.get_name().to_lower() + var is_mobile_os = os_name in ["android", "ios"] + + # Show mobile input if touchscreen is available OR if on mobile OS + var should_show = has_touchscreen or is_mobile_os + + visible = should_show + + # Debug output (optional, can be removed) + if Engine.is_editor_hint(): + return + print("MobileInput visibility: ", should_show, " (touchscreen: ", has_touchscreen, ", mobile OS: ", is_mobile_os, ", OS: ", os_name, ")") + + +func _on_virtual_joystick_analogic_changed(value: Vector2, _distance: float, _angle: float, _angle_clockwise: float, _angle_not_clockwise: float) -> void: + # Store the joystick input value + # The value is already normalized (0.0 to 1.0) from the joystick + virtual_joystick_input = value + + # Update all local players with the joystick input + _update_player_input() + +func _update_player_input(): + # Find all local players and set their virtual joystick input + var game_world = get_tree().get_first_node_in_group("game_world") + if not game_world: + return + + var player_manager = game_world.get_node_or_null("PlayerManager") + if not player_manager: + return + + # Get all local players + var local_players = player_manager.get_local_players() + for player in local_players: + if player and is_instance_valid(player): + # Set the virtual joystick input on the player + player.virtual_joystick_input = virtual_joystick_input diff --git a/src/scripts/mobile_input.gd.uid b/src/scripts/mobile_input.gd.uid new file mode 100644 index 0000000..b2e4fdc --- /dev/null +++ b/src/scripts/mobile_input.gd.uid @@ -0,0 +1 @@ +uid://5hepk3l8u2eg diff --git a/src/scripts/player.gd b/src/scripts/player.gd index 4e518aa..2f457ca 100644 --- a/src/scripts/player.gd +++ b/src/scripts/player.gd @@ -22,6 +22,7 @@ var teleported_this_frame: bool = false # Flag to prevent position sync from ove # Input device (for local multiplayer) var input_device: int = -1 # -1 for keyboard, 0+ for gamepad index +var virtual_joystick_input: Vector2 = Vector2.ZERO # Virtual joystick input from mobile controls # Interaction var held_object = null @@ -271,9 +272,8 @@ func _ready(): # Set up cone light blend mode, texture, initial rotation, and spread if cone_light: - _create_cone_light_texture() _update_cone_light_rotation() - _update_cone_light_spread() + _update_cone_light_spread() # This calls _create_cone_light_texture() # Wait before allowing RPCs to ensure player is fully spawned on all clients # This prevents "Node not found" errors when RPCs try to resolve node paths @@ -1056,10 +1056,26 @@ func _physics_process(delta): func _handle_input(): var input_vector = Vector2.ZERO - if input_device == -1: + # Check for virtual joystick input first (mobile/touchscreen) + if virtual_joystick_input.length() > 0.01: + input_vector = virtual_joystick_input + elif input_device == -1: # Keyboard input - input_vector.x = Input.get_action_strength("move_right") - Input.get_action_strength("move_left") - input_vector.y = Input.get_action_strength("move_down") - Input.get_action_strength("move_up") + input_vector.x = max( + Input.get_action_strength("move_right"), + Input.get_action_strength("ui_right") + ) - max( + Input.get_action_strength("move_left"), + Input.get_action_strength("ui_left") + ) + + input_vector.y = max( + Input.get_action_strength("move_down"), + Input.get_action_strength("ui_down") + ) - max( + Input.get_action_strength("move_up"), + Input.get_action_strength("ui_up") + ) else: # Gamepad input input_vector.x = Input.get_joy_axis(input_device, JOY_AXIS_LEFT_X) @@ -2252,8 +2268,18 @@ func _handle_struggle(delta): var input_dir = Vector2.ZERO if input_device == -1: # Keyboard - input_dir.x = Input.get_axis("move_left", "move_right") - input_dir.y = Input.get_axis("move_up", "move_down") + input_dir.x = clamp( + Input.get_axis("move_left", "move_right") + + Input.get_axis("ui_left", "ui_right"), + -1.0, + 1.0 + ) + input_dir.y = clamp( + Input.get_axis("move_up", "move_down") + + Input.get_axis("ui_up", "ui_down"), + -1.0, + 1.0 + ) else: # Gamepad input_dir.x = Input.get_joy_axis(input_device, JOY_AXIS_LEFT_X) input_dir.y = Input.get_joy_axis(input_device, JOY_AXIS_LEFT_Y) diff --git a/src/scripts/room_lighting_system.gd b/src/scripts/room_lighting_system.gd deleted file mode 100644 index b057cc7..0000000 --- a/src/scripts/room_lighting_system.gd +++ /dev/null @@ -1,259 +0,0 @@ -extends Node2D - -# Room Lighting System -# Manages per-room darkness and fog of war based on player lights and torch count - -@onready var game_world = get_tree().get_first_node_in_group("game_world") - -# Room lighting data -var room_lighting_data: Dictionary = {} # room_id -> {lit: bool, torch_count: int, darkness_level: float} -var room_darkness_overlays: Dictionary = {} # room_id -> ColorRect node - -# Constants -const TILE_SIZE = 16 # Each tile is 16x16 pixels -const DARKNESS_COLOR = Color(0, 0, 0, 0.95) # Almost black, slightly transparent -const MIN_DARKNESS = 0.3 # Minimum darkness even with torches -const MAX_DARKNESS = 0.95 # Maximum darkness (no torches, unlit) - -# Light detection -var light_check_timer: float = 0.0 -const LIGHT_CHECK_INTERVAL = 0.1 # Check every 0.1 seconds - -var darkness_layer: Node2D = null - -func _ready(): - # Create Node2D for darkness overlays (in world space, above game world) - darkness_layer = Node2D.new() - darkness_layer.name = "RoomDarknessLayer" - darkness_layer.z_index = 100 # High z-index to be above game world - add_child(darkness_layer) - - # Wait for dungeon to be generated - call_deferred("_initialize_room_lighting") - -func _initialize_room_lighting(): - # Wait for dungeon data to be available - if not game_world or game_world.dungeon_data.is_empty(): - await get_tree().process_frame - call_deferred("_initialize_room_lighting") - return - - var dungeon_data = game_world.dungeon_data - if not dungeon_data.has("rooms") or not dungeon_data.has("torches"): - print("RoomLightingSystem: Dungeon data not ready yet") - await get_tree().process_frame - call_deferred("_initialize_room_lighting") - return - - # Clear old room lighting data and overlays when reinitializing - room_lighting_data.clear() - if darkness_layer: - for child in darkness_layer.get_children(): - child.queue_free() - room_darkness_overlays.clear() - - # Count torches per room - var torch_counts: Dictionary = {} # room_id -> count - var rooms = dungeon_data.rooms - var torches = dungeon_data.torches - - # Initialize all rooms as unlit - for i in range(rooms.size()): - var room = rooms[i] - var room_id = _get_room_id(room) - torch_counts[room_id] = 0 - room_lighting_data[room_id] = { - "lit": false, - "torch_count": 0, - "darkness_level": MAX_DARKNESS - } - - # Count torches in each room - for torch_data in torches: - var torch_pos = torch_data.position - # Find which room this torch belongs to - for i in range(rooms.size()): - var room = rooms[i] - if _is_position_in_room(torch_pos, room): - var room_id = _get_room_id(room) - torch_counts[room_id] = torch_counts.get(room_id, 0) + 1 - break - - # Update room lighting data with torch counts - for room_id in torch_counts: - var torch_count = torch_counts[room_id] - room_lighting_data[room_id].torch_count = torch_count - # Calculate darkness level based on torch count (0-4 torches) - # More torches = less darkness - var darkness = MAX_DARKNESS - (torch_count * 0.15) # Each torch reduces darkness by 0.15 - darkness = clamp(darkness, MIN_DARKNESS, MAX_DARKNESS) - room_lighting_data[room_id].darkness_level = darkness - - # Create darkness overlays for all rooms (initially all dark) - _create_darkness_overlays() - - print("RoomLightingSystem: Initialized ", rooms.size(), " rooms with lighting data") - -# Public method to reinitialize lighting (called when new level is generated) -func reinitialize(): - call_deferred("_initialize_room_lighting") - -func _get_room_id(room: Dictionary) -> String: - # Create unique ID from room position and size - return "%d_%d_%d_%d" % [room.x, room.y, room.w, room.h] - -func _is_position_in_room(pos: Vector2, room: Dictionary) -> bool: - # Convert room tile coordinates to world coordinates - var room_world_x = room.x * TILE_SIZE - var room_world_y = room.y * TILE_SIZE - var room_world_w = room.w * TILE_SIZE - var room_world_h = room.h * TILE_SIZE - - # Check if position is within room bounds (including walls) - return pos.x >= room_world_x and pos.x < room_world_x + room_world_w and \ - pos.y >= room_world_y and pos.y < room_world_y + room_world_h - -func _create_darkness_overlays(): - if not darkness_layer: - push_error("RoomLightingSystem: Darkness layer not found!") - return - - if not game_world or game_world.dungeon_data.is_empty(): - return - - var rooms = game_world.dungeon_data.rooms - - # Create darkness overlay for each room - for i in range(rooms.size()): - var room = rooms[i] - var room_id = _get_room_id(room) - - # Create ColorRect for darkness overlay - var overlay = ColorRect.new() - overlay.name = "Darkness_%s" % room_id - - # Set position and size (in world coordinates) - var room_world_x = room.x * TILE_SIZE - var room_world_y = room.y * TILE_SIZE - var room_world_w = room.w * TILE_SIZE - var room_world_h = room.h * TILE_SIZE - - overlay.position = Vector2(room_world_x, room_world_y) - overlay.size = Vector2(room_world_w, room_world_h) - - # Set darkness color based on torch count - var lighting_data = room_lighting_data.get(room_id, {}) - var darkness_level = lighting_data.get("darkness_level", MAX_DARKNESS) - var is_lit = lighting_data.get("lit", false) - - # If room is lit, make it transparent (no darkness) - # Otherwise, apply darkness based on torch count - if is_lit: - overlay.color = Color(0, 0, 0, 0) # Transparent (lit) - else: - overlay.color = Color(0, 0, 0, darkness_level) # Dark (unlit) - - darkness_layer.add_child(overlay) - room_darkness_overlays[room_id] = overlay - -func _process(delta): - light_check_timer += delta - if light_check_timer >= LIGHT_CHECK_INTERVAL: - light_check_timer = 0.0 - _check_player_lights() - -func _check_player_lights(): - if not game_world or game_world.dungeon_data.is_empty(): - return - - var rooms = game_world.dungeon_data.rooms - var players = get_tree().get_nodes_in_group("player") - - # Check each room against each player's lights - for room in rooms: - var room_id = _get_room_id(room) - var was_lit = room_lighting_data[room_id].lit - - # Check if any player's light intersects this room - var is_lit_now = false - for player in players: - if _player_light_intersects_room(player, room): - is_lit_now = true - break - - # Update lighting state - if is_lit_now and not was_lit: - # Room just became lit - room_lighting_data[room_id].lit = true - _update_room_darkness(room_id) - elif not is_lit_now and was_lit: - # Room became unlit (shouldn't happen, but handle it) - # Actually, we keep rooms lit once they've been seen - pass - -func _player_light_intersects_room(player: Node2D, room: Dictionary) -> bool: - # Check if player's cone light or point light intersects the room - var player_pos = player.global_position - - # Get room bounds in world coordinates - var room_world_x = room.x * TILE_SIZE - var room_world_y = room.y * TILE_SIZE - var room_world_w = room.w * TILE_SIZE - var room_world_h = room.h * TILE_SIZE - var room_rect = Rect2(room_world_x, room_world_y, room_world_w, room_world_h) - - # Check cone light (PointLight2D named "ConeLight") - var cone_light = player.get_node_or_null("ConeLight") - if cone_light: - # Get light range from texture or use default - # Cone light texture is 256x256, so range is approximately 128 pixels - var light_range = 128.0 # Approximate range of cone light - var light_pos = cone_light.global_position - - # Check if light circle intersects room rectangle - if _circle_intersects_rect(light_pos, light_range, room_rect): - return true - - # Check point light (PointLight2D) - even if not visible, it might be used - var point_light = player.get_node_or_null("PointLight2D") - if point_light: - # Get light range from texture or use default - # Point light has a gradient texture, estimate range - var light_range = 64.0 # Approximate range of point light - var light_pos = point_light.global_position - - # Check if light circle intersects room rectangle - if _circle_intersects_rect(light_pos, light_range, room_rect): - return true - - # Also check if player is inside the room (they can see it) - if room_rect.has_point(player_pos): - return true - - return false - -func _circle_intersects_rect(circle_center: Vector2, circle_radius: float, rect: Rect2) -> bool: - # Find the closest point on the rectangle to the circle center - var closest_x = clamp(circle_center.x, rect.position.x, rect.position.x + rect.size.x) - var closest_y = clamp(circle_center.y, rect.position.y, rect.position.y + rect.size.y) - var closest_point = Vector2(closest_x, closest_y) - - # Check if the closest point is within the circle - var distance = circle_center.distance_to(closest_point) - return distance <= circle_radius - -func _update_room_darkness(room_id: String): - var overlay = room_darkness_overlays.get(room_id) - if not overlay: - return - - var lighting_data = room_lighting_data.get(room_id, {}) - var is_lit = lighting_data.get("lit", false) - var darkness_level = lighting_data.get("darkness_level", MAX_DARKNESS) - - # If room is lit, make overlay transparent - # Otherwise, apply darkness based on torch count - if is_lit: - overlay.color = Color(0, 0, 0, 0) # Transparent (lit) - else: - overlay.color = Color(0, 0, 0, darkness_level) # Dark (unlit)