Spaces:
Runtime error
Runtime error
using System; | |
namespace Quantum | |
{ | |
/// <summary> | |
/// The sequence task is similar to an and operation. It will return failure as soon as one of its child tasks return failure. | |
/// If a child task returns success then it will sequentially run the next task. If all child tasks return success then it will return success. | |
/// </summary> | |
[ | ]|
public unsafe partial class BTSequence : BTComposite | |
{ | |
protected override BTStatus OnUpdate(BTParams btParams) | |
{ | |
BTStatus status = BTStatus.Success; | |
while (GetCurrentChild(btParams.Frame, btParams.Agent) < _childInstances.Length) | |
{ | |
var currentChildId = GetCurrentChild(btParams.Frame, btParams.Agent); | |
var child = _childInstances[currentChildId]; | |
status = child.RunUpdate(btParams); | |
if (status == BTStatus.Abort) | |
{ | |
if (btParams.Agent->IsAborting == true) | |
{ | |
return BTStatus.Abort; | |
} | |
else | |
{ | |
return BTStatus.Failure; | |
} | |
} | |
if (status == BTStatus.Success) | |
{ | |
SetCurrentChild(btParams.Frame, currentChildId + 1, btParams.Agent); | |
} | |
else | |
{ | |
break; | |
} | |
} | |
return status; | |
} | |
internal override void ChildCompletedRunning(BTParams btParams, BTStatus childResult) | |
{ | |
if (childResult == BTStatus.Abort) | |
{ | |
return; | |
} | |
if (childResult == BTStatus.Failure) | |
{ | |
SetCurrentChild(btParams.Frame, _childInstances.Length, btParams.Agent); | |
// If the child failed, then we already know that this sequence failed, so we can force it | |
SetStatus(btParams.Frame, BTStatus.Failure, btParams.Agent); | |
// Trigger the debugging callbacks | |
BTManager.OnNodeFailure?.Invoke(btParams.Entity, Guid.Value); | |
BTManager.OnNodeExit?.Invoke(btParams.Entity, Guid.Value); | |
} | |
else | |
{ | |
var currentChild = GetCurrentChild(btParams.Frame, btParams.Agent); | |
SetCurrentChild(btParams.Frame, currentChild + 1, btParams.Agent); | |
} | |
} | |
} | |
} |