Esempio n. 1
0
    PlannerTask* Planner::BuildPlan(Task* root)
    {
        //LogManager.PLanningClearCache();

        int depth = this->agent->m_variables.Depth();
        BEHAVIAC_UNUSED_VAR(depth);

        PlannerTask* rootTask = NULL;

        {
            AgentState::AgentStateScope scopedState(this->agent->m_variables.Push(true));

            this->agent->m_planningTop = this->agent->m_variables.Top();
            BEHAVIAC_ASSERT(this->agent->m_planningTop >= 0);

            LogPlanBegin(this->agent, root);

            rootTask = this->decomposeNode((BehaviorNode*)root, 0);

            LogPlanEnd(this->agent, root);

#if !BEHAVIAC_RELEASE
            //BehaviorTask::CHECK_BREAKPOINT(this->agent, root, "plan", EActionResult.EAR_all);
#endif

            this->agent->m_planningTop = -1;
        }

        BEHAVIAC_ASSERT(this->agent->m_variables.Depth() == depth);

        return rootTask;
    }
Esempio n. 2
0
    bool DecoratorIterator::decompose(BehaviorNode* node, PlannerTaskComplex* seqTask, int depth, Planner* planner)
    {
        bool bOk = false;
        DecoratorIterator* pForEach = (DecoratorIterator*)node;
        int childCount = pForEach->GetChildrenCount();
        BEHAVIAC_ASSERT(childCount == 1);
        BEHAVIAC_UNUSED_VAR(childCount);
        BehaviorNode* childNode = (BehaviorNode*)pForEach->GetChild(0);

        bool bGoOn = true;
        int count = 0;
        int index = 0;

        while (bGoOn)
        {
            int depth2 = planner->GetAgent()->m_variables.Depth();
            BEHAVIAC_UNUSED_VAR(depth2);
            {
                AgentState::AgentStateScope scopedState(planner->GetAgent()->m_variables.Push(false));

                bGoOn = pForEach->IterateIt(planner->GetAgent(), index, count);

                if (bGoOn)
                {
                    planner->LogPlanForEachBegin(planner->GetAgent(), pForEach, index, count);
                    PlannerTask* childTask = planner->decomposeNode(childNode, depth);
                    planner->LogPlanForEachEnd(planner->GetAgent(), pForEach, index, count, childTask != NULL ? "success" : "failure");

                    if (childTask != NULL)
                    {
                        BEHAVIAC_ASSERT(PlannerTaskIterator::DynamicCast(seqTask) != 0);
                        PlannerTaskIterator* pForEachTask = (PlannerTaskIterator*)seqTask;
						pForEachTask->SetIndex(index);

                        seqTask->AddChild(childTask);
                        bOk = true;
                        break;
                    }

                    index++;
                }

                BEHAVIAC_ASSERT(planner->GetAgent()->m_variables.Depth() == depth2);
            }
        }

        return bOk;
    }
Esempio n. 3
0
    PlannerTask* Planner::decomposeTask(Task* task, int depth)
    {
        uint32_t methodsCount = task->GetChildrenCount();

        if (methodsCount == 0)
        {
            return NULL;
        }

        int depth1 = this->agent->m_variables.Depth();
        BEHAVIAC_UNUSED_VAR(depth1);
        PlannerTask* methodTask = NULL;

        for (uint32_t i = 0; i < methodsCount; i++)
        {
            BehaviorNode* method = (BehaviorNode*)task->GetChild(i);
            BEHAVIAC_ASSERT(Method::DynamicCast(method) != 0);
            BEHAVIAC_UNUSED_VAR(method);

            int depth2 = this->agent->m_variables.Depth();
            BEHAVIAC_UNUSED_VAR(depth2);
            {
                AgentState::AgentStateScope scopedState(this->agent->m_variables.Push(false));

                LogPlanMethodBegin(this->agent, method);
                methodTask = this->decomposeNode(method, depth + 1);
                LogPlanMethodEnd(this->agent, method, methodTask != NULL ? "success" : "failure");

                if (methodTask != NULL)
                {
                    // succeeded
                    break;
                }
            }

            BEHAVIAC_ASSERT(this->agent->m_variables.Depth() == depth2);
        }

        BEHAVIAC_ASSERT(this->agent->m_variables.Depth() == depth1);
        return methodTask;
    }
Esempio n. 4
0
    bool ReferencedBehavior::decompose(BehaviorNode* node, PlannerTaskComplex* seqTask, int depth, Planner* planner)
    {
        bool bOk = false;
        ReferencedBehavior* taskSubTree = (ReferencedBehavior*)node;// as ReferencedBehavior;
        BEHAVIAC_ASSERT(taskSubTree != 0);
        int depth2 = planner->GetAgent()->m_variables.Depth();
        BEHAVIAC_UNUSED_VAR(depth2);
        {
            AgentState::AgentStateScope scopedState(planner->GetAgent()->m_variables.Push(false));
            //planner.agent.Variables.Log(planner.agent, true);
            taskSubTree->SetTaskParams(planner->GetAgent());

            Task* task = taskSubTree->RootTaskNode();

            if (task != 0)
            {
                planner->LogPlanReferenceTreeEnter(planner->GetAgent(), taskSubTree);

                const BehaviorNode* tree = task->GetParent();
                tree->InstantiatePars(planner->GetAgent());

                PlannerTask* childTask = planner->decomposeNode(task, depth);

                if (childTask != 0)
                {
                    seqTask->AddChild(childTask);
                    bOk = true;
                }

                tree->UnInstantiatePars(planner->GetAgent());
                planner->LogPlanReferenceTreeExit(planner->GetAgent(), taskSubTree);
                BEHAVIAC_ASSERT(true);
            }
        }

        BEHAVIAC_ASSERT(planner->GetAgent()->m_variables.Depth() == depth2);
        return bOk;
    }