73 lines
1.9 KiB
C#
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;
|
|
}
|
|
}
|