Skip to content

Commit 019996e

Browse files
committed
Sequence abort self now only triggers on condition tasks
1 parent 59a9d40 commit 019996e

File tree

4 files changed

+56
-31
lines changed

4 files changed

+56
-31
lines changed

Assets/FluidBehaviorTree/Editor/Testing/ParentTasks/TaskSequenceTest.cs

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
using System;
2-
using Adnc.FluidBT.TaskParents;
1+
using Adnc.FluidBT.TaskParents;
32
using Adnc.FluidBT.Tasks;
4-
using Adnc.FluidBT.Tasks.Actions;
53
using NSubstitute;
64
using NSubstitute.ReturnsExtensions;
75
using NUnit.Framework;
@@ -254,16 +252,15 @@ public void SetAbortTypeSelf () {
254252
}
255253

256254
public class DefaultCalls : WhenAbortSelf {
257-
public void Triggers_on_valid_conditional_task () {
258-
259-
}
260-
255+
[Test]
261256
public void Does_not_trigger_on_invalid_conditional_task () {
262-
263-
}
264-
265-
public void It_should_revaulate_parent_tasks_with_an_abort_type_assigned () {
266-
257+
_childB.Update().Returns(TaskStatus.Continue);
258+
259+
_sequence.Update();
260+
261+
_childA.Update().Returns(TaskStatus.Failure);
262+
263+
Assert.AreEqual(TaskStatus.Continue, _sequence.Update());
267264
}
268265

269266
[Test]
@@ -282,49 +279,66 @@ public void It_should_not_fail_if_no_children_are_present () {
282279

283280
[Test]
284281
public void Nested_sequence_will_return_failure_while_being_ticked_through_multiple_frames () {
285-
var parentSequence = new Sequence();
286-
parentSequence.AddChild(_sequence);
287-
_childB.Update().Returns(TaskStatus.Continue);
288-
282+
var parentSequence = new Sequence {AbortType = AbortType.Self};
283+
var childSequence = new Sequence();
284+
var condition = A.TaskStub().WithAbortConditionSelf(true).Build();
285+
var action = A.TaskStub().WithUpdateStatus(TaskStatus.Continue).Build();
286+
287+
parentSequence
288+
.AddChild(childSequence.AddChild(condition))
289+
.AddChild(action);
290+
289291
Assert.AreEqual(TaskStatus.Continue, parentSequence.Update());
290-
_childA.Update().Returns(TaskStatus.Failure);
292+
condition.Update().Returns(TaskStatus.Failure);
291293

292294
Assert.AreEqual(TaskStatus.Failure, parentSequence.Update());
293295
}
294296
}
295297

296298
public class WhenAbortIsReady : WhenAbortSelf {
299+
private Sequence _parentSequence;
300+
private ITask _condition;
301+
private ITask _action;
302+
297303
[SetUp]
298304
public void SetupAbort () {
299-
_childB.Update().Returns(TaskStatus.Continue);
300-
_sequence.Update();
301-
_childA.Update().Returns(TaskStatus.Failure);
305+
_parentSequence = new Sequence {AbortType = AbortType.Self};
306+
_condition = A.TaskStub().WithAbortConditionSelf(true).Build();
307+
_action = A.TaskStub().WithUpdateStatus(TaskStatus.Continue).Build();
308+
309+
_parentSequence
310+
.AddChild(_condition)
311+
.AddChild(_action);
312+
313+
_parentSequence.Update();
314+
315+
_condition.Update().Returns(TaskStatus.Failure);
302316
}
303317

304318
[Test]
305319
public void Return_failure_on_tick_if_the_first_node_changes_from_success_to_failure () {
306-
Assert.AreEqual(TaskStatus.Failure, _sequence.Update());
320+
Assert.AreEqual(TaskStatus.Failure, _parentSequence.Update());
307321
}
308322

309323
[Test]
310324
public void Does_not_abort_if_not_marked_abort_self () {
311-
_sequence.AbortType = AbortType.None;
325+
_parentSequence.AbortType = AbortType.None;
312326

313-
Assert.AreEqual(TaskStatus.Continue, _sequence.Update());
327+
Assert.AreEqual(TaskStatus.Continue, _parentSequence.Update());
314328
}
315329

316330
[Test]
317331
public void It_should_run_end_when_aborting_on_the_active_node () {
318-
_sequence.Update();
332+
_parentSequence.Update();
319333

320-
_childB.Received(1).End();
334+
_action.Received(1).End();
321335
}
322336

323337
[Test]
324338
public void Triggers_reset_after_firing_abort () {
325-
_sequence.Update();
339+
_parentSequence.Update();
326340

327-
_sequence.children.ForEach((child) => {
341+
_parentSequence.children.ForEach((child) => {
328342
child.Received().Reset();
329343
});
330344
}

Assets/FluidBehaviorTree/Scripts/TaskParents/Composites/Sequence/Sequence.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
using System.Collections.Generic;
22
using Adnc.FluidBT.Tasks;
3-
using UnityEngine;
43

54
namespace Adnc.FluidBT.TaskParents {
65
public class Sequence : TaskParentBase {
6+
private ITask _selfAbortTask;
77
private int _childIndex;
88
private readonly List<ITask> _abortLowerPriorities = new List<ITask>();
99

1010
protected override TaskStatus OnUpdate () {
1111
if (AbortType.HasFlag(AbortType.Self)
1212
&& _childIndex > 0
13-
&& children[0].Update() == TaskStatus.Failure) {
13+
&& _selfAbortTask != null
14+
&& _selfAbortTask.Update() == TaskStatus.Failure) {
1415
children[_childIndex].End();
1516
Reset();
1617
return TaskStatus.Failure;
@@ -45,6 +46,14 @@ protected override TaskStatus OnUpdate () {
4546

4647
return TaskStatus.Success;
4748
}
49+
50+
public override ITaskParent AddChild (ITask child) {
51+
if (children.Count == 0) {
52+
_selfAbortTask = child.GetAbortCondition();
53+
}
54+
55+
return base.AddChild(child);
56+
}
4857

4958
public override void End () {
5059
children[_childIndex].End();

Assets/FluidBehaviorTree/Scripts/TaskParents/ITaskParent.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44
namespace Adnc.FluidBT.TaskParents {
55
public interface ITaskParent : ITask {
66
List<ITask> children { get; }
7-
void AddChild (ITask child);
7+
ITaskParent AddChild (ITask child);
88
}
99
}

Assets/FluidBehaviorTree/Scripts/TaskParents/TaskParentBase.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,12 @@ public virtual void Reset (bool hardReset = false) {
4242
}
4343
}
4444

45-
public void AddChild (ITask child) {
45+
public virtual ITaskParent AddChild (ITask child) {
4646
if (children.Count < MaxChildren || MaxChildren < 0) {
4747
children.Add(child);
4848
}
49+
50+
return this;
4951
}
5052
}
5153
}

0 commit comments

Comments
 (0)