Files
GameJamDungeon/Zennysoft.Game.Ma/src/enemy/behaviors/EngagePlayerBehavior.cs
2026-02-23 10:36:08 -08:00

73 lines
1.9 KiB
C#

using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
namespace Zennysoft.Game.Ma;
[Meta(typeof(IAutoNode))]
public partial class EngagePlayerBehavior : Node, IEngagePlayerBehavior
{
public override void _Notification(int what) => this.Notify(what);
[Export] public float _minimumAttackTime { get; set; } = 2f;
[Export] public float _maximumAttackTime { get; set; } = 5f;
[Export] public float _acquireTargetTime { get; set; } = 1f;
private Timer _actionTimer { get; set; } = default!;
private Timer _acquireTargetTimer { get; set; } = default!;
[Signal] public delegate void TakeActionEventHandler();
[Signal] public delegate void AcquireTargetEventHandler();
public void OnReady()
{
_actionTimer = new Timer();
_acquireTargetTimer = new Timer() { WaitTime = _acquireTargetTime };
_actionTimer.WaitTime = 0.8f;
_actionTimer.Timeout += OnAttackTimeout;
_acquireTargetTimer.Timeout += OnAcquireTargetTimeout;
AddChild(_actionTimer);
AddChild(_acquireTargetTimer);
}
public void Engage()
{
_actionTimer.Start();
_acquireTargetTimer.Start();
}
public void Disengage()
{
_actionTimer.Stop();
_acquireTargetTimer.Stop();
}
private void OnAttackTimeout()
{
_actionTimer.Stop();
_actionTimer.WaitTime = RandomizeTimer(_minimumAttackTime, _maximumAttackTime);
_actionTimer.Start();
EmitSignal(SignalName.TakeAction);
}
private void OnAcquireTargetTimeout()
{
EmitSignal(SignalName.AcquireTarget);
}
private float RandomizeTimer(float min, float max)
{
var rng = new RandomNumberGenerator();
rng.Randomize();
return rng.RandfRange(min, max);
}
public void OnExitTree()
{
_actionTimer.Stop();
_acquireTargetTimer.Stop();
_actionTimer.Timeout -= OnAttackTimeout;
_acquireTargetTimer.Timeout -= OnAcquireTargetTimeout;
}
}