summaryrefslogtreecommitdiff
path: root/Client/Assets/Behavior Designer/Runtime/Decorators/Inverter.cs
blob: ce70d2f66dbd1fb154b7246b24ef3a6615a59c58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
namespace BehaviorDesigner.Runtime.Tasks
{
    [TaskDescription("The inverter task will invert the return value of the child task after it has finished executing. " + 
                     "If the child returns success, the inverter task will return failure. If the child returns failure, the inverter task will return success.")]
    [HelpURL("http://www.opsive.com/assets/BehaviorDesigner/documentation.php?id=36")]
    [TaskIcon("{SkinColor}InverterIcon.png")]
    public class Inverter : Decorator
    {
        // The status of the child after it has finished running.
        private TaskStatus executionStatus = TaskStatus.Inactive;

        public override bool CanExecute()
        {
            // Continue executing until the child task returns success or failure.
            return executionStatus == TaskStatus.Inactive || executionStatus == TaskStatus.Running;
        }

        public override void OnChildExecuted(TaskStatus childStatus)
        {
            // Update the execution status after a child has finished running.
            executionStatus = childStatus;
        }

        public override TaskStatus Decorate(TaskStatus status)
        {
            // Invert the task status.
            if (status == TaskStatus.Success) {
                return TaskStatus.Failure;
            } else if (status == TaskStatus.Failure) {
                return TaskStatus.Success;
            }
            return status;
        }

        public override void OnEnd()
        {
            // Reset the execution status back to its starting values.
            executionStatus = TaskStatus.Inactive;
        }
    }
}