hlsdk-xash3d/dlls/talkmonster.h

184 lines
6.1 KiB
C++

/***
*
* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
*
* This product contains software technology licensed from Id
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
* All Rights Reserved.
*
* This source code contains proprietary and confidential information of
* Valve LLC and its suppliers. Access to this code is restricted to
* persons who have executed a written SDK license with Valve. Any access,
* use or distribution of this code by or to any unlicensed person is illegal.
*
****/
#ifndef TALKMONSTER_H
#define TALKMONSTER_H
#ifndef MONSTERS_H
#include "monsters.h"
#endif
//=========================================================
// Talking monster base class
// Used for scientists and barneys
//=========================================================
#define TALKRANGE_MIN 500.0 // don't talk to anyone farther away than this
#define TLK_STARE_DIST 128 // anyone closer than this and looking at me is probably staring at me.
#define bit_saidDamageLight (1<<0) // bits so we don't repeat key sentences
#define bit_saidDamageMedium (1<<1)
#define bit_saidDamageHeavy (1<<2)
#define bit_saidHelloPlayer (1<<3)
#define bit_saidWoundLight (1<<4)
#define bit_saidWoundHeavy (1<<5)
#define bit_saidHeard (1<<6)
#define bit_saidSmelled (1<<7)
#define TLK_CFRIENDS 3
typedef enum
{
TLK_ANSWER = 0,
TLK_QUESTION,
TLK_IDLE,
TLK_STARE,
TLK_USE,
TLK_UNUSE,
TLK_STOP,
TLK_NOSHOOT,
TLK_HELLO,
TLK_PHELLO,
TLK_PIDLE,
TLK_PQUESTION,
TLK_PLHURT1,
TLK_PLHURT2,
TLK_PLHURT3,
TLK_SMELL,
TLK_WOUND,
TLK_MORTAL,
TLK_CGROUPS, // MUST be last entry
} TALKGROUPNAMES;
enum
{
SCHED_CANT_FOLLOW = LAST_COMMON_SCHEDULE + 1,
SCHED_MOVE_AWAY, // Try to get out of the player's way
SCHED_MOVE_AWAY_FOLLOW, // same, but follow afterward
SCHED_MOVE_AWAY_FAIL, // Turn back toward player
LAST_TALKMONSTER_SCHEDULE, // MUST be last
};
enum
{
TASK_CANT_FOLLOW = LAST_COMMON_TASK + 1,
TASK_MOVE_AWAY_PATH,
TASK_WALK_PATH_FOR_UNITS,
TASK_TLK_RESPOND, // say my response
TASK_TLK_SPEAK, // question or remark
TASK_TLK_HELLO, // Try to say hello to player
TASK_TLK_HEADRESET, // reset head position
TASK_TLK_STOPSHOOTING, // tell player to stop shooting friend
TASK_TLK_STARE, // let the player know I know he's staring at me.
TASK_TLK_LOOK_AT_CLIENT,// faces player if not moving and not talking and in idle.
TASK_TLK_CLIENT_STARE, // same as look at client, but says something if the player stares.
TASK_TLK_EYECONTACT, // maintain eyecontact with person who I'm talking to
TASK_TLK_IDEALYAW, // set ideal yaw to face who I'm talking to
TASK_FACE_PLAYER, // Face the player
LAST_TALKMONSTER_TASK, // MUST be last
};
class CTalkMonster : public CBaseMonster
{
public:
void TalkInit( void );
CBaseEntity *FindNearestFriend(BOOL fPlayer);
float TargetDistance( void );
void StopTalking( void ) { SentenceStop(); }
// Base Monster functions
void Precache( void );
int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType);
void Touch( CBaseEntity *pOther );
void Killed( entvars_t *pevAttacker, int iGib );
int IRelationship ( CBaseEntity *pTarget );
virtual int CanPlaySentence( BOOL fDisregardState );
virtual void PlaySentence( const char *pszSentence, float duration, float volume, float attenuation );
void PlayScriptedSentence( const char *pszSentence, float duration, float volume, float attenuation, BOOL bConcurrent, CBaseEntity *pListener );
void KeyValue( KeyValueData *pkvd );
// AI functions
void SetActivity ( Activity newActivity );
Schedule_t *GetScheduleOfType ( int Type );
void StartTask( Task_t *pTask );
void RunTask( Task_t *pTask );
void HandleAnimEvent( MonsterEvent_t *pEvent );
void PrescheduleThink( void );
// Conversations / communication
int GetVoicePitch( void );
void IdleRespond( void );
int FIdleSpeak( void );
int FIdleStare( void );
int FIdleHello( void );
void IdleHeadTurn( Vector &vecFriend );
int FOkToSpeak( void );
void TrySmellTalk( void );
CBaseEntity *EnumFriends( CBaseEntity *pentPrevious, int listNumber, BOOL bTrace );
void AlertFriends( void );
void ShutUpFriends( void );
BOOL IsTalking( void );
void Talk( float flDuration );
// For following
BOOL CanFollow( void );
BOOL IsFollowing( void ) { return m_hTargetEnt != NULL && m_hTargetEnt->IsPlayer(); }
void StopFollowing( BOOL clearSchedule );
void StartFollowing( CBaseEntity *pLeader );
virtual void DeclineFollowing( void ) {}
void LimitFollowers( CBaseEntity *pPlayer, int maxFollowers );
void EXPORT FollowerUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
virtual void SetAnswerQuestion( CTalkMonster *pSpeaker );
virtual int FriendNumber( int arrayNumber ) { return arrayNumber; }
virtual int Save( CSave &save );
virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
static char *m_szFriends[TLK_CFRIENDS]; // array of friend names
static float g_talkWaitTime;
int m_bitsSaid; // set bits for sentences we don't want repeated
int m_nSpeak; // number of times initiated talking
int m_voicePitch; // pitch of voice for this head
const char *m_szGrp[TLK_CGROUPS]; // sentence group names
float m_useTime; // Don't allow +USE until this time
int m_iszUse; // Custom +USE sentence group (follow)
int m_iszUnUse; // Custom +USE sentence group (stop following)
float m_flLastSaidSmelled;// last time we talked about something that stinks
float m_flStopTalkTime;// when in the future that I'll be done saying this sentence.
EHANDLE m_hTalkTarget; // who to look at while talking
CUSTOM_SCHEDULES;
};
// Clients can push talkmonsters out of their way
#define bits_COND_CLIENT_PUSH ( bits_COND_SPECIAL1 )
// Don't see a client right now.
#define bits_COND_CLIENT_UNSEEN ( bits_COND_SPECIAL2 )
#endif //TALKMONSTER_H