nuclide/src/gs-entbase/shared/NSMonster.h

292 lines
6.7 KiB
C++

/*
* Copyright (c) 2016-2020 Marco Cawthorne <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
typedef enum {
ACT_RESET = 0,
ACT_IDLE = 1i,
ACT_GUARD,
ACT_WALK,
ACT_RUN,
ACT_FLY,
ACT_SWIM,
ACT_HOP,
ACT_LEAP,
ACT_FALL,
ACT_LAND,
ACT_STRAFE_LEFT,
ACT_STRAFE_RIGHT,
ACT_ROLL_LEFT,
ACT_ROLL_RIGHT,
ACT_TURN_LEFT,
ACT_TURN_RIGHT,
ACT_CROUCH,
ACT_CROUCHIDLE,
ACT_STAND,
ACT_USE,
ACT_SIGNAL1,
ACT_SIGNAL2,
ACT_SIGNAL3,
ACT_TWITCH,
ACT_COWER,
ACT_SMALL_FLINCH,
ACT_BIG_FLINCH,
ACT_RANGE_ATTACK1,
ACT_RANGE_ATTACK2,
ACT_MELEE_ATTACK1,
ACT_MELEE_ATTACK2,
ACT_RELOAD,
ACT_ARM,
ACT_DISARM,
ACT_EAT,
ACT_DIESIMPLE,
ACT_DIEBACKWARD,
ACT_DIEFORWARD,
ACT_DIEVIOLENT,
ACT_BARNACLE_HIT,
ACT_BARNACLE_PULL,
ACT_BARNACLE_CHOMP,
ACT_BARNACLE_CHEW,
ACT_SLEEP,
ACT_INSPECT_FLOOR,
ACT_INSPECT_WALL,
ACT_IDLE_ANGRY,
ACT_WALK_HURT,
ACT_RUN_HURT,
ACT_HOVER,
ACT_GLIDE,
ACT_FLY_LEFT,
ACT_FLY_RIGHT,
ACT_DETECT_SCENT,
ACT_SNIFF,
ACT_BITE,
ACT_THREAT_DISPLAY,
ACT_FEAR_DISPLAY,
ACT_EXCITED,
ACT_SPECIAL_ATTACK1,
ACT_SPECIAL_ATTACK2,
ACT_COMBAT_IDLE,
ACT_WALK_SCARED,
ACT_RUN_SCARED,
ACT_VICTORY_DANCE,
ACT_DIE_HEADSHOT,
ACT_DIE_CHESTSHOT,
ACT_DIE_GUTSHOT,
ACT_DIE_BACKSHOT,
ACT_FLINCH_HEAD,
ACT_FLINCH_CHEST,
ACT_FLINCH_STOMACH,
ACT_FLINCH_LEFTARM,
ACT_FLINCH_RIGHTARM,
ACT_FLINCH_LEFTLEG,
ACT_FLINCH_RIGHTLEG,
} monster_activity_e;
/* monster flags, these are defined by the level designers */
typedef enumflags
{
MSF_WAITTILLSEEN,
MSF_GAG,
MSF_MONSTERCLIP,
MSF_RESERVED1,
MSF_PRISONER,
MSF_RESERVED2,
MSF_IGNOREPLAYER,
MSF_WAITFORSCRIPT,
MSF_PREDISASTER,
MSF_FADECORPSE,
MSF_MULTIPLAYER,
MSF_FALLING,
MSF_HORDE
} monsterFlag_t;
/* movement states */
typedef enum
{
MONSTER_IDLE,
MONSTER_FOLLOWING,
MONSTER_CHASING,
MONSTER_AIMING,
MONSTER_DEAD,
MONSTER_GIBBED
} monsterState_t;
/* scripted sequence states */
typedef enum
{
SEQUENCESTATE_NONE,
SEQUENCESTATE_IDLE,
SEQUENCESTATE_ACTIVE,
SEQUENCESTATE_ENDING
} sequenceState_t;
/* alliance state */
typedef enum
{
MAL_FRIEND, /* friendly towards the player */
MAL_ENEMY, /* unfriendly towards the player */
MAL_ALIEN, /* unfriendly towards anyone but themselves */
MAL_ROGUE /* no allies, not even amongst themselves */
} allianceState_t;
typedef enum
{
MOVESTATE_IDLE,
MOVESTATE_WALK,
MOVESTATE_RUN
} movementState_t;
/* These numerations involve the m_iTriggerCondition attribute.
* Basically these conditions are being checked and triggered depending on what
* it's set to. If any of those checks are successful, we trigger our target
* under the m_strTriggerTarget attribute. */
typedef enum
{
MTRIG_NONE, /* nothing */
MTRIG_SEEPLAYER_ANGRY, /* we see an enemy player, that we want to harm */
MTRIG_PAIN, /* taken damage */
MTRIG_HALFHEALTH, /* lost half of our base_health */
MTRIG_DEATH, /* we have died. */
MTRIG_SQUADMEMBERDEAD, /* a squad member died */
MTRIG_SQUADLEADERDEAD, /* the squad leader died */
MTRIG_HEARNOISE, /* we hear some noise around the world. */
MTRIG_HEARENEMYPLAYER, /* we hear a player we are enemies with */
MTRIG_HEARWEAPONS, /* we hear weapons being fired */
MTRIG_SEEPLAYER, /* we see a player, don't have to be angry at him. */
MTRIG_SEEPLAYER_RELAXED, /* we see a player and we're currently attacking anything */
} triggerCondition_t;
/* FIXME: I'd like to move this into NSMonster, but our current IsFriend()
* check is currently only checking on a .takedamage basis. */
.int m_iAlliance;
class NSMonster:NSSurfacePropEntity
{
#ifdef SERVER
entity m_ssLast;
vector oldnet_velocity;
float m_flPitch;
int m_iFlags;
vector base_mins;
vector base_maxs;
float base_health;
/* sequences */
string m_strRouteEnded;
int m_iSequenceRemove;
int m_iSequenceState;
float m_flSequenceEnd;
float m_flSequenceSpeed;
vector m_vecSequenceAngle;
vector m_vecTurnAngle;
int m_iSequenceFlags;
movementState_t m_iMoveState;
int m_iTriggerCondition;
string m_strTriggerTarget;
/* model events */
float m_flBaseTime;
/* attack/alliance system */
entity m_eEnemy;
float m_flAttackThink;
int m_iMState;
vector m_vecLKPos; /* last-known pos */
/* pathfinding */
int m_iNodes;
int m_iCurNode;
nodeslist_t *m_pRoute;
vector m_vecLastNode;
#endif
void(void) NSMonster;
#ifdef SERVER
/* overrides */
virtual void(float) Save;
virtual void(string,string) Restore;
virtual bool(void) CanCrouch;
virtual void(entity) Touch;
virtual void(void) Hide;
virtual void(void) Respawn;
virtual void(void) Pain;
virtual void(void) Death;
virtual void(void) Physics;
virtual void(void) IdleNoise;
virtual void(void) FallNoise;
virtual void(void) Gib;
virtual void(string) Sound;
virtual void(string, string) SpawnKey;
/* see/hear subsystem */
float m_flSeeTime;
virtual void(void) SeeThink;
virtual float(void) SeeFOV;
/* reactions */
virtual void(void) AlertNearby;
/* movement */
virtual float(void) GetWalkSpeed;
virtual float(void) GetChaseSpeed;
virtual float(void) GetRunSpeed;
/* attack system */
virtual void(void) AttackDraw;
virtual void(void) AttackHolster;
virtual void(void) AttackThink;
virtual int(void) AttackMelee;
virtual int(void) AttackRanged;
virtual float(void) MeleeMaxDistance;
virtual int(void) MeleeCondition;
/* sequences */
virtual void(void) FreeState;
virtual void(void) FreeStateMoved;
virtual void(void) ClearRoute;
virtual void(void) CheckRoute;
virtual void(void) WalkRoute;
virtual void(vector) NewRoute;
/* animation cycles */
float m_flAnimTime;
virtual int(void) AnimIdle;
virtual int(void) AnimWalk;
virtual int(void) AnimRun;
virtual void(float) AnimPlay;
virtual void(void) AnimationUpdate;
/* TriggerTarget/Condition */
virtual int(void) GetTriggerCondition;
virtual void(void) TriggerTargets;
virtual float(entity, float) SendEntity;
#else
virtual void(void) customphysics;
virtual float(void) predraw;
virtual void(float,float) ReceiveEntity;
#endif
};
#ifdef CLIENT
string Sentences_GetSamples(string);
string Sentences_ProcessSample(string);
#else
void NSMonster_AlertEnemyAlliance(vector pos, float radius, int alliance);
#endif