From 3230e487f2752e565ba257cca376c86c6d5040be Mon Sep 17 00:00:00 2001 From: HumanoidSandvichDispenser Date: Fri, 29 Dec 2023 17:45:36 -0800 Subject: [PATCH] associate weapon scenes with resources --- Items/Item.cs | 11 ++++------- Items/ItemMetadata.cs | 16 ++++++++++++++++ Items/Weapons/Bow.tres | 14 ++++++++++++++ Items/Weapons/Bow.tscn | 4 +++- Items/Weapons/DocLance.tres | 14 ++++++++++++++ Items/Weapons/DocLance.tscn | 7 ++++--- Items/Weapons/Pugio.tres | 14 ++++++++++++++ Items/Weapons/Pugio.tscn | 4 +++- Items/Weapons/Sword.tres | 14 ++++++++++++++ Items/Weapons/Sword.tscn | 15 ++++++++++++++- Utils/ResourcePath.cs | 22 ++++++++++++++++++++++ Utils/ScenePath.cs | 32 ++++++++++++++++++++++++++++++++ 12 files changed, 154 insertions(+), 13 deletions(-) create mode 100644 Items/ItemMetadata.cs create mode 100644 Items/Weapons/Bow.tres create mode 100644 Items/Weapons/DocLance.tres create mode 100644 Items/Weapons/Pugio.tres create mode 100644 Items/Weapons/Sword.tres create mode 100644 Utils/ResourcePath.cs create mode 100644 Utils/ScenePath.cs diff --git a/Items/Item.cs b/Items/Item.cs index 78ee0b3..c38fc0b 100644 --- a/Items/Item.cs +++ b/Items/Item.cs @@ -8,15 +8,12 @@ public abstract partial class Item : Node2D [Signal] public delegate void UsedItemEventHandler(Item item); - [Export] - public string ItemName { get; set; } - - [Export] - public string Description { get; set; } - [Export] public bool CanStack { get; set; } = false; + [Export] + public ItemMetadata Metadata { get; set; } + public int Count { get; set; } = 1; public bool IsOneHanded { get; set; } = false; @@ -41,7 +38,7 @@ public abstract partial class Item : Node2D return false; } - if (ItemName != item.ItemName) + if (Metadata.Name != item.Metadata.Name) { return false; } diff --git a/Items/ItemMetadata.cs b/Items/ItemMetadata.cs new file mode 100644 index 0000000..4308e8e --- /dev/null +++ b/Items/ItemMetadata.cs @@ -0,0 +1,16 @@ +using Godot; + +namespace SupaLidlGame.Items; + +[GlobalClass] +public partial class ItemMetadata : Resource +{ + [Export] + public Utils.ScenePath Instance { get; set; } + + [Export] + public string Name { get; set; } + + [Export(PropertyHint.MultilineText)] + public string Description { get; set; } +} diff --git a/Items/Weapons/Bow.tres b/Items/Weapons/Bow.tres new file mode 100644 index 0000000..604f7d0 --- /dev/null +++ b/Items/Weapons/Bow.tres @@ -0,0 +1,14 @@ +[gd_resource type="Resource" script_class="ItemMetadata" load_steps=4 format=3 uid="uid://cjsh0dcgbfn77"] + +[ext_resource type="Script" path="res://Utils/ScenePath.cs" id="1_haiji"] +[ext_resource type="Script" path="res://Items/ItemMetadata.cs" id="2_hjbs0"] + +[sub_resource type="Resource" id="Resource_mjj1w"] +script = ExtResource("1_haiji") +Path = "res://Items/Weapons/Bow.tscn" + +[resource] +script = ExtResource("2_hjbs0") +Instance = SubResource("Resource_mjj1w") +Name = "Bow" +Description = "A bow and arrow." diff --git a/Items/Weapons/Bow.tscn b/Items/Weapons/Bow.tscn index f1d91d5..42f8d7b 100644 --- a/Items/Weapons/Bow.tscn +++ b/Items/Weapons/Bow.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=16 format=3 uid="uid://cgg0sfm2qeiwn"] +[gd_scene load_steps=17 format=3 uid="uid://cgg0sfm2qeiwn"] [ext_resource type="Texture2D" uid="uid://dam6aigkw8xs" path="res://Assets/Sprites/Items/bow-and-arrow.png" id="1_1ghvv"] [ext_resource type="Script" path="res://Items/Weapons/ProjectileSpawner.cs" id="1_76bur"] [ext_resource type="PackedScene" uid="uid://cjiftn2suskla" path="res://Entities/Arrow.tscn" id="2_mvw0j"] +[ext_resource type="Resource" uid="uid://cjsh0dcgbfn77" path="res://Items/Weapons/Bow.tres" id="3_j7q7r"] [ext_resource type="Script" path="res://State/Weapon/WeaponStateMachine.cs" id="3_pg4gy"] [ext_resource type="Script" path="res://State/Weapon/RangedIdleState.cs" id="3_uxif8"] [ext_resource type="Script" path="res://State/Weapon/RangedFireState.cs" id="4_moo4d"] @@ -123,6 +124,7 @@ Knockback = 64.0 InitialVelocity = 200.0 ShouldFreezeAngleOnUse = false PlayerLevelGain = 1.0 +Metadata = ExtResource("3_j7q7r") [node name="StateMachine" type="Node" parent="." node_paths=PackedStringArray("InitialState")] script = ExtResource("3_pg4gy") diff --git a/Items/Weapons/DocLance.tres b/Items/Weapons/DocLance.tres new file mode 100644 index 0000000..034160d --- /dev/null +++ b/Items/Weapons/DocLance.tres @@ -0,0 +1,14 @@ +[gd_resource type="Resource" script_class="ItemMetadata" load_steps=4 format=3 uid="uid://cud7l7t0qsc65"] + +[ext_resource type="Script" path="res://Utils/ScenePath.cs" id="1_2t2st"] +[ext_resource type="Script" path="res://Items/ItemMetadata.cs" id="1_fhdpj"] + +[sub_resource type="Resource" id="Resource_clkv8"] +script = ExtResource("1_2t2st") +Path = "res://Items/Weapons/DocLance.tscn" + +[resource] +script = ExtResource("1_fhdpj") +Instance = SubResource("Resource_clkv8") +Name = "Shungite Spear" +Description = "It's a billion year old lance, spear that protects against unwanted invaders." diff --git a/Items/Weapons/DocLance.tscn b/Items/Weapons/DocLance.tscn index abea938..c82e4ca 100644 --- a/Items/Weapons/DocLance.tscn +++ b/Items/Weapons/DocLance.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=22 format=3 uid="uid://p7oijq6dbvvk"] +[gd_scene load_steps=23 format=3 uid="uid://p7oijq6dbvvk"] [ext_resource type="Script" path="res://Items/Weapons/Sword.cs" id="1_1oyma"] +[ext_resource type="Resource" uid="uid://cud7l7t0qsc65" path="res://Items/Weapons/DocLance.tres" id="2_5r5mm"] [ext_resource type="Script" path="res://State/Weapon/WeaponStateMachine.cs" id="2_c41ov"] [ext_resource type="Script" path="res://State/Weapon/SwordIdleState.cs" id="3_sxffm"] [ext_resource type="Script" path="res://State/Weapon/SwordAnticipateState.cs" id="4_t7af2"] @@ -185,8 +186,7 @@ UseTime = 0.55 Knockback = 64.0 ShouldHideIdle = true HandAnchor = NodePath("Anchor/Node2D/Sprite2D/Hand") -ItemName = "VSM-93" -Description = "\"Violence. Speed. Momentum.\"" +Metadata = ExtResource("2_5r5mm") [node name="State" type="Node" parent="." node_paths=PackedStringArray("InitialState")] script = ExtResource("2_c41ov") @@ -251,6 +251,7 @@ libraries = { [node name="Hitbox" parent="." instance=ExtResource("9_buajm")] position = Vector2(16, -4) +priority = 5 IsDisabled = true [node name="CollisionShape2D" parent="Hitbox" index="0"] diff --git a/Items/Weapons/Pugio.tres b/Items/Weapons/Pugio.tres new file mode 100644 index 0000000..43b23e8 --- /dev/null +++ b/Items/Weapons/Pugio.tres @@ -0,0 +1,14 @@ +[gd_resource type="Resource" script_class="ItemMetadata" load_steps=4 format=3 uid="uid://iqe6rgnb3jur"] + +[ext_resource type="Script" path="res://Utils/ScenePath.cs" id="1_o026a"] +[ext_resource type="Script" path="res://Items/ItemMetadata.cs" id="2_j4tmu"] + +[sub_resource type="Resource" id="Resource_abrg1"] +script = ExtResource("1_o026a") +Path = "res://Items/Weapons/Pugio.tscn" + +[resource] +script = ExtResource("2_j4tmu") +Instance = SubResource("Resource_abrg1") +Name = "Pugio" +Description = "A sidearm dagger." diff --git a/Items/Weapons/Pugio.tscn b/Items/Weapons/Pugio.tscn index c80bb02..542904c 100644 --- a/Items/Weapons/Pugio.tscn +++ b/Items/Weapons/Pugio.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=29 format=3 uid="uid://5y1acxl4j4n7"] +[gd_scene load_steps=30 format=3 uid="uid://5y1acxl4j4n7"] [ext_resource type="Script" path="res://Items/Weapons/Sword.cs" id="1_mai31"] [ext_resource type="Script" path="res://State/Weapon/WeaponStateMachine.cs" id="2_5ramr"] +[ext_resource type="Resource" uid="uid://iqe6rgnb3jur" path="res://Items/Weapons/Pugio.tres" id="2_ulca0"] [ext_resource type="Script" path="res://State/Weapon/SwordIdleState.cs" id="3_fwkit"] [ext_resource type="Script" path="res://State/Weapon/SwordAnticipateState.cs" id="4_nsn1q"] [ext_resource type="Script" path="res://State/Weapon/SwordAttackState.cs" id="5_g1en5"] @@ -350,6 +351,7 @@ UseAltTime = 1.5 Knockback = 64.0 PlayerLevelGain = 1.0 HandAnchor = NodePath("Anchor/Node2D/Sprite2D/Hand") +Metadata = ExtResource("2_ulca0") [node name="State" type="Node" parent="." node_paths=PackedStringArray("InitialState")] script = ExtResource("2_5ramr") diff --git a/Items/Weapons/Sword.tres b/Items/Weapons/Sword.tres new file mode 100644 index 0000000..406e7ec --- /dev/null +++ b/Items/Weapons/Sword.tres @@ -0,0 +1,14 @@ +[gd_resource type="Resource" script_class="ItemMetadata" load_steps=4 format=3 uid="uid://cl7jvdu2lnv2d"] + +[ext_resource type="Script" path="res://Utils/ScenePath.cs" id="1_mh5y8"] +[ext_resource type="Script" path="res://Items/ItemMetadata.cs" id="2_asbkr"] + +[sub_resource type="Resource" id="Resource_qqiwa"] +script = ExtResource("1_mh5y8") +Path = "res://Items/Weapons/Sword.tscn" + +[resource] +script = ExtResource("2_asbkr") +Instance = SubResource("Resource_qqiwa") +Name = "Sword" +Description = "A basic sword." diff --git a/Items/Weapons/Sword.tscn b/Items/Weapons/Sword.tscn index 4b7304e..11b79cb 100644 --- a/Items/Weapons/Sword.tscn +++ b/Items/Weapons/Sword.tscn @@ -1,6 +1,8 @@ -[gd_scene load_steps=25 format=3 uid="uid://dvqap2uhcah63"] +[gd_scene load_steps=29 format=3 uid="uid://dvqap2uhcah63"] [ext_resource type="Script" path="res://Items/Weapons/Sword.cs" id="1_mlo73"] +[ext_resource type="Script" path="res://Utils/ScenePath.cs" id="2_g8hkw"] +[ext_resource type="Script" path="res://Items/ItemMetadata.cs" id="2_gy7e7"] [ext_resource type="Script" path="res://State/Weapon/WeaponStateMachine.cs" id="2_vwirq"] [ext_resource type="Script" path="res://State/Weapon/SwordIdleState.cs" id="3_nw6r0"] [ext_resource type="Texture2D" uid="uid://dp7osg05ip5oo" path="res://Assets/Sprites/sword.png" id="3_r75ni"] @@ -15,6 +17,16 @@ [ext_resource type="Texture2D" uid="uid://cmvh6pc71ir1m" path="res://Assets/Sprites/sword-swing-large.png" id="10_672jv"] [ext_resource type="AudioStream" uid="uid://qvthq6tppp63" path="res://Assets/Sounds/whoosh.wav" id="10_mfnl7"] +[sub_resource type="Resource" id="Resource_qqiwa"] +script = ExtResource("2_g8hkw") +Path = "res://Items/Weapons/Sword.tscn" + +[sub_resource type="Resource" id="Resource_advps"] +script = ExtResource("2_gy7e7") +Instance = SubResource("Resource_qqiwa") +Name = "The Fool's Sword" +Description = "The Top Right's Sword" + [sub_resource type="Environment" id="Environment_72txp"] background_mode = 3 glow_enabled = true @@ -320,6 +332,7 @@ Knockback = 64.0 ShouldHideIdle = true PlayerLevelGain = 1.0 HandAnchor = NodePath("Anchor/Node2D/Sprite2D/Hand") +Metadata = SubResource("Resource_advps") [node name="State" type="Node" parent="." node_paths=PackedStringArray("InitialState")] script = ExtResource("2_vwirq") diff --git a/Utils/ResourcePath.cs b/Utils/ResourcePath.cs new file mode 100644 index 0000000..f7c35db --- /dev/null +++ b/Utils/ResourcePath.cs @@ -0,0 +1,22 @@ +using Godot; + +namespace SupaLidlGame.Utils; + +[GlobalClass] +public partial class ResourcePath : Resource +{ + private static Godot.Collections.Dictionary _loaded; + + static ResourcePath() + { + _loaded = new(); + } + + [Export(Godot.PropertyHint.File)] + public string Path { get; set; } + + public T Load() where T : Resource + { + return GD.Load(Path); + } +} diff --git a/Utils/ScenePath.cs b/Utils/ScenePath.cs new file mode 100644 index 0000000..5e2a236 --- /dev/null +++ b/Utils/ScenePath.cs @@ -0,0 +1,32 @@ +using Godot; + +namespace SupaLidlGame.Utils; + +[GlobalClass] +public partial class ScenePath : ResourcePath +{ + private static Godot.Collections.Dictionary _loaded; + + static ScenePath() + { + _loaded = new(); + } + + public PackedScene Load(bool useCached = false) + { + if (useCached && _loaded.ContainsKey(Path)) + { + return _loaded[Path]; + } + + // add scene to loaded to not have to reload scene when called again + var scene = base.Load(); + _loaded.Add(Path, scene); + return scene; + } + + public T Instantiate() where T : Node + { + return Load().Instantiate(); + } +}