From 341173c53f454e2301dfcc946d4ed213fbf696d2 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Wed, 29 Oct 2025 02:27:41 +0100 Subject: [PATCH] Add healing effects and systems with event handling --- GameCore/Combat/Effects/HealEffect.cs | 14 ++++++++ GameCore/Combat/HealingSystem.cs | 46 +++++++++++++++++++++++++++ GameCore/Events/EntityHealedEvent.cs | 11 +++++++ GameCore/Events/HealDealtEvent.cs | 10 ++++++ 4 files changed, 81 insertions(+) create mode 100644 GameCore/Combat/Effects/HealEffect.cs create mode 100644 GameCore/Combat/HealingSystem.cs create mode 100644 GameCore/Events/EntityHealedEvent.cs create mode 100644 GameCore/Events/HealDealtEvent.cs diff --git a/GameCore/Combat/Effects/HealEffect.cs b/GameCore/Combat/Effects/HealEffect.cs new file mode 100644 index 0000000..4105491 --- /dev/null +++ b/GameCore/Combat/Effects/HealEffect.cs @@ -0,0 +1,14 @@ +using GameCore.Combat.Interfaces; +using GameCore.Events; + +namespace GameCore.Combat.Effects; + +public class HealEffect(float amount) : IEffect +{ + public void Execute(EffectContext context) + { + if (context.Target == null) return; + + context.World.PublishEvent(new HealDealtEvent(context.Target.Value, amount)); + } +} \ No newline at end of file diff --git a/GameCore/Combat/HealingSystem.cs b/GameCore/Combat/HealingSystem.cs new file mode 100644 index 0000000..1b3bf08 --- /dev/null +++ b/GameCore/Combat/HealingSystem.cs @@ -0,0 +1,46 @@ +using GameCore.Attributes; +using GameCore.ECS; +using GameCore.ECS.Interfaces; +using GameCore.Events; +using Attribute = GameCore.Attributes.Attribute; + +namespace GameCore.Combat; + +public class HealingSystem : ISystem +{ + private readonly World _world; + + public HealingSystem(World world) + { + _world = world; + _world.Subscribe(OnHealDealt); + } + + public void Update(World world, float deltaTime) + { + } + + private void OnHealDealt(HealDealtEvent e) + { + var attributes = _world.GetComponent(e.Target); + if (attributes == null) return; + + var currentHealth = attributes.GetValue(Attribute.Health); + var maxHealth = attributes.GetValue(Attribute.MaxHealth); + + if (currentHealth >= maxHealth) return; + + var amountToHeal = e.Amount; + var newHealth = currentHealth + amountToHeal; + + if (newHealth > maxHealth) + { + amountToHeal = maxHealth - newHealth; + newHealth = maxHealth; + } + + attributes.ModifyValue(Attribute.Health, amountToHeal); + + _world.PublishEvent(new EntityHealedEvent(e.Target, newHealth, amountToHeal)); + } +} \ No newline at end of file diff --git a/GameCore/Events/EntityHealedEvent.cs b/GameCore/Events/EntityHealedEvent.cs new file mode 100644 index 0000000..63ed88c --- /dev/null +++ b/GameCore/Events/EntityHealedEvent.cs @@ -0,0 +1,11 @@ +using GameCore.ECS; +using GameCore.Events.Interfaces; + +namespace GameCore.Events; + +public readonly struct EntityHealedEvent(Entity target, float newHealth, float amountHealed) : IEvent +{ + public readonly Entity Target = target; + public readonly float NewHealth = newHealth; + public readonly float AmountHealed = amountHealed; +} \ No newline at end of file diff --git a/GameCore/Events/HealDealtEvent.cs b/GameCore/Events/HealDealtEvent.cs new file mode 100644 index 0000000..8152488 --- /dev/null +++ b/GameCore/Events/HealDealtEvent.cs @@ -0,0 +1,10 @@ +using GameCore.ECS; +using GameCore.Events.Interfaces; + +namespace GameCore.Events; + +public readonly struct HealDealtEvent(Entity target, float amount) : IEvent +{ + public readonly Entity Target = target; + public readonly float Amount = amount; +} \ No newline at end of file