//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
//=============================================================================//

#include "cbase.h"
#include "ai_default.h"
#include "ai_task.h"
#include "ai_schedule.h"
#include "ai_node.h"
#include "ai_hull.h"
#include "ai_hint.h"
#include "ai_squad.h"
#include "ai_senses.h"
#include "ai_navigator.h"
#include "ai_motor.h"
#include "ai_behavior.h"
#include "ai_baseactor.h"
#include "ai_behavior_lead.h"
#include "ai_behavior_follow.h"
#include "ai_behavior_standoff.h"
#include "ai_behavior_assault.h"
#include "npc_playercompanion.h"
#include "soundent.h"
#include "game.h"
#include "npcevent.h"
#include "entitylist.h"
#include "activitylist.h"
#include "vstdlib/random.h"
#include "engine/IEngineSound.h"
#include "sceneentity.h"

// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"

#define FISHERMAN_MODEL "models/lostcoast/fisherman/fisherman.mdl"

//=========================================================
// Fisherman activities
//=========================================================

Activity ACT_FISHERMAN_HAT_UP;
Activity ACT_FISHERMAN_HAT_DOWN;

//=========================================================
// animation events
//=========================================================
int AE_FISHERMAN_HAT_UP;
int AE_FISHERMAN_HAT_DOWN;
int AE_FISHERMAN_HAT_ON;
int AE_FISHERMAN_HAT_OFF;

//---------------------------------------------------------
//
//---------------------------------------------------------

class CNPC_Fisherman : public CNPC_PlayerCompanion
{
public:
	DECLARE_CLASS( CNPC_Fisherman, CNPC_PlayerCompanion );
	//DECLARE_SERVERCLASS();
	DECLARE_DATADESC();

	virtual void Precache()
	{
		// Prevents a warning
		SelectModel( );
		BaseClass::Precache();

		PrecacheScriptSound( "NPC_Fisherman.FootstepLeft" );
		PrecacheScriptSound( "NPC_Fisherman.FootstepRight" );
		PrecacheScriptSound( "NPC_Fisherman.Die" );

		PrecacheInstancedScene( "scenes/Expressions/FishermanIdle.vcd" );
		PrecacheInstancedScene( "scenes/Expressions/FishermanAlert.vcd" );
		PrecacheInstancedScene( "scenes/Expressions/FishermanCombat.vcd" );
	}

	virtual void Activate()
	{
		BaseClass::Activate();

		if (m_iHatState == -1)
		{
			m_iHatState = ACT_FISHERMAN_HAT_DOWN;
		}

		// allocate layer, start with the hat down
		m_iHatLayer = AddGesture( (Activity)m_iHatState, false );
	}

	void	Spawn( void );
	void	SelectModel();
	Class_T Classify( void );

	void HandleAnimEvent( animevent_t *pEvent );

	bool ShouldLookForBetterWeapon() { return false; }
	virtual bool	IgnorePlayerPushing( void ) { return true; }
	void	DeathSound( const CTakeDamageInfo &info );

	int m_iHatLayer;	// overlay layer for hat, don't save/restore.
	int m_iHatState;	// hat state, persistant.

	DEFINE_CUSTOM_AI;
};

LINK_ENTITY_TO_CLASS( npc_fisherman, CNPC_Fisherman );

//---------------------------------------------------------
// 
//---------------------------------------------------------
/*
IMPLEMENT_SERVERCLASS_ST(CNPC_Fisherman, DT_NPC_Fisherman)
END_SEND_TABLE()
*/

//---------------------------------------------------------
// Save/Restore
//---------------------------------------------------------
BEGIN_DATADESC( CNPC_Fisherman )

	// DEFINE_FIELD( m_iHatLayer, FIELD_INT ),
	DEFINE_FIELD( m_iHatState, FIELD_INTEGER ),

END_DATADESC()

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CNPC_Fisherman::SelectModel()
{
	SetModelName( AllocPooledString( FISHERMAN_MODEL ) );
}

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CNPC_Fisherman::Spawn( void )
{
	m_iHatLayer = -1;
	m_iHatState = -1;

	Precache();

	m_iHealth = 80;

//	m_iszIdleExpression = MAKE_STRING("scenes/Expressions/FishermanIdle.vcd");
//	m_iszAlertExpression = MAKE_STRING("scenes/Expressions/FishermanAlert.vcd");
//	m_iszCombatExpression = MAKE_STRING("scenes/Expressions/FishermanCombat.vcd");

	BaseClass::Spawn();

	AddEFlags( EFL_NO_DISSOLVE | EFL_NO_MEGAPHYSCANNON_RAGDOLL | EFL_NO_PHYSCANNON_INTERACTION );

	NPCInit();
}

//-----------------------------------------------------------------------------
// Purpose: 
// Output : 
//-----------------------------------------------------------------------------
Class_T	CNPC_Fisherman::Classify( void )
{
	return	CLASS_PLAYER_ALLY_VITAL;
}

//---------------------------------------------------------
//---------------------------------------------------------
void CNPC_Fisherman::HandleAnimEvent( animevent_t *pEvent )
{
	if ( pEvent->event == NPC_EVENT_LEFTFOOT )
	{
		EmitSound( "NPC_Fisherman.FootstepLeft", pEvent->eventtime );
	}
	else if ( pEvent->event == NPC_EVENT_RIGHTFOOT )
	{
		EmitSound( "NPC_Fisherman.FootstepRight", pEvent->eventtime );
	}
	else if ( pEvent->event == AE_FISHERMAN_HAT_UP )
	{
		if (m_iHatLayer != -1)
		{
			RemoveLayer( m_iHatLayer, 0.2, 0.2 );
			m_iHatLayer = -1;
		}

		m_iHatState = ACT_FISHERMAN_HAT_UP;
		m_iHatLayer = AddGesture( (Activity)m_iHatState, false );
	}
	else if ( pEvent->event == AE_FISHERMAN_HAT_DOWN )
	{
		if (m_iHatLayer != -1)
		{
			RemoveLayer( m_iHatLayer, 0.2, 0.2 );
			m_iHatLayer = -1;
		}

		m_iHatState = ACT_FISHERMAN_HAT_DOWN;
		m_iHatLayer = AddGesture( (Activity)m_iHatState, false );
	}
	else if ( pEvent->event == AE_FISHERMAN_HAT_ON )
	{
		m_iHatLayer = AddGesture( (Activity)m_iHatState, false );
	}
	else if ( pEvent->event == AE_FISHERMAN_HAT_OFF )
	{
		if (m_iHatLayer != -1)
		{
			RemoveLayer( m_iHatLayer, 0.2, 0.2 );
			m_iHatLayer = -1;
		}
	}
	else
	{
		BaseClass::HandleAnimEvent( pEvent );
	}
}

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void CNPC_Fisherman::DeathSound( const CTakeDamageInfo &info )
{
	// Sentences don't play on dead NPCs
	SentenceStop();
}

//-----------------------------------------------------------------------------
//
// Schedules
//
//-----------------------------------------------------------------------------

AI_BEGIN_CUSTOM_NPC( npc_fisherman, CNPC_Fisherman )

	DECLARE_ACTIVITY( ACT_FISHERMAN_HAT_UP )
	DECLARE_ACTIVITY( ACT_FISHERMAN_HAT_DOWN )

	DECLARE_ANIMEVENT( AE_FISHERMAN_HAT_UP )
	DECLARE_ANIMEVENT( AE_FISHERMAN_HAT_DOWN )
	DECLARE_ANIMEVENT( AE_FISHERMAN_HAT_ON )
	DECLARE_ANIMEVENT( AE_FISHERMAN_HAT_OFF )

AI_END_CUSTOM_NPC()