You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
256 lines
5.7 KiB
256 lines
5.7 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
|
|
#ifndef NPC_CROW_H |
|
#define NPC_CROW_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#define BIRDTYPE_CROW 1 |
|
#define BIRDTYPE_PIGEON 2 |
|
#define BIRDTYPE_SEAGULL 3 |
|
|
|
// |
|
// Spawnflags. |
|
// |
|
#define SF_CROW_FLYING 16 |
|
|
|
#define CROW_TAKEOFF_SPEED 170 |
|
#define CROW_AIRSPEED 220 // FIXME: should be about 440, but I need to add acceleration |
|
|
|
// |
|
// Custom schedules. |
|
// |
|
enum |
|
{ |
|
SCHED_CROW_IDLE_WALK = LAST_SHARED_SCHEDULE, |
|
SCHED_CROW_IDLE_FLY, |
|
|
|
// |
|
// Various levels of wanting to get away from something, selected |
|
// by current value of m_nMorale. |
|
// |
|
SCHED_CROW_WALK_AWAY, |
|
SCHED_CROW_RUN_AWAY, |
|
SCHED_CROW_HOP_AWAY, |
|
SCHED_CROW_FLY_AWAY, |
|
|
|
SCHED_CROW_FLY, |
|
SCHED_CROW_FLY_FAIL, |
|
|
|
SCHED_CROW_BARNACLED, |
|
}; |
|
|
|
|
|
// |
|
// Custom tasks. |
|
// |
|
enum |
|
{ |
|
TASK_CROW_FIND_FLYTO_NODE = LAST_SHARED_TASK, |
|
//TASK_CROW_PREPARE_TO_FLY, |
|
TASK_CROW_TAKEOFF, |
|
//TASK_CROW_LAND, |
|
TASK_CROW_FLY, |
|
TASK_CROW_FLY_TO_HINT, |
|
TASK_CROW_PICK_RANDOM_GOAL, |
|
TASK_CROW_PICK_EVADE_GOAL, |
|
TASK_CROW_HOP, |
|
|
|
TASK_CROW_FALL_TO_GROUND, |
|
TASK_CROW_PREPARE_TO_FLY_RANDOM, |
|
|
|
TASK_CROW_WAIT_FOR_BARNACLE_KILL, |
|
}; |
|
|
|
|
|
// |
|
// Custom conditions. |
|
// |
|
enum |
|
{ |
|
COND_CROW_ENEMY_TOO_CLOSE = LAST_SHARED_CONDITION, |
|
COND_CROW_ENEMY_WAY_TOO_CLOSE, |
|
COND_CROW_FORCED_FLY, |
|
COND_CROW_BARNACLED, |
|
}; |
|
|
|
enum FlyState_t |
|
{ |
|
FlyState_Walking = 0, |
|
FlyState_Flying, |
|
FlyState_Falling, |
|
FlyState_Landing, |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// The crow class. |
|
//----------------------------------------------------------------------------- |
|
class CNPC_Crow : public CAI_BaseNPC |
|
{ |
|
DECLARE_CLASS( CNPC_Crow, CAI_BaseNPC ); |
|
|
|
public: |
|
|
|
// |
|
// CBaseEntity: |
|
// |
|
virtual void Spawn( void ); |
|
virtual void Precache( void ); |
|
|
|
virtual Vector BodyTarget( const Vector &posSrc, bool bNoisy = true ); |
|
|
|
virtual int DrawDebugTextOverlays( void ); |
|
|
|
// |
|
// CBaseCombatCharacter: |
|
// |
|
virtual int OnTakeDamage_Alive( const CTakeDamageInfo &info ); |
|
virtual bool CorpseGib( const CTakeDamageInfo &info ); |
|
bool BecomeRagdollOnClient( const Vector &force ); |
|
|
|
// |
|
// CAI_BaseNPC: |
|
// |
|
virtual float MaxYawSpeed( void ) { return 120.0f; } |
|
|
|
virtual Class_T Classify( void ); |
|
virtual void GatherEnemyConditions( CBaseEntity *pEnemy ); |
|
|
|
virtual void HandleAnimEvent( animevent_t *pEvent ); |
|
virtual int GetSoundInterests( void ); |
|
virtual int SelectSchedule( void ); |
|
virtual void StartTask( const Task_t *pTask ); |
|
virtual void RunTask( const Task_t *pTask ); |
|
|
|
virtual bool HandleInteraction( int interactionType, void *data, CBaseCombatCharacter *sourceEnt ); |
|
|
|
virtual void OnChangeActivity( Activity eNewActivity ); |
|
|
|
virtual bool OverrideMove( float flInterval ); |
|
|
|
virtual bool FValidateHintType( CAI_Hint *pHint ); |
|
virtual Activity GetHintActivity( short sHintType, Activity HintsActivity ); |
|
|
|
virtual void PainSound( const CTakeDamageInfo &info ); |
|
virtual void DeathSound( const CTakeDamageInfo &info ); |
|
virtual void IdleSound( void ); |
|
virtual void AlertSound( void ); |
|
virtual void StopLoopingSounds( void ); |
|
virtual void UpdateEfficiency( bool bInPVS ); |
|
|
|
virtual bool QueryHearSound( CSound *pSound ); |
|
|
|
void InputFlyAway( inputdata_t &inputdata ); |
|
|
|
void TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr, CDmgAccumulator *pAccumulator ); |
|
void StartTargetHandling( CBaseEntity *pTargetEnt ); |
|
|
|
DEFINE_CUSTOM_AI; |
|
DECLARE_DATADESC(); |
|
|
|
int m_iBirdType; |
|
bool m_bOnJeep; |
|
|
|
protected: |
|
void SetFlyingState( FlyState_t eState ); |
|
inline bool IsFlying( void ) const { return GetNavType() == NAV_FLY; } |
|
|
|
void Takeoff( const Vector &vGoal ); |
|
void FlapSound( void ); |
|
|
|
void MoveCrowFly( float flInterval ); |
|
bool Probe( const Vector &vecMoveDir, float flSpeed, Vector &vecDeflect ); |
|
|
|
bool IsDeaf() { return m_bIsDeaf; } |
|
|
|
protected: |
|
float m_flGroundIdleMoveTime; |
|
|
|
float m_flEnemyDist; // Distance to GetEnemy(), cached in GatherEnemyConditions. |
|
int m_nMorale; // Used to determine which avoidance schedule to pick. Degrades as I pick avoidance schedules. |
|
|
|
bool m_bReachedMoveGoal; |
|
|
|
float m_flHopStartZ; // Our Z coordinate when we started a hop. Used to check for accidentally hopping off things. |
|
|
|
bool m_bPlayedLoopingSound; |
|
|
|
private: |
|
|
|
Activity NPC_TranslateActivity( Activity eNewActivity ); |
|
|
|
float m_flSoarTime; |
|
bool m_bSoar; |
|
Vector m_vLastStoredOrigin; |
|
float m_flLastStuckCheck; |
|
|
|
float m_flDangerSoundTime; |
|
|
|
Vector m_vDesiredTarget; |
|
Vector m_vCurrentTarget; |
|
|
|
bool m_bIsDeaf; |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Seagull. Crow with a different model. |
|
//----------------------------------------------------------------------------- |
|
class CNPC_Seagull : public CNPC_Crow |
|
{ |
|
DECLARE_CLASS( CNPC_Seagull, CNPC_Crow ); |
|
|
|
public: |
|
|
|
void Spawn( void ) |
|
{ |
|
SetModelName( AllocPooledString("models/seagull.mdl") ); |
|
BaseClass::Spawn(); |
|
|
|
m_iBirdType = BIRDTYPE_SEAGULL; |
|
} |
|
|
|
void PainSound( const CTakeDamageInfo &info ) |
|
{ |
|
EmitSound( "NPC_Seagull.Pain" ); |
|
} |
|
|
|
void DeathSound( const CTakeDamageInfo &info ) |
|
{ |
|
EmitSound( "NPC_Seagull.Pain" ); |
|
} |
|
|
|
void IdleSound( void ) |
|
{ |
|
EmitSound( "NPC_Seagull.Idle" ); |
|
} |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Pigeon. Crow with a different model. |
|
//----------------------------------------------------------------------------- |
|
class CNPC_Pigeon : public CNPC_Crow |
|
{ |
|
DECLARE_CLASS( CNPC_Pigeon, CNPC_Crow ); |
|
|
|
public: |
|
void Spawn( void ) |
|
{ |
|
SetModelName( AllocPooledString("models/pigeon.mdl") ); |
|
BaseClass::Spawn(); |
|
|
|
m_iBirdType = BIRDTYPE_PIGEON; |
|
} |
|
|
|
void IdleSound( void ) |
|
{ |
|
EmitSound( "NPC_Pigeon.Idle" ); |
|
} |
|
}; |
|
|
|
#endif // NPC_CROW_H
|
|
|