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; }
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; }
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; }
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; }