newlon/scripts/entities/zombies/RuntimeZombieData.cs
2025-07-20 04:23:22 +05:00

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
}