/*********************************************************************//**
*	Prepinac po strelbe.
*	Pokud nekdo streli do tohoto objektu, tak se aktivuje.
*	
*	author: Michal Jirous
*	date: 23.04.2009
*	file: ent_func_shootswitch.cpp
**********************************************************************/

#include "ent_func_shootswitch.h"
#include "game.h"

FuncShootSwitch::FuncShootSwitch() : CBaseFunction()
{
	m_sClassName = "func_shootswitch";
	m_ResetDelay = TRIGGER_INFINITE;
	m_ResetTime = TRIGGER_INFINITE;
	m_pCounters = NULL;
	m_iProperties = ENT_PARM_COLLIDING | ENT_PARM_RENDER | ENT_PARM_RUNNABLE | ENT_PARM_SHOOTABLE;
}
//




void FuncShootSwitch::update( float seconds )
{
	CBaseFunction::update( seconds );
	if( m_bSwitched && m_ResetDelay != TRIGGER_INFINITE && m_ResetTime != TRIGGER_INFINITE && m_ResetTime + m_ResetDelay < game.getGameTime() )
	{
		CBaseFunction::switchTextures();
		if( m_pCounters )
			for( entityList_t::iterator iter = m_pCounters->begin(); iter != m_pCounters->end(); ++iter )
				(*iter)->onTarget( -1 );
		m_ResetTime = TRIGGER_INFINITE;
	}
}

void FuncShootSwitch::passStoredEvent( BackTimeData &backData )
{
	if( backData.type == EVENT_TEXTURE_SWITCH )
	{
		if( !m_bSwitched )
			shot();
		else
		{
			CBaseFunction::switchTextures();
			if( m_pCounters )
			for( entityList_t::iterator iter = m_pCounters->begin(); iter != m_pCounters->end(); ++iter )
				(*iter)->onTarget( -1 );
		}
		
	}
	else
		CBaseFunction::passStoredEvent( backData );
}


void FuncShootSwitch::shot()
{
	if( !m_bSwitched )
	{
		m_Sound.play();
		CBaseFunction::switchTextures();
		m_ResetTime = game.getGameTime();
		if( m_pCounters )	//TODO
			for( entityList_t::iterator iter = m_pCounters->begin(); iter != m_pCounters->end(); ++iter )
				(*iter)->onTarget( 1 );
		if( m_TargetList )
			for( entityList_t::iterator iter = m_TargetList->begin(); iter != m_TargetList->end(); ++iter )
				(*iter)->onTarget( 0 );
	}
}

void FuncShootSwitch::goBackInTime()
{
	CBaseEntity::goBackInTime();

	int i = 0;
	for( std::list<BackTimeData>::reverse_iterator riter = m_BackTimeData.rbegin(); riter != m_BackTimeData.rend(); ++riter )
	{
		if( (*riter).type == EVENT_BORDER )
			break;

		if( (*riter).type == EVENT_TEXTURE_SWITCH )
			i++;
	}


	if( i > 0 && i % 2 == 1 )
	{
		if( !m_bSwitched )	//nejsem zapnut a byl sem zapnut = 1
		{
			shot();
		}
		else	//jsem zapnut a nebyl sem zapnut
		{
			switchTextures();
			if( m_pCounters )	//TODO
				for( entityList_t::iterator iter = m_pCounters->begin(); iter != m_pCounters->end(); ++iter )
					(*iter)->onTarget( -1 );
		}
		
	}

}


void FuncShootSwitch::onTarget( int target_type )
{
	shot();
}

void FuncShootSwitch::onAttack( const AttackInfo &attackInfo )
{
	shot();
}

void FuncShootSwitch::setParameters( parameters_t &parametersMap )
{
	CBaseFunction::setParameters( parametersMap );
	std::string value = getParameterValue( parametersMap, "resetdelay" );
	if( !value.empty() )
		m_ResetDelay = atoi( value.c_str() );

	m_SoundFilename = getParameterValue( parametersMap, "sound" );
	m_sCounterName = getParameterValue( parametersMap, "counter" );
}

#include "level_loader.h"
void FuncShootSwitch::compile()
{
	CBaseFunction::compile();
	soundLibrary.loadSound( m_Sound, m_SoundFilename );
	m_Sound.setPosition( origin.x, origin.y, origin.z );
	m_pCounters = levelLoader.m_Entities.getEntitiesByName( m_sCounterName );
}

void FuncShootSwitch::decompile()
{
	soundLibrary.unloadSound( m_Sound );
}
