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

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

#include "tf_weaponbase_gun.h"

#if defined( CLIENT_DLL )
#define CTFShotgun C_TFShotgun
#define CTFShotgun_Soldier C_TFShotgun_Soldier
#define CTFShotgun_HWG C_TFShotgun_HWG
#define CTFShotgun_Pyro C_TFShotgun_Pyro
#define CTFScatterGun C_TFScatterGun
#define CTFShotgun_Revenge C_TFShotgun_Revenge
#define CTFSodaPopper C_TFSodaPopper
#define CTFPEPBrawlerBlaster C_TFPEPBrawlerBlaster
#define CTFShotgunBuildingRescue C_TFShotgunBuildingRescue
#define CTFLeech C_TFLeech
#endif

// Reload Modes
enum
{
	TF_WEAPON_SHOTGUN_RELOAD_START = 0,
	TF_WEAPON_SHOTGUN_RELOAD_SHELL,
	TF_WEAPON_SHOTGUN_RELOAD_CONTINUE,
	TF_WEAPON_SHOTGUN_RELOAD_FINISH
};

//=============================================================================
//
// Shotgun class.
//
class CTFShotgun : public CTFWeaponBaseGun
{
public:

	DECLARE_CLASS( CTFShotgun, CTFWeaponBaseGun );
	DECLARE_NETWORKCLASS(); 
	DECLARE_PREDICTABLE();

	CTFShotgun();

	virtual int		GetWeaponID( void ) const			{ return TF_WEAPON_SHOTGUN_PRIMARY; }
	virtual void	PrimaryAttack();
	virtual void	PlayWeaponShootSound( void );

#ifdef GAME_DLL
	virtual CDmgAccumulator	*GetDmgAccumulator( void ) { return &m_Accumulator; }
#endif // GAME_DLL
	
protected:

	void		Fire( CTFPlayer *pPlayer );
	void		UpdatePunchAngles( CTFPlayer *pPlayer );

private:

	CTFShotgun( const CTFShotgun & ) {}

#ifdef GAME_DLL
	CDmgAccumulator m_Accumulator;
#endif // GAME_DLL
};

// Engineer's revenge shotgun.
class CTFShotgun_Revenge : public CTFShotgun
{
public:
	DECLARE_CLASS( CTFShotgun_Revenge, CTFShotgun );
	DECLARE_NETWORKCLASS();
	DECLARE_PREDICTABLE();

	CTFShotgun_Revenge();

	virtual int			GetWeaponID( void ) const		{ return TF_WEAPON_SENTRY_REVENGE; }

	void				Precache();
	virtual void		PrimaryAttack();
	virtual void		SentryKilled( int iKills );
	virtual bool		Holster( CBaseCombatWeapon *pSwitchingTo = NULL );
	virtual bool		Deploy( void );
	virtual int         GetCustomDamageType() const;
	int					GetCount( void );
	float				GetProgress( void ) { return 0.f; }
	const char*			GetEffectLabelText( void ) { return "#TF_REVENGE"; }

#ifdef CLIENT_DLL
	virtual void		SetWeaponVisible( bool visible );
	virtual int			GetWorldModelIndex( void );
#else
	virtual void		Detach();
#endif
};

// Scout version. Different models, possibly different behaviour later on
class CTFScatterGun : public CTFShotgun
{
public:
	DECLARE_CLASS( CTFScatterGun, CTFShotgun );
	DECLARE_NETWORKCLASS(); 
	DECLARE_PREDICTABLE();

	virtual int		GetWeaponID( void ) const			{ return TF_WEAPON_SCATTERGUN; }
	virtual bool	Reload( void );
	virtual void	FireBullet( CTFPlayer *pPlayer );
	virtual void	ApplyPostHitEffects( const CTakeDamageInfo &inputInfo, CTFPlayer *pPlayer );
	virtual void	FinishReload( void );
	virtual bool	HasKnockback( void );
	virtual bool	SendWeaponAnim( int iActivity );

#ifdef GAME_DLL
	virtual void	Equip( CBaseCombatCharacter *pOwner );
#endif // GAME_DLL
};

class CTFShotgun_Soldier : public CTFShotgun
{
public:
	DECLARE_CLASS( CTFShotgun_Soldier, CTFShotgun );
	DECLARE_NETWORKCLASS(); 
	DECLARE_PREDICTABLE();

	virtual int		GetWeaponID( void ) const			{ return TF_WEAPON_SHOTGUN_SOLDIER; }
};

// Secondary version. Different weapon slot, different ammo
class CTFShotgun_HWG : public CTFShotgun
{
public:
	DECLARE_CLASS( CTFShotgun_HWG, CTFShotgun );
	DECLARE_NETWORKCLASS(); 
	DECLARE_PREDICTABLE();

	virtual int		GetWeaponID( void ) const			{ return TF_WEAPON_SHOTGUN_HWG; }
};

class CTFShotgun_Pyro : public CTFShotgun
{
public:
	DECLARE_CLASS( CTFShotgun_Pyro, CTFShotgun );
	DECLARE_NETWORKCLASS(); 
	DECLARE_PREDICTABLE();

	virtual int		GetWeaponID( void ) const			{ return TF_WEAPON_SHOTGUN_PYRO; }
};

class CTFSodaPopper : public CTFScatterGun
{
public:
	DECLARE_CLASS( CTFSodaPopper, CTFScatterGun );
	DECLARE_NETWORKCLASS(); 
	DECLARE_PREDICTABLE();

	virtual int		GetWeaponID( void ) const			{ return TF_WEAPON_SODA_POPPER; }

	virtual void	ItemBusyFrame( void );
	virtual void	SecondaryAttack( void );

	const char*		GetEffectLabelText( void )			{ return "#TF_HYPE"; }
	float			GetProgress( void );
};

class CTFPEPBrawlerBlaster : public CTFScatterGun
{
public:
	DECLARE_CLASS( CTFPEPBrawlerBlaster, CTFScatterGun );
	DECLARE_NETWORKCLASS(); 
	DECLARE_PREDICTABLE();

	virtual int		GetWeaponID( void ) const			{ return TF_WEAPON_PEP_BRAWLER_BLASTER; }

	const char*		GetEffectLabelText( void )			{ return "#TF_Boost"; }
	float			GetProgress( void );
};

class CTFShotgunBuildingRescue : public CTFShotgun
{
public:
	DECLARE_CLASS( CTFShotgunBuildingRescue, CTFShotgun );
	DECLARE_NETWORKCLASS(); 
	DECLARE_PREDICTABLE();

	virtual int		GetWeaponID( void ) const			{ return TF_WEAPON_SHOTGUN_BUILDING_RESCUE; }
	virtual float	GetProjectileSpeed( void );
	virtual float   GetProjectileGravity( void );
	virtual bool	IsViewModelFlipped( void );
};

#endif // TF_WEAPON_SHOTGUN_H