Exemplo n.º 1
0
    bool BranchTask::oneventCurrentNode(Agent* pAgent, const char* eventName)
    {
        BEHAVIAC_ASSERT(this->m_currentTask);

        EBTStatus s = this->m_currentTask->GetStatus();
        BEHAVIAC_UNUSED_VAR(s);

        BEHAVIAC_ASSERT(s == BT_RUNNING && this->m_node->HasEvents());

        bool bGoOn = this->m_currentTask->onevent(pAgent, eventName);

        //give the handling back to parents
        if (bGoOn)
        {
            BranchTask* parentBranch = this->m_currentTask->GetParent();

            //back track the parents until the branch
            while (parentBranch && parentBranch != this)
            {
                BEHAVIAC_ASSERT(parentBranch->GetStatus() == BT_RUNNING);

                bGoOn = parentBranch->onevent(pAgent, eventName);

                if (!bGoOn)
                {
                    return false;
                }

                parentBranch = parentBranch->GetParent();
            }
        }

        return bGoOn;
    }
Exemplo n.º 2
0
    EBTStatus BranchTask::execCurrentTask(Agent* pAgent)
    {
        BEHAVIAC_ASSERT(this->m_currentTask != 0 && this->m_currentTask->GetStatus() == BT_RUNNING);

        //this->m_currentTask could be cleared in ::tick, to remember it
        EBTStatus status = this->m_currentTask->exec(pAgent);

        //give the handling back to parents
        if (status != BT_RUNNING)
        {
            BEHAVIAC_ASSERT(status == BT_SUCCESS || status == BT_FAILURE);
            BEHAVIAC_ASSERT(this->m_currentTask->m_status == status);

            BranchTask* parentBranch = this->m_currentTask->GetParent();

            this->m_currentTask = 0;

            //back track the parents until the branch
            while (parentBranch != 0 && parentBranch != this)
            {
                status = parentBranch->exec(pAgent, status);

                if (status == BT_RUNNING)
                {
                    return BT_RUNNING;
                }

                BEHAVIAC_ASSERT(parentBranch->m_status == status);

                parentBranch = parentBranch->GetParent();
            }
        }

        return status;
    }
Exemplo n.º 3
0
	bool BehaviorTask::CheckParentUpdatePreconditions(Agent* pAgent)
	{
		bool bValid = true;

		if (this->m_bHasManagingParent)
		{
			bool bHasManagingParent = false;
			const int kMaxParentsCount = 512;
			int parentsCount = 0;
			BehaviorTask* parents[kMaxParentsCount];

			BranchTask* parentBranch = this->GetParent();

			parents[parentsCount++] = this;

			//back track the parents until the managing branch
			while (parentBranch != 0)
			{
				BEHAVIAC_ASSERT(parentsCount < kMaxParentsCount, "weird tree!");

				parents[parentsCount++] = parentBranch;

				if (parentBranch->GetCurrentTask() == this)
				{
					//BEHAVIAC_ASSERT(parentBranch->GetNode()->IsManagingChildrenAsSubTrees());

					bHasManagingParent = true;
					break;
				}

				parentBranch = parentBranch->GetParent();
			}

			if (bHasManagingParent)
			{
				for (int i = parentsCount - 1; i >= 0; --i)
				{
					BehaviorTask* pb = parents[i];

					bValid = pb->CheckPreconditions(pAgent, true);

					if (!bValid)
					{
						break;
					}
				}
			}
		}
		else
		{
			bValid = this->CheckPreconditions(pAgent, true);
		}

		return bValid;
	}