You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.7 KiB
C#
59 lines
1.7 KiB
C#
using System.Collections.Generic;
|
|
using CleverCrow.Fluid.BTs.Tasks;
|
|
|
|
namespace CleverCrow.Fluid.BTs.TaskParents.Composites {
|
|
public class Parallel : CompositeBase {
|
|
private readonly Dictionary<ITask, TaskStatus> _childStatus = new Dictionary<ITask, TaskStatus>();
|
|
|
|
public override string IconPath { get; } = $"{PACKAGE_ROOT}/CompareArrows.png";
|
|
|
|
protected override TaskStatus OnUpdate () {
|
|
var successCount = 0;
|
|
var failureCount = 0;
|
|
|
|
foreach (var child in Children) {
|
|
TaskStatus prevStatus;
|
|
if (_childStatus.TryGetValue(child, out prevStatus) && prevStatus == TaskStatus.Success) {
|
|
successCount++;
|
|
continue;
|
|
}
|
|
|
|
var status = child.Update();
|
|
_childStatus[child] = status;
|
|
|
|
switch (status) {
|
|
case TaskStatus.Failure:
|
|
failureCount++;
|
|
break;
|
|
case TaskStatus.Success:
|
|
successCount++;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (successCount == Children.Count) {
|
|
End();
|
|
return TaskStatus.Success;
|
|
}
|
|
|
|
if (failureCount > 0) {
|
|
End();
|
|
return TaskStatus.Failure;
|
|
}
|
|
|
|
return TaskStatus.Continue;
|
|
}
|
|
|
|
public override void Reset () {
|
|
_childStatus.Clear();
|
|
|
|
base.Reset();
|
|
}
|
|
|
|
public override void End () {
|
|
foreach (var child in Children) {
|
|
child.End();
|
|
}
|
|
}
|
|
}
|
|
} |