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