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

#include "cbase.h"
#include "c_ai_basenpc.h"
#include "soundenvelope.h"

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

class C_NPC_Manhack : public C_AI_BaseNPC
{
public:
	C_NPC_Manhack() {}

	DECLARE_CLASS( C_NPC_Manhack, C_AI_BaseNPC );
	DECLARE_CLIENTCLASS();
 	DECLARE_DATADESC();

	// Purpose: Start the manhack's engine sound.
	virtual void OnDataChanged( DataUpdateType_t type );
	virtual void UpdateOnRemove( void );
	virtual void OnRestore();

private:
	C_NPC_Manhack( const C_NPC_Manhack & );

	// Purpose: Start + stop the manhack's engine sound.
	void SoundInit( void );
	void SoundShutdown( void );

	CSoundPatch		*m_pEngineSound1;
	CSoundPatch		*m_pEngineSound2;
	CSoundPatch		*m_pBladeSound;

	int				m_nEnginePitch1;
	int				m_nEnginePitch2;
	float			m_flEnginePitch1Time;
	float			m_flEnginePitch2Time;
};


//-----------------------------------------------------------------------------
// Save/restore
//-----------------------------------------------------------------------------
BEGIN_DATADESC( C_NPC_Manhack )

//	DEFINE_SOUNDPATCH( m_pEngineSound1 ),
//	DEFINE_SOUNDPATCH( m_pEngineSound2 ),
//	DEFINE_SOUNDPATCH( m_pBladeSound ),

//	DEFINE_FIELD( m_nEnginePitch1, FIELD_INTEGER ),
//	DEFINE_FIELD( m_nEnginePitch2, FIELD_INTEGER ),
//	DEFINE_FIELD( m_flEnginePitch1Time, FIELD_FLOAT ),
//	DEFINE_FIELD( m_flEnginePitch2Time, FIELD_FLOAT ),

END_DATADESC()


//-----------------------------------------------------------------------------
// Networking
//-----------------------------------------------------------------------------
IMPLEMENT_CLIENTCLASS_DT(C_NPC_Manhack, DT_NPC_Manhack, CNPC_Manhack)
	RecvPropIntWithMinusOneFlag(RECVINFO(m_nEnginePitch1)),
	RecvPropFloat(RECVINFO(m_flEnginePitch1Time)),
	RecvPropIntWithMinusOneFlag(RECVINFO(m_nEnginePitch2)),
	RecvPropFloat(RECVINFO(m_flEnginePitch2Time)),
END_RECV_TABLE()



//-----------------------------------------------------------------------------
// Purpose: Start the manhack's engine sound.
//-----------------------------------------------------------------------------
void C_NPC_Manhack::OnDataChanged( DataUpdateType_t type )
{
	BaseClass::OnDataChanged( type );

	if (( m_nEnginePitch1 < 0 ) || ( m_nEnginePitch2 < 0 ) )
	{
		SoundShutdown();
	}
	else
	{
		SoundInit();
		if ( m_pEngineSound1 && m_pEngineSound2 )
		{
			float dt = ( m_flEnginePitch1Time >= gpGlobals->curtime ) ? m_flEnginePitch1Time - gpGlobals->curtime : 0.0f;
			CSoundEnvelopeController::GetController().SoundChangePitch( m_pEngineSound1, m_nEnginePitch1, dt );
			dt = ( m_flEnginePitch2Time >= gpGlobals->curtime ) ? m_flEnginePitch2Time - gpGlobals->curtime : 0.0f;
			CSoundEnvelopeController::GetController().SoundChangePitch( m_pEngineSound2, m_nEnginePitch2, dt );
		}
	}
}


//-----------------------------------------------------------------------------
// Restore
//-----------------------------------------------------------------------------
void C_NPC_Manhack::OnRestore()
{
	BaseClass::OnRestore();
	SoundInit();
}


//-----------------------------------------------------------------------------
// Purpose: Start the manhack's engine sound.
//-----------------------------------------------------------------------------
void C_NPC_Manhack::UpdateOnRemove( void )
{
	BaseClass::UpdateOnRemove();
	SoundShutdown();
}


//-----------------------------------------------------------------------------
// Purpose: Start the manhack's engine sound.
//-----------------------------------------------------------------------------
void C_NPC_Manhack::SoundInit( void )
{
	if (( m_nEnginePitch1 < 0 ) || ( m_nEnginePitch2 < 0 ) )
		return;

	// play an engine start sound!!
	CPASAttenuationFilter filter( this );

	// Bring up the engine looping sound.
	if( !m_pEngineSound1 )
	{
		m_pEngineSound1 = CSoundEnvelopeController::GetController().SoundCreate( filter, entindex(), "NPC_Manhack.EngineSound1" );
		CSoundEnvelopeController::GetController().Play( m_pEngineSound1, 0.0, m_nEnginePitch1 );
		CSoundEnvelopeController::GetController().SoundChangeVolume( m_pEngineSound1, 0.7, 2.0 );
	}

	if( !m_pEngineSound2 )
	{
		m_pEngineSound2 = CSoundEnvelopeController::GetController().SoundCreate( filter, entindex(), "NPC_Manhack.EngineSound2" );
		CSoundEnvelopeController::GetController().Play( m_pEngineSound2, 0.0, m_nEnginePitch2 );
		CSoundEnvelopeController::GetController().SoundChangeVolume( m_pEngineSound2, 0.7, 2.0 );
	}

	if( !m_pBladeSound )
	{
		m_pBladeSound = CSoundEnvelopeController::GetController().SoundCreate( filter, entindex(), "NPC_Manhack.BladeSound" );
		CSoundEnvelopeController::GetController().Play( m_pBladeSound, 0.0, m_nEnginePitch1 );
		CSoundEnvelopeController::GetController().SoundChangeVolume( m_pBladeSound, 0.7, 2.0 );
	}
}


//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void C_NPC_Manhack::SoundShutdown(void)
{
	// Kill the engine!
	if ( m_pEngineSound1 )
	{
		CSoundEnvelopeController::GetController().SoundDestroy( m_pEngineSound1 );
		m_pEngineSound1 = NULL;
	}

	// Kill the engine!
	if ( m_pEngineSound2 )
	{
		CSoundEnvelopeController::GetController().SoundDestroy( m_pEngineSound2 );
		m_pEngineSound2 = NULL;
	}

	// Kill the blade!
	if ( m_pBladeSound )
	{
		CSoundEnvelopeController::GetController().SoundDestroy( m_pBladeSound );
		m_pBladeSound = NULL;
	}
}