//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef NPC_ASSASSIN_H #define NPC_ASSASSIN_H #ifdef _WIN32 #pragma once #endif #include "Sprite.h" #include "SpriteTrail.h" #include "ai_basenpc.h" #include "soundent.h" // Eye states enum eyeState_t { ASSASSIN_EYE_SEE_TARGET = 0, // Sees the target, bright and big ASSASSIN_EYE_SEEKING_TARGET, // Looking for a target, blinking (bright) ASSASSIN_EYE_ACTIVE, // Actively looking ASSASSIN_EYE_DORMANT, // Not active ASSASSIN_EYE_DEAD, // Completely invisible }; //========================================================= //========================================================= class CNPC_Assassin : public CAI_BaseNPC { public: DECLARE_CLASS(CNPC_Assassin, CAI_BaseNPC); // DECLARE_SERVERCLASS(); DECLARE_DATADESC(); CNPC_Assassin(void); Class_T Classify(void) { return CLASS_COMBINE; } int GetSoundInterests(void) { return (SOUND_WORLD | SOUND_COMBAT | SOUND_PLAYER); } int SelectSchedule(void); int MeleeAttack1Conditions(float flDot, float flDist); int RangeAttack1Conditions(float flDot, float flDist); int RangeAttack2Conditions(float flDot, float flDist); void Precache(void); void Spawn(void); void PrescheduleThink(void); void HandleAnimEvent(animevent_t *pEvent); void StartTask(const Task_t *pTask); void RunTask(const Task_t *pTask); void OnScheduleChange(void); void GatherEnemyConditions(CBaseEntity *pEnemy); void BuildScheduleTestBits(void); void Event_Killed(const CTakeDamageInfo &info); bool FValidateHintType(CAI_Hint *pHint); bool IsJumpLegal(const Vector &startPos, const Vector &apex, const Vector &endPos) const; bool MovementCost(int moveType, const Vector &vecStart, const Vector &vecEnd, float *pCost); float MaxYawSpeed(void); const Vector &GetViewOffset(void); private: void SetEyeState(eyeState_t state); void FirePistol(int hand); bool CanFlip(int flipType, Activity &activity, const Vector *avoidPosition); int m_nNumFlips; int m_nLastFlipType; float m_flNextFlipTime; // Next earliest time the assassin can flip again float m_flNextLungeTime; float m_flNextShotTime; bool m_bEvade; bool m_bAggressive; // Sets certain state, including whether or not her eye // is visible bool m_bBlinkState; CSprite *m_pEyeSprite; CSpriteTrail *m_pEyeTrail; DEFINE_CUSTOM_AI; }; #endif // NPC_ASSASSIN_H