public BehaviorTreeBuilder <T> Decorator(Decorator <T> task) { if (this.CurrentParent == TaskId.Invalid) { throw new BehaviorTreeBuilderException("No Root node defined yet, add a branch first"); } BranchTask <T> parent = (BranchTask <T>) this.stream.Get(this.CurrentParent); parent.AddChild(this.stream.Add(task)); if (task.ChildCount <= 0) { // This decorator has no child yet, wait for a fluent set of a leaf node this.CurrentDecorator = task.Id; } this.CurrentLeaf = TaskId.Invalid; return(this); }
public BehaviorTreeBuilder <T> Branch(BranchTask <T> task) { this.CurrentParent = this.stream.Add(task); if (this.CurrentDecorator != TaskId.Invalid) { // Decorate the branch and close the decorator out Decorator <T> decorator = (Decorator <T>) this.stream.Get(this.CurrentDecorator); decorator.AddChild(this.CurrentParent); this.CurrentDecorator = TaskId.Invalid; } else if (this.parentStack.Count > 0) { // Add as a sub-branch BranchTask <T> parent = (BranchTask <T>) this.stream.Get(this.parentStack.Peek()); parent.AddChild(this.CurrentParent); } this.parentStack.Push(this.CurrentParent); this.CurrentLeaf = TaskId.Invalid; return(this); }
public BehaviorTreeBuilder <T> Leaf(LeafTask <T> task) { if (this.CurrentDecorator != TaskId.Invalid) { Decorator <T> decorator = (Decorator <T>) this.stream.Get(this.CurrentDecorator); decorator.AddChild(this.stream.Add(task)); this.CurrentDecorator = TaskId.Invalid; this.CurrentLeaf = task.Id; return(this); } if (this.CurrentParent == TaskId.Invalid) { throw new BehaviorTreeBuilderException("No Root node defined yet, add a branch first"); } BranchTask <T> parent = (BranchTask <T>) this.stream.Get(this.CurrentParent); parent.AddChild(this.stream.Add(task)); this.CurrentLeaf = task.Id; return(this); }