public EBTStatus resume(Agent pAgent, EBTStatus status) { BranchTask prev = null; BehaviorTask p = this.m_currentTask; while (p != null) { BranchTask branch = p as BranchTask; if (branch != null) { prev = branch; p = branch.GetCurrentTask(); } else { prev = p.GetParent(); break; } } if (prev != null) { //prev is the last interrupted node, to find and let its parent update with 'status' which is the subtree's return status Debug.Check(status == EBTStatus.BT_SUCCESS || status == EBTStatus.BT_FAILURE); prev.onexit_action(pAgent, status); prev.SetReturnStatus(status); } return(status); }
public EBTStatus resume(Agent pAgent, EBTStatus status) { BranchTask parent = null; BehaviorTask currentTask = base.m_currentTask; while (currentTask != null) { BranchTask task3 = currentTask as BranchTask; if (task3 != null) { parent = task3; currentTask = task3.GetCurrentTask(); } else { parent = currentTask.GetParent(); break; } } if (parent != null) { parent.onexit_action(pAgent, status); parent.SetReturnStatus(status); } return(status); }
private bool CheckParentUpdatePreconditions(Agent pAgent) { bool bValid = true; if (this.m_bHasManagingParent) { bool bHasManagingParent = false; const int kMaxParentsCount = 512; int parentsCount = 0; BehaviorTask[] parents = new BehaviorTask[kMaxParentsCount]; BranchTask parentBranch = this.GetParent(); parents[parentsCount++] = this; //back track the parents until the managing branch while (parentBranch != null) { Debug.Check(parentsCount < kMaxParentsCount, "weird tree!"); parents[parentsCount++] = parentBranch; if (parentBranch.GetCurrentTask() == this) { //Debug.Check(parentBranch->GetNode()->IsManagingChildrenAsSubTrees()); bHasManagingParent = true; break; } parentBranch = parentBranch.GetParent(); } if (bHasManagingParent) { for (int i = parentsCount - 1; i >= 0; --i) { BehaviorTask pb = parents[i]; bValid = pb.CheckPreconditions(pAgent, true); if (!bValid) { break; } } } } else { bValid = this.CheckPreconditions(pAgent, true); } return(bValid); }