Signal context
This commit is contained in:
parent
8a7295be82
commit
b4bf3ab8bc
13 changed files with 112 additions and 72 deletions
|
|
@ -11,36 +11,52 @@ public partial class Entity : Node2D
|
|||
#region Health points
|
||||
[Export] public float MaxHP;
|
||||
public float HP;
|
||||
[Signal] public delegate void OnHPChangedEventHandler(float deltaHP, Node origin);
|
||||
[Signal] public delegate void OnHPChangedEventHandler(EntitySignalContext context);
|
||||
[Signal] public delegate void OnDamagedEventHandler();
|
||||
|
||||
public virtual void TakeDamage(float amount, Node origin)
|
||||
{
|
||||
EmitSignal(SignalName.OnDamaged);
|
||||
var context = new EntitySignalContext()
|
||||
{
|
||||
target = this,
|
||||
source = (Entity)origin,
|
||||
actionAmount = amount
|
||||
};
|
||||
if (HP - amount <= 0)
|
||||
{
|
||||
EmitSignal(SignalName.OnHPChanged, -HP, origin);
|
||||
context.deltaHP = -HP;
|
||||
EmitSignal(SignalName.OnHPChanged, context);
|
||||
HP = 0;
|
||||
KillByDamage();
|
||||
}
|
||||
else
|
||||
{
|
||||
context.deltaHP = -amount;
|
||||
HP -= amount;
|
||||
EmitSignal(SignalName.OnHPChanged, -amount, origin);
|
||||
EmitSignal(SignalName.OnHPChanged, context);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void Heal(float amount, Node origin)
|
||||
{
|
||||
var context = new EntitySignalContext()
|
||||
{
|
||||
target = this,
|
||||
source = (Entity)origin,
|
||||
actionAmount = amount
|
||||
};
|
||||
if (HP + amount > MaxHP)
|
||||
{
|
||||
EmitSignal(SignalName.OnHPChanged, MaxHP - HP, origin);
|
||||
context.deltaHP = MaxHP - HP;
|
||||
EmitSignal(SignalName.OnHPChanged, context);
|
||||
HP = MaxHP;
|
||||
}
|
||||
else
|
||||
{
|
||||
context.deltaHP = amount;
|
||||
HP += amount;
|
||||
EmitSignal(SignalName.OnHPChanged, amount, origin);
|
||||
EmitSignal(SignalName.OnHPChanged, context);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ public partial class EntityHPObserver : Node
|
|||
_observedEntity.OnHPChanged += OnHPChanged;
|
||||
}
|
||||
|
||||
private void OnHPChanged(float delta, Node origin)
|
||||
private void OnHPChanged(EntitySignalContext context)
|
||||
{
|
||||
if (_setGreater == false && _observedEntity.HP / _observedEntity.MaxHP <= _threshold)
|
||||
{
|
||||
|
|
|
|||
11
scripts/entities/EntitySignalContext.cs
Normal file
11
scripts/entities/EntitySignalContext.cs
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
using Godot;
|
||||
|
||||
namespace Newlon.Components;
|
||||
|
||||
public partial class EntitySignalContext : RefCounted
|
||||
{
|
||||
public Node source;
|
||||
public Entity target;
|
||||
public float actionAmount;
|
||||
public float deltaHP;
|
||||
}
|
||||
1
scripts/entities/EntitySignalContext.cs.uid
Normal file
1
scripts/entities/EntitySignalContext.cs.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://cbdvo20dhiadw
|
||||
|
|
@ -14,7 +14,7 @@ public partial class FlashComponent : CanvasGroup
|
|||
_shaderMaterial = Material as ShaderMaterial;
|
||||
}
|
||||
|
||||
public void DamageFlash(int damage,Node origin)
|
||||
public void DamageFlash(EntitySignalContext context)
|
||||
{
|
||||
Flash();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,10 +29,10 @@ public partial class NerdusReturnAttack : Area2D
|
|||
entities.Remove(entity);
|
||||
}
|
||||
}
|
||||
private void OnHPChanged(float delta, Node source)
|
||||
private void OnHPChanged(EntitySignalContext context)
|
||||
{
|
||||
if (delta >= 0) return;
|
||||
returnAmount -= delta;
|
||||
if (context.deltaHP >= 0) return;
|
||||
returnAmount -= context.deltaHP;
|
||||
triggered = true;
|
||||
}
|
||||
public void ReturnAllDamage()
|
||||
|
|
|
|||
|
|
@ -9,10 +9,10 @@ public partial class ReturnEffect : Node
|
|||
[Export]
|
||||
private Effect _effectToReturn;
|
||||
|
||||
public void OnDamageRecieved(int delta,Node origin)
|
||||
public void OnDamageRecieved(EntitySignalContext context)
|
||||
{
|
||||
if (delta >= 0) return;
|
||||
if (origin is RuntimeZombieData zombie)
|
||||
if (context.deltaHP >= 0) return;
|
||||
if (context.source is RuntimeZombieData zombie)
|
||||
{
|
||||
zombie.GiveEffect(_effectToReturn);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,18 +5,11 @@ namespace Newlon.Components.Plants.Behaviours;
|
|||
|
||||
public partial class HpBasedBehaviour : BaseBehaviour
|
||||
{
|
||||
private RuntimePlantData _data;
|
||||
[Export] private Array<string> parameters;
|
||||
|
||||
public override void _Ready()
|
||||
public void OnHPChanged(EntitySignalContext context)
|
||||
{
|
||||
base._Ready();
|
||||
_data = GetParent<RuntimePlantData>();
|
||||
}
|
||||
|
||||
public void OnHPChanged(float amount, Node origin)
|
||||
{
|
||||
var calc = _data.HP / _data.MaxHP;
|
||||
var calc = context.target.HP / context.target.MaxHP;
|
||||
foreach (var par in parameters)
|
||||
{
|
||||
_tree.Set(par, calc);
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ public partial class RuntimeZombieData : Entity
|
|||
[Export]
|
||||
private Armor _armor;
|
||||
[Signal] public delegate void HasBeenKilledEventHandler(RuntimeZombieData who);
|
||||
[Signal] public delegate void HPChangedMixedEventHandler(float delta);
|
||||
[Signal] public delegate void HPChangedMixedEventHandler(EntitySignalContext context);
|
||||
public bool AbleToEat = true;
|
||||
|
||||
public override void _Ready()
|
||||
|
|
@ -20,6 +20,14 @@ public partial class RuntimeZombieData : Entity
|
|||
|
||||
public override void Heal(float amount, Node origin)
|
||||
{
|
||||
var context = new EntitySignalContext()
|
||||
{
|
||||
source = (Entity)origin,
|
||||
target = this,
|
||||
actionAmount = amount,
|
||||
deltaHP = Mathf.Clamp(HP+amount,0,MaxHP-amount)
|
||||
};
|
||||
|
||||
if (_armor != null)
|
||||
{
|
||||
HP += _armor.Heal(amount);
|
||||
|
|
@ -42,33 +50,54 @@ public partial class RuntimeZombieData : Entity
|
|||
}
|
||||
|
||||
EmitSignal(SignalName.OnDamaged);
|
||||
var context = new EntitySignalContext()
|
||||
{
|
||||
source = origin,
|
||||
target = this,
|
||||
actionAmount = amount
|
||||
};
|
||||
if (HP - damage <= 0)
|
||||
{
|
||||
var delta = -HP;
|
||||
HP = 0;
|
||||
EmitSignal(SignalName.OnHPChanged, delta, origin);
|
||||
EmitSignal(SignalName.OnHPChanged, context);
|
||||
context.deltaHP = delta;
|
||||
KillByDamage();
|
||||
}
|
||||
else
|
||||
{
|
||||
HP -= damage;
|
||||
EmitSignal(SignalName.OnHPChanged, -damage, origin);
|
||||
context.deltaHP = -damage;
|
||||
EmitSignal(SignalName.OnHPChanged, context);
|
||||
}
|
||||
}
|
||||
public void HPChangedMixedInvokerSource(float delta, Node source)
|
||||
public void HPChangedMixedInvokerSource(EntitySignalContext context)
|
||||
{
|
||||
EmitSignal(SignalName.HPChangedMixed, delta);
|
||||
EmitSignal(SignalName.HPChangedMixed, context);
|
||||
}
|
||||
public void HPChangedMixedInvoker(float delta)
|
||||
{
|
||||
EmitSignal(SignalName.HPChangedMixed, -delta);
|
||||
|
||||
EmitSignal(SignalName.HPChangedMixed, new EntitySignalContext()
|
||||
{
|
||||
deltaHP = -delta,
|
||||
source = null,
|
||||
target = this,
|
||||
actionAmount = delta
|
||||
});
|
||||
}
|
||||
public float GetMaxHPMixed()
|
||||
public float GetMaxHPMixed()
|
||||
{
|
||||
if (_armor != null)
|
||||
return MaxHP + _armor.MaxHP;
|
||||
return MaxHP;
|
||||
}
|
||||
public float GetHPMixed()
|
||||
{
|
||||
if (_armor != null)
|
||||
return HP + _armor._hp;
|
||||
return HP;
|
||||
}
|
||||
#region Death sequence
|
||||
private bool _killed = false;
|
||||
public override void KillByDamage()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue