aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/server/hl2/npc_BaseZombie.h
diff options
context:
space:
mode:
Diffstat (limited to 'mp/src/game/server/hl2/npc_BaseZombie.h')
-rw-r--r--mp/src/game/server/hl2/npc_BaseZombie.h582
1 files changed, 291 insertions, 291 deletions
diff --git a/mp/src/game/server/hl2/npc_BaseZombie.h b/mp/src/game/server/hl2/npc_BaseZombie.h
index 85513291..d4800f3c 100644
--- a/mp/src/game/server/hl2/npc_BaseZombie.h
+++ b/mp/src/game/server/hl2/npc_BaseZombie.h
@@ -1,291 +1,291 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-// $NoKeywords: $
-//=============================================================================//
-
-#ifndef NPC_BASEZOMBIE_H
-#define NPC_BASEZOMBIE_H
-#ifdef _WIN32
-#pragma once
-#endif
-
-#include "ai_basenpc.h"
-#include "ai_blended_movement.h"
-#include "soundenvelope.h"
-#include "ai_behavior_actbusy.h"
-
-#define ZOM_ATTN_FOOTSTEP ATTN_IDLE
-
-#define ENVELOPE_CONTROLLER (CSoundEnvelopeController::GetController())
-
-#define ZOMBIE_MELEE_REACH 55
-
-extern int AE_ZOMBIE_ATTACK_RIGHT;
-extern int AE_ZOMBIE_ATTACK_LEFT;
-extern int AE_ZOMBIE_ATTACK_BOTH;
-extern int AE_ZOMBIE_SWATITEM;
-extern int AE_ZOMBIE_STARTSWAT;
-extern int AE_ZOMBIE_STEP_LEFT;
-extern int AE_ZOMBIE_STEP_RIGHT;
-extern int AE_ZOMBIE_SCUFF_LEFT;
-extern int AE_ZOMBIE_SCUFF_RIGHT;
-extern int AE_ZOMBIE_ATTACK_SCREAM;
-extern int AE_ZOMBIE_GET_UP;
-extern int AE_ZOMBIE_POUND;
-
-#define ZOMBIE_BODYGROUP_HEADCRAB 1 // The crab on our head
-
-// Pass these to claw attack so we know where to draw the blood.
-#define ZOMBIE_BLOOD_LEFT_HAND 0
-#define ZOMBIE_BLOOD_RIGHT_HAND 1
-#define ZOMBIE_BLOOD_BOTH_HANDS 2
-#define ZOMBIE_BLOOD_BITE 3
-
-
-enum HeadcrabRelease_t
-{
- RELEASE_NO,
- RELEASE_IMMEDIATE, // release the headcrab right now!
- RELEASE_SCHEDULED, // release the headcrab through the AI schedule.
- RELEASE_VAPORIZE, // just destroy the crab.
- RELEASE_RAGDOLL, // release a dead crab
- RELEASE_RAGDOLL_SLICED_OFF // toss the crab up a bit
-};
-
-
-//=========================================================
-// schedules
-//=========================================================
-enum
-{
- SCHED_ZOMBIE_CHASE_ENEMY = LAST_SHARED_SCHEDULE,
- SCHED_ZOMBIE_MOVE_SWATITEM,
- SCHED_ZOMBIE_SWATITEM,
- SCHED_ZOMBIE_ATTACKITEM,
- SCHED_ZOMBIE_RELEASECRAB,
- SCHED_ZOMBIE_MOVE_TO_AMBUSH,
- SCHED_ZOMBIE_WAIT_AMBUSH,
- SCHED_ZOMBIE_WANDER_MEDIUM, // medium range wandering behavior.
- SCHED_ZOMBIE_WANDER_FAIL,
- SCHED_ZOMBIE_WANDER_STANDOFF,
- SCHED_ZOMBIE_MELEE_ATTACK1,
- SCHED_ZOMBIE_POST_MELEE_WAIT,
-
- LAST_BASE_ZOMBIE_SCHEDULE,
-};
-
-//=========================================================
-// tasks
-//=========================================================
-enum
-{
- TASK_ZOMBIE_DELAY_SWAT = LAST_SHARED_TASK,
- TASK_ZOMBIE_GET_PATH_TO_PHYSOBJ,
- TASK_ZOMBIE_SWAT_ITEM,
- TASK_ZOMBIE_DIE,
- TASK_ZOMBIE_RELEASE_HEADCRAB,
- TASK_ZOMBIE_WAIT_POST_MELEE,
-
- LAST_BASE_ZOMBIE_TASK,
-};
-
-
-//=========================================================
-// Zombie conditions
-//=========================================================
-enum Zombie_Conds
-{
- COND_ZOMBIE_CAN_SWAT_ATTACK = LAST_SHARED_CONDITION,
- COND_ZOMBIE_RELEASECRAB,
- COND_ZOMBIE_LOCAL_MELEE_OBSTRUCTION,
-
- LAST_BASE_ZOMBIE_CONDITION,
-};
-
-
-
-typedef CAI_BlendingHost< CAI_BehaviorHost<CAI_BaseNPC> > CAI_BaseZombieBase;
-
-//=========================================================
-//=========================================================
-abstract_class CNPC_BaseZombie : public CAI_BaseZombieBase
-{
- DECLARE_CLASS( CNPC_BaseZombie, CAI_BaseZombieBase );
-
-public:
- CNPC_BaseZombie( void );
- ~CNPC_BaseZombie( void );
-
- void Spawn( void );
- void Precache( void );
- void StartTouch( CBaseEntity *pOther );
- bool CreateBehaviors();
- float MaxYawSpeed( void );
- bool OverrideMoveFacing( const AILocalMoveGoal_t &move, float flInterval );
- Class_T Classify( void );
- Disposition_t IRelationType( CBaseEntity *pTarget );
- void HandleAnimEvent( animevent_t *pEvent );
-
- void OnStateChange( NPC_STATE OldState, NPC_STATE NewState );
-
- void KillMe( void )
- {
- m_iHealth = 5;
- OnTakeDamage( CTakeDamageInfo( this, this, m_iHealth * 2, DMG_GENERIC ) );
- }
-
- int MeleeAttack1Conditions ( float flDot, float flDist );
- virtual float GetClawAttackRange() const { return ZOMBIE_MELEE_REACH; }
-
- // No range attacks
- int RangeAttack1Conditions ( float flDot, float flDist ) { return( 0 ); }
-
- virtual float GetHitgroupDamageMultiplier( int iHitGroup, const CTakeDamageInfo &info );
- void TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr, CDmgAccumulator *pAccumulator );
- int OnTakeDamage_Alive( const CTakeDamageInfo &info );
- virtual float GetReactionDelay( CBaseEntity *pEnemy ) { return 0.0; }
-
- virtual int SelectSchedule ( void );
- virtual int SelectFailSchedule( int failedSchedule, int failedTask, AI_TaskFailureCode_t taskFailCode );
- virtual void BuildScheduleTestBits( void );
-
- virtual int TranslateSchedule( int scheduleType );
- virtual Activity NPC_TranslateActivity( Activity baseAct );
-
- void StartTask( const Task_t *pTask );
- void RunTask( const Task_t *pTask );
-
- void GatherConditions( void );
- void PrescheduleThink( void );
-
- virtual void Event_Killed( const CTakeDamageInfo &info );
- virtual bool BecomeRagdoll( const CTakeDamageInfo &info, const Vector &forceVector );
- void StopLoopingSounds();
- virtual void OnScheduleChange( void );
-
- virtual void PoundSound();
-
- // Custom damage/death
- bool ShouldIgnite( const CTakeDamageInfo &info );
- bool ShouldIgniteZombieGib( void );
- virtual bool IsChopped( const CTakeDamageInfo &info );
- virtual bool IsSquashed( const CTakeDamageInfo &info ) { return false; }
- virtual void DieChopped( const CTakeDamageInfo &info );
- virtual void Ignite( float flFlameLifetime, bool bNPCOnly = true, float flSize = 0.0f, bool bCalledByLevelDesigner = false );
- void CopyRenderColorTo( CBaseEntity *pOther );
-
- virtual bool ShouldBecomeTorso( const CTakeDamageInfo &info, float flDamageThreshold );
- virtual HeadcrabRelease_t ShouldReleaseHeadcrab( const CTakeDamageInfo &info, float flDamageThreshold );
-
- // Headcrab releasing/breaking apart
- void RemoveHead( void );
- virtual void SetZombieModel( void ) { };
- virtual void BecomeTorso( const Vector &vecTorsoForce, const Vector &vecLegsForce );
- virtual bool CanBecomeLiveTorso() { return false; }
- virtual bool HeadcrabFits( CBaseAnimating *pCrab );
- void ReleaseHeadcrab( const Vector &vecOrigin, const Vector &vecVelocity, bool fRemoveHead, bool fRagdollBody, bool fRagdollCrab = false );
- void SetHeadcrabSpawnLocation( int iCrabAttachment, CBaseAnimating *pCrab );
-
- // Slumping/sleeping
- bool IsSlumped( void );
- bool IsGettingUp( void );
-
- // Swatting physics objects
- int GetSwatActivity( void );
- bool FindNearestPhysicsObject( int iMaxMass );
- float DistToPhysicsEnt( void );
- virtual bool CanSwatPhysicsObjects( void ) { return true; }
-
- // Returns whether we must be very near our enemy to attack them.
- virtual bool MustCloseToAttack(void) { return true; }
-
- virtual CBaseEntity *ClawAttack( float flDist, int iDamage, QAngle &qaViewPunch, Vector &vecVelocityPunch, int BloodOrigin );
-
- // Sounds & sound envelope
- virtual bool ShouldPlayFootstepMoan( void );
- virtual void PainSound( const CTakeDamageInfo &info ) = 0;
- virtual void AlertSound( void ) = 0;
- virtual void IdleSound( void ) = 0;
- virtual void AttackSound( void ) = 0;
- virtual void AttackHitSound( void ) = 0;
- virtual void AttackMissSound( void ) = 0;
- virtual void FootstepSound( bool fRightFoot ) = 0;
- virtual void FootscuffSound( bool fRightFoot ) = 0;
-
- // make a sound Alyx can hear when in darkness mode
- void MakeAISpookySound( float volume, float duration = 0.5 );
-
- virtual bool CanPlayMoanSound();
- virtual void MoanSound( envelopePoint_t *pEnvelope, int iEnvelopeSize );
- bool ShouldPlayIdleSound( void ) { return false; }
-
- virtual const char *GetMoanSound( int nSound ) = 0;
- virtual const char *GetHeadcrabClassname( void ) = 0;
- virtual const char *GetLegsModel( void ) = 0;
- virtual const char *GetTorsoModel( void ) = 0;
- virtual const char *GetHeadcrabModel( void ) = 0;
-
- virtual Vector BodyTarget( const Vector &posSrc, bool bNoisy );
- virtual Vector HeadTarget( const Vector &posSrc );
- virtual float GetAutoAimRadius();
- virtual void TranslateNavGoal( CBaseEntity *pEnemy, Vector &chasePosition );
-
- bool OnInsufficientStopDist( AILocalMoveGoal_t *pMoveGoal, float distClear, AIMoveResult_t *pResult );
-
- virtual bool AllowedToIgnite( void ) { return true; }
-
-public:
- CAI_ActBusyBehavior m_ActBusyBehavior;
-
-
-
-protected:
-
- CSoundPatch *m_pMoanSound;
-
- bool m_fIsTorso; // is this is a half-zombie?
- bool m_fIsHeadless; // is this zombie headless
-
- float m_flNextFlinch;
-
- bool m_bHeadShot; // Used to determine the survival of our crab beyond our death.
-
- //
- // Zombies catch on fire if they take too much burn damage in a given time period.
- //
- float m_flBurnDamage; // Keeps track of how much burn damage we've incurred in the last few seconds.
- float m_flBurnDamageResetTime; // Time at which we reset the burn damage.
-
- EHANDLE m_hPhysicsEnt;
-
- float m_flNextMoanSound;
- float m_flNextSwat;
- float m_flNextSwatScan;
- float m_crabHealth;
- float m_flMoanPitch;
-
- EHANDLE m_hObstructor;
-
- static int g_numZombies; // counts total number of existing zombies.
-
- int m_iMoanSound; // each zombie picks one of the 4 and keeps it.
-
- static int ACT_ZOM_SWATLEFTMID;
- static int ACT_ZOM_SWATRIGHTMID;
- static int ACT_ZOM_SWATLEFTLOW;
- static int ACT_ZOM_SWATRIGHTLOW;
- static int ACT_ZOM_RELEASECRAB;
- static int ACT_ZOM_FALL;
-
- DECLARE_DATADESC();
-
- DEFINE_CUSTOM_AI;
-
-private:
- bool m_bIsSlumped;
-
-};
-
-#endif // NPC_BASEZOMBIE_H
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef NPC_BASEZOMBIE_H
+#define NPC_BASEZOMBIE_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "ai_basenpc.h"
+#include "ai_blended_movement.h"
+#include "soundenvelope.h"
+#include "ai_behavior_actbusy.h"
+
+#define ZOM_ATTN_FOOTSTEP ATTN_IDLE
+
+#define ENVELOPE_CONTROLLER (CSoundEnvelopeController::GetController())
+
+#define ZOMBIE_MELEE_REACH 55
+
+extern int AE_ZOMBIE_ATTACK_RIGHT;
+extern int AE_ZOMBIE_ATTACK_LEFT;
+extern int AE_ZOMBIE_ATTACK_BOTH;
+extern int AE_ZOMBIE_SWATITEM;
+extern int AE_ZOMBIE_STARTSWAT;
+extern int AE_ZOMBIE_STEP_LEFT;
+extern int AE_ZOMBIE_STEP_RIGHT;
+extern int AE_ZOMBIE_SCUFF_LEFT;
+extern int AE_ZOMBIE_SCUFF_RIGHT;
+extern int AE_ZOMBIE_ATTACK_SCREAM;
+extern int AE_ZOMBIE_GET_UP;
+extern int AE_ZOMBIE_POUND;
+
+#define ZOMBIE_BODYGROUP_HEADCRAB 1 // The crab on our head
+
+// Pass these to claw attack so we know where to draw the blood.
+#define ZOMBIE_BLOOD_LEFT_HAND 0
+#define ZOMBIE_BLOOD_RIGHT_HAND 1
+#define ZOMBIE_BLOOD_BOTH_HANDS 2
+#define ZOMBIE_BLOOD_BITE 3
+
+
+enum HeadcrabRelease_t
+{
+ RELEASE_NO,
+ RELEASE_IMMEDIATE, // release the headcrab right now!
+ RELEASE_SCHEDULED, // release the headcrab through the AI schedule.
+ RELEASE_VAPORIZE, // just destroy the crab.
+ RELEASE_RAGDOLL, // release a dead crab
+ RELEASE_RAGDOLL_SLICED_OFF // toss the crab up a bit
+};
+
+
+//=========================================================
+// schedules
+//=========================================================
+enum
+{
+ SCHED_ZOMBIE_CHASE_ENEMY = LAST_SHARED_SCHEDULE,
+ SCHED_ZOMBIE_MOVE_SWATITEM,
+ SCHED_ZOMBIE_SWATITEM,
+ SCHED_ZOMBIE_ATTACKITEM,
+ SCHED_ZOMBIE_RELEASECRAB,
+ SCHED_ZOMBIE_MOVE_TO_AMBUSH,
+ SCHED_ZOMBIE_WAIT_AMBUSH,
+ SCHED_ZOMBIE_WANDER_MEDIUM, // medium range wandering behavior.
+ SCHED_ZOMBIE_WANDER_FAIL,
+ SCHED_ZOMBIE_WANDER_STANDOFF,
+ SCHED_ZOMBIE_MELEE_ATTACK1,
+ SCHED_ZOMBIE_POST_MELEE_WAIT,
+
+ LAST_BASE_ZOMBIE_SCHEDULE,
+};
+
+//=========================================================
+// tasks
+//=========================================================
+enum
+{
+ TASK_ZOMBIE_DELAY_SWAT = LAST_SHARED_TASK,
+ TASK_ZOMBIE_GET_PATH_TO_PHYSOBJ,
+ TASK_ZOMBIE_SWAT_ITEM,
+ TASK_ZOMBIE_DIE,
+ TASK_ZOMBIE_RELEASE_HEADCRAB,
+ TASK_ZOMBIE_WAIT_POST_MELEE,
+
+ LAST_BASE_ZOMBIE_TASK,
+};
+
+
+//=========================================================
+// Zombie conditions
+//=========================================================
+enum Zombie_Conds
+{
+ COND_ZOMBIE_CAN_SWAT_ATTACK = LAST_SHARED_CONDITION,
+ COND_ZOMBIE_RELEASECRAB,
+ COND_ZOMBIE_LOCAL_MELEE_OBSTRUCTION,
+
+ LAST_BASE_ZOMBIE_CONDITION,
+};
+
+
+
+typedef CAI_BlendingHost< CAI_BehaviorHost<CAI_BaseNPC> > CAI_BaseZombieBase;
+
+//=========================================================
+//=========================================================
+abstract_class CNPC_BaseZombie : public CAI_BaseZombieBase
+{
+ DECLARE_CLASS( CNPC_BaseZombie, CAI_BaseZombieBase );
+
+public:
+ CNPC_BaseZombie( void );
+ ~CNPC_BaseZombie( void );
+
+ void Spawn( void );
+ void Precache( void );
+ void StartTouch( CBaseEntity *pOther );
+ bool CreateBehaviors();
+ float MaxYawSpeed( void );
+ bool OverrideMoveFacing( const AILocalMoveGoal_t &move, float flInterval );
+ Class_T Classify( void );
+ Disposition_t IRelationType( CBaseEntity *pTarget );
+ void HandleAnimEvent( animevent_t *pEvent );
+
+ void OnStateChange( NPC_STATE OldState, NPC_STATE NewState );
+
+ void KillMe( void )
+ {
+ m_iHealth = 5;
+ OnTakeDamage( CTakeDamageInfo( this, this, m_iHealth * 2, DMG_GENERIC ) );
+ }
+
+ int MeleeAttack1Conditions ( float flDot, float flDist );
+ virtual float GetClawAttackRange() const { return ZOMBIE_MELEE_REACH; }
+
+ // No range attacks
+ int RangeAttack1Conditions ( float flDot, float flDist ) { return( 0 ); }
+
+ virtual float GetHitgroupDamageMultiplier( int iHitGroup, const CTakeDamageInfo &info );
+ void TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr, CDmgAccumulator *pAccumulator );
+ int OnTakeDamage_Alive( const CTakeDamageInfo &info );
+ virtual float GetReactionDelay( CBaseEntity *pEnemy ) { return 0.0; }
+
+ virtual int SelectSchedule ( void );
+ virtual int SelectFailSchedule( int failedSchedule, int failedTask, AI_TaskFailureCode_t taskFailCode );
+ virtual void BuildScheduleTestBits( void );
+
+ virtual int TranslateSchedule( int scheduleType );
+ virtual Activity NPC_TranslateActivity( Activity baseAct );
+
+ void StartTask( const Task_t *pTask );
+ void RunTask( const Task_t *pTask );
+
+ void GatherConditions( void );
+ void PrescheduleThink( void );
+
+ virtual void Event_Killed( const CTakeDamageInfo &info );
+ virtual bool BecomeRagdoll( const CTakeDamageInfo &info, const Vector &forceVector );
+ void StopLoopingSounds();
+ virtual void OnScheduleChange( void );
+
+ virtual void PoundSound();
+
+ // Custom damage/death
+ bool ShouldIgnite( const CTakeDamageInfo &info );
+ bool ShouldIgniteZombieGib( void );
+ virtual bool IsChopped( const CTakeDamageInfo &info );
+ virtual bool IsSquashed( const CTakeDamageInfo &info ) { return false; }
+ virtual void DieChopped( const CTakeDamageInfo &info );
+ virtual void Ignite( float flFlameLifetime, bool bNPCOnly = true, float flSize = 0.0f, bool bCalledByLevelDesigner = false );
+ void CopyRenderColorTo( CBaseEntity *pOther );
+
+ virtual bool ShouldBecomeTorso( const CTakeDamageInfo &info, float flDamageThreshold );
+ virtual HeadcrabRelease_t ShouldReleaseHeadcrab( const CTakeDamageInfo &info, float flDamageThreshold );
+
+ // Headcrab releasing/breaking apart
+ void RemoveHead( void );
+ virtual void SetZombieModel( void ) { };
+ virtual void BecomeTorso( const Vector &vecTorsoForce, const Vector &vecLegsForce );
+ virtual bool CanBecomeLiveTorso() { return false; }
+ virtual bool HeadcrabFits( CBaseAnimating *pCrab );
+ void ReleaseHeadcrab( const Vector &vecOrigin, const Vector &vecVelocity, bool fRemoveHead, bool fRagdollBody, bool fRagdollCrab = false );
+ void SetHeadcrabSpawnLocation( int iCrabAttachment, CBaseAnimating *pCrab );
+
+ // Slumping/sleeping
+ bool IsSlumped( void );
+ bool IsGettingUp( void );
+
+ // Swatting physics objects
+ int GetSwatActivity( void );
+ bool FindNearestPhysicsObject( int iMaxMass );
+ float DistToPhysicsEnt( void );
+ virtual bool CanSwatPhysicsObjects( void ) { return true; }
+
+ // Returns whether we must be very near our enemy to attack them.
+ virtual bool MustCloseToAttack(void) { return true; }
+
+ virtual CBaseEntity *ClawAttack( float flDist, int iDamage, QAngle &qaViewPunch, Vector &vecVelocityPunch, int BloodOrigin );
+
+ // Sounds & sound envelope
+ virtual bool ShouldPlayFootstepMoan( void );
+ virtual void PainSound( const CTakeDamageInfo &info ) = 0;
+ virtual void AlertSound( void ) = 0;
+ virtual void IdleSound( void ) = 0;
+ virtual void AttackSound( void ) = 0;
+ virtual void AttackHitSound( void ) = 0;
+ virtual void AttackMissSound( void ) = 0;
+ virtual void FootstepSound( bool fRightFoot ) = 0;
+ virtual void FootscuffSound( bool fRightFoot ) = 0;
+
+ // make a sound Alyx can hear when in darkness mode
+ void MakeAISpookySound( float volume, float duration = 0.5 );
+
+ virtual bool CanPlayMoanSound();
+ virtual void MoanSound( envelopePoint_t *pEnvelope, int iEnvelopeSize );
+ bool ShouldPlayIdleSound( void ) { return false; }
+
+ virtual const char *GetMoanSound( int nSound ) = 0;
+ virtual const char *GetHeadcrabClassname( void ) = 0;
+ virtual const char *GetLegsModel( void ) = 0;
+ virtual const char *GetTorsoModel( void ) = 0;
+ virtual const char *GetHeadcrabModel( void ) = 0;
+
+ virtual Vector BodyTarget( const Vector &posSrc, bool bNoisy );
+ virtual Vector HeadTarget( const Vector &posSrc );
+ virtual float GetAutoAimRadius();
+ virtual void TranslateNavGoal( CBaseEntity *pEnemy, Vector &chasePosition );
+
+ bool OnInsufficientStopDist( AILocalMoveGoal_t *pMoveGoal, float distClear, AIMoveResult_t *pResult );
+
+ virtual bool AllowedToIgnite( void ) { return true; }
+
+public:
+ CAI_ActBusyBehavior m_ActBusyBehavior;
+
+
+
+protected:
+
+ CSoundPatch *m_pMoanSound;
+
+ bool m_fIsTorso; // is this is a half-zombie?
+ bool m_fIsHeadless; // is this zombie headless
+
+ float m_flNextFlinch;
+
+ bool m_bHeadShot; // Used to determine the survival of our crab beyond our death.
+
+ //
+ // Zombies catch on fire if they take too much burn damage in a given time period.
+ //
+ float m_flBurnDamage; // Keeps track of how much burn damage we've incurred in the last few seconds.
+ float m_flBurnDamageResetTime; // Time at which we reset the burn damage.
+
+ EHANDLE m_hPhysicsEnt;
+
+ float m_flNextMoanSound;
+ float m_flNextSwat;
+ float m_flNextSwatScan;
+ float m_crabHealth;
+ float m_flMoanPitch;
+
+ EHANDLE m_hObstructor;
+
+ static int g_numZombies; // counts total number of existing zombies.
+
+ int m_iMoanSound; // each zombie picks one of the 4 and keeps it.
+
+ static int ACT_ZOM_SWATLEFTMID;
+ static int ACT_ZOM_SWATRIGHTMID;
+ static int ACT_ZOM_SWATLEFTLOW;
+ static int ACT_ZOM_SWATRIGHTLOW;
+ static int ACT_ZOM_RELEASECRAB;
+ static int ACT_ZOM_FALL;
+
+ DECLARE_DATADESC();
+
+ DEFINE_CUSTOM_AI;
+
+private:
+ bool m_bIsSlumped;
+
+};
+
+#endif // NPC_BASEZOMBIE_H