using Godot; using System.Collections.Generic; using System.Linq; namespace Rokojori { public class SequenceActionFinishedEvent { public int id; public bool success; } [Tool] [GlobalClass, Icon("res://addons/rokojori_action_library/Icons/SequenceAction.svg")] public abstract partial class SequenceAction : Action { [ExportGroup("Debugging")] [ExportToolButton("Clear Listeners")] public Callable clearListeners => Callable.From( ()=> { onSequenceDone.ResetAndClearAll(); } ); [Export] public bool showRunningSequences = false; [Export] public int[] runningSequences = []; HashSet _running = new HashSet(); int _dispatchCounter = 0; public int GetLastSequenceActionID() { return _dispatchCounter; } public readonly EventSlot onSequenceDone = new EventSlot(); public int DispatchStart() { _dispatchCounter ++; if ( showRunningSequences ) { runningSequences = runningSequences.Add( _dispatchCounter ); } _running.Add( _dispatchCounter ); return _dispatchCounter; } public void DispatchEnd( int id ) { _running.Remove( id ); var ev = new SequenceActionFinishedEvent{ id = id, success = true }; onSequenceDone.DispatchEvent( ev ); if ( showRunningSequences ) { runningSequences = runningSequences.Remove( _dispatchCounter ); } } public void DispatchCancelled( int id ) { _running.Remove( id ); var ev = new SequenceActionFinishedEvent{ id = id, success = true }; onSequenceDone.DispatchEvent( ev ); if ( showRunningSequences ) { runningSequences = runningSequences.Remove( _dispatchCounter ); } } public virtual void CancelAllRunning() { var runningList = _running.ToArray(); runningList.ForEach( ( id )=> { CancelAction( id ); } ); } public virtual void CancelAction( int id ) { } public int TriggerSequenceAndGetID() { var nextID = GetLastSequenceActionID() + 1; Trigger(); return GetLastSequenceActionID() < nextID ? -1 : nextID; } } }