//----------------------------------------------------------------------
// Call the factory to create new GameObject as described in the file
// Send a Event_CreateObject
void GameObjectManager::LoadGameObjects( const char* file )
{
	XmlMediator* pRoot = TinyXmlLoader::Instance().LoadFile( file );

	if( pRoot == nullptr )
	{
		std::cerr << "[GOManager] Loading objects from " << file << " failed." << std::endl;
		return;
	}

	auto pGOChildren = pRoot->GetChildren( std::string("GameObject") );
	for( auto It = pGOChildren.begin(); It != pGOChildren.end(); It++ )
	{
		GameObject* newGO = m_pGOFactory->CreateGameObject( *It );

		if( newGO != nullptr )
		{
			m_pObjects[ newGO->GetID() ] = newGO;
			EventManager::Instance().SendEvent( std::make_shared<Event_CreateObject>( Event_CreateObject( newGO ) ) );
		}
		else
		{
			std::cerr << "[GOManager] Error in GameObject load." << std::endl;
		}
	}

	SAFE_DELETE( pRoot );
}
objectID Example::GetFarthestAgent( void )
{
	float farthestDistance = 0.0f;
	GameObject* farthestGameObject = 0;
	dbCompositionList list;
	g_database.ComposeList( list, OBJECT_NPC );
	
	dbCompositionList::iterator i;
	for( i=list.begin(); i!=list.end(); ++i )
	{
		if( (*i)->GetID() != m_owner->GetID() )
		{
			D3DXVECTOR3 npcPos = (*i)->GetBody().GetPos();
			D3DXVECTOR3 myPos = m_owner->GetBody().GetPos();
			D3DXVECTOR3 diff = npcPos - myPos;
			float distance = D3DXVec3Length( &diff );

			if( farthestGameObject )
			{
				if( distance > farthestDistance )
				{
					farthestDistance = distance;
					farthestGameObject = *i;
				}
			}
			else
			{
				farthestDistance = distance;
				farthestGameObject = *i;
			}
		}
	}

	return( farthestGameObject->GetID() );
}
Ejemplo n.º 3
0
/*---------------------------------------------------------------------------*
  Name:         Store

  Description:  Stores an object within the database.

  Arguments:    object : the game object

  Returns:      None.
 *---------------------------------------------------------------------------*/
void Database::Store( GameObject & object )
{
	if( Find( object.GetID() ) == 0 ) {
		m_database.push_back( &object );
	}
	else {
		ASSERTMSG( 0, "Database::Store - Object ID already represented in database." );
	}
}
GameObject* GameObjectManager::Find( objectID id )
{
	std::map<int, GameObject*>::iterator b = m_allEntities.begin();
	std::map<int, GameObject*>::iterator e = m_allEntities.end();
	for ( ; b != e; b++)
	{		
		GameObject* pkGameObject = (*b).second;
		if (pkGameObject->GetID() == id)
			return pkGameObject;
	}
	return NULL;
}
objectID GameObjectManager::GetIDByName( const char* name )
{
	std::map<int, GameObject*>::iterator b = m_allEntities.begin();
	std::map<int, GameObject*>::iterator e = m_allEntities.end();
	for ( ; b != e; b++)
	{		
		GameObject* pkGameObject = (*b).second;
		if (strcmp(pkGameObject->GetName(), name) == 0)
			return pkGameObject->GetID();
	}

	return (INVALID_OBJECT_ID);
}
Ejemplo n.º 6
0
void GameController::ProcessMessages()
{
	while(messages.size() > 0)
	{
		Message* msg = messages.front();
		messages.pop_front();

		GameObject* obj = _model->GetPlayerObject();

		if(msg->GetMessageType() == MessageType::USER_INPUT)
		{
			assert(obj != NULL);
			obj->SendMessage(msg);
		}
		else if(msg->GetMessageType() == MessageType::GAME_OBJECT_ACTION)
		{
			if(msg->GetMessageContent() == MessageContent::CREATE_OBJECT)
			{
				GameObject* obj = (GameObject*)msg->GetExtended();
				assert(obj != NULL);
				this->_model->AddNewObject(obj);
				delete msg;
			}
			else if(msg->GetMessageContent() == MessageContent::DESTROY_OBJECT)
			{
				GameObject* obj = (GameObject*)msg->GetExtended();
				_model->DestroyObject( obj->GetID());
				theReaper.DoomObject((GameObject*)msg->GetExtended());
				delete msg;
			}
			else if(msg->GetMessageContent() == MessageContent::SHOULD_RENDER)
			{				 
				_view->PassMessage(msg);				 
			}
			else if(msg->GetMessageContent() == MessageContent::DO_PHYSICS)
			{
				physicsWorld.PassMessage(msg);
			}
		}
	}
	assert(messages.size() == 0);
}
END_ON_EDIT_FUNC

//NOTE:  THIS ASSUMES THAT THIS NODE WILL BE THE ROOT OF THE KILLER TREE

NODE_MSG_RECEIVED(SelectRandomVictim)
{
	GameObject *me = g_database.Find(self);
	if (name == AGENT_TARGETED_RESPONSE)
	{
		if(data.GetInt() == -1)
		{
			GameObject *t = g_database.Find(static_cast<objectID>(rand() % g_database.GetSize() - 1));
			if (me && t)
			{
				IBTNode::SendMsg(AGENT_TARGETED_PING, (t->GetID()), self, "CivilianIdle", MSG_Data(self));
				//In root nodes put:
				//  if cop:   if(node msg received == AGENT_TARGETED_PING), return data = -1
				//  if civilian or killer:  if(node msg received == AGENT_TARGETED_PING), return data = 1

				currentStatus = NS_Running;
			}
			else
			{
				currentStatus = NS_Failed;
			}
		}

		else
		{
			//me->SetTargetPOS()
			currentStatus = NS_Completed;
		}

	}

	else if (name == AGENT_TARGETED_PING)
	{
		currentStatus = NS_Failed;
	}
}