Signal context

This commit is contained in:
Rendo 2025-07-22 19:24:34 +05:00
commit b4bf3ab8bc
13 changed files with 112 additions and 72 deletions

View file

@ -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);
}
}

View file

@ -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)
{

View 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;
}

View file

@ -0,0 +1 @@
uid://cbdvo20dhiadw

View file

@ -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();
}

View file

@ -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()

View file

@ -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);
}

View file

@ -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);

View file

@ -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()

View file

@ -83,9 +83,16 @@ public partial class LevelRunner : Node
waveTimer.WaitTime = resource.waves[waveIndex].customWaveDelay > 0 ? resource.waves[waveIndex].customWaveDelay : resource.standardWaveDelay;
waveTimer.Start();
}
private void OnHPChanged(float delta)
private void OnHPChanged(EntitySignalContext context)
{
waveHealth += delta;
waveHealth = 0;
foreach (var zombie in zombies)
{
if (zombie != null)
{
waveHealth += zombie.GetHPMixed();
}
}
if (waveIndex == resource.waves.Count - 1) return;