From dae952af8b6016dc0aa26ed26aa2673192ae3cf4 Mon Sep 17 00:00:00 2001 From: Marco Date: Mon, 17 Mar 2025 16:20:22 +0100 Subject: [PATCH] Item Effects system --- Resources/Items/Heart_Pickup.tres | 10 +- Resources/Items/Shield_Pickup.tres | 10 +- Resources/Items/Spider_Bomb_Pickup.tres | 8 +- .../FSM/Player/PlayerFSMItemUseModule.cs | 170 +++++++++--------- .../ItemEffects/HealEffectResource.cs | 41 +++++ .../ItemEffects/HealEffectResource.cs.uid | 1 + .../ItemEffects/HealPercentEffectResource.cs | 33 ++++ .../HealPercentEffectResource.cs.uid | 1 + .../ItemEffects/IITemEffectMachine.cs | 8 + .../ItemEffects/IITemEffectMachine.cs.uid | 1 + .../ItemEffects/ItemEffectResource.cs | 10 ++ .../ItemEffects/ItemEffectResource.cs.uid | 1 + .../ItemEffects/SpiderbombEffectResource.cs | 44 +++++ .../SpiderbombEffectResource.cs.uid | 1 + Scripts/Resources/LootItem.cs | 4 +- 15 files changed, 257 insertions(+), 86 deletions(-) create mode 100644 Scripts/Resources/ItemEffects/HealEffectResource.cs create mode 100644 Scripts/Resources/ItemEffects/HealEffectResource.cs.uid create mode 100644 Scripts/Resources/ItemEffects/HealPercentEffectResource.cs create mode 100644 Scripts/Resources/ItemEffects/HealPercentEffectResource.cs.uid create mode 100644 Scripts/Resources/ItemEffects/IITemEffectMachine.cs create mode 100644 Scripts/Resources/ItemEffects/IITemEffectMachine.cs.uid create mode 100644 Scripts/Resources/ItemEffects/ItemEffectResource.cs create mode 100644 Scripts/Resources/ItemEffects/ItemEffectResource.cs.uid create mode 100644 Scripts/Resources/ItemEffects/SpiderbombEffectResource.cs create mode 100644 Scripts/Resources/ItemEffects/SpiderbombEffectResource.cs.uid diff --git a/Resources/Items/Heart_Pickup.tres b/Resources/Items/Heart_Pickup.tres index 1011af94..6b1762aa 100644 --- a/Resources/Items/Heart_Pickup.tres +++ b/Resources/Items/Heart_Pickup.tres @@ -1,7 +1,14 @@ -[gd_resource type="Resource" script_class="LootItem" load_steps=3 format=3 uid="uid://dodwpect0ldjf"] +[gd_resource type="Resource" script_class="LootItem" load_steps=5 format=3 uid="uid://dodwpect0ldjf"] [ext_resource type="Script" uid="uid://epnwjptvks3t" path="res://Scripts/Resources/LootItem.cs" id="1_hyh2l"] [ext_resource type="Texture2D" uid="uid://dlkqy5jgchwy" path="res://Sprites/Items/Heart_Pickup.png" id="1_xg75n"] +[ext_resource type="Script" uid="uid://bxgjw8wis5l0t" path="res://Scripts/Resources/ItemEffects/HealPercentEffectResource.cs" id="2_yj7ej"] + +[sub_resource type="Resource" id="Resource_vsvqq"] +script = ExtResource("2_yj7ej") +HealPercentage = 25.0 +ResourceType = 0 +metadata/_custom_type_script = "uid://bxgjw8wis5l0t" [resource] script = ExtResource("1_hyh2l") @@ -9,6 +16,7 @@ ItemName = &"Health" ItemDescription = &"Gives back 25% of Max Health on use" ItemKey = &"HEALTH" Item = 4 +ItemEffect = SubResource("Resource_vsvqq") Amount = 1 Max = 10 PickupIfMaxed = false diff --git a/Resources/Items/Shield_Pickup.tres b/Resources/Items/Shield_Pickup.tres index 87d8d74a..e0ea1fe5 100644 --- a/Resources/Items/Shield_Pickup.tres +++ b/Resources/Items/Shield_Pickup.tres @@ -1,14 +1,22 @@ -[gd_resource type="Resource" script_class="LootItem" load_steps=3 format=3 uid="uid://bhbufxodybsw4"] +[gd_resource type="Resource" script_class="LootItem" load_steps=5 format=3 uid="uid://bhbufxodybsw4"] [ext_resource type="Texture2D" uid="uid://8n23xie4kore" path="res://Sprites/Items/Shield_Pickup.png" id="1_0hq6q"] +[ext_resource type="Script" uid="uid://bxgjw8wis5l0t" path="res://Scripts/Resources/ItemEffects/HealPercentEffectResource.cs" id="2_mvfwl"] [ext_resource type="Script" uid="uid://epnwjptvks3t" path="res://Scripts/Resources/LootItem.cs" id="2_xsuq5"] +[sub_resource type="Resource" id="Resource_qh6j2"] +script = ExtResource("2_mvfwl") +HealPercentage = 25.0 +ResourceType = 1 +metadata/_custom_type_script = "uid://bxgjw8wis5l0t" + [resource] script = ExtResource("2_xsuq5") ItemName = &"Shield Charge" ItemDescription = &"Recharges the shield by 25%" ItemKey = &"SHIELD" Item = 8 +ItemEffect = SubResource("Resource_qh6j2") Amount = 1 Max = 10 PickupIfMaxed = false diff --git a/Resources/Items/Spider_Bomb_Pickup.tres b/Resources/Items/Spider_Bomb_Pickup.tres index 2913a322..4e95c2c6 100644 --- a/Resources/Items/Spider_Bomb_Pickup.tres +++ b/Resources/Items/Spider_Bomb_Pickup.tres @@ -1,14 +1,19 @@ -[gd_resource type="Resource" script_class="LootItem" load_steps=7 format=3 uid="uid://dhbltvgsa3g88"] +[gd_resource type="Resource" script_class="LootItem" load_steps=9 format=3 uid="uid://dhbltvgsa3g88"] [ext_resource type="Texture2D" uid="uid://r2h77ktff10m" path="res://Sprites/Bullets/Snowball.png" id="1_gpot4"] [ext_resource type="Script" uid="uid://epnwjptvks3t" path="res://Scripts/Resources/LootItem.cs" id="1_lus3u"] [ext_resource type="Script" uid="uid://b6fmrnipv88bk" path="res://Scripts/Resources/WeaponResource.cs" id="1_qd764"] +[ext_resource type="Script" uid="uid://cyipg3seetrxd" path="res://Scripts/Resources/ItemEffects/SpiderbombEffectResource.cs" id="2_6b2qd"] [ext_resource type="Resource" uid="uid://dwxn7f1ue0m4s" path="res://Resources/Bullets/Spider_Bomb_Bullet.tres" id="2_gpot4"] [sub_resource type="AtlasTexture" id="AtlasTexture_gpot4"] atlas = ExtResource("1_gpot4") region = Rect2(0, 0, 16, 16) +[sub_resource type="Resource" id="Resource_2pgyg"] +script = ExtResource("2_6b2qd") +metadata/_custom_type_script = "uid://cyipg3seetrxd" + [sub_resource type="Resource" id="Resource_v5a4k"] script = ExtResource("1_qd764") Name = null @@ -32,6 +37,7 @@ ItemName = &"SnowBall Bomb" ItemDescription = &"A snowball packed of explosive, explodes on contact" ItemKey = &"SPIDER_BOMB" Item = 5 +ItemEffect = SubResource("Resource_2pgyg") WeaponData = SubResource("Resource_v5a4k") Amount = 1 Max = 10 diff --git a/Scripts/Components/FSM/Player/PlayerFSMItemUseModule.cs b/Scripts/Components/FSM/Player/PlayerFSMItemUseModule.cs index 318083fd..9c004b3e 100644 --- a/Scripts/Components/FSM/Player/PlayerFSMItemUseModule.cs +++ b/Scripts/Components/FSM/Player/PlayerFSMItemUseModule.cs @@ -36,6 +36,7 @@ public partial class PlayerFSMItemUseModule : ModuleBase _machine; + public IStateMachine Machine => _machine; public override void Init(IStateMachine machine) { @@ -46,91 +47,96 @@ public partial class PlayerFSMItemUseModule : ModuleBase(); - //bullet.Initialize(item.WeaponData.BulletData.MakeBullet(this.GlobalPosition, 1,0, 0), GameManager.Instance); - - - //InventoryManager.Instance.RemoveItem(item.ItemKey, 1); - // emit projectile - var bullet = this.CreateChildOf(GameManager.Instance.BulletsContainer, item.WeaponData.BulletData.BulletScene, this.GlobalPosition); - - var bulletData = item.WeaponData.MakeBullet(this.GlobalPosition); - - bullet.Initialize(bulletData, GameManager.Instance); - bullet.SetDirection(FacingDirection); - bullet.RotateSpriteDegrees(-90); - //bullet.SetDirection(_facingDirection); - bullet.Speed = item.WeaponData.BulletData.BulletSpeed; - - _machine.SetState(PlayerState.Controlling); - - //RequestMovementDisable(true); - // set camera - GameManager.Instance.CameraTargetObject(bullet); - // set event destroy - bullet.OnDestroy += () => - { - GameManager.Instance.CameraTargetPlayer(); - _machine.SetState(PlayerState.Active); - //RequestMovementDisable(false); - }; - } + // private void SpawnBomb(LootItem item) + // { + // GD.Print("Spawned bomb"); + // } + // + // private void Heal(LootItem item) + // { + // Health.CurrentResource += Mathf.CeilToInt(Health.MaxResource * 25 / 100); + // } + // + // private void RechargeShield(LootItem item) + // { + // Shield.CurrentResource += Mathf.CeilToInt(Health.MaxResource * 25 / 100); + // } + // + // private void SpawnSpiderBomb(LootItem item) + // { + // //var bullet = item.WeaponData.BulletData.BulletScene.Instantiate(); + // //bullet.Initialize(item.WeaponData.BulletData.MakeBullet(this.GlobalPosition, 1,0, 0), GameManager.Instance); + // + // + // //InventoryManager.Instance.RemoveItem(item.ItemKey, 1); + // // emit projectile + // var bullet = this.CreateChildOf(GameManager.Instance.BulletsContainer, item.WeaponData.BulletData.BulletScene, this.GlobalPosition); + // + // var bulletData = item.WeaponData.MakeBullet(this.GlobalPosition); + // + // bullet.Initialize(bulletData, GameManager.Instance); + // bullet.SetDirection(FacingDirection); + // bullet.RotateSpriteDegrees(-90); + // //bullet.SetDirection(_facingDirection); + // bullet.Speed = item.WeaponData.BulletData.BulletSpeed; + // + // _machine.SetState(PlayerState.Controlling); + // + // //RequestMovementDisable(true); + // // set camera + // GameManager.Instance.CameraTargetObject(bullet); + // // set event destroy + // bullet.OnDestroy += () => + // { + // GameManager.Instance.CameraTargetPlayer(); + // _machine.SetState(PlayerState.Active); + // //RequestMovementDisable(false); + // }; + // } public override void Process(double delta) { diff --git a/Scripts/Resources/ItemEffects/HealEffectResource.cs b/Scripts/Resources/ItemEffects/HealEffectResource.cs new file mode 100644 index 00000000..828596da --- /dev/null +++ b/Scripts/Resources/ItemEffects/HealEffectResource.cs @@ -0,0 +1,41 @@ +using System; +using Cirno.Scripts.Components.FSM.Player; +using Godot; + +namespace Cirno.Scripts.Resources.ItemEffects; + +[GlobalClass] +public partial class HealEffectResource : ItemEffectResource +{ + [Export] public float HealAmount { get; private set; } = 10f; + [Export] public HealResourceType ResourceType { get; private set; } = HealResourceType.Health; + + public override IITemEffectMachine Execute(PlayerFSMItemUseModule parent, LootItem item) + { + return new HealEffectmachine(this, parent, item).Execute(); + } + + public class HealEffectmachine(HealEffectResource resource, PlayerFSMItemUseModule parent, LootItem item) + : IITemEffectMachine + { + public IITemEffectMachine Execute() + { + switch (resource.ResourceType) + { + case HealResourceType.Health: + parent.Health.CurrentResource += resource.HealAmount; + break; + case HealResourceType.Shield: + parent.Shield.CurrentResource += resource.HealAmount; + break; + } + return this; + } + } + + public enum HealResourceType + { + Health, + Shield + } +} \ No newline at end of file diff --git a/Scripts/Resources/ItemEffects/HealEffectResource.cs.uid b/Scripts/Resources/ItemEffects/HealEffectResource.cs.uid new file mode 100644 index 00000000..e19693db --- /dev/null +++ b/Scripts/Resources/ItemEffects/HealEffectResource.cs.uid @@ -0,0 +1 @@ +uid://ppuaa7avtsgq diff --git a/Scripts/Resources/ItemEffects/HealPercentEffectResource.cs b/Scripts/Resources/ItemEffects/HealPercentEffectResource.cs new file mode 100644 index 00000000..ca142e54 --- /dev/null +++ b/Scripts/Resources/ItemEffects/HealPercentEffectResource.cs @@ -0,0 +1,33 @@ +using Cirno.Scripts.Components.FSM.Player; +using Godot; + +namespace Cirno.Scripts.Resources.ItemEffects; + +[GlobalClass] +public partial class HealPercentEffectResource : ItemEffectResource +{ + [Export] public float HealPercentage = 25f; + [Export] public HealEffectResource.HealResourceType ResourceType { get; private set; } = HealEffectResource.HealResourceType.Health; + public override IITemEffectMachine Execute(PlayerFSMItemUseModule parent, LootItem item) + { + return new HealPercentEffectmachine(this, parent, item).Execute(); + } + + public class HealPercentEffectmachine(HealPercentEffectResource resource, PlayerFSMItemUseModule parent, LootItem item) : IITemEffectMachine + { + public IITemEffectMachine Execute() + { + switch (resource.ResourceType) + { + case HealEffectResource.HealResourceType.Health: + parent.Health.CurrentResource += Mathf.CeilToInt(parent.Health.MaxResource * resource.HealPercentage / 100); + break; + case HealEffectResource.HealResourceType.Shield: + parent.Shield.CurrentResource += Mathf.CeilToInt(parent.Shield.MaxResource * resource.HealPercentage / 100); + break; + } + + return this; + } + } +} \ No newline at end of file diff --git a/Scripts/Resources/ItemEffects/HealPercentEffectResource.cs.uid b/Scripts/Resources/ItemEffects/HealPercentEffectResource.cs.uid new file mode 100644 index 00000000..1c85975e --- /dev/null +++ b/Scripts/Resources/ItemEffects/HealPercentEffectResource.cs.uid @@ -0,0 +1 @@ +uid://bxgjw8wis5l0t diff --git a/Scripts/Resources/ItemEffects/IITemEffectMachine.cs b/Scripts/Resources/ItemEffects/IITemEffectMachine.cs new file mode 100644 index 00000000..6984ab71 --- /dev/null +++ b/Scripts/Resources/ItemEffects/IITemEffectMachine.cs @@ -0,0 +1,8 @@ +using Cirno.Scripts.Components.FSM.Player; + +namespace Cirno.Scripts.Resources.ItemEffects; + +public interface IITemEffectMachine +{ + public IITemEffectMachine Execute(); +} \ No newline at end of file diff --git a/Scripts/Resources/ItemEffects/IITemEffectMachine.cs.uid b/Scripts/Resources/ItemEffects/IITemEffectMachine.cs.uid new file mode 100644 index 00000000..054048a2 --- /dev/null +++ b/Scripts/Resources/ItemEffects/IITemEffectMachine.cs.uid @@ -0,0 +1 @@ +uid://bb8cess7hkvwg diff --git a/Scripts/Resources/ItemEffects/ItemEffectResource.cs b/Scripts/Resources/ItemEffects/ItemEffectResource.cs new file mode 100644 index 00000000..94941e8b --- /dev/null +++ b/Scripts/Resources/ItemEffects/ItemEffectResource.cs @@ -0,0 +1,10 @@ +using Cirno.Scripts.Components.FSM.Player; +using Godot; + +namespace Cirno.Scripts.Resources.ItemEffects; + +[GlobalClass] +public abstract partial class ItemEffectResource : Resource +{ + public abstract IITemEffectMachine Execute(PlayerFSMItemUseModule parent, LootItem item); +} \ No newline at end of file diff --git a/Scripts/Resources/ItemEffects/ItemEffectResource.cs.uid b/Scripts/Resources/ItemEffects/ItemEffectResource.cs.uid new file mode 100644 index 00000000..5ca0e396 --- /dev/null +++ b/Scripts/Resources/ItemEffects/ItemEffectResource.cs.uid @@ -0,0 +1 @@ +uid://cmkhe0q83rkmd diff --git a/Scripts/Resources/ItemEffects/SpiderbombEffectResource.cs b/Scripts/Resources/ItemEffects/SpiderbombEffectResource.cs new file mode 100644 index 00000000..6d8d28fc --- /dev/null +++ b/Scripts/Resources/ItemEffects/SpiderbombEffectResource.cs @@ -0,0 +1,44 @@ +using Cirno.Scripts.Components.FSM.Player; +using Godot; + +namespace Cirno.Scripts.Resources.ItemEffects; + +[GlobalClass] +public partial class SpiderbombEffectResource : ItemEffectResource +{ + public override IITemEffectMachine Execute(PlayerFSMItemUseModule parent, LootItem item) + { + return new SpiderbombEffectmachine(this, parent, item).Execute(); + } + + public class SpiderbombEffectmachine(SpiderbombEffectResource resource, PlayerFSMItemUseModule parent, LootItem item) : IITemEffectMachine + { + public IITemEffectMachine Execute() + { + var bullet = parent.CreateChildOf(GameManager.Instance.BulletsContainer, item.WeaponData.BulletData.BulletScene, parent.GlobalPosition); + + var bulletData = item.WeaponData.MakeBullet(parent.GlobalPosition); + + bullet.Initialize(bulletData, GameManager.Instance); + bullet.SetDirection(parent.FacingDirection); + bullet.RotateSpriteDegrees(-90); + //bullet.SetDirection(_facingDirection); + bullet.Speed = item.WeaponData.BulletData.BulletSpeed; + + parent.Machine.SetState(PlayerState.Controlling); + + //RequestMovementDisable(true); + // set camera + GameManager.Instance.CameraTargetObject(bullet); + // set event destroy + bullet.OnDestroy += () => + { + GameManager.Instance.CameraTargetPlayer(); + parent.Machine.SetState(PlayerState.Active); + //RequestMovementDisable(false); + }; + + return this; + } + } +} \ No newline at end of file diff --git a/Scripts/Resources/ItemEffects/SpiderbombEffectResource.cs.uid b/Scripts/Resources/ItemEffects/SpiderbombEffectResource.cs.uid new file mode 100644 index 00000000..30fd1c29 --- /dev/null +++ b/Scripts/Resources/ItemEffects/SpiderbombEffectResource.cs.uid @@ -0,0 +1 @@ +uid://cyipg3seetrxd diff --git a/Scripts/Resources/LootItem.cs b/Scripts/Resources/LootItem.cs index cbab9f52..086245cc 100644 --- a/Scripts/Resources/LootItem.cs +++ b/Scripts/Resources/LootItem.cs @@ -1,4 +1,5 @@ -using Godot; +using Cirno.Scripts.Resources.ItemEffects; +using Godot; namespace Cirno.Scripts.Resources; @@ -9,6 +10,7 @@ public partial class LootItem : Resource [Export] public StringName ItemDescription { get; set; } [Export] public StringName ItemKey { get; set; } [Export] public ItemTypes Item; + [Export] public ItemEffectResource ItemEffect { get; private set; } [Export] public WeaponResource WeaponData { get; set; } [Export] public int Amount; [Export] public int Max;