55 lines
1.2 KiB
C#
55 lines
1.2 KiB
C#
using Chickensoft.Collections;
|
|
|
|
namespace Zennysoft.Game.Implementation.Components;
|
|
|
|
public class HealthComponent
|
|
{
|
|
public IAutoProp<int> CurrentHP => _currentHP;
|
|
|
|
public IAutoProp<int> MaximumHP => _maximumHP;
|
|
|
|
private readonly AutoProp<int> _currentHP;
|
|
|
|
private readonly AutoProp<int> _maximumHP;
|
|
|
|
public event Action? HealthReachedZero;
|
|
public event Action? DamageTaken;
|
|
|
|
public bool AtFullHealth => CurrentHP.Value == MaximumHP.Value;
|
|
|
|
public HealthComponent(int initialHP)
|
|
{
|
|
_maximumHP = new AutoProp<int>(initialHP);
|
|
_currentHP = new AutoProp<int>(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);
|
|
}
|
|
}
|