//========= Copyright Valve Corporation, All rights reserved. ============//
//
//
//
//=============================================================================
#include "cbase.h"

#include "tf_shareddefs.h"
#include "zombie.h"
#include "zombie_spawner.h"

LINK_ENTITY_TO_CLASS( tf_zombie_spawner, CZombieSpawner );

BEGIN_DATADESC( CZombieSpawner )
	DEFINE_KEYFIELD( m_flZombieLifeTime, FIELD_FLOAT, "zombie_lifetime" ),
	DEFINE_KEYFIELD( m_nMaxActiveZombies, FIELD_INTEGER, "max_zombies" ),
	DEFINE_KEYFIELD( m_bInfiniteZombies, FIELD_BOOLEAN, "infinite_zombies" ),
	DEFINE_KEYFIELD( m_nSkeletonType, FIELD_INTEGER, "zombie_type" ),
	DEFINE_INPUTFUNC( FIELD_VOID, "Enable", InputEnable ),
	DEFINE_INPUTFUNC( FIELD_VOID, "Disable", InputDisable ),
	DEFINE_INPUTFUNC( FIELD_INTEGER, "SetMaxActiveZombies", InputSetMaxActiveZombies ),
END_DATADESC()

CZombieSpawner::CZombieSpawner()
{
	m_bEnabled = false;
	m_bInfiniteZombies = false;
	m_nMaxActiveZombies = 1;
	m_flZombieLifeTime = 0;
	m_nSkeletonType = 0;
	m_nSpawned = 0;
}


void CZombieSpawner::Spawn()
{
	BaseClass::Spawn();

	SetNextThink( gpGlobals->curtime );
}


void CZombieSpawner::Think()
{
	m_activeZombies.FindAndFastRemove( NULL );

	if ( m_bEnabled && ( ( m_bInfiniteZombies && m_activeZombies.Count() < m_nMaxActiveZombies ) || ( !m_bInfiniteZombies && m_nSpawned < m_nMaxActiveZombies ) ) )
	{
		CZombie *pZombie = CZombie::SpawnAtPos( GetAbsOrigin(), m_flZombieLifeTime, TF_TEAM_HALLOWEEN, NULL, (CZombie::SkeletonType_t)m_nSkeletonType );
		if ( pZombie )
		{
			m_nSpawned++;
			m_activeZombies.AddToTail( pZombie );
		}

		SetNextThink( gpGlobals->curtime + RandomFloat( 1.5f, 3.f ) );
		return;
	}

	SetNextThink( gpGlobals->curtime + 0.2f );
}


void CZombieSpawner::InputEnable( inputdata_t &inputdata )
{
	m_bEnabled = true;

	SetNextThink( gpGlobals->curtime );
}


void CZombieSpawner::InputDisable( inputdata_t &inputdata )
{
	m_bEnabled = false;
	m_nSpawned = 0;

	m_activeZombies.Purge();

	SetNextThink( gpGlobals->curtime );
}


void CZombieSpawner::InputSetMaxActiveZombies( inputdata_t &inputdata )
{
	m_nMaxActiveZombies = inputdata.value.Int();
}
