From b7d241bf111376a720f63e577adbc0cf3697aad1 Mon Sep 17 00:00:00 2001 From: Marco Date: Tue, 4 Mar 2025 09:43:05 +0100 Subject: [PATCH] Loot Drops --- Cirno.sln.DotSettings.user | 1 + Resources/Items/Ammo1.tres | 1 + Resources/Items/Blue_Keycard.tres | 1 + Resources/Items/Green_Keycard.tres | 1 + Resources/Items/Power_Pickup.tres | 1 + Resources/Items/Red_Keycard.tres | 1 + Resources/Items/Spider_Bomb_Pickup.tres | 1 + Scenes/Actors/FairyGuard_New.tscn | 36 +++++++++- Scenes/Items/Green_Keycard.tscn | 5 +- Scenes/Maps/PlayerFSMTest.tscn | 2 +- Scenes/test.tscn | 2 +- Scripts/Components/Actors/EnemyDropModule.cs | 66 +++++++++++++++++++ .../Components/Actors/EnemyDropModule.cs.uid | 1 + Scripts/Resources/Loot/LootDrop.cs | 13 ++++ Scripts/Resources/Loot/LootDrop.cs.uid | 1 + Scripts/Resources/LootItem.cs | 2 +- 16 files changed, 129 insertions(+), 6 deletions(-) create mode 100644 Scripts/Components/Actors/EnemyDropModule.cs create mode 100644 Scripts/Components/Actors/EnemyDropModule.cs.uid create mode 100644 Scripts/Resources/Loot/LootDrop.cs create mode 100644 Scripts/Resources/Loot/LootDrop.cs.uid diff --git a/Cirno.sln.DotSettings.user b/Cirno.sln.DotSettings.user index 863ccdb4..70daab1a 100644 --- a/Cirno.sln.DotSettings.user +++ b/Cirno.sln.DotSettings.user @@ -9,6 +9,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded diff --git a/Resources/Items/Ammo1.tres b/Resources/Items/Ammo1.tres index f066496e..ebd71caa 100644 --- a/Resources/Items/Ammo1.tres +++ b/Resources/Items/Ammo1.tres @@ -21,3 +21,4 @@ UiType = 2 Selectable = false InventorySprite = SubResource("AtlasTexture_3y0hf") HudItemScene = ExtResource("1_qkp4b") +DropScenePath = &"res://Scenes/Items/Ammo1.tscn" diff --git a/Resources/Items/Blue_Keycard.tres b/Resources/Items/Blue_Keycard.tres index d8ab0dc0..f1be3736 100644 --- a/Resources/Items/Blue_Keycard.tres +++ b/Resources/Items/Blue_Keycard.tres @@ -20,3 +20,4 @@ ConsumeOnUse = false UiType = 1 Selectable = false InventorySprite = SubResource("AtlasTexture_ebbst") +DropScenePath = &"res://Scenes/Items/Blue_Keycard.tscn" diff --git a/Resources/Items/Green_Keycard.tres b/Resources/Items/Green_Keycard.tres index f354544d..ef7b578f 100644 --- a/Resources/Items/Green_Keycard.tres +++ b/Resources/Items/Green_Keycard.tres @@ -20,3 +20,4 @@ ConsumeOnUse = false UiType = 1 Selectable = false InventorySprite = SubResource("AtlasTexture_iasoh") +DropScenePath = &"res://Scenes/Items/Green_Keycard.tscn" diff --git a/Resources/Items/Power_Pickup.tres b/Resources/Items/Power_Pickup.tres index 98f2ca90..03f7a938 100644 --- a/Resources/Items/Power_Pickup.tres +++ b/Resources/Items/Power_Pickup.tres @@ -16,3 +16,4 @@ ConsumeOnUse = true UiType = 2 Selectable = true InventorySprite = ExtResource("1_cang8") +DropScenePath = &"res://Scenes/Items/Power_Pickup.tscn" diff --git a/Resources/Items/Red_Keycard.tres b/Resources/Items/Red_Keycard.tres index d100d889..b6b2cb37 100644 --- a/Resources/Items/Red_Keycard.tres +++ b/Resources/Items/Red_Keycard.tres @@ -20,3 +20,4 @@ Selectable = false InventorySprite = ExtResource("1_glhfu") WorldSprite = ExtResource("1_1j6xs") HudItemScene = ExtResource("1_30txj") +DropScenePath = &"res://Scenes/Items/Red_Keycard.tscn" diff --git a/Resources/Items/Spider_Bomb_Pickup.tres b/Resources/Items/Spider_Bomb_Pickup.tres index 90ade696..479c4015 100644 --- a/Resources/Items/Spider_Bomb_Pickup.tres +++ b/Resources/Items/Spider_Bomb_Pickup.tres @@ -40,4 +40,5 @@ ConsumeOnUse = false UiType = 0 Selectable = true InventorySprite = SubResource("AtlasTexture_gpot4") +DropScenePath = &"res://Scenes/Items/SpiderBomb_Pickup.tscn" metadata/_custom_type_script = "uid://epnwjptvks3t" diff --git a/Scenes/Actors/FairyGuard_New.tscn b/Scenes/Actors/FairyGuard_New.tscn index 90b45476..fcef0d97 100644 --- a/Scenes/Actors/FairyGuard_New.tscn +++ b/Scenes/Actors/FairyGuard_New.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=19 format=3 uid="uid://bc054js8ep2b"] +[gd_scene load_steps=29 format=3 uid="uid://bc054js8ep2b"] [ext_resource type="Script" uid="uid://c2mo5hc1qb6kf" path="res://Scripts/Components/Actors/Actor.cs" id="1_ugrra"] [ext_resource type="SpriteFrames" uid="uid://ch2ll1on8im2p" path="res://Resources/Sprites/FairyGuard.tres" id="2_i2plx"] @@ -15,6 +15,12 @@ [ext_resource type="Script" uid="uid://m0ag88kn0c40" path="res://Scripts/Components/Actors/DeathAnimationHandler.cs" id="13_e2vvk"] [ext_resource type="Resource" uid="uid://dk2rbf88a5irh" path="res://Resources/Bullets/Explosion_Harmless.tres" id="14_881we"] [ext_resource type="Script" uid="uid://7g3luecewcp5" path="res://Scripts/Components/Actors/ActorDefeatScriptHandler.cs" id="15_17yce"] +[ext_resource type="Script" uid="uid://dwbh55rqi0x5e" path="res://Scripts/Components/Actors/EnemyDropModule.cs" id="16_76vwd"] +[ext_resource type="Script" uid="uid://cq65aed620ijo" path="res://Scripts/Resources/Loot/LootDrop.cs" id="17_gsthm"] +[ext_resource type="Resource" uid="uid://ct1fa2huvy34n" path="res://Resources/Items/Ammo1.tres" id="18_hwppe"] +[ext_resource type="Resource" uid="uid://dodwpect0ldjf" path="res://Resources/Items/Heart_Pickup.tres" id="19_swk2c"] +[ext_resource type="Resource" uid="uid://clr1gln7nxa1o" path="res://Resources/Items/Power_Pickup.tres" id="20_evv7k"] +[ext_resource type="Resource" uid="uid://dhbltvgsa3g88" path="res://Resources/Items/Spider_Bomb_Pickup.tres" id="21_y1chq"] [sub_resource type="CircleShape2D" id="CircleShape2D_2b36v"] radius = 5.0 @@ -25,6 +31,30 @@ radius = 85.0529 [sub_resource type="CircleShape2D" id="CircleShape2D_0tkae"] radius = 5.09902 +[sub_resource type="Resource" id="Resource_lh4qp"] +script = ExtResource("17_gsthm") +Item = ExtResource("18_hwppe") +Chance = 40.0 +metadata/_custom_type_script = "uid://cq65aed620ijo" + +[sub_resource type="Resource" id="Resource_fmqd5"] +script = ExtResource("17_gsthm") +Item = ExtResource("19_swk2c") +Chance = 20.0 +metadata/_custom_type_script = "uid://cq65aed620ijo" + +[sub_resource type="Resource" id="Resource_gry1a"] +script = ExtResource("17_gsthm") +Item = ExtResource("20_evv7k") +Chance = 20.0 +metadata/_custom_type_script = "uid://cq65aed620ijo" + +[sub_resource type="Resource" id="Resource_6b6qx"] +script = ExtResource("17_gsthm") +Item = ExtResource("21_y1chq") +Chance = 10.0 +metadata/_custom_type_script = "uid://cq65aed620ijo" + [node name="FairyGuard" type="CharacterBody2D"] collision_layer = 16 collision_mask = 113 @@ -103,6 +133,10 @@ ExplosionData = ExtResource("14_881we") [node name="DefeatScriptHandler" type="Node2D" parent="."] script = ExtResource("15_17yce") +[node name="LootDrops" type="Node2D" parent="."] +script = ExtResource("16_76vwd") +LootDrops = Array[ExtResource("17_gsthm")]([SubResource("Resource_lh4qp"), SubResource("Resource_fmqd5"), SubResource("Resource_gry1a"), SubResource("Resource_6b6qx")]) + [connection signal="area_entered" from="PlayerDetection" to="PlayerDetection" method="_on_area_entered"] [connection signal="area_exited" from="PlayerDetection" to="PlayerDetection" method="_on_area_exited"] [connection signal="velocity_computed" from="NavigationAgent2D" to="NavigationMovementProvider" method="_on_navigation_agent_2d_velocity_computed"] diff --git a/Scenes/Items/Green_Keycard.tscn b/Scenes/Items/Green_Keycard.tscn index c7971b16..8ab5cf33 100644 --- a/Scenes/Items/Green_Keycard.tscn +++ b/Scenes/Items/Green_Keycard.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=8 format=3 uid="uid://r25rq6ijgm6m"] +[gd_scene load_steps=9 format=3 uid="uid://r25rq6ijgm6m"] [ext_resource type="Script" uid="uid://b3h7b30kerf60" path="res://Scripts/Interactables/ItemPickup.cs" id="1_kb5vg"] +[ext_resource type="Script" uid="uid://epnwjptvks3t" path="res://Scripts/Resources/LootItem.cs" id="2_k08wy"] [ext_resource type="Resource" uid="uid://cspcgkr0tane2" path="res://Resources/Items/Green_Keycard.tres" id="2_kb5vg"] [ext_resource type="Texture2D" uid="uid://bvkjnc3ggp7ba" path="res://Sprites/Items/GreenKeycard_Small.png" id="2_lts72"] @@ -32,7 +33,7 @@ animations = [{ collision_layer = 4 collision_mask = 2 script = ExtResource("1_kb5vg") -LootTable = [ExtResource("2_kb5vg")] +LootTable = Array[ExtResource("2_k08wy")]([ExtResource("2_kb5vg")]) [node name="CollisionShape2D" type="CollisionShape2D" parent="."] shape = SubResource("CircleShape2D_6vv2s") diff --git a/Scenes/Maps/PlayerFSMTest.tscn b/Scenes/Maps/PlayerFSMTest.tscn index bfbb3e32..c0a7bf3f 100644 --- a/Scenes/Maps/PlayerFSMTest.tscn +++ b/Scenes/Maps/PlayerFSMTest.tscn @@ -57,7 +57,7 @@ PlayerTemplate = ExtResource("8_c3v4x") SpawnMarkers = Dictionary[int, NodePath]({ 0: NodePath("PlayerStartPosition") }) -StartingEquipment = [ExtResource("3_6314l"), ExtResource("4_yyg8m")] +StartingEquipment = Array[ExtResource("5_u1i8n")]([ExtResource("3_6314l"), ExtResource("4_yyg8m")]) MapStartData = SubResource("Resource_6wo78") [node name="Tilemaps" type="Node2D" parent="."] diff --git a/Scenes/test.tscn b/Scenes/test.tscn index 9c035320..cd1ac197 100644 --- a/Scenes/test.tscn +++ b/Scenes/test.tscn @@ -207,7 +207,7 @@ SpawnMarkers = Dictionary[int, NodePath]({ 2: NodePath("Factory Tilemaps/LevelProps/BossDebugTeleporterDestination"), 255: NodePath("Factory Tilemaps/Debug Room/DebugRoomStartPosition") }) -StartingEquipment = [ExtResource("4_swym2"), ExtResource("5_nqier")] +StartingEquipment = Array[ExtResource("6_8tdlb")]([ExtResource("4_swym2"), ExtResource("5_nqier")]) MapStartData = SubResource("Resource_6sau4") metadata/_edit_lock_ = true diff --git a/Scripts/Components/Actors/EnemyDropModule.cs b/Scripts/Components/Actors/EnemyDropModule.cs new file mode 100644 index 00000000..944982c4 --- /dev/null +++ b/Scripts/Components/Actors/EnemyDropModule.cs @@ -0,0 +1,66 @@ +using Cirno.Scripts.Resources; +using Cirno.Scripts.Resources.Loot; +using Godot; +using Godot.Collections; + +namespace Cirno.Scripts.Components.Actors; + +public partial class EnemyDropModule : ActorModule +{ + [Export] public Array LootDrops { get; private set; } = []; + + private RandomNumberGenerator _rng = new (); + + private Actor _actor; + + public override void Init(Actor actor) + { + _actor = actor; + actor.OnDeath += ActorOnDeath; + } + + private void DropLoot() + { + foreach (var loot in LootDrops) + { + if (loot is { Item: not null }) + { + float roll = _rng.RandfRange(0f, 100f); // Generate a number between 0 and 100 + if (roll <= loot.Chance) // Compare with drop chance + { + DropItem(loot.Item); + } + } + } + } + + private void DropItem(LootItem item) + { + if (!string.IsNullOrWhiteSpace(item.DropScenePath)) + { + GD.Print($"Dropped item: {item.ItemName}"); + var scene = GD.Load(item.DropScenePath); + _actor.CreateSibling(scene); + } + else + { + GD.Print($"Skipping Item with missing path: {item.ItemName}"); + } + } + + private void ActorOnDeath() + { + DropLoot(); + _actor.OnDeath -= ActorOnDeath; + } + + public override void Update(double delta) + { + + } + + public override void PhysicsUpdate(double delta) + { + + } +} \ No newline at end of file diff --git a/Scripts/Components/Actors/EnemyDropModule.cs.uid b/Scripts/Components/Actors/EnemyDropModule.cs.uid new file mode 100644 index 00000000..e25990fe --- /dev/null +++ b/Scripts/Components/Actors/EnemyDropModule.cs.uid @@ -0,0 +1 @@ +uid://dwbh55rqi0x5e diff --git a/Scripts/Resources/Loot/LootDrop.cs b/Scripts/Resources/Loot/LootDrop.cs new file mode 100644 index 00000000..7e74592a --- /dev/null +++ b/Scripts/Resources/Loot/LootDrop.cs @@ -0,0 +1,13 @@ +using Godot; + +namespace Cirno.Scripts.Resources.Loot; + +[GlobalClass] +public partial class LootDrop : Resource +{ + [Export] + public LootItem Item { get; private set; } + + [Export(PropertyHint.None, "suffix:%")] + public float Chance { get; private set; } +} \ No newline at end of file diff --git a/Scripts/Resources/Loot/LootDrop.cs.uid b/Scripts/Resources/Loot/LootDrop.cs.uid new file mode 100644 index 00000000..1d64ff65 --- /dev/null +++ b/Scripts/Resources/Loot/LootDrop.cs.uid @@ -0,0 +1 @@ +uid://cq65aed620ijo diff --git a/Scripts/Resources/LootItem.cs b/Scripts/Resources/LootItem.cs index 9faf4e8f..20cb4cb8 100644 --- a/Scripts/Resources/LootItem.cs +++ b/Scripts/Resources/LootItem.cs @@ -19,7 +19,7 @@ public partial class LootItem : Resource [Export] public Texture2D InventorySprite; [Export] public SpriteFrames WorldSprite; [Export] public PackedScene HudItemScene; - + [Export(PropertyHint.File)] public StringName DropScenePath { get; private set; } // Has to be a string path to avoid recursion issues } public enum UiItemType