예제 #1
0
            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);
            }
예제 #2
0
            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);
            }
예제 #3
0
            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);
            }