#if GRAPH_DESIGNER
/// ---------------------------------------------
/// Behavior Designer
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.BehaviorDesigner.Runtime.Tasks.Conditionals
{
using Opsive.GraphDesigner.Runtime;
///
/// The StackedConditional task allows for multiple conditionals to be added to the same node.
///
[NodeIcon("b2368834b8b80144a8b1ab97b609e966", "86fbf527a2c761e45bc4a47cf4894902")]
[NodeDescription("Allows multiple conditional tasks to be added to a single node.")]
public class StackedConditional : StackedTask, IConditional, IConditionalReevaluation
{
///
/// Reevaluates the task logic. Returns a TaskStatus indicating how the behavior tree flow should proceed.
///
/// The status of the task during the reevaluation phase.
public TaskStatus OnReevaluateUpdate()
{
if (m_Tasks == null) {
return TaskStatus.Failure;
}
for (int i = 0; i < m_Tasks.Length; ++i) {
if (m_Tasks[i] == null) {
continue;
}
TaskStatus executionStatus;
if (m_Tasks[i] is IConditionalReevaluation reevaluateTask) {
executionStatus = reevaluateTask.OnReevaluateUpdate();
} else { // Use the regular update method if the task isn't designed for conditional aborts.
executionStatus = m_Tasks[i].OnUpdate();
}
if (m_ComparisonType == ComparisonType.Sequence && executionStatus == TaskStatus.Failure) {
return TaskStatus.Failure;
} else if (m_ComparisonType == ComparisonType.Selector && executionStatus == TaskStatus.Success) {
return TaskStatus.Success;
}
}
return m_ComparisonType == ComparisonType.Sequence ? TaskStatus.Success : TaskStatus.Failure;
}
}
}
#endif