protected override BehaviorTask createTask() { WithPreconditionTask pTask = new WithPreconditionTask(); return(pTask); }
protected override EBTStatus update(Agent pAgent, EBTStatus childStatus) { int num = -1; for (int i = 0; i < base.m_children.Count; i++) { WithPreconditionTask task = (WithPreconditionTask)base.m_children[i]; if (task.PreconditionNode().exec(pAgent) == EBTStatus.BT_SUCCESS) { num = i; break; } } if (num != -1) { if (base.m_activeChildIndex != -1) { WithPreconditionTask task3 = (WithPreconditionTask)base.m_children[base.m_activeChildIndex]; BehaviorTask task4 = task3.Action(); BehaviorTask task6 = ((WithPreconditionTask)base.m_children[num]).Action(); if (task4 != task6) { task4.abort(pAgent); task3.abort(pAgent); base.m_activeChildIndex = num; } } for (int j = 0; j < base.m_children.Count; j++) { WithPreconditionTask task7 = (WithPreconditionTask)base.m_children[j]; EBTStatus status2 = task7.exec(pAgent); if ((j >= num) && ((j <= num) || (task7.PreconditionNode().exec(pAgent) == EBTStatus.BT_SUCCESS))) { EBTStatus status4 = task7.Action().exec(pAgent); switch (status4) { case EBTStatus.BT_RUNNING: base.m_activeChildIndex = num; return(status4); case EBTStatus.BT_FAILURE: case EBTStatus.BT_INVALID: { continue; } } return(status4); } } } return(EBTStatus.BT_FAILURE); }
protected override BehaviorTask createTask() { WithPreconditionTask pTask = new WithPreconditionTask(); return pTask; }
protected override EBTStatus update(Agent pAgent, EBTStatus childStatus) { int idx = -1; for (int i = 0; i < this.m_children.Count; ++i) { WithPreconditionTask pSubTree = (WithPreconditionTask)this.m_children[i]; Debug.Check(pSubTree is WithPreconditionTask); EBTStatus returnStatus = pSubTree.GetReturnStatus(); if (returnStatus != EBTStatus.BT_INVALID) { pSubTree.SetReturnStatus(EBTStatus.BT_INVALID); if (returnStatus == EBTStatus.BT_SUCCESS) { return(EBTStatus.BT_SUCCESS); } else if (returnStatus == EBTStatus.BT_FAILURE) { idx = i; break; } } } //checking the preconditions and take the first action tree int index = (int)-1; for (int i = (idx + 1); i < this.m_children.Count; ++i) { WithPreconditionTask pSubTree = (WithPreconditionTask)this.m_children[i]; Debug.Check(pSubTree is WithPreconditionTask); BehaviorTask pPrecondTree = pSubTree.PreconditionNode(); EBTStatus status = pPrecondTree.exec(pAgent); if (status == EBTStatus.BT_SUCCESS) { index = i; break; } } //clean up the current ticking action tree if (index != (int)-1) { if (this.m_activeChildIndex != CompositeTask.InvalidChildIndex && this.m_activeChildIndex != index) { WithPreconditionTask pCurrentSubTree = (WithPreconditionTask)this.m_children[this.m_activeChildIndex]; Debug.Check(pCurrentSubTree is WithPreconditionTask); BehaviorTask pCurrentActionTree = pCurrentSubTree.Action(); WithPreconditionTask pSubTree = (WithPreconditionTask)this.m_children[index]; Debug.Check(pSubTree is WithPreconditionTask); BehaviorTask pActionTree = pSubTree.Action(); Debug.Check(pCurrentActionTree != pActionTree); pCurrentActionTree.abort(pAgent); pCurrentSubTree.abort(pAgent); this.m_activeChildIndex = index; } for (int i = index; i < this.m_children.Count; ++i) { WithPreconditionTask pSubTree = (WithPreconditionTask)this.m_children[i]; Debug.Check(pSubTree is WithPreconditionTask); if (i > index) { BehaviorTask pPreconditionTree = pSubTree.PreconditionNode(); EBTStatus status = pPreconditionTree.exec(pAgent); //to search for the first one whose precondition is success if (status != EBTStatus.BT_SUCCESS) { continue; } } BehaviorTask pActionTree = pSubTree.Action(); EBTStatus s = pActionTree.exec(pAgent); if (s == EBTStatus.BT_RUNNING) { this.m_activeChildIndex = index; } else { pActionTree.reset(pAgent); if (s == EBTStatus.BT_FAILURE || s == EBTStatus.BT_INVALID) { //THE ACTION failed, to try the next one continue; } } Debug.Check(s == EBTStatus.BT_RUNNING || s == EBTStatus.BT_SUCCESS); return(s); } } return(EBTStatus.BT_FAILURE); }
protected override EBTStatus update(Agent pAgent, EBTStatus childStatus) { int idx = -1; if (childStatus != EBTStatus.BT_RUNNING) { Debug.Check(this.m_activeChildIndex != CompositeTask.InvalidChildIndex); if (childStatus == EBTStatus.BT_SUCCESS) { return(EBTStatus.BT_SUCCESS); } else if (childStatus == EBTStatus.BT_FAILURE) { //the next for starts from (idx + 1), so that it starts from next one after this failed one idx = this.m_activeChildIndex; } else { Debug.Check(false); } } //checking the preconditions and take the first action tree int index = (int)-1; for (int i = (idx + 1); i < this.m_children.Count; ++i) { Debug.Check(this.m_children[i] is WithPreconditionTask); WithPreconditionTask pSubTree = (WithPreconditionTask)this.m_children[i]; BehaviorTask pre = pSubTree.PreconditionNode; EBTStatus status = pre.exec(pAgent); if (status == EBTStatus.BT_SUCCESS) { index = i; break; } } //clean up the current ticking action tree if (index != (int)-1) { if (this.m_activeChildIndex != CompositeTask.InvalidChildIndex && this.m_activeChildIndex != index) { WithPreconditionTask pCurrentSubTree = (WithPreconditionTask)this.m_children[this.m_activeChildIndex]; BehaviorTask action = pCurrentSubTree.ActionNode; action.abort(pAgent); //don't set it here //this.m_activeChildIndex = index; } for (int i = index; i < this.m_children.Count; ++i) { WithPreconditionTask pSubTree = (WithPreconditionTask)this.m_children[i]; if (i > index) { BehaviorTask pre = pSubTree.PreconditionNode; EBTStatus status = pre.exec(pAgent); //to search for the first one whose precondition is success if (status != EBTStatus.BT_SUCCESS) { continue; } } BehaviorTask action = pSubTree.ActionNode; EBTStatus s = action.exec(pAgent); if (s == EBTStatus.BT_RUNNING) { this.m_activeChildIndex = i; } else { if (s == EBTStatus.BT_FAILURE) { //THE ACTION failed, to try the next one continue; } } Debug.Check(s == EBTStatus.BT_RUNNING || s == EBTStatus.BT_SUCCESS); return(s); } } return(EBTStatus.BT_FAILURE); }
protected override EBTStatus update(Agent pAgent, EBTStatus childStatus) { int num = -1; for (int i = 0; i < this.m_children.get_Count(); i++) { WithPreconditionTask withPreconditionTask = (WithPreconditionTask)this.m_children.get_Item(i); BehaviorTask behaviorTask = withPreconditionTask.PreconditionNode(); EBTStatus eBTStatus = behaviorTask.exec(pAgent); if (eBTStatus == EBTStatus.BT_SUCCESS) { num = i; break; } } if (num != -1) { if (this.m_activeChildIndex != -1) { WithPreconditionTask withPreconditionTask2 = (WithPreconditionTask)this.m_children.get_Item(this.m_activeChildIndex); BehaviorTask behaviorTask2 = withPreconditionTask2.Action(); WithPreconditionTask withPreconditionTask3 = (WithPreconditionTask)this.m_children.get_Item(num); BehaviorTask behaviorTask3 = withPreconditionTask3.Action(); if (behaviorTask2 != behaviorTask3) { behaviorTask2.abort(pAgent); withPreconditionTask2.abort(pAgent); this.m_activeChildIndex = num; } } for (int j = 0; j < this.m_children.get_Count(); j++) { WithPreconditionTask withPreconditionTask4 = (WithPreconditionTask)this.m_children.get_Item(j); EBTStatus eBTStatus2 = withPreconditionTask4.exec(pAgent); if (j >= num) { if (j > num) { BehaviorTask behaviorTask4 = withPreconditionTask4.PreconditionNode(); EBTStatus eBTStatus3 = behaviorTask4.exec(pAgent); if (eBTStatus3 != EBTStatus.BT_SUCCESS) { goto IL_158; } } BehaviorTask behaviorTask5 = withPreconditionTask4.Action(); EBTStatus eBTStatus4 = behaviorTask5.exec(pAgent); if (eBTStatus4 == EBTStatus.BT_RUNNING) { this.m_activeChildIndex = num; } else if (eBTStatus4 == EBTStatus.BT_FAILURE || eBTStatus4 == EBTStatus.BT_INVALID) { goto IL_158; } return(eBTStatus4); } IL_158 :; } } return(EBTStatus.BT_FAILURE); }