123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402 |
- #ifndef __B_PUBLIC_H__
- #define __B_PUBLIC_H__
- #include "bstate.h"
- #include "AI.h"
- #define NPCAI_CHECK_WEAPON 0x00000001
- #define NPCAI_BURST_WEAPON 0x00000002
- #define NPCAI_MOVING 0x00000004
- #define NPCAI_TOUCHED_GOAL 0x00000008
- #define NPCAI_PUSHED 0x00000010
- #define NPCAI_NO_COLL_AVOID 0x00000020
- #define NPCAI_BLOCKED 0x00000040
- #define NPCAI_SUBBOSS_CHARACTER 0x00000080 //Alora, tough reborn
- #define NPCAI_OFF_PATH 0x00000100
- #define NPCAI_IN_SQUADPOINT 0x00000200
- #define NPCAI_STRAIGHT_TO_DESTPOS 0x00000400
- #define NPCAI_HEAVY_MELEE 0x00000800 //4x melee damage, dismemberment
- #define NPCAI_NO_SLOWDOWN 0x00001000
- #define NPCAI_LOST 0x00002000 //Can't nav to his goal
- #define NPCAI_SHIELDS 0x00004000 //Has shields, borg can adapt
- #define NPCAI_GREET_ALLIES 0x00008000 //Say hi to nearby allies
- #define NPCAI_FORM_TELE_NAV 0x00010000 //Tells formation people to use nav info to get to
- #define NPCAI_ENROUTE_TO_HOMEWP 0x00020000 //Lets us know to run our lostenemyscript when we get to homeWp
- #define NPCAI_MATCHPLAYERWEAPON 0x00040000 //Match the player's weapon except when it changes during cinematics
- #define NPCAI_DIE_ON_IMPACT 0x00100000 //Next time you crashland, die!
- #define NPCAI_WALKING 0x00200000
- #define NPCAI_STOP_AT_LOS 0x00400000 //Stop Running When We Hit LOS
- #define NPCAI_NAV_THROUGH_BREAKABLES 0x00800000 //Navigation allows connections through breakable (func_glass, func_breakable or misc_model_breakable)
- #define NPCAI_KNEEL 0x01000000 //Kneel befor Zod
- #define NPCAI_FLY 0x02000000 //Fly, My Pretty!
- #define NPCAI_FLAMETHROW 0x04000000
- #define NPCAI_ROSH 0x08000000 //I am Rosh, when I'm hurt, drop to one knee and wait for Vil or Dasariah to heal me
- #define NPCAI_HEAL_ROSH 0x10000000 //Constantly look for NPC with NPC_type of rosh_dark, follow him, heal him if needbe
- #define NPCAI_JUMP 0x20000000 //Jump Now
- #define NPCAI_BOSS_CHARACTER 0x40000000 //Boss NPC flag for certain immunities/defenses
- #define NPCAI_NO_JEDI_DELAY 0x80000000 //Reborn/Jedi don't taunt enemy before attacking
- //Script flags
- #define SCF_CROUCHED 0x00000001 //Force ucmd.upmove to be -127
- #define SCF_WALKING 0x00000002 //Force BUTTON_WALKING to be pressed
- #define SCF_MORELIGHT 0x00000004 //NPC will have a minlight of 96
- #define SCF_LEAN_RIGHT 0x00000008 //Force rightmove+BUTTON_USE
- #define SCF_LEAN_LEFT 0x00000010 //Force leftmove+BUTTON_USE
- #define SCF_RUNNING 0x00000020 //Takes off walking button, overrides SCF_WALKING
- #define SCF_ALT_FIRE 0x00000040 //Force to use alt-fire when firing
- #define SCF_NO_RESPONSE 0x00000080 //NPC will not do generic responses to being used
- #define SCF_FFDEATH 0x00000100 //Just tells player_die to run the friendly fire deathscript
- #define SCF_NO_COMBAT_TALK 0x00000200 //NPC will not use their generic combat chatter stuff
- #define SCF_CHASE_ENEMIES 0x00000400 //NPC chase enemies - FIXME: right now this is synonymous with using combat points... should it be?
- #define SCF_LOOK_FOR_ENEMIES 0x00000800 //NPC be on the lookout for enemies
- #define SCF_FACE_MOVE_DIR 0x00001000 //NPC face direction it's moving - FIXME: not really implemented right now
- #define SCF_IGNORE_ALERTS 0x00002000 //NPC ignore alert events
- #define SCF_DONT_FIRE 0x00004000 //NPC won't shoot
- #define SCF_DONT_FLEE 0x00008000 //NPC never flees
- #define SCF_FORCED_MARCH 0x00010000 //NPC that the player must aim at to make him walk
- #define SCF_NO_GROUPS 0x00020000 //NPC cannot alert groups or be part of a group
- #define SCF_FIRE_WEAPON 0x00040000 //NPC will fire his (her) weapon
- #define SCF_NO_MIND_TRICK 0x00080000 //Not succeptible to mind tricks
- #define SCF_USE_CP_NEAREST 0x00100000 //Will use combat point close to it, not next to player or try and flank player
- #define SCF_NO_FORCE 0x00200000 //Not succeptible to force powers
- #define SCF_NO_FALLTODEATH 0x00400000 //NPC will not scream and tumble and fall to hit death over large drops
- #define SCF_NO_ACROBATICS 0x00800000 //Jedi won't jump, roll or cartwheel
- #define SCF_USE_SUBTITLES 0x01000000 //Regardless of subtitle setting, this NPC will display subtitles when it speaks lines
- #define SCF_NO_ALERT_TALK 0x02000000 //Will not say alert sounds, but still can be woken up by alerts
- #define SCF_NAV_CAN_FLY 0x04000000 //Navigation allows connections through air
- #define SCF_FLY_WITH_JET 0x08000000 //Must Fly With A Jet
- #define SCF_PILOT 0x10000000 //Can pilot a vehicle
- #define SCF_NAV_CAN_JUMP 0x20000000 //Can attempt to jump when blocked
- #define SCF_FIRE_WEAPON_NO_ANIM 0x40000000 //Fire weapon but don't play weapon firing anim
- #define SCF_SAFE_REMOVE 0x80000000 //Remove NPC when it's safe (when player isn't looking)
- //#ifdef __DEBUG
- //Debug flag definitions
- #define AID_IDLE 0x00000000 //Nothing is happening
- #define AID_ACQUIRED 0x00000001 //A target has been found
- #define AID_LOST 0x00000002 //Alert, but no target is in sight
- #define AID_CONFUSED 0x00000004 //Is unable to come up with a course of action
- #define AID_LOSTPATH 0x00000008 //Cannot make a valid movement due to lack of connections
- //#endif //__DEBUG
- //extern qboolean showWaypoints;
- typedef enum {VIS_UNKNOWN, VIS_NOT, VIS_PVS, VIS_360, VIS_FOV, VIS_SHOOT} visibility_t;
- typedef enum {SPOT_ORIGIN, SPOT_CHEST, SPOT_HEAD, SPOT_HEAD_LEAN, SPOT_WEAPON, SPOT_LEGS, SPOT_GROUND} spot_t;
- typedef enum //# lookMode_e
- {
- LM_ENT = 0,
- LM_INTEREST
- } lookMode_t;
- typedef enum //# jumpState_e
- {
- JS_WAITING = 0,
- JS_FACING,
- JS_CROUCHING,
- JS_JUMPING,
- JS_LANDING
- } jumpState_t;
- typedef enum
- {
- SEX_NEUTRAL = 0,
- SEX_MALE,
- SEX_FEMALE,
- SEX_SHEMALE//what the Hell, ya never know...
- } sexType_t;
- // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!!
- typedef struct gNPCstats_e
- {//Stats, loaded in, and can be set by scripts
- //AI
- int aggression; // "
- int aim; // "
- float earshot; // "
- int evasion; // "
- int hfov; // horizontal field of view
- int intelligence; // "
- int move; // "
- int reactions; // 1-5, higher is better
- float shootDistance; //Maximum range- overrides range set for weapon if nonzero
- int vfov; // vertical field of view
- float vigilance; // "
- float visrange; // "
- //Movement
- int runSpeed;
- int walkSpeed;
- float yawSpeed; // 1 - whatever, default is 50
- int health;
- int acceleration;
- //sex
- sexType_t sex; //male, female, etc.
- } gNPCstats_t;
- #define MAX_ENEMY_POS_LAG 2400
- #define ENEMY_POS_LAG_INTERVAL 100
- #define ENEMY_POS_LAG_STEPS (MAX_ENEMY_POS_LAG/ENEMY_POS_LAG_INTERVAL)
- // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!!
- typedef struct
- {
- //FIXME: Put in playerInfo or something
- int timeOfDeath; //FIXME do we really need both of these
- gentity_t *touchedByPlayer;
- visibility_t enemyLastVisibility;
- int aimTime;
- float desiredYaw;
- float desiredPitch;
- float lockedDesiredYaw;
- float lockedDesiredPitch;
- gentity_t *aimingBeam; // debugging aid
- vec3_t enemyLastSeenLocation;
- int enemyLastSeenTime;
- vec3_t enemyLastHeardLocation;
- int enemyLastHeardTime;
- int lastAlertID; //unique ID
- int eFlags;
- int aiFlags;
- int currentAmmo; // this sucks, need to find a better way
- int shotTime;
- int burstCount;
- int burstMin;
- int burstMean;
- int burstMax;
- int burstSpacing;
- int attackHold;
- int attackHoldTime;
- vec3_t shootAngles; //Angles to where bot is shooting - fixme: make he torso turn to reflect these
- //extra character info
- rank_t rank; //for pips
- //Behavior state info
- bState_t behaviorState; //determines what actions he should be doing
- bState_t defaultBehavior;//State bot will default to if none other set
- bState_t tempBehavior;//While valid, overrides other behavior
- qboolean ignorePain; //only play pain scripts when take pain
- int duckDebounceTime;//Keeps them ducked for a certain time
- int walkDebounceTime;
- int enemyCheckDebounceTime;
- int investigateDebounceTime;
- int investigateCount;
- vec3_t investigateGoal;
- int investigateSoundDebounceTime;
- int greetingDebounceTime;//when we can greet someone next
- gentity_t *eventOwner;
-
- //bState-specific fields
- gentity_t *coverTarg;
- jumpState_t jumpState;
- float followDist;
- // goal, navigation & pathfinding
- gentity_t *tempGoal; // used for locational goals (player's last seen/heard position)
- gentity_t *goalEntity;
- gentity_t *lastGoalEntity;
- gentity_t *eventualGoal;
- gentity_t *captureGoal; //Where we should try to capture
- gentity_t *defendEnt; //Who we're trying to protect
- gentity_t *greetEnt; //Who we're greeting
- int goalTime; //FIXME: This is never actually used
- qboolean straightToGoal; //move straight at navgoals
- float distToGoal;
- int navTime;
- int blockingEntNum;
- int blockedSpeechDebounceTime;
- int homeWp;
- int avoidSide;
- int leaderAvoidSide;
- int lastAvoidSteerSide;
- int lastAvoidSteerSideDebouncer;
- AIGroupInfo_t *group;
- int troop;
- vec3_t lastPathAngles; //So we know which way to face generally when we stop
- //stats
- gNPCstats_t stats;
- int aimErrorDebounceTime;
- float lastAimErrorYaw;
- float lastAimErrorPitch;
- vec3_t aimOfs;
- int currentAim;
- int currentAggression;
- //scriptflags
- int scriptFlags;//in b_local.h
- //moveInfo
- int desiredSpeed;
- int currentSpeed;
- char last_forwardmove;
- char last_rightmove;
- vec3_t lastClearOrigin;
- int shoveCount;
- int blockedDebounceTime;
- gentity_t* blockedEntity; // The entity That Causes The Current Blockage
- vec3_t blockedTargetPosition; // Where the actor was trying to get TO before blocked
- gentity_t* blockedTargetEntity; // Where the actor was trying to get TO before blocked
- //jump info
- vec3_t jumpDest; // Where The Actor Is Trying To Jump TO
- gentity_t* jumpTarget; // What Entity The Actor Is Trying To Jump TO
- float jumpMaxXYDist; // The Minimal Delta On The XY Plane Allowed To Jump To The Dest
- float jumpMazZDist;
- int jumpSide; // Which Side The Last Jump Occured On
- int jumpTime; // When The Last Jump Started
- int jumpBackupTime; // If Active, Then The Guy Should Backup Before Jumping
- int jumpNextCheckTime; // The Minimal Next Time To Check For A Jump
- //
- int combatPoint;//NPCs in bState BS_COMBAT_POINT will find their closest empty combat_point
- int lastFailedCombatPoint;//NPCs in bState BS_COMBAT_POINT will find their closest empty combat_point
- int movementSpeech; //what to say when you first successfully move
- float movementSpeechChance;//how likely you are to say it
- //Testing physics at 20fps
- int nextBStateThink;
- usercmd_t last_ucmd;
- //
- //JWEIER ADDITIONS START
- qboolean combatMove;
- int goalRadius;
- //FIXME: These may be redundant
-
- /*
- int weaponTime; //Time until refire is valid
- int jumpTime;
- */
- int pauseTime; //Time to stand still
- int standTime;
- int localState; //Tracking information local to entity
- int squadState; //Tracking information for team level interaction
- //JWEIER ADDITIONS END
- //
- int confusionTime; //Doesn't respond to alerts or pick up enemies (unless shot) until this time is up
- int charmedTime; //charmed to enemy team
- int controlledTime; //controlled by player
- int surrenderTime; //Hands up
- int kneelTime; //kneeling (for troopers)
- //Lagging enemy position - FIXME: seems awful wasteful...
- vec3_t enemyLaggedPos[ENEMY_POS_LAG_STEPS];
- gentity_t *watchTarget; //for BS_CINEMATIC, keeps facing this ent
- int ffireCount; //sigh... you'd think I'd be able to find a way to do this without having to use 3 int fields, but...
- int ffireDebounce;
- int ffireFadeDebounce;
- } gNPC_t;
- void G_SquadPathsInit(void);
- void NPC_InitGame( void );
- void G_LoadBoltOns( void );
- void Svcmd_NPC_f( void );
- /*
- void Bot_InitGame( void );
- void Bot_InitPreSpawn( void );
- void Bot_InitPostSpawn( void );
- void Bot_Shutdown( void );
- void Bot_Think( gentity_t *ent, int msec );
- void Bot_Connect( gentity_t *bot, char *botName );
- void Bot_Begin( gentity_t *bot );
- void Bot_Disconnect( gentity_t *bot );
- void Svcmd_Bot_f( void );
- void Nav_ItemSpawn( gentity_t *ent, int remaining );
- */
- //
- // This section should be moved to QFILES.H
- //
- /*
- #define NAVFILE_ID (('I')+('N'<<8)+('A'<<16)+('V'<<24))
- #define NAVFILE_VERSION 6
- typedef struct {
- unsigned id;
- unsigned version;
- unsigned checksum;
- unsigned surfaceCount;
- unsigned edgeCount;
- } navheader_t;
- #define MAX_SURFACES 4096
- #define NSF_PUSH 0x00000001
- #define NSF_WATERLEVEL1 0x00000002
- #define NSF_WATERLEVEL2 0x00000004
- #define NSF_WATER_NOAIR 0x00000008
- #define NSF_DUCK 0x00000010
- #define NSF_PAIN 0x00000020
- #define NSF_TELEPORTER 0x00000040
- #define NSF_PLATHIGH 0x00000080
- #define NSF_PLATLOW 0x00000100
- #define NSF_DOOR_FLOOR 0x00000200
- #define NSF_DOOR_SHOOT 0x00000400
- #define NSF_DOOR_BUTTON 0x00000800
- #define NSF_BUTTON 0x00001000
- typedef struct {
- vec3_t origin;
- vec2_t absmin;
- vec2_t absmax;
- int parm;
- unsigned flags;
- unsigned edgeCount;
- unsigned edgeIndex;
- } nsurface_t;
- #define NEF_DUCK 0x00000001
- #define NEF_JUMP 0x00000002
- #define NEF_HOLD 0x00000004
- #define NEF_WALK 0x00000008
- #define NEF_RUN 0x00000010
- #define NEF_NOAIRMOVE 0x00000020
- #define NEF_LEFTGROUND 0x00000040
- #define NEF_PLAT 0x00000080
- #define NEF_FALL1 0x00000100
- #define NEF_FALL2 0x00000200
- #define NEF_DOOR_SHOOT 0x00000400
- #define NEF_DOOR_BUTTON 0x00000800
- #define NEF_BUTTON 0x00001000
- typedef struct {
- vec3_t origin;
- vec2_t absmin; // region within this surface that is the portal to the other surface
- vec2_t absmax;
- int surfaceNum;
- unsigned flags; // jump, prerequisite button, will take falling damage, etc...
- float cost;
- int dirIndex;
- vec3_t endSpot;
- int parm;
- } nedge_t;
- */
- #endif
|