/*********************************************************************//**
*	\brief Definice struktury, ktera je databazi entit.
*	Tento objekt dokaze nacist identifikace entit z retezce a pote
*	vytvori objekty dle jejich jmena a rozradi je do prislusnych
*	seznamu dle vlastnosti.
*
*	\author Michal Jirous
*	\date 13.02.2009
*	\file level_entities.h
**********************************************************************/


#ifndef __LEVEL_ENTITIES_H__
#define __LEVEL_ENTITIES_H__

#include "ent_baseentity.h"
#include "ent_basephysics.h"
#include "ent_basemoveable.h"
#include "ent_light.h"


typedef std::map<std::string, entityList_t> entityNamesMap_t;	/*!< @brief Pojmenovani mapy typu string-string. */

/** @brief Objekt udrzujici informace o entitach. */
struct EntityInfo
{
	entityList_t m_Entities;					/*!< @brief Zakladni seznam vsech entit. */
	entityList_t m_CollisionEntities;			/*!< @brief Seznam entit, ktere koliduji. */
	entityList_t m_RunnableEntities;			/*!< @brief Seznam entit, ktere potrebuji pravidelnou aktualizaci. */
	entityList_t m_Render;						/*!< @brief Entity, ktere se vykresluji. */
	//std::list<CBaseEntity*> m_BlendingCare;
	std::list<CBaseMoveable*> m_ForceColliding;				/*!< @brief Entity, ktere se mohou pohybovat a je treba na jejich pohyb reagovat. */
	std::list<CBasePhysics*> m_PhysicModels;			/*!< @brief Entity, ktere maji dynamicky model a mohou se tak nahodne pohybovat. */

	void loadEntities( const char* entityString );	/*!< @brief Funkce dle zadaneho retezce vytvori entity. */
	void compileAll();				/*!< @brief Funkce zavola vsem entitam funkci compile, cimz se entity dotvori. */
	void decompileAll();			/*!< @brief Opacna funkce ke compileAll, kde zde entity naopak uvolni sva alokovana data. */
	void unloadEntities();			/*!< @brief Konecna funkce, ktera smaze vsechny entity a vsechny seznamy. */
	void insertEntity( CBaseEntity* entity );	/*!< @brief Funkce vlozi entitu do seznamu, do kterych ma byt zarazena. */
	
	void createEntityFromParameters( parameters_t &parameters );	/*!< @brief Funkce vytvori entitu na zaklade parametru. */

	entityNamesMap_t m_NamesDatabase;	/*!< @brief Databaze entit, ktere jsou rozrazeny dle jmen, coz je vyhledavaci klic teto mapy. */
	entityList_t *getEntitiesByName( std::string name );	/*!< @brief Funkce vraci seznam entit, ktere maji jmeno shodne s parametrem funkce. */

	Light *lightStyles[255];	/*!< @brief maximalni pocet svetel se styly. */
};

#endif

