//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: Base combat character with no AI // // $Workfile: $ // $Date: $ // $NoKeywords: $ //=============================================================================// #ifndef HL1TALKNPC_H #define HL1TALKNPC_H #ifdef _WIN32 #pragma once #endif #include "soundflags.h" #include "ai_task.h" #include "ai_schedule.h" #include "ai_default.h" #include "ai_speech.h" #include "ai_basenpc.h" #include "ai_behavior.h" #include "ai_behavior_follow.h" #include "npc_talker.h" #define SF_NPC_PREDISASTER ( 1 << 16 ) // This is a predisaster scientist or barney. Influences how they speak. //========================================================= // Talking NPC base class // Used for scientists and barneys //========================================================= //============================================================================= // >> CHL1NPCTalker //============================================================================= class CHL1NPCTalker : public CNPCSimpleTalker { DECLARE_CLASS( CHL1NPCTalker, CNPCSimpleTalker ); public: CHL1NPCTalker( void ) { } virtual void Precache(); void StartTask( const Task_t *pTask ); void RunTask( const Task_t *pTask ); int SelectSchedule ( void ); bool HandleInteraction(int interactionType, void *data, CBaseCombatCharacter* sourceEnt); bool ShouldGib( const CTakeDamageInfo &info ); int TranslateSchedule( int scheduleType ); void IdleHeadTurn( CBaseEntity *pTarget, float flDuration = 0.0, float flImportance = 1.0f ); void SetHeadDirection( const Vector &vTargetPos, float flInterval); bool CorpseGib( const CTakeDamageInfo &info ); Disposition_t IRelationType( CBaseEntity *pTarget ); void TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr, CDmgAccumulator *pAccumulator ); void StartFollowing( CBaseEntity *pLeader ); void StopFollowing( void ); int PlayScriptedSentence( const char *pszSentence, float delay, float volume, soundlevel_t soundlevel, bool bConcurrent, CBaseEntity *pListener ); void Touch( CBaseEntity *pOther ); float PickLookTarget( bool bExcludePlayers = false, float minTime = 1.5, float maxTime = 2.5 ); bool OnObstructingDoor( AILocalMoveGoal_t *pMoveGoal, CBaseDoor *pDoor, float distClear, AIMoveResult_t *pResult ); // Hacks! HL2 has a system for avoiding the player, we don't // This ensures that we fall back to the real player avoidance // Essentially does the opposite of what it says virtual bool ShouldPlayerAvoid( void ) { return false; } bool IsValidSpeechTarget( int flags, CBaseEntity *pEntity ); protected: virtual void FollowerUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); int FIdleSpeak ( void ); private: virtual void DeclineFollowing( void ) {} virtual int SelectDeadSchedule( void ); public: bool m_bInBarnacleMouth; enum { SCHED_HL1TALKER_FOLLOW_MOVE_AWAY = BaseClass::NEXT_SCHEDULE, SCHED_HL1TALKER_IDLE_SPEAK_WAIT, SCHED_HL1TALKER_BARNACLE_HIT, SCHED_HL1TALKER_BARNACLE_PULL, SCHED_HL1TALKER_BARNACLE_CHOMP, SCHED_HL1TALKER_BARNACLE_CHEW, NEXT_SCHEDULE, }; enum { TASK_HL1TALKER_FOLLOW_WALK_PATH_FOR_UNITS = BaseClass::NEXT_TASK, NEXT_TASK, }; DECLARE_DATADESC(); DEFINE_CUSTOM_AI; }; #endif //HL1TALKNPC_H