/*** * * Copyright (c) 1996-2002, Valve LLC. All rights reserved. * * This product contains software technology licensed from Id * Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. * All Rights Reserved. * * Use, distribution, and modification of this source code and/or resulting * object code is restricted to non-commercial enhancements to products from * Valve LLC. All other use, distribution, or modification is prohibited * without written permission from Valve LLC. * ****/ #ifndef WEAPONS_H #define WEAPONS_H #include "effects.h" class CBasePlayer; extern int gmsgWeapPickup; void DeactivateSatchels( CBasePlayer *pOwner ); // Contact Grenade / Timed grenade / Satchel Charge class CGrenade : public CBaseMonster { public: void Spawn( void ); typedef enum { SATCHEL_DETONATE = 0, SATCHEL_RELEASE } SATCHELCODE; static CGrenade *ShootTimed( entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time ); static CGrenade *ShootContact( entvars_t *pevOwner, Vector vecStart, Vector vecVelocity ); static CGrenade *ShootSatchelCharge( entvars_t *pevOwner, Vector vecStart, Vector vecVelocity ); static void UseSatchelCharges( entvars_t *pevOwner, SATCHELCODE code ); void Explode( Vector vecSrc, Vector vecAim ); void Explode( TraceResult *pTrace, int bitsDamageType ); void EXPORT Smoke( void ); void EXPORT BounceTouch( CBaseEntity *pOther ); void EXPORT SlideTouch( CBaseEntity *pOther ); void EXPORT ExplodeTouch( CBaseEntity *pOther ); void EXPORT DangerSoundThink( void ); void EXPORT PreDetonate( void ); void EXPORT Detonate( void ); void EXPORT DetonateUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); void EXPORT TumbleThink( void ); virtual void BounceSound( void ); virtual int BloodColor( void ) { return DONT_BLEED; } virtual void Killed( entvars_t *pevAttacker, int iGib ); virtual float TouchGravGun( CBaseEntity *attacker, int stage ) { pev->owner = attacker->edict(); return 200; } BOOL m_fRegisteredSound;// whether or not this grenade has issued its DANGER sound to the world sound list yet. }; // constant items #define ITEM_HEALTHKIT 1 #define ITEM_ANTIDOTE 2 #define ITEM_SECURITY 3 #define ITEM_BATTERY 4 #define WEAPON_NONE 0 #define WEAPON_CROWBAR 1 #define WEAPON_GLOCK 2 #define WEAPON_PYTHON 3 #define WEAPON_MP5 4 #define WEAPON_CHAINGUN 5 #define WEAPON_CROSSBOW 6 #define WEAPON_SHOTGUN 7 #define WEAPON_RPG 8 #define WEAPON_GAUSS 9 #define WEAPON_EGON 10 #define WEAPON_HORNETGUN 11 #define WEAPON_HANDGRENADE 12 #define WEAPON_TRIPMINE 13 #define WEAPON_SATCHEL 14 #define WEAPON_SNARK 15 #define WEAPON_ALLWEAPONS (~(1<pev->origin - pev->origin ).Length() < 90 ) Touch( attacker ); } if( pev->movetype == MOVETYPE_FOLLOW ) return 0; if( pev->movetype == MOVETYPE_NONE ) return 0; if( pev->effects & EF_NODRAW ) return 0; //if( pev->mins == pev->maxs ) //return 0; return 200; } }; // inventory items that class CBasePlayerWeapon : public CBasePlayerItem { public: virtual int Save( CSave &save ); virtual int Restore( CRestore &restore ); static TYPEDESCRIPTION m_SaveData[]; // generic weapon versions of CBasePlayerItem calls virtual int AddToPlayer( CBasePlayer *pPlayer ); virtual int AddDuplicate( CBasePlayerItem *pItem ); virtual int ExtractAmmo( CBasePlayerWeapon *pWeapon ); //{ return TRUE; }; // Return TRUE if you can add ammo to yourself when picked up virtual int ExtractClipAmmo( CBasePlayerWeapon *pWeapon );// { return TRUE; }; // Return TRUE if you can add ammo to yourself when picked up virtual int AddWeapon( void ) { ExtractAmmo( this ); return TRUE; }; // Return TRUE if you want to add yourself to the player // generic "shared" ammo handlers BOOL AddPrimaryAmmo( int iCount, char *szName, int iMaxClip, int iMaxCarry ); BOOL AddSecondaryAmmo( int iCount, char *szName, int iMaxCarry ); virtual void UpdateItemInfo( void ) {}; // updates HUD state int m_iPlayEmptySound; int m_fFireOnEmpty; // True when the gun is empty and the player is still holding down the // attack key(s) virtual BOOL PlayEmptySound( void ); virtual void ResetEmptySound( void ); virtual void SendWeaponAnim( int iAnim, int skiplocal = 1, int body = 0 ); // skiplocal is 1 if client is predicting weapon animations virtual BOOL CanDeploy( void ); virtual BOOL IsUseable( void ); BOOL DefaultDeploy( char *szViewModel, char *szWeaponModel, int iAnim, char *szAnimExt, int skiplocal = 0, int body = 0 ); int DefaultReload( int iClipSize, int iAnim, float fDelay, int body = 0 ); virtual void ItemPostFrame( void ); // called each frame by the player PostThink // called by CBasePlayerWeapons ItemPostFrame() virtual void PrimaryAttack( void ) { return; } // do "+ATTACK" virtual void SecondaryAttack( void ) { return; } // do "+ATTACK2" virtual void Reload( void ) { return; } // do "+RELOAD" virtual void WeaponIdle( void ) { return; } // called when no buttons pressed virtual int UpdateClientData( CBasePlayer *pPlayer ); // sends hud info to client dll, if things have changed virtual void RetireWeapon( void ); virtual BOOL ShouldWeaponIdle( void ) {return FALSE; }; virtual void Holster( int skiplocal = 0 ); virtual BOOL UseDecrement( void ) { return FALSE; }; int PrimaryAmmoIndex(); int SecondaryAmmoIndex(); void PrintState( void ); virtual CBasePlayerItem *GetWeaponPtr( void ) { return (CBasePlayerItem *)this; }; float m_flPumpTime; int m_fInSpecialReload; // Are we in the middle of a reload for the shotguns float m_flNextPrimaryAttack; // soonest time ItemPostFrame will call PrimaryAttack float m_flNextSecondaryAttack; // soonest time ItemPostFrame will call SecondaryAttack float m_flTimeWeaponIdle; // soonest time ItemPostFrame will call WeaponIdle int m_iPrimaryAmmoType; // "primary" ammo index into players m_rgAmmo[] int m_iSecondaryAmmoType; // "secondary" ammo index into players m_rgAmmo[] int m_iClip; // number of shots left in the primary weapon clip, -1 it not used int m_iClientClip; // the last version of m_iClip sent to hud dll int m_iClientWeaponState; // the last version of the weapon state sent to hud dll (is current weapon, is on target) int m_fInReload; // Are we in the middle of a reload; int m_iDefaultAmmo;// how much ammo you get when you pick up this weapon as placed by a level designer. }; class CBasePlayerAmmo : public CBaseEntity { public: virtual void Spawn( void ); void EXPORT DefaultTouch( CBaseEntity *pOther ); // default weapon touch virtual BOOL AddAmmo( CBaseEntity *pOther ) { return TRUE; }; CBaseEntity* Respawn( void ); void EXPORT Materialize( void ); virtual float TouchGravGun( CBaseEntity *attacker, int stage) { if( stage == 2 ) { if( (attacker->pev->origin - pev->origin ).Length() < 90 ) Touch( attacker ); } if( pev->movetype == MOVETYPE_FOLLOW ) return 0; if( pev->movetype == MOVETYPE_NONE ) return 0; if( pev->effects & EF_NODRAW ) return 0; //if( pev->mins == pev->maxs ) //return 0; return 200; } Vector m_SpawnPoint; }; extern DLL_GLOBAL short g_sModelIndexLaser;// holds the index for the laser beam extern DLL_GLOBAL const char *g_pModelNameLaser; extern DLL_GLOBAL short g_sModelIndexLaserDot;// holds the index for the laser beam dot extern DLL_GLOBAL short g_sModelIndexFireball;// holds the index for the fireball extern DLL_GLOBAL short g_sModelIndexSmoke;// holds the index for the smoke cloud extern DLL_GLOBAL short g_sModelIndexWExplosion;// holds the index for the underwater explosion extern DLL_GLOBAL short g_sModelIndexBubbles;// holds the index for the bubbles model extern DLL_GLOBAL short g_sModelIndexBloodDrop;// holds the sprite index for blood drops extern DLL_GLOBAL short g_sModelIndexBloodSpray;// holds the sprite index for blood spray (bigger) extern void ClearMultiDamage(void); extern void ApplyMultiDamage(entvars_t* pevInflictor, entvars_t* pevAttacker ); extern void AddMultiDamage( entvars_t *pevInflictor, CBaseEntity *pEntity, float flDamage, int bitsDamageType); extern void DecalGunshot( TraceResult *pTrace, int iBulletType ); extern void SpawnBlood(Vector vecSpot, int bloodColor, float flDamage); extern int DamageDecal( CBaseEntity *pEntity, int bitsDamageType ); extern void RadiusDamage( Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType ); typedef struct { CBaseEntity *pEntity; float amount; int type; } MULTIDAMAGE; extern MULTIDAMAGE gMultiDamage; #define LOUD_GUN_VOLUME 1000 #define NORMAL_GUN_VOLUME 600 #define QUIET_GUN_VOLUME 200 #define BRIGHT_GUN_FLASH 512 #define NORMAL_GUN_FLASH 256 #define DIM_GUN_FLASH 128 #define BIG_EXPLOSION_VOLUME 2048 #define NORMAL_EXPLOSION_VOLUME 1024 #define SMALL_EXPLOSION_VOLUME 512 #define WEAPON_ACTIVITY_VOLUME 64 #define VECTOR_CONE_1DEGREES Vector( 0.00873, 0.00873, 0.00873 ) #define VECTOR_CONE_2DEGREES Vector( 0.01745, 0.01745, 0.01745 ) #define VECTOR_CONE_3DEGREES Vector( 0.02618, 0.02618, 0.02618 ) #define VECTOR_CONE_4DEGREES Vector( 0.03490, 0.03490, 0.03490 ) #define VECTOR_CONE_5DEGREES Vector( 0.04362, 0.04362, 0.04362 ) #define VECTOR_CONE_6DEGREES Vector( 0.05234, 0.05234, 0.05234 ) #define VECTOR_CONE_7DEGREES Vector( 0.06105, 0.06105, 0.06105 ) #define VECTOR_CONE_8DEGREES Vector( 0.06976, 0.06976, 0.06976 ) #define VECTOR_CONE_9DEGREES Vector( 0.07846, 0.07846, 0.07846 ) #define VECTOR_CONE_10DEGREES Vector( 0.08716, 0.08716, 0.08716 ) #define VECTOR_CONE_15DEGREES Vector( 0.13053, 0.13053, 0.13053 ) #define VECTOR_CONE_20DEGREES Vector( 0.17365, 0.17365, 0.17365 ) //========================================================= // CWeaponBox - a single entity that can store weapons // and ammo. //========================================================= class CWeaponBox : public CBaseEntity { void Precache( void ); void Spawn( void ); void Touch( CBaseEntity *pOther ); void KeyValue( KeyValueData *pkvd ); BOOL IsEmpty( void ); int GiveAmmo( int iCount, char *szName, int iMax, int *pIndex = NULL ); void SetObjectCollisionBox( void ); public: void EXPORT Kill ( void ); int Save( CSave &save ); int Restore( CRestore &restore ); static TYPEDESCRIPTION m_SaveData[]; bool HasWeapon( CBasePlayerItem *pCheckItem ); BOOL PackWeapon( CBasePlayerItem *pWeapon ); BOOL PackAmmo( int iszName, int iCount ); CBasePlayerItem *m_rgpPlayerItems[MAX_ITEM_TYPES];// one slot for each int m_rgiszAmmo[MAX_AMMO_SLOTS];// ammo names int m_rgAmmo[MAX_AMMO_SLOTS];// ammo quantities int m_cAmmoTypes;// how many ammo types packed into this box (if packed by a level designer) virtual float TouchGravGun( CBaseEntity *attacker, int stage) { pev->framerate = 1; pev->movetype = MOVETYPE_TOSS; pev->gravity = 1; if( pev->velocity.z > 20 ) pev->velocity.z = 20; if( stage == 2 ) { if( (attacker->pev->origin - pev->origin ).Length() < 90 ) Touch( attacker ); return 0; } return 200; } }; #ifdef CLIENT_DLL bool bIsMultiplayer ( void ); void LoadVModel ( char *szViewModel, CBasePlayer *m_pPlayer ); #endif class CGlock : public CBasePlayerWeapon { public: void Spawn( void ); void Precache( void ); int iItemSlot( void ) { return 2; } int GetItemInfo(ItemInfo *p); void PrimaryAttack( void ); void SecondaryAttack( void ); void GlockFire( float flSpread, float flCycleTime, BOOL fUseAutoAim ); BOOL Deploy( void ); void Reload( void ); void WeaponIdle( void ); virtual BOOL UseDecrement( void ) { #if defined( CLIENT_WEAPONS ) return TRUE; #else return FALSE; #endif } private: int m_iShell; unsigned short m_usFireGlock1; unsigned short m_usFireGlock2; }; class CCrowbar : public CBasePlayerWeapon { public: void Spawn( void ); void Precache( void ); int iItemSlot( void ) { return 1; } void EXPORT SwingAgain( void ); void EXPORT Smack( void ); int GetItemInfo(ItemInfo *p); void PrimaryAttack( void ); int Swing( int fFirst ); BOOL Deploy( void ); void Holster( int skiplocal = 0 ); int m_iSwing; TraceResult m_trHit; virtual BOOL UseDecrement( void ) { #if defined( CLIENT_WEAPONS ) return TRUE; #else return FALSE; #endif } private: unsigned short m_usCrowbar; }; class CPython : public CBasePlayerWeapon { public: void Spawn( void ); void Precache( void ); int iItemSlot( void ) { return 2; } int GetItemInfo(ItemInfo *p); int AddToPlayer( CBasePlayer *pPlayer ); void PrimaryAttack( void ); void SecondaryAttack( void ); BOOL Deploy( void ); void Holster( int skiplocal = 0 ); void Reload( void ); void WeaponIdle( void ); float m_flSoundDelay; BOOL m_fInZoom;// don't save this. virtual BOOL UseDecrement( void ) { #if defined( CLIENT_WEAPONS ) return TRUE; #else return FALSE; #endif } private: unsigned short m_usFirePython; }; class CMP5 : public CBasePlayerWeapon { public: void Spawn( void ); void Precache( void ); int iItemSlot( void ) { return 3; } int GetItemInfo(ItemInfo *p); int AddToPlayer( CBasePlayer *pPlayer ); void PrimaryAttack( void ); void SecondaryAttack( void ); int SecondaryAmmoIndex( void ); BOOL Deploy( void ); void Reload( void ); void WeaponIdle( void ); float m_flNextAnimTime; int m_iShell; virtual BOOL UseDecrement( void ) { #if defined( CLIENT_WEAPONS ) return TRUE; #else return FALSE; #endif } private: unsigned short m_usMP5; unsigned short m_usMP52; }; class CCrossbow : public CBasePlayerWeapon { public: void Spawn( void ); void Precache( void ); int iItemSlot( ) { return 3; } int GetItemInfo(ItemInfo *p); void FireBolt( void ); void FireSniperBolt( void ); void PrimaryAttack( void ); void SecondaryAttack( void ); int AddToPlayer( CBasePlayer *pPlayer ); BOOL Deploy( ); void Holster( int skiplocal = 0 ); void Reload( void ); void WeaponIdle( void ); int m_fInZoom; // don't save this virtual BOOL UseDecrement( void ) { #if defined( CLIENT_WEAPONS ) return TRUE; #else return FALSE; #endif } private: unsigned short m_usCrossbow; unsigned short m_usCrossbow2; }; class CShotgun : public CBasePlayerWeapon { public: #ifndef CLIENT_DLL int Save( CSave &save ); int Restore( CRestore &restore ); static TYPEDESCRIPTION m_SaveData[]; #endif void Spawn( void ); void Precache( void ); int iItemSlot( ) { return 3; } int GetItemInfo(ItemInfo *p); int AddToPlayer( CBasePlayer *pPlayer ); void PrimaryAttack( void ); void SecondaryAttack( void ); BOOL Deploy( ); void Reload( void ); void WeaponIdle( void ); int m_fInReload; float m_flNextReload; int m_iShell; virtual BOOL UseDecrement( void ) { #if defined( CLIENT_WEAPONS ) return TRUE; #else return FALSE; #endif } private: unsigned short m_usDoubleFire; unsigned short m_usSingleFire; }; class CLaserSpot : public CBaseEntity { void Spawn( void ); void Precache( void ); int ObjectCaps( void ) { return FCAP_DONT_SAVE; } public: void Suspend( float flSuspendTime ); void EXPORT Revive( void ); static CLaserSpot *CreateSpot( void ); }; class CRpg : public CBasePlayerWeapon { public: #ifndef CLIENT_DLL int Save( CSave &save ); int Restore( CRestore &restore ); static TYPEDESCRIPTION m_SaveData[]; #endif void Spawn( void ); void Precache( void ); void Reload( void ); int iItemSlot( void ) { return 4; } int GetItemInfo(ItemInfo *p); int AddToPlayer( CBasePlayer *pPlayer ); BOOL Deploy( void ); BOOL CanHolster( void ); void Holster( int skiplocal = 0 ); void PrimaryAttack( void ); void SecondaryAttack( void ); void WeaponIdle( void ); void UpdateSpot( void ); BOOL ShouldWeaponIdle( void ) { return TRUE; }; CLaserSpot *m_pSpot; int m_fSpotActive; int m_cActiveRockets;// how many missiles in flight from this launcher right now? virtual BOOL UseDecrement( void ) { #if defined( CLIENT_WEAPONS ) return TRUE; #else return FALSE; #endif } private: unsigned short m_usRpg; }; class CRpgRocket : public CGrenade { public: int Save( CSave &save ); int Restore( CRestore &restore ); static TYPEDESCRIPTION m_SaveData[]; void Spawn( void ); void Precache( void ); void EXPORT FollowThink( void ); void EXPORT IgniteThink( void ); void EXPORT RocketTouch( CBaseEntity *pOther ); static CRpgRocket *CreateRpgRocket( Vector vecOrigin, Vector vecAngles, CBaseEntity *pOwner, CRpg *pLauncher ); int m_iTrail; float m_flIgniteTime; CRpg *m_pLauncher;// pointer back to the launcher that fired me. }; class CGauss : public CBasePlayerWeapon { public: #ifndef CLIENT_DLL int Save( CSave &save ); int Restore( CRestore &restore ); static TYPEDESCRIPTION m_SaveData[]; #endif void Spawn( void ); void Precache( void ); int iItemSlot( void ) { return 4; } int GetItemInfo(ItemInfo *p); int AddToPlayer( CBasePlayer *pPlayer ); BOOL Deploy( void ); void Holster( int skiplocal = 0 ); void PrimaryAttack( void ); void SecondaryAttack( void ); void WeaponIdle( void ); void StartFire( void ); void Fire( Vector vecOrigSrc, Vector vecDirShooting, float flDamage ); float GetFullChargeTime( void ); int m_iBalls; int m_iGlow; int m_iBeam; int m_iSoundState; // don't save this // was this weapon just fired primary or secondary? // we need to know so we can pick the right set of effects. BOOL m_fPrimaryFire; virtual BOOL UseDecrement( void ) { #if defined( CLIENT_WEAPONS ) return TRUE; #else return FALSE; #endif } private: unsigned short m_usGaussFire; unsigned short m_usGaussSpin; }; class CEgon : public CBasePlayerWeapon { public: #ifndef CLIENT_DLL int Save( CSave &save ); int Restore( CRestore &restore ); static TYPEDESCRIPTION m_SaveData[]; #endif void Spawn( void ); void Precache( void ); int iItemSlot( void ) { return 4; } int GetItemInfo(ItemInfo *p); int AddToPlayer( CBasePlayer *pPlayer ); BOOL Deploy( void ); void Holster( int skiplocal = 0 ); void UpdateEffect( const Vector &startPoint, const Vector &endPoint, float timeBlend ); void CreateEffect ( void ); void DestroyEffect ( void ); void EndAttack( void ); void Attack( void ); void PrimaryAttack( void ); void WeaponIdle( void ); float m_flAmmoUseTime;// since we use < 1 point of ammo per update, we subtract ammo on a timer. float GetPulseInterval( void ); float GetDischargeInterval( void ); void Fire( const Vector &vecOrigSrc, const Vector &vecDir ); BOOL HasAmmo( void ); void UseAmmo( int count ); enum EGON_FIREMODE { FIRE_NARROW, FIRE_WIDE}; CBeam *m_pBeam; CBeam *m_pNoise; CSprite *m_pSprite; virtual BOOL UseDecrement( void ) { #if defined( CLIENT_WEAPONS ) return TRUE; #else return FALSE; #endif } unsigned short m_usEgonStop; private: float m_shootTime; EGON_FIREMODE m_fireMode; float m_shakeTime; BOOL m_deployed; unsigned short m_usEgonFire; }; class CHgun : public CBasePlayerWeapon { public: void Spawn( void ); void Precache( void ); int iItemSlot( void ) { return 4; } int GetItemInfo(ItemInfo *p); int AddToPlayer( CBasePlayer *pPlayer ); void PrimaryAttack( void ); void SecondaryAttack( void ); BOOL Deploy( void ); BOOL IsUseable( void ); void Holster( int skiplocal = 0 ); void Reload( void ); void WeaponIdle( void ); float m_flNextAnimTime; float m_flRechargeTime; int m_iFirePhase;// don't save me. virtual BOOL UseDecrement( void ) { #if defined( CLIENT_WEAPONS ) return TRUE; #else return FALSE; #endif } private: unsigned short m_usHornetFire; }; class CHandGrenade : public CBasePlayerWeapon { public: void Spawn( void ); void Precache( void ); int iItemSlot( void ) { return 5; } int GetItemInfo(ItemInfo *p); void PrimaryAttack( void ); BOOL Deploy( void ); BOOL CanHolster( void ); void Holster( int skiplocal = 0 ); void WeaponIdle( void ); virtual BOOL UseDecrement( void ) { #if defined( CLIENT_WEAPONS ) return TRUE; #else return FALSE; #endif } }; class CSatchel : public CBasePlayerWeapon { public: #ifndef CLIENT_DLL int Save( CSave &save ); int Restore( CRestore &restore ); static TYPEDESCRIPTION m_SaveData[]; #endif void Spawn( void ); void Precache( void ); int iItemSlot( void ) { return 5; } int GetItemInfo(ItemInfo *p); int AddToPlayer( CBasePlayer *pPlayer ); void PrimaryAttack( void ); void SecondaryAttack( void ); int AddDuplicate( CBasePlayerItem *pOriginal ); BOOL CanDeploy( void ); BOOL Deploy( void ); BOOL IsUseable( void ); void Holster( int skiplocal = 0 ); void WeaponIdle( void ); void Throw( void ); virtual BOOL UseDecrement( void ) { #if defined( CLIENT_WEAPONS ) return TRUE; #else return FALSE; #endif } }; class CTripmine : public CBasePlayerWeapon { public: void Spawn( void ); void Precache( void ); int iItemSlot( void ) { return 5; } int GetItemInfo(ItemInfo *p); void SetObjectCollisionBox( void ) { //!!!BUGBUG - fix the model! pev->absmin = pev->origin + Vector(-16, -16, -5); pev->absmax = pev->origin + Vector(16, 16, 28); } void PrimaryAttack( void ); BOOL Deploy( void ); void Holster( int skiplocal = 0 ); void WeaponIdle( void ); virtual BOOL UseDecrement( void ) { #if defined( CLIENT_WEAPONS ) return TRUE; #else return FALSE; #endif } private: unsigned short m_usTripFire; }; class CSqueak : public CBasePlayerWeapon { public: void Spawn( void ); void Precache( void ); int iItemSlot( void ) { return 5; } int GetItemInfo(ItemInfo *p); void PrimaryAttack( void ); void SecondaryAttack( void ); BOOL Deploy( void ); void Holster( int skiplocal = 0 ); void WeaponIdle( void ); int m_fJustThrown; virtual BOOL UseDecrement( void ) { #if defined( CLIENT_WEAPONS ) return TRUE; #else return FALSE; #endif } private: unsigned short m_usSnarkFire; }; #endif // WEAPONS_H