From 88c56f8aed2e40c09b74a00591d6369151f6400d Mon Sep 17 00:00:00 2001 From: 2ndbeam <2ndbeam@disroot.org> Date: Fri, 1 Aug 2025 13:11:26 +0300 Subject: [PATCH] Finished basic PickupableItem --- base/assets/resources/items/auto_weapon.tres | 4 +- base/assets/resources/items/weapon_base.tres | 4 +- .../sprites/guns/gangstaholder/world.png | Bin 0 -> 254 bytes .../guns/gangstaholder/world.png.import | 35 ++++++++++++++++++ .../assets/sprites/guns/placeholder/world.png | Bin 0 -> 220 bytes .../sprites/guns/placeholder/world.png.import | 35 ++++++++++++++++++ base/scenes/game.tscn | 6 +-- .../interactive/interactive_object.tscn | 5 ++- base/scenes/interactive/pickupable_item.tscn | 2 + base/scenes/player.tscn | 7 +--- base/scenes/rooms/test.tscn | 7 +++- base/scripts/autoload/resource_handler.gd | 35 ++++++++++++++++++ base/scripts/autoload/resource_handler.gd.uid | 1 + base/scripts/identified_resource.gd | 7 ++++ base/scripts/identified_resource.gd.uid | 1 + .../interactive/base_pickupable_resource.gd | 11 ++---- base/scripts/interactive/pickupable_item.gd | 5 ++- .../interactive/weapon_pickupable_resource.gd | 14 +++---- base/scripts/player/weapon_slot.gd | 7 ++-- base/scripts/weapons/weapon_base.gd | 2 +- project.godot | 10 +++++ 21 files changed, 163 insertions(+), 35 deletions(-) create mode 100644 base/assets/sprites/guns/gangstaholder/world.png create mode 100644 base/assets/sprites/guns/gangstaholder/world.png.import create mode 100644 base/assets/sprites/guns/placeholder/world.png create mode 100644 base/assets/sprites/guns/placeholder/world.png.import create mode 100644 base/scripts/autoload/resource_handler.gd create mode 100644 base/scripts/autoload/resource_handler.gd.uid create mode 100644 base/scripts/identified_resource.gd create mode 100644 base/scripts/identified_resource.gd.uid diff --git a/base/assets/resources/items/auto_weapon.tres b/base/assets/resources/items/auto_weapon.tres index f133aea..461a953 100644 --- a/base/assets/resources/items/auto_weapon.tres +++ b/base/assets/resources/items/auto_weapon.tres @@ -1,10 +1,12 @@ -[gd_resource type="Resource" script_class="WeaponPickupableResource" load_steps=3 format=3 uid="uid://cdsrjmq8xd5b0"] +[gd_resource type="Resource" script_class="WeaponPickupableResource" load_steps=4 format=3 uid="uid://cdsrjmq8xd5b0"] [ext_resource type="Script" uid="uid://dob8q3jclxrtd" path="res://base/scripts/interactive/weapon_pickupable_resource.gd" id="1_7xmtm"] +[ext_resource type="Texture2D" uid="uid://dq1uplqdiuxur" path="res://base/assets/sprites/guns/gangstaholder/world.png" id="2_bxcfp"] [ext_resource type="PackedScene" uid="uid://cig5dryfni4f8" path="res://base/scenes/weapons/auto_weapon_test.tscn" id="2_qbjol"] [resource] script = ExtResource("1_7xmtm") weapon = ExtResource("2_qbjol") +texture = ExtResource("2_bxcfp") id = &"auto_weapon_test" metadata/_custom_type_script = "uid://dob8q3jclxrtd" diff --git a/base/assets/resources/items/weapon_base.tres b/base/assets/resources/items/weapon_base.tres index 9d23c26..92acb6d 100644 --- a/base/assets/resources/items/weapon_base.tres +++ b/base/assets/resources/items/weapon_base.tres @@ -1,10 +1,12 @@ -[gd_resource type="Resource" script_class="WeaponPickupableResource" load_steps=3 format=3 uid="uid://b1pqbhcv5ixmy"] +[gd_resource type="Resource" script_class="WeaponPickupableResource" load_steps=4 format=3 uid="uid://b1pqbhcv5ixmy"] [ext_resource type="Script" uid="uid://dob8q3jclxrtd" path="res://base/scripts/interactive/weapon_pickupable_resource.gd" id="1_fp2lr"] +[ext_resource type="Texture2D" uid="uid://bk7klildfi4pn" path="res://base/assets/sprites/guns/placeholder/world.png" id="2_8n6rc"] [ext_resource type="PackedScene" uid="uid://bb6ovrbusyxpi" path="res://base/scenes/weapons/weapon_base.tscn" id="2_fp2lr"] [resource] script = ExtResource("1_fp2lr") weapon = ExtResource("2_fp2lr") +texture = ExtResource("2_8n6rc") id = &"weapon_base" metadata/_custom_type_script = "uid://dob8q3jclxrtd" diff --git a/base/assets/sprites/guns/gangstaholder/world.png b/base/assets/sprites/guns/gangstaholder/world.png new file mode 100644 index 0000000000000000000000000000000000000000..41833cae46d852a4a83d98dd16d0d7b4eec36d9f GIT binary patch literal 254 zcmVPx#xJg7oR9J=W*4qt$APfai>LkV)+$Ze!LvhgSz@qLn2z= zUQ6U^P~d5Mc+>NUam9b(3bv1G-@H3c?A*4#>Betuj}HsgJf2kEJI?wpwQFbp^IKfI z#rQ1p>O{Gguq{wXYY=5(&M-XPD%QbL@_Tcpqj5`BLxAz7OvV+-E7+FIsLoa8;b4Ds zZzW@TM_TcwGYp*19|ShAY-XBK&$xZ33P-}UCrfO&COlzyq5Hg7ddl;^>t(lPx?JA4 Sc3CITg$$mqelF{r5}E*QB~`Tm literal 0 HcmV?d00001 diff --git a/base/assets/sprites/guns/placeholder/world.png.import b/base/assets/sprites/guns/placeholder/world.png.import new file mode 100644 index 0000000..153bdbd --- /dev/null +++ b/base/assets/sprites/guns/placeholder/world.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bk7klildfi4pn" +path.s3tc="res://.godot/imported/world.png-eaa9564d3ed78f593557d4bf4bb259eb.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://base/assets/sprites/guns/placeholder/world.png" +dest_files=["res://.godot/imported/world.png-eaa9564d3ed78f593557d4bf4bb259eb.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +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=0 diff --git a/base/scenes/game.tscn b/base/scenes/game.tscn index ebae183..512c801 100644 --- a/base/scenes/game.tscn +++ b/base/scenes/game.tscn @@ -1,8 +1,7 @@ -[gd_scene load_steps=4 format=3 uid="uid://d23028pr0jahr"] +[gd_scene load_steps=3 format=3 uid="uid://d23028pr0jahr"] [ext_resource type="PackedScene" uid="uid://bgnb01j1nphhi" path="res://base/scenes/rooms/test.tscn" id="1_sjeh3"] [ext_resource type="PackedScene" uid="uid://dwx5tcatj35gu" path="res://base/scenes/player.tscn" id="2_uxs03"] -[ext_resource type="PackedScene" uid="uid://twqkevpn0q1a" path="res://base/scenes/enemies/test_enemy.tscn" id="3_tk4w0"] [node name="Game" type="Node3D"] @@ -11,6 +10,3 @@ [node name="Player" parent="." instance=ExtResource("2_uxs03")] unique_name_in_owner = true transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.208048, 1.61008) - -[node name="TestEnemy" parent="." instance=ExtResource("3_tk4w0")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.695979) diff --git a/base/scenes/interactive/interactive_object.tscn b/base/scenes/interactive/interactive_object.tscn index 2c0bf80..7570ddd 100644 --- a/base/scenes/interactive/interactive_object.tscn +++ b/base/scenes/interactive/interactive_object.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=4 format=3 uid="uid://ddjjrkernsobh"] [ext_resource type="Texture2D" uid="uid://bdgoa18kfhlwo" path="res://base/assets/sprites/interactive/interactive.png" id="1_yf10f"] -[ext_resource type="Script" uid="uid://fva8kqc3mk86" path="res://base/scripts/interactive_object.gd" id="2_cdwk3"] +[ext_resource type="Script" uid="uid://junnt60g6c7x" path="res://base/scripts/interactive/interactive_object.gd" id="2_cdwk3"] [sub_resource type="SphereShape3D" id="SphereShape3D_cdwk3"] @@ -11,8 +11,11 @@ billboard = 1 texture_filter = 0 texture = ExtResource("1_yf10f") script = ExtResource("2_cdwk3") +metadata/_custom_type_script = "uid://junnt60g6c7x" [node name="Area3D" type="Area3D" parent="."] +collision_layer = 16 +collision_mask = 2 [node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"] shape = SubResource("SphereShape3D_cdwk3") diff --git a/base/scenes/interactive/pickupable_item.tscn b/base/scenes/interactive/pickupable_item.tscn index 8b3070e..3bcef7a 100644 --- a/base/scenes/interactive/pickupable_item.tscn +++ b/base/scenes/interactive/pickupable_item.tscn @@ -13,6 +13,8 @@ texture = ExtResource("1_2373a") script = ExtResource("2_2373a") [node name="Area3D" type="Area3D" parent="."] +collision_layer = 16 +collision_mask = 2 [node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"] shape = SubResource("SphereShape3D_cdwk3") diff --git a/base/scenes/player.tscn b/base/scenes/player.tscn index 279f6d1..0334561 100644 --- a/base/scenes/player.tscn +++ b/base/scenes/player.tscn @@ -1,11 +1,10 @@ -[gd_scene load_steps=12 format=3 uid="uid://dwx5tcatj35gu"] +[gd_scene load_steps=11 format=3 uid="uid://dwx5tcatj35gu"] [ext_resource type="Script" uid="uid://dts8lbivkgsmj" path="res://base/scripts/player/player.gd" id="1_1w3ab"] [ext_resource type="Texture2D" uid="uid://cf7avgppv4kfk" path="res://base/assets/sprites/guns/placeholder/static.png" id="2_gt0rj"] [ext_resource type="PackedScene" uid="uid://bb6ovrbusyxpi" path="res://base/scenes/weapons/weapon_base.tscn" id="2_ma1q3"] [ext_resource type="Script" uid="uid://byhp4pklbjltn" path="res://base/scripts/player/weapon_container.gd" id="3_1w3ab"] [ext_resource type="Script" uid="uid://diu6eno2ag6ga" path="res://base/scripts/player/weapon_slot.gd" id="4_gt0rj"] -[ext_resource type="PackedScene" uid="uid://cig5dryfni4f8" path="res://base/scenes/weapons/auto_weapon_test.tscn" id="6_gt0rj"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_jjqxs"] @@ -67,7 +66,7 @@ _data = { [node name="Player" type="CharacterBody3D"] collision_layer = 2 -collision_mask = 3 +collision_mask = 19 platform_wall_layers = 1 script = ExtResource("1_1w3ab") @@ -120,8 +119,6 @@ metadata/_custom_type_script = "uid://diu6eno2ag6ga" script = ExtResource("4_gt0rj") metadata/_custom_type_script = "uid://diu6eno2ag6ga" -[node name="Weapon" parent="WeaponContainer/Secondary" instance=ExtResource("6_gt0rj")] - [node name="Tertiary" type="Node3D" parent="WeaponContainer"] script = ExtResource("4_gt0rj") metadata/_custom_type_script = "uid://diu6eno2ag6ga" diff --git a/base/scenes/rooms/test.tscn b/base/scenes/rooms/test.tscn index a96c1ca..b18b5ea 100644 --- a/base/scenes/rooms/test.tscn +++ b/base/scenes/rooms/test.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=3 format=3 uid="uid://bgnb01j1nphhi"] +[gd_scene load_steps=4 format=3 uid="uid://bgnb01j1nphhi"] [ext_resource type="PackedScene" uid="uid://c4wpq5gxkbor7" path="res://base/scenes/interactive/pickupable_item.tscn" id="1_1whpt"] [ext_resource type="Resource" uid="uid://b1pqbhcv5ixmy" path="res://base/assets/resources/items/weapon_base.tres" id="2_ayew2"] +[ext_resource type="Resource" uid="uid://cdsrjmq8xd5b0" path="res://base/assets/resources/items/auto_weapon.tres" id="3_npgpc"] [node name="Test Room" type="Node3D"] @@ -51,4 +52,8 @@ content = ExtResource("2_ayew2") [node name="PickupableItem2" parent="." instance=ExtResource("1_1whpt")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.700438, -0.47008, -0.800458) +content = ExtResource("3_npgpc") + +[node name="PickupableItem3" parent="." instance=ExtResource("1_1whpt")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.10903, -0.47008, 1.99618) content = ExtResource("2_ayew2") diff --git a/base/scripts/autoload/resource_handler.gd b/base/scripts/autoload/resource_handler.gd new file mode 100644 index 0000000..6651d0f --- /dev/null +++ b/base/scripts/autoload/resource_handler.gd @@ -0,0 +1,35 @@ +extends Node + +## Dictionary, that holds resource id and path to it +var resource_registry: Dictionary = {} + +const DEFAULT_WEAPON_RESOURCE_ID: StringName = "weapon_base" + +## Recursively add resources to registry +func add_resource_path(_path: String) -> void: + var dir = DirAccess.open(_path) + if dir == null: + return + # Used to ignore last slash if it was provided in _path + var path = dir.get_current_dir() + for subdir in dir.get_directories(): + var subdir_path = "%s/%s" % [ path, subdir ] + add_resource_path(subdir_path) + + for filename in dir.get_files(): + if !filename.ends_with('.tres'): + continue + var filepath = "%s/%s" % [ path, filename ] + var res: IdentifiedResource = ResourceLoader.load(filepath, 'IdentifiedResource') + resource_registry[res.id] = filepath + +func get_resource(id: String) -> IdentifiedResource: + var path = resource_registry.get(id) + if path == null: + return null + var res: IdentifiedResource = ResourceLoader.load(path, 'IdentifiedResource') + return res + +func _init() -> void: + add_resource_path('res://base/assets/resources') + assert(resource_registry.has(DEFAULT_WEAPON_RESOURCE_ID)) diff --git a/base/scripts/autoload/resource_handler.gd.uid b/base/scripts/autoload/resource_handler.gd.uid new file mode 100644 index 0000000..deb7dcf --- /dev/null +++ b/base/scripts/autoload/resource_handler.gd.uid @@ -0,0 +1 @@ +uid://b67umubha4odj diff --git a/base/scripts/identified_resource.gd b/base/scripts/identified_resource.gd new file mode 100644 index 0000000..76caaaa --- /dev/null +++ b/base/scripts/identified_resource.gd @@ -0,0 +1,7 @@ +extends Resource + +## Basic resource, holding its string identifier +class_name IdentifiedResource + +## Item ID, make sure it's unique +@export var id: StringName diff --git a/base/scripts/identified_resource.gd.uid b/base/scripts/identified_resource.gd.uid new file mode 100644 index 0000000..2e618bc --- /dev/null +++ b/base/scripts/identified_resource.gd.uid @@ -0,0 +1 @@ +uid://dkk5xaxoo7i8y diff --git a/base/scripts/interactive/base_pickupable_resource.gd b/base/scripts/interactive/base_pickupable_resource.gd index 428b0d3..4ecddec 100644 --- a/base/scripts/interactive/base_pickupable_resource.gd +++ b/base/scripts/interactive/base_pickupable_resource.gd @@ -1,13 +1,10 @@ -extends Resource +extends IdentifiedResource class_name BasePickupableResource -## Item ID, make sure it's unique -@export var id: StringName - ## Texture that will be used in node sprite @export var texture: Texture2D -## Emitted when item picked up. Returns if PickupableItem should be freed -func _apply(_player: Player) -> bool: - return true +## Emitted when item picked up. Returns IdentifiedResource if it should be swapped +func _apply(_player: Player) -> IdentifiedResource: + return null diff --git a/base/scripts/interactive/pickupable_item.gd b/base/scripts/interactive/pickupable_item.gd index 1abcbc5..2482203 100644 --- a/base/scripts/interactive/pickupable_item.gd +++ b/base/scripts/interactive/pickupable_item.gd @@ -9,5 +9,8 @@ func _ready() -> void: texture = content.texture func _interact(_player: Player) -> void: - if content._apply(_player): + content = content._apply(_player) + if content == null: queue_free() + return + _ready() diff --git a/base/scripts/interactive/weapon_pickupable_resource.gd b/base/scripts/interactive/weapon_pickupable_resource.gd index c6bd77b..46bd333 100644 --- a/base/scripts/interactive/weapon_pickupable_resource.gd +++ b/base/scripts/interactive/weapon_pickupable_resource.gd @@ -5,7 +5,7 @@ class_name WeaponPickupableResource ## Weapon that will be added on interaction @export var weapon: PackedScene -func _apply(player: Player) -> bool: +func _apply(player: Player) -> IdentifiedResource: var slot = player.weapons.first_free_slot() # TODO: Implement proper swapping behavior when old or new weapon uses several slots @@ -13,15 +13,11 @@ func _apply(player: Player) -> bool: slot = player.weapons.current_slot var set_data = slot.set_weapon(weapon) - set_data.old_weapon.id = id + set_data.new_weapon.id = id if slot == player.weapons.current_slot: player.weapons.refresh_current_slot() - return update_by_id(set_data.new_weapon) - -# TODO: implement proper updating -func update_by_id(new_id: StringName) -> bool: - id = new_id - - return id == "" + var new_res = ResourceHandler.get_resource(set_data.old_weapon) as WeaponPickupableResource + print(new_res) + return new_res diff --git a/base/scripts/player/weapon_slot.gd b/base/scripts/player/weapon_slot.gd index e1de34f..fcc099a 100644 --- a/base/scripts/player/weapon_slot.gd +++ b/base/scripts/player/weapon_slot.gd @@ -17,10 +17,11 @@ class WeaponSetData: old_weapon = _old_weapon func _ready(): - has_weapon = get_child_count() > 0 - + var child_count = get_child_count() + has_weapon = child_count > 0 + if has_weapon: - var child = get_child(0) + var child = get_child(child_count - 1) assert(child is Weapon) weapon = child as Weapon diff --git a/base/scripts/weapons/weapon_base.gd b/base/scripts/weapons/weapon_base.gd index 6d4527a..36958a2 100644 --- a/base/scripts/weapons/weapon_base.gd +++ b/base/scripts/weapons/weapon_base.gd @@ -6,7 +6,7 @@ signal fired() signal fire_failed() signal fire_allowed() -var id: StringName +var id: StringName = ResourceHandler.DEFAULT_WEAPON_RESOURCE_ID @onready var barrel = $"Barrel" @export var uses_hands: Array[CommandQueue.Side] diff --git a/project.godot b/project.godot index a766ae8..566f24c 100644 --- a/project.godot +++ b/project.godot @@ -15,6 +15,10 @@ run/main_scene="uid://d23028pr0jahr" config/features=PackedStringArray("4.4", "Forward Plus") config/icon="uid://3tgkfxqayrbo" +[autoload] + +ResourceHandler="*res://base/scripts/autoload/resource_handler.gd" + [dotnet] project/assembly_name="Revenge of the Red Dragon Pon of the Red Dragon Pon of the Red Dragon Pon" @@ -84,6 +88,11 @@ slot_previous={ "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":8,"position":Vector2(402, 28),"global_position":Vector2(411, 76),"factor":1.0,"button_index":4,"canceled":false,"pressed":true,"double_click":false,"script":null) ] } +interact={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"location":0,"echo":false,"script":null) +] +} [layer_names] @@ -92,6 +101,7 @@ slot_previous={ 3d_physics/layer_2="Friendly entities" 3d_physics/layer_3="Enemy entities" 3d_physics/layer_4="Projectile" +3d_physics/layer_5="Interactive Objects" [rendering]