text: //========= Copyright Valve Corporation, All rights reserved. ============//
  //
  // Purpose:
  //
  // $NoKeywords: $
  //=============================================================================//
  
  #ifndef NPC_ASSASSIN_H
  #define NPC_ASSASSIN_H
  #ifdef _WIN32
  #pragma once
  #endif
  
  #include "ai_basenpc.h"
  #include "Sprite.h"
  #include "SpriteTrail.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
  