rokojori_action_library/Runtime/Actions/Sequence/SequenceRunner.cs

192 lines
4.5 KiB
C#
Raw Normal View History

2024-05-12 17:03:20 +00:00
using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
using System;
using Godot;
namespace Rokojori
{
2026-05-02 10:32:42 +00:00
public class SequenceRunner
2024-05-12 17:03:20 +00:00
{
2026-05-02 10:32:42 +00:00
public Sequence sequence;
2025-01-08 18:46:17 +00:00
public List<Action> actions;
public List<SequenceAction> sequencables;
2024-05-12 17:03:20 +00:00
public int sequencablesIndex = 0;
bool cancelled = false;
bool cancelledSequence = false;
2026-02-26 14:06:27 +00:00
2024-05-12 17:03:20 +00:00
int _runID = -1;
2025-01-08 18:46:17 +00:00
SequenceAction _runningAction;
2024-05-12 17:03:20 +00:00
int _runningActionID = -1;
public void Cancel()
{
if ( cancelled || _runningAction == null )
{
return;
}
cancelled = true;
_runningAction.CancelAction( _runningActionID );
}
void CancelRun()
{
if ( cancelledSequence )
{
return;
}
if ( ! cancelled )
{
cancelled = true;
}
cancelledSequence = true;
sequence.DispatchCancelled( _runID );
sequence.ClearRun( this );
}
public void ProcessNext()
{
2025-01-03 12:09:23 +00:00
// RJLog.Log( "@" + sequence.Name, "Index:", sequencablesIndex );
2024-05-12 17:03:20 +00:00
if ( sequencablesIndex == 0 )
{
_runID = sequence.DispatchStart();
if ( sequencables.Count == 0 )
{
2026-05-02 10:32:42 +00:00
actions.ForEach( a => Action.TriggerSafe( a ) );
2024-05-12 17:03:20 +00:00
sequence.DispatchEnd( _runID );
sequence.ClearRun( this );
return;
}
}
if ( sequencablesIndex >= sequencables.Count )
{
TriggerAllAfter( sequencables[ sequencables.Count -1 ] );
sequence.DispatchEnd( _runID );
sequence.ClearRun( this );
return;
}
if ( cancelled )
{
CancelRun();
return;
}
var sequenceAction = sequencables[ sequencablesIndex ];
StartAction( sequenceAction );
}
2026-05-02 10:32:42 +00:00
Dictionary<SequenceAction,System.Action<SequenceAction.FinishedEvent>> callbacks =
new Dictionary<SequenceAction, System.Action<SequenceAction.FinishedEvent>>();
2024-05-12 17:03:20 +00:00
2025-01-08 18:46:17 +00:00
void StartAction( SequenceAction action )
2024-05-12 17:03:20 +00:00
{
var capturedAction = action;
2026-05-02 10:32:42 +00:00
System.Action<SequenceAction.FinishedEvent> callback =
( SequenceAction.FinishedEvent ev ) =>
2024-05-12 17:03:20 +00:00
{
2025-01-08 18:46:17 +00:00
2024-05-12 17:03:20 +00:00
//RJLog.Log( "On Done", id, success );
2025-01-08 18:46:17 +00:00
if ( ev.id != _runningActionID )
2024-05-12 17:03:20 +00:00
{
// RJLog.Error( "Invalid ID", id, "!=", _runningActionID );
return;
}
_runningActionID = -1;
2025-01-08 18:46:17 +00:00
if ( ev.success )
2024-05-12 17:03:20 +00:00
{
sequencablesIndex ++;
ProcessNext();
}
else
{
sequence.DispatchCancelled( _runID );
sequence.ClearRun( this );
}
var callbackReference = callbacks[ capturedAction ];
2025-01-08 18:46:17 +00:00
capturedAction.onSequenceDone.RemoveAction( callbackReference );
2024-05-12 17:03:20 +00:00
callbacks.Remove( capturedAction );
};
RunNext( action, callback );
/*
_runningAction = action;
callbacks[ _runningAction ] = callback;
_runningAction.OnSequenceDone += callback;
TriggerAllBefore( _runningAction );
2025-01-08 18:46:17 +00:00
Action.Trigger( _runningAction );
2024-05-12 17:03:20 +00:00
_runningActionID = _runningAction.GetLastSequenceActionID();
*/
}
2026-05-02 10:32:42 +00:00
void RunNext( SequenceAction action, System.Action<SequenceAction.FinishedEvent> callback )
2024-05-12 17:03:20 +00:00
{
_runningAction = action;
callbacks[ _runningAction ] = callback;
2025-01-08 18:46:17 +00:00
_runningAction.onSequenceDone.AddAction( callback );
2024-05-12 17:03:20 +00:00
TriggerAllBefore( _runningAction );
2026-05-02 10:32:42 +00:00
Action.TriggerSafe( _runningAction );
2024-05-12 17:03:20 +00:00
_runningActionID = _runningAction.GetLastSequenceActionID();
}
2025-01-08 18:46:17 +00:00
void TriggerAllBefore( SequenceAction action )
2024-05-12 17:03:20 +00:00
{
var actionIndex = actions.IndexOf( action );
for ( int i = actionIndex - 1; i >= 0; i -- )
{
2025-01-08 18:46:17 +00:00
if ( typeof( SequenceAction ).IsAssignableFrom( actions[ i ].GetType() ) )
2024-05-12 17:03:20 +00:00
{
return;
}
2025-10-31 12:09:03 +00:00
// RJLog.Log( _runID, "Triggering Actions Before", i, actions[ i ].Name, HierarchyName.Of( action ) );
2024-05-12 17:03:20 +00:00
2026-05-02 10:32:42 +00:00
Action.TriggerSafe( actions[ i ] );
2024-05-12 17:03:20 +00:00
}
}
2025-01-08 18:46:17 +00:00
void TriggerAllAfter( SequenceAction action )
2024-05-12 17:03:20 +00:00
{
var actionIndex = actions.IndexOf( action );
for ( int i = actionIndex + 1; i < actions.Count; i ++ )
{
2025-01-08 18:46:17 +00:00
if ( typeof( SequenceAction ).IsAssignableFrom( actions[ i ].GetType() ) )
2024-05-12 17:03:20 +00:00
{
return;
}
2025-01-21 20:58:56 +00:00
// RJLog.Log( "Triggering Action", actions[ i ].Name );
2026-05-02 10:32:42 +00:00
Action.TriggerSafe( actions[ i ] );
2024-05-12 17:03:20 +00:00
}
}
2026-05-02 10:32:42 +00:00
}
2024-05-12 17:03:20 +00:00
}