AUVec3f GetSpawnPosition( EGameObject type )
	{
		float width, height;
		PerModuleInterface::g_pSystemTable->pGame->GetWindowSize( width, height );
		float edgeMargin = 0.05f;

		// Spawn WBC in bottom quarter of screen, RBC in middle quarter, and Virus and Infected Cell
		// in the top quarter
		float min = height * edgeMargin;       // from bottom of screen
		float max = height * (1 - edgeMargin);  // from bottom of screen
		if (type == EGO_WBC)
		{
			max = height * 0.25f;
		}
		else if (type == EGO_RBC)
		{
			min = height * 0.375f;
			max = height * 0.625f;
		}
		else
		{
			min = height * 0.75f;
		}
		
		AUVec3f position;
		position.SetX( rand() * 1.0f / RAND_MAX * width * (1.0f - edgeMargin * 2) - width * (0.5f - edgeMargin) );
		position.SetY( 0.0f );
		position.SetZ( rand() * 1.0f / RAND_MAX * (max - min) + min - height * 0.5f);

		return position;
	}
	virtual void OnEvent( int event_id, const IGUIEvent& event_info )
	{
		AUVec3f selectPos;
		char buff[16];
		event_info.GetParameter( "mouse_x", buff, sizeof(buff) );
		selectPos.SetX( (float)atof( buff ) );
		event_info.GetParameter( "mouse_y", buff, sizeof(buff) );
		selectPos.SetY( (float)atof( buff ) );
		event_info.GetParameter( "button", buff, sizeof(buff) );
		int button = atoi( buff );

		AUVec3f worldPos = m_pCameraControl->Unproject( selectPos );

		IGameObject* pGameObject = GetSelectedObject( worldPos );
		if ( button == 0 ) // left button
		{
			if ( m_pSelectedObject && pGameObject != m_pSelectedObject )
			{
				// Deselect currently selected object
				m_pSelectedObject->OnDeselect();
				m_pSelectedObject = 0;
			}

			if ( pGameObject )
			{
				// Select object
				pGameObject->OnSelect();
				m_pSelectedObject = pGameObject;
			}
		}
		else // right button
		{
			if ( m_pSelectedObject && pGameObject != m_pSelectedObject )
			{
				// Set target
				m_pSelectedObject->OnPositionRequest( worldPos );
			}
		}
	}