84 lines
2 KiB
C#
84 lines
2 KiB
C#
using Godot;
|
|
|
|
namespace Newlon.Components.Zombies;
|
|
|
|
public partial class RuntimeZombieData : Entity
|
|
{
|
|
[Export]
|
|
private Armor _armor;
|
|
[Signal] public delegate void HasBeenKilledEventHandler(RuntimeZombieData who);
|
|
[Signal] public delegate void HPChangedMixedEventHandler(float delta);
|
|
public bool AbleToEat = true;
|
|
|
|
public override void _Ready()
|
|
{
|
|
base._Ready();
|
|
|
|
OnHPChanged += HPChangedMixedInvokerSource;
|
|
LocalTimescale -= (float)GD.Randf() / 100.0f;
|
|
}
|
|
|
|
public override void Heal(float amount, Node origin)
|
|
{
|
|
if (_armor != null)
|
|
{
|
|
HP += _armor.Heal(amount);
|
|
}
|
|
else
|
|
HP += amount;
|
|
EmitSignal(SignalName.OnHPChanged, amount, origin);
|
|
|
|
if (HP > MaxHP)
|
|
{
|
|
HP = MaxHP;
|
|
}
|
|
}
|
|
public override void TakeDamage(float amount, Node origin)
|
|
{
|
|
var damage = amount;
|
|
if (_armor != null)
|
|
{
|
|
damage = _armor.RecieveDamage(amount);
|
|
}
|
|
|
|
EmitSignal(SignalName.OnDamaged);
|
|
if (HP - damage <= 0)
|
|
{
|
|
var delta = -HP;
|
|
HP = 0;
|
|
EmitSignal(SignalName.OnHPChanged, delta, origin);
|
|
KillByDamage();
|
|
}
|
|
else
|
|
{
|
|
HP -= damage;
|
|
EmitSignal(SignalName.OnHPChanged, -damage, origin);
|
|
}
|
|
}
|
|
public void HPChangedMixedInvokerSource(float delta, Node source)
|
|
{
|
|
EmitSignal(SignalName.HPChangedMixed, delta);
|
|
}
|
|
public void HPChangedMixedInvoker(float delta)
|
|
{
|
|
EmitSignal(SignalName.HPChangedMixed, -delta);
|
|
}
|
|
public float GetMaxHPMixed()
|
|
{
|
|
if (_armor != null)
|
|
return MaxHP + _armor.MaxHP;
|
|
return MaxHP;
|
|
}
|
|
#region Death sequence
|
|
private bool _killed = false;
|
|
public override void KillByDamage()
|
|
{
|
|
if (_killed) return;
|
|
_killed = true;
|
|
AbleToEat = false;
|
|
EmitSignal(SignalName.HasBeenKilled,this);
|
|
}
|
|
|
|
|
|
#endregion
|
|
}
|