new effect system
This commit is contained in:
parent
f3a6f7a05a
commit
22b02c4590
11 changed files with 146 additions and 89 deletions
|
|
@ -113,8 +113,7 @@ public partial class Entity : Node2D
|
|||
#region Effects
|
||||
[Export] private Array<Effect> _effectImmunities = new();
|
||||
[Export] private bool completeInvulnerability = false;
|
||||
private readonly Dictionary<string, Effect> _activeEffectSlots = new();
|
||||
private readonly Dictionary<string, Timer> _effectSlotTimers = new();
|
||||
private readonly Dictionary<string, EffectHandler> effectHandlers = new();
|
||||
|
||||
[Signal] public delegate void EffectStartedEventHandler(Effect what);
|
||||
[Signal] public delegate void EffectEndedEventHandler(Effect what);
|
||||
|
|
@ -123,50 +122,25 @@ public partial class Entity : Node2D
|
|||
|
||||
public virtual void GiveEffect(Effect what)
|
||||
{
|
||||
if (Killed) return;
|
||||
if (_effectImmunities.Contains(what) || completeInvulnerability)
|
||||
{
|
||||
if (what == null ||
|
||||
Killed ||
|
||||
completeInvulnerability || _effectImmunities.Contains(what))
|
||||
return;
|
||||
}
|
||||
|
||||
string slot = what.Slot;
|
||||
if (_activeEffectSlots.ContainsKey(slot) == false)
|
||||
{
|
||||
var slot = what.Slot;
|
||||
if (effectHandlers.ContainsKey(slot) == false)
|
||||
InitSlot(slot);
|
||||
}
|
||||
|
||||
if (what == _activeEffectSlots[slot])
|
||||
if (effectHandlers[slot].HandledEffect == what)
|
||||
{
|
||||
EmitSignal(SignalName.EffectContinued, what);
|
||||
effectHandlers[slot].Restart();
|
||||
}
|
||||
else
|
||||
{
|
||||
EmitSignal(SignalName.EffectStarted, what);
|
||||
effectHandlers[slot].HandledEffect = what;
|
||||
effectHandlers[slot].Start();
|
||||
}
|
||||
|
||||
if (_activeEffectSlots[slot] != null)
|
||||
{
|
||||
_effectSlotTimers[slot].Stop();
|
||||
_activeEffectSlots[slot].Exit(this);
|
||||
}
|
||||
_effectSlotTimers[slot].WaitTime = what.Duration;
|
||||
_effectSlotTimers[slot].Start();
|
||||
|
||||
what.Enter(this);
|
||||
_activeEffectSlots[slot] = what;
|
||||
|
||||
}
|
||||
|
||||
private void InitSlot(string key)
|
||||
{
|
||||
_activeEffectSlots.Add(key, null);
|
||||
|
||||
var timer = new Timer() { Autostart = false, OneShot = true };
|
||||
AddChild(timer);
|
||||
timer.Timeout += () => { EndEffectAtSlot(key); };
|
||||
|
||||
_effectSlotTimers.Add(key, timer);
|
||||
|
||||
}
|
||||
|
||||
public void EndEffect(Effect what)
|
||||
|
|
@ -174,34 +148,48 @@ public partial class Entity : Node2D
|
|||
EndEffectAtSlot(what.Slot);
|
||||
}
|
||||
|
||||
public Tween CreateTweenEffect(Effect effect)
|
||||
{
|
||||
Tween tween = CreateTween();
|
||||
|
||||
effectHandlers[effect.Slot].EffectTween = tween;
|
||||
|
||||
return tween;
|
||||
}
|
||||
|
||||
protected void ClearEffects()
|
||||
{
|
||||
foreach (var slot in _activeEffectSlots.Keys)
|
||||
foreach (var slot in effectHandlers.Keys)
|
||||
{
|
||||
if (_activeEffectSlots[slot] != null)
|
||||
{
|
||||
_activeEffectSlots[slot].Exit(this);
|
||||
_effectSlotTimers[slot].Stop();
|
||||
_activeEffectSlots[slot] = null;
|
||||
}
|
||||
effectHandlers[slot].End();
|
||||
}
|
||||
}
|
||||
private void InitSlot(string key)
|
||||
{
|
||||
effectHandlers.Add(key, new EffectHandler());
|
||||
effectHandlers[key].handler = this;
|
||||
effectHandlers[key].EffectTimer = new();
|
||||
|
||||
AddChild(effectHandlers[key].EffectTimer);
|
||||
effectHandlers[key].EffectTimer.Name = key + "Timer";
|
||||
|
||||
effectHandlers[key].EffectTimer.Timeout += () => { EndEffectAtSlot(key); };
|
||||
}
|
||||
|
||||
public void ProcessEffects()
|
||||
{
|
||||
if (Killed) return;
|
||||
foreach (string key in _activeEffectSlots.Keys)
|
||||
_activeEffectSlots[key]?.Process(this);
|
||||
foreach (var slot in effectHandlers.Keys)
|
||||
{
|
||||
effectHandlers[slot].Process();
|
||||
}
|
||||
}
|
||||
|
||||
private void EndEffectAtSlot(string slot)
|
||||
{
|
||||
_activeEffectSlots[slot].Exit(this);
|
||||
_activeEffectSlots[slot] = null;
|
||||
|
||||
EmitSignal(SignalName.EffectEnded, _activeEffectSlots[slot]);
|
||||
|
||||
EmitSignal(SignalName.EffectEnded, effectHandlers[slot].HandledEffect);
|
||||
effectHandlers[slot].End();
|
||||
}
|
||||
|
||||
#endregion
|
||||
#region LocalTimescale
|
||||
private float _localTimescale = 1.0f;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue