//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Zombies on cars!
//
//=============================================================================

#ifndef AI_BEHAVIOR_PASSENGER_ZOMBIE_H
#define AI_BEHAVIOR_PASSENGER_ZOMBIE_H
#ifdef _WIN32
#pragma once
#endif

#include "ai_behavior_passenger.h"
#include "ai_utils.h"
#include "vehicle_base.h"

extern impactdamagetable_t gZombiePassengerImpactDamageTable;

class CAI_PassengerBehaviorZombie : public CAI_PassengerBehavior
{
	DECLARE_CLASS( CAI_PassengerBehaviorZombie, CAI_PassengerBehavior );
	DECLARE_DATADESC()

public:

	CAI_PassengerBehaviorZombie( void );

	enum
	{
		// Schedules
		SCHED_PASSENGER_ZOMBIE_ENTER_VEHICLE = BaseClass::NEXT_SCHEDULE,
		SCHED_PASSENGER_ZOMBIE_EXIT_VEHICLE,
		SCHED_PASSENGER_ZOMBIE_MELEE_ATTACK1,
		SCHED_PASSENGER_ZOMBIE_RANGE_ATTACK1,
		SCHED_PASSENGER_ZOMBIE_ATTACH,
		SCHED_PASSENGER_ZOMBIE_RUN_TO_VEHICLE,
		NEXT_SCHEDULE,

		// Tasks
		TASK_PASSENGER_ZOMBIE_RANGE_ATTACK1 = BaseClass::NEXT_TASK,
		TASK_PASSENGER_ZOMBIE_DISMOUNT,
		TASK_PASSENGER_ZOMBIE_ATTACH,
		NEXT_TASK,

		// Conditions
		COND_PASSENGER_ZOMBIE_CAN_ATTACH_TO_VEHICLE = BaseClass::NEXT_CONDITION,
		NEXT_CONDITION
	};

	virtual const char *GetName( void ) { return "ZombiePassenger"; }
	virtual string_t	GetRoleName( void ) { return MAKE_STRING( "passenger_zombie" ); }
	virtual int			SelectSchedule( void );
	virtual int			TranslateSchedule( int scheduleType );
	virtual void		GatherConditions( void );
	virtual void		Event_Killed( const CTakeDamageInfo &info );
	virtual void		BuildScheduleTestBits( void );
	virtual void		RunTask( const Task_t *pTask );
	virtual void		StartTask( const Task_t *pTask );
	virtual bool		CanEnterVehicle( void );
	virtual void		ExitVehicle( void );
	virtual void		HandleAnimEvent( animevent_t *pEvent );
	virtual Activity	NPC_TranslateActivity( Activity activity );

	virtual	bool		AttachToVehicle( void );

	void				SuppressAttack( float flDuration );

	DEFINE_CUSTOM_SCHEDULE_PROVIDER;

protected:
	
	int					SelectOutsideSchedule( void );
	int					SelectInsideSchedule( void );
	virtual	int			FindExitSequence( void );
	void				StartDismount( void );
	void				FinishDismount( void );
	virtual void		CalculateBodyLean( void );
	virtual void		GatherVehicleStateConditions( void );
	virtual int			FindEntrySequence( bool bNearest = false );

private:

	void				VehicleLeapAttackTouch( CBaseEntity *pOther );
	void				VehicleLeapAttack( void );
	bool				CanBeOnEnemyVehicle( void );
	float				GetEntryPointCost( const Vector &vecEntryPos );
	bool				EnemyInVehicle( void );
	void				GetAttachmentPoint( Vector *vecPoint );
	bool				CanJumpToAttachToVehicle( void );
	//bool				WithinAttachRange( void );

	float				m_flLastLateralLean;
	float				m_flLastVerticalLean;
	float				m_flNextLeapTime;
};

#endif // AI_BEHAVIOR_PASSENGER_ZOMBIE_H