Пример #1
0
    EBTStatus PlannerTaskReference::update(Agent* pAgent, EBTStatus childStatus)
    {
        BEHAVIAC_UNUSED_VAR(childStatus);

        BEHAVIAC_ASSERT(ReferencedBehavior::DynamicCast(this->m_node) != 0);
        //BEHAVIAC_ASSERT(this->m_node is ReferencedBehavior);
        ReferencedBehavior* pNode = (ReferencedBehavior*)this->m_node;
        //ReferencedBehavior pNode = this->m_node as ReferencedBehavior;
        BEHAVIAC_ASSERT(pNode != NULL);

        EBTStatus status = BT_RUNNING;

        //pNode->SetTaskParams(pAgent);

        if (pNode->RootTaskNode() == NULL)
        {
			status = this->m_subTree->exec(pAgent);
        }
        else
        {
#if !BEHAVIAC_RELEASE
            if (!_logged)
            {
				pAgent->LogJumpTree(pNode->GetReferencedTree());
				_logged = true;
            }
#endif
            BEHAVIAC_ASSERT(this->m_children.size() == 1);
            BehaviorTask* c = this->m_children[0];

            status = c->exec(pAgent);
        }

        return status;
    }
Пример #2
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;
    }