using Chickensoft.Collections; namespace Zennysoft.Game.Implementation.Components; public class HealthComponent { public IAutoProp CurrentHP => _currentHP; public IAutoProp MaximumHP => _maximumHP; private readonly AutoProp _currentHP; private readonly AutoProp _maximumHP; public event Action? HealthReachedZero; public event Action? DamageTaken; public bool AtFullHealth => CurrentHP.Value == MaximumHP.Value; public HealthComponent(int initialHP) { _maximumHP = new AutoProp(initialHP); _currentHP = new AutoProp(initialHP); } public void Heal(int healAmount) { var cappedAmount = Math.Min(healAmount + _currentHP.Value, _maximumHP.Value); _currentHP.OnNext(cappedAmount); } public void Damage(int damageAmount) { var cappedAmount = Math.Max(_currentHP.Value - damageAmount, 0); _currentHP.OnNext(cappedAmount); if (cappedAmount == 0) HealthReachedZero?.Invoke(); else DamageTaken?.Invoke(); } public void SetHealth(int health) { var cappedAmount = Math.Min(health, _maximumHP.Value); _currentHP.OnNext(cappedAmount); } public void RaiseMaximumHP(int raiseAmount) { _maximumHP.OnNext(raiseAmount); Heal(raiseAmount); } }