/*********************************************************************//**
*	Manazer udalosti.
*	Tato entita dokaze aktivovat ostatni entity v urcity cas.
*	
*	author: Michal Jirous
*	date: 23.04.2009
*	file: ent_multimanager.cpp
**********************************************************************/

#include "ent_multimanager.h"

MultiManager::MultiManager() : CBaseEnvironment()
{
	m_sClassName = "multi_manager";
	m_uiStartTime = TRIGGER_INFINITE;
	m_pTargetList = NULL;
	m_CurrentSession = 0;
	m_iProperties = ENT_PARM_RUNNABLE;
}

void MultiManager::goBackInTime()
{
	CBaseEnvironment::goBackInTime();

	
}
#include "game.h"
void MultiManager::passStoredEvent( BackTimeData &backData )
{
	CBaseEnvironment::passStoredEvent( backData );

	if( backData.type == EVENT_TARGET )
	{
		if( m_pTargetList && (unsigned)backData.values.event < m_iEventsCount )
		{
			SingleEvent &Event = m_pTargetList[backData.values.event];
			if( Event.pEntities )
			{
				for( entityList_t::iterator iter = Event.pEntities->begin(); iter != Event.pEntities->end(); ++iter )
					(*iter)->onTarget( 0 );
			
				m_BackTimeData.push_front( BackTimeData() );
				m_BackTimeData.front().event_time = game.getGameTime();
				m_BackTimeData.front().type = EVENT_TARGET;
				m_BackTimeData.front().values.event = backData.values.event;
			}

		}
	}


}


void MultiManager::onTarget( int target_type )
{
	m_CurrentSession++;
	m_uiStartTime = game.getGameTime();
}







void MultiManager::setParameters( parameters_t &parametersMap )
{
	CBaseEnvironment::setParameters( parametersMap );

	for( parameters_t::iterator iter = parametersMap.begin(); iter != parametersMap.end(); ++iter )
	{
		if( iter->first == "targetname" || iter->first == "classname" || iter->first == "origin" )
			continue;

		m_tempList.push_back( temp() );
		m_tempList.back().name = iter->first;
		m_tempList.back().time = atoi( iter->second.c_str() );
	}
}



void MultiManager::targetEvent( unsigned key )
{ 
	SingleEvent &Event = m_pTargetList[key];

	if( Event.session != m_CurrentSession && m_uiStartTime != TRIGGER_INFINITE && Event.delay + m_uiStartTime < game.getGameTime() )
	{
		Event.session = m_CurrentSession;
		if( Event.pEntities )
		{
			for( entityList_t::iterator iter = Event.pEntities->begin(); iter != Event.pEntities->end(); ++iter )
				(*iter)->onTarget( 0 );
		
			m_BackTimeData.push_front( BackTimeData() );
			m_BackTimeData.front().event_time = game.getGameTime();
			m_BackTimeData.front().type = EVENT_TARGET;
			m_BackTimeData.front().values.event = key;
		}
	}
}

void MultiManager::update( float seconds )
{
	CBaseEnvironment::update(seconds);

	if( !m_pTargetList )
		return;

	for( unsigned int i = 0; i < m_iEventsCount; ++i )
		targetEvent( i );
}



void MultiManager::restart()
{
	CBaseEnvironment::restart();
	
	m_CurrentSession++;
	m_uiStartTime = TRIGGER_INFINITE;
}

#include "level_loader.h"
#include "parsing.h"
void MultiManager::compile()
{
	CBaseEnvironment::compile();
	

	const unsigned EVENTS_COUNT = (unsigned)m_tempList.size();
	m_pTargetList = new SingleEvent[EVENTS_COUNT];
	memset( m_pTargetList, 0, EVENTS_COUNT * sizeof(SingleEvent) );

	int i = 0;
	for( std::list<temp>::iterator iter = m_tempList.begin(); iter != m_tempList.end(); ++iter )
	{
		m_pTargetList[i].delay = (*iter).time;

		istringstream in( (*iter).name );
		std::string target = parsing::readField( in );
	

		m_pTargetList[i].pEntities = levelLoader.m_Entities.getEntitiesByName( target );
		++i;
	}

	m_iEventsCount = EVENTS_COUNT;
}

void MultiManager::decompile()
{
	if( m_pTargetList )
		delete [] m_pTargetList;
}
