//========= Copyright Valve Corporation, All rights reserved. ============//
#ifndef NPC_TURRET_GROUND_H
#define NPC_TURRET_GROUND_H
#ifdef _WIN32
#pragma once
#endif

#include "ai_basenpc.h"
#include "smoke_trail.h"

//=========================================================
//=========================================================
class CNPC_GroundTurret : public CAI_BaseNPC
{
public:
	DECLARE_CLASS( CNPC_GroundTurret, CAI_BaseNPC );
	DECLARE_DATADESC();

	void			Precache( void );
	virtual void	Spawn( void );
	bool			CreateVPhysics( void );
	void			PrescheduleThink();
	Class_T			Classify( void );

	void PostNPCInit();

	// Damage & Death
	virtual int OnTakeDamage_Alive( const CTakeDamageInfo &info );
	void Event_Killed( const CTakeDamageInfo &info );
	void DeathEffects();
	bool CanBecomeRagdoll( void ) { return false; }
	void DeathSound( const CTakeDamageInfo &info );

	// Combat
	void MakeTracer( const Vector &vecTracerSrc, const trace_t &tr, int iTracerType );
	Vector GetAttackSpread( CBaseCombatWeapon *pWeapon, CBaseEntity *pTarget )
	{
		return VECTOR_CONE_5DEGREES;
	}


	// Sensing 
	void GatherConditions();
	Vector EyePosition();
	bool FVisible( CBaseEntity *pEntity, int traceMask, CBaseEntity **ppBlocker );
	bool QuerySeeEntity( CBaseEntity *pEntity, bool bOnlyHateOrFearIfNPC = false );


	bool IsOpeningOrClosing() { return (GetAbsVelocity().z != 0.0f); }
	bool IsEnabled();
	bool IsOpen();

	// Tasks & Schedules
	void StartTask( const Task_t *pTask );
	void RunTask( const Task_t *pTask );
	virtual int SelectSchedule( void );
	virtual int TranslateSchedule( int scheduleType );

	// Activities & Animation
	Activity			NPC_TranslateActivity( Activity eNewActivity );
	virtual void		Shoot();
	virtual void		Scan();
	void				ProjectBeam( const Vector &vecStart, const Vector &vecDir, int width, int brightness, float duration );

	// Local
	void SetActive( bool bActive ) {}

	// Inputs
	void InputEnable( inputdata_t &inputdata );
	void InputDisable( inputdata_t &inputdata );

	// Outputs
	COutputEvent	m_OnAreaClear;

	DEFINE_CUSTOM_AI;

protected:
	//-----------------------------------------------------
	// Conditions, Schedules, Tasks
	//-----------------------------------------------------
	enum 
	{
		SCHED_GROUND_TURRET_IDLE = BaseClass::NEXT_SCHEDULE,
		SCHED_GROUND_TURRET_ATTACK,

		TASK_GROUNDTURRET_SCAN = BaseClass::NEXT_TASK,
	};

	int			m_iAmmoType;
	SmokeTrail	*m_pSmoke;

	bool		m_bEnabled;

	float		m_flTimeNextShoot;
	float		m_flTimeLastSawEnemy;
	Vector		m_vecSpread;
	bool		m_bHasExploded;
	int			m_iDeathSparks;
	float		m_flSensingDist;
	bool		m_bSeeEnemy;
	float		m_flTimeNextPing;

	Vector		m_vecClosedPos;

	Vector		m_vecLightOffset;

	HSOUNDSCRIPTHANDLE 	m_ShotSounds;
};

#endif //#ifndef NPC_TURRET_GROUND_H