/*********************************************************************//**
*	Bod lana
*	Nekolik techto bodu se pouziva pro definici lana ve scene.
*	
*	author: Michal Jirous
*	date: 23.04.2009
*	file: ent_info_rope_node.cpp
**********************************************************************/

#include "ent_info_rope_node.h"
#include "parsing.h"


RopeNode::RopeNode()
{
	m_sClassName = "info_rope_node";
	m_iProperties = ENT_PARM_RUNNABLE;
	m_bStore_MoveAble = false;

	m_bCompiled = false;
	m_ThisNode.moveable = false;
	m_ThisNode.value = NULL;
}

#include "level_loader.h"

void RopeNode::compileAll( RopeNode *current )
{
	if( current->m_bCompiled )
		return;

	current->m_bCompiled = true;
	
	//analyzujeme a pridame si sousedy
	std::istringstream in( current->m_sNeightbours );
	std::string neightbourName;
	while( !(neightbourName = parsing::readField( in, ';' )).empty() )
	{
		entityList_t *neightbour = levelLoader.m_Entities.getEntitiesByName( neightbourName );
		if( neightbour && neightbour->front()->getClassName() == "info_rope_node" )
		{
			RopeNode *pNeightbourNode = reinterpret_cast<RopeNode*>(neightbour->front());
			compileAll( pNeightbourNode );
			current->m_ThisNode.addNeightbour( pNeightbourNode->getRopeNode() );
		}
	}

}



void RopeNode::compile()
{
	if( m_bCompiled )
		return;

	CBaseEnvironment::compile();

	


	compileAll( this );
}

#include "game.h"
void RopeNode::onTarget( int target_type )
{
	m_BackTimeData.push_front( BackTimeData() );
	m_BackTimeData.front().event_time = game.m_uiGameTime;
	
	if( m_ThisNode.moveable )
	{
		m_BackTimeData.front().type = EVENT_TURN_OFF;
		m_ThisNode.moveable = false;
	}
	else
	{
		m_BackTimeData.front().type = EVENT_TURN_ON;
		m_ThisNode.moveable = true;
	}
}

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

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

		if( (*riter).type == EVENT_TURN_OFF )
		{	
			m_ThisNode.moveable = true;
			return;
		}
		else if( (*riter).type == EVENT_TURN_ON )
		{	
			m_ThisNode.moveable = false;
			return;
		}
	}
}

void RopeNode::restart()
{
	m_ThisNode.moveable = m_bStore_MoveAble;
	if( m_ThisNode.value )
	*(m_ThisNode.value) = m_Store_Position;
}

void RopeNode::passFlags( int flags )
{
	if( flags & STARTS_MOVEABLE )
		m_bStore_MoveAble = true;

	m_ThisNode.moveable = m_bStore_MoveAble;
}


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


	m_sNeightbours = getParameterValue( parametersMap, "neightbours" );

	m_ThisNode.value = &origin;
	m_Store_Position = origin;
}
