avp/src/avp/bh_marin.h
2019-08-20 02:22:37 +02:00

413 lines
11 KiB
C

/*--------------Patrick 14/2/97----------------
Header file for marine support functions
---------------------------------------------*/
#ifndef _bhmarin_h_
#define _bhmarin_h_ 1
#ifdef __cplusplus
extern "C" {
#endif
#include "bh_pred.h"
#include "psndproj.h"
#include "sfx.h"
/*--------------------------------------------
enums of marine far and near behaviour states
--------------------------------------------*/
typedef enum marine_bhstate
{
MBS_Waiting,
/* Waiting - stand and do nothing,
until you get a call, see an enemy,
or begin to fidget. */
MBS_Wandering,
/* Go from module to module around the environment. */
MBS_Retreating,
MBS_Sentry,
MBS_Approaching,
MBS_Firing,
MBS_Avoidance,
MBS_Dying,
MBS_Responding,
MBS_Returning,
MBS_Pathfinding,
MBS_Taunting,
MBS_PanicFire,
MBS_Reloading,
MBS_PumpAction,
MBS_GetWeapon,
MBS_PanicReloading,
MBS_AcidAvoidance,
} MARINE_BHSTATE;
typedef enum marine_movement_style {
MMS_Stationary=0,
MMS_Bored,
MMS_Alert,
MMS_Combat,
MMS_Sprint,
} MARINE_MOVEMENT_STYLE;
typedef enum state_return_condition {
SRC_No_Change,
SRC_Request_Approach,
SRC_Request_Fire,
SRC_Request_Wander,
SRC_Request_Avoidance,
SRC_Request_Wait,
SRC_Request_Retreat,
SRC_Request_Respond,
SRC_Request_Return,
SRC_Request_Taunt,
SRC_Request_PanicFire,
SRC_Request_Reload,
SRC_Request_PumpAction,
SRC_Request_PullPistol,
SRC_Request_PanicReload,
} STATE_RETURN_CONDITION;
/*--------------------------------------------
Enum of marine animation sequences
--------------------------------------------*/
typedef enum MarineSequence
{
MSQ_Walk,
MSQ_StandDieFront,
MSQ_StandDieBack,
MSQ_StartStandingFire,
MSQ_StandingFire,
MSQ_StandDeadFront,
MSQ_StandDeadBack,
MSQ_Crawl,
MSQ_CrouchDie,
MSQ_CrouchDead,
MSQ_RunningFire,
MSQ_Crouch,
MSQ_Stand,
MSQ_Jump,
MSQ_Taunt,
MSQ_Walk_Backwards,
MSQ_Crawl_Backwards,
MSQ_RunningFire_Backwards,
MSQ_StandingFireSecondary,
MSQ_RunningFireSecondary,
MSQ_RunningFireSecondary_Backwards,
MSQ_BaseOfCudgelAttacks=40,
}MARINE_SEQUENCE;
typedef enum MarineMissions {
MM_Wait_Then_Wander, // Should do nothing until visible.
MM_Wander,
MM_Guard,
MM_LocalGuard,
MM_NonCom,
MM_Pathfinder,
MM_RunAroundOnFire,
}MARINE_MISSION;
/***** Marine squad command state *****/
typedef struct squadcommand {
int alertStatus;
int responseLevel;
AIMODULE *alertZone;
int alertPriority;
int Squad_Suspicion;
VECTORCH squad_suspect_point;
/* Now some stats. */
int RespondingMarines;
int Alt_RespondingMarines;
int NearUnpanickedMarines;
int Alt_NearUnpanickedMarines;
int NearPanickedMarines;
int Alt_NearPanickedMarines;
int NearBurningMarines;
int Alt_NearBurningMarines;
int Squad_Delta_Morale;
int Nextframe_Squad_Delta_Morale;
} SQUAD_COMMAND_STATE;
/*--------------------------------------------
Data for civilian accoutement stuff
--------------------------------------------*/
struct hierarchy_shape_replacement;
typedef struct hierarchy_variant_data
{
struct hierarchy_shape_replacement * replacements;
int voice;
unsigned int female :1;
} HIERARCHY_VARIANT_DATA;
/*--------------------------------------------
Marine behaviour data block
--------------------------------------------*/
typedef struct marineStatusBlock
{
signed int health;
signed int volleySize;
signed int primaryWeaponDamage;
MARINE_BHSTATE behaviourState;
MARINE_BHSTATE lastState;
STRATEGYBLOCK *Target;
MARINE_MISSION Mission;
char Target_SBname[SB_NAME_LENGTH];
char death_target_ID[SB_NAME_LENGTH]; //another strategy can be notified of the marine's death
STRATEGYBLOCK* death_target_sbptr;
int death_target_request;
STRATEGYBLOCK* generator_sbptr;//0 unless created by a generator
AIMODULE *lastmodule;
AIMODULE *destinationmodule;
AIMODULE *missionmodule;
AIMODULE *fearmodule;
VECTORCH my_spot;
VECTORCH my_facing_point;
/* Movement data. */
signed int nearSpeed;
int acceleration;
int speedConstant;
int accelerationConstant;
/* Sense data */
int mtracker_timer;
VECTORCH suspect_point;
int suspicious;
int previous_suspicion;
int using_squad_suspicion;
int sawlastframe;
int gotapoint;
int lastframe_fallingspeed;
/* Pathfinder parameters */
int path;
int stepnumber;
/* Pathfinder parameters */
int stateTimer;
int internalState;
HMODELCONTROLLER HModelController;
VECTORCH weaponTarget; /* position for firing weapon at */
DISPLAYBLOCK *myGunFlash;
int soundHandle;
int soundHandle2;
NPC_OBSTRUCTIONREPORT obstruction;
NPC_MOVEMENTDATA moveData;
NPC_WANDERDATA wanderData;
int IAmCrouched;
/* CDF 15/12/97 */
struct marine_weapon_data *My_Weapon;
SECTION_DATA *My_Gunflash_Section;
SECTION_DATA *My_Elevation_Section; /* For elevation computation. */
int lastroundhit;
SECTION_DATA *lasthitsection;
int GibbFactor;
int Wounds;
int incidentFlag;
int incidentTimer;
int weapon_variable;
int weapon_variable2;
int clipammo;
int roundsForThisTarget;
int Female;
int Android;
int Skill;
int Courage;
int Voice;
int VoicePitch;
int FiringAnim;
int Expression;
int Target_Expression;
int Blink;
int SpotFlag;
NPC_AVOIDANCEMANAGER avoidanceManager;
WAYPOINT_MANAGER waypointManager;
}MARINE_STATUS_BLOCK;
typedef enum marine_npc_weapons {
MNPCW_PulseRifle,
MNPCW_Flamethrower,
MNPCW_Smartgun,
MNPCW_SADAR,
MNPCW_GrenadeLauncher,
MNPCW_Minigun,
MNPCW_MShotgun,
MNPCW_MPistol,
MNPCW_MFlamer,
MNPCW_MUnarmed,
MNPCW_MMolotov,
MNPCW_PistolMarine,
MNPCW_Android,
MNPCW_AndroidSpecial,
MNPCW_Android_Pistol_Special,
MNPCW_Scientist_A,
MNPCW_Scientist_B,
MNPCW_TwoPistols,
MNPCW_Skeeter,
MNPCW_End,
} MARINE_NPC_WEAPONS;
/*--------------------------------------------
Tools data template
--------------------------------------------*/
typedef struct tools_data_marine
{
struct vectorch position;
struct vectorch facing_point;
int shapeIndex;
char nameID[SB_NAME_LENGTH];
MARINE_MISSION Mission;
char death_target_ID[SB_NAME_LENGTH];
int death_target_request;
enum marine_npc_weapons marine_type;
int path;
int stepnumber;
int textureID;
}TOOLS_DATA_MARINE;
/*--------------------------------------------
Weapon Behaviour Type.
--------------------------------------------*/
typedef struct marine_weapon_data {
MARINE_NPC_WEAPONS id;
enum SFX_ID SfxID;
STATE_RETURN_CONDITION (*WeaponFireFunction)(STRATEGYBLOCK *);
void (*WeaponMisfireFunction)(SECTION_DATA *, int *);
STATE_RETURN_CONDITION (*WeaponPanicFireFunction)(STRATEGYBLOCK *);
char *Riffname;
char *HierarchyName;
char *GunflashName;
char *ElevationSection;
char *HitLocationTableName;
char *TemplateName;
char *ClipName;
int MinRange;
int ForceFireRange;
int MaxRange;
int Accuracy;
int FiringRate;
int FiringTime;
int MinimumBurstSize;
enum AMMO_ID Ammo_Type;
int clip_size;
int Reload_Sequence;
int TargetCallibrationShift;
SOUNDINDEX StartSound;
SOUNDINDEX LoopSound;
SOUNDINDEX EndSound;
unsigned int EnableGrenades :1;
unsigned int UseElevation :1;
unsigned int EnableTracker :1;
unsigned int ARealMarine :1;
unsigned int Android :1;
}MARINE_WEAPON_DATA;
/*--------------------------------------------
Some defines....
--------------------------------------------*/
#define MARINE_STATE_PRINT 0
#define MARINE_STARTING_HEALTH 30
#define NO_OF_FRAGMENTS_FROM_DEAD_MARINE 10
// #define MARINE_NEAR_SPEED 6000 /* mm/s */
/* Experiment. Can they take the ramps? */
#define MARINE_NEAR_SPEED 6000 /* mm/s */
#define MARINE_NEAR_VIEW_WIDTH 500 /* mm */
#define MARINE_WEAPON_DAMAGE 5
#define MARINE_CLOSE_APPROACH_DISTANCE 3000 /* mm */
#define MARINE_FIRINGPOINT_INFRONT 3000 /* 900 mm */
#define MARINE_FIRINGPOINT_ACROSS 300 /* 300 mm */
#define MARINE_FIRINGPOINT_UP 200 /* 200 mm */
#define MARINE_FIRINGPOINT_INFRONT_CROUCHED 900 /* mm */
#define MARINE_FIRINGPOINT_ACROSS_CROUCHED 200 /* mm */
#define MARINE_FIRINGPOINT_UP_CROUCHED 100 /* mm */
#define MARINE_WEAPON_VOLLEYSIZE (1+(FastRandom()&0x02)) /* 1,2 or 3 1/4 second bursts */
#define MARINE_CHANCEOFGRENADE (3)
#define MARINE_TOO_CLOSE_TO_GRENADE_FOOL 3000
#define MARINE_PARANOIA_TIME (ONE_FIXED*10)
#define MARINE_PANIC_TIME (ONE_FIXED*120)
#define SQUAD_PARANOIA_TIME (ONE_FIXED)
/* 1.5-2 seconds in 1/16 second. NB DO NOT INCREASE THIS */
#define MARINE_FAR_MOVE_TIME ((24+(FastRandom()&0x07))*(ONE_FIXED>>4))
/* 1-2 seconds in 1/8ths of a second */
#define MARINE_NEAR_TIMEBETWEENFIRING ((8+(FastRandom()&0x07))*(ONE_FIXED>>3))
// #define MARINE_NEAR_FIRE_TIME (ONE_FIXED>>2) /* 1/4 second */
#define MARINE_NEAR_FIRE_TIME (ONE_FIXED) /* 1 second */
/* random time between 1 and 2 seconds,in fixed point,with granularity 1/8th second */
#define MARINE_NEARWAITTIME (ONE_FIXED+((FastRandom()&0x7)*(ONE_FIXED>>3)))
#define SEAL_NEAR_SPEED 7000
#define SEAL_WEAPON_DAMAGE 15
#define SEAL_STARTING_HEALTH 150
//#define MINIGUN_IDLE_SPEED (ONE_FIXED>>2)
#define MINIGUN_IDLE_SPEED (0)
#define MINIGUN_MAX_SPEED (ONE_FIXED*20)
#define MINIGUN_MINIMUM_BURST (25)
/*--------------------------------------------
Some prototypes...
--------------------------------------------*/
void InitMarineBehaviour(void* bhdata, STRATEGYBLOCK *sbPtr);
void InitSealBehaviour(void* bhdata, STRATEGYBLOCK *sbPtr);
void SendRequestToMarine(STRATEGYBLOCK* sbPtr,BOOL state,int extended_data);
void MarineBehaviour(STRATEGYBLOCK *sbPtr);
void MakeMarineNear(STRATEGYBLOCK *sbPtr);
void MakeMarineFar(STRATEGYBLOCK *sbPtr);
void MarineIsDamaged(STRATEGYBLOCK *sbPtr, DAMAGE_PROFILE *damage, int multiple, int wounds,SECTION_DATA *Section, VECTORCH *incoming);
void WarnMarineOfAttack(STRATEGYBLOCK *marine,STRATEGYBLOCK *attacker);
DISPLAYBLOCK* AddNPCGunFlashEffect(VECTORCH *position, MATRIXCH* orientation, enum SFX_ID sfxID);
void RemoveNPCGunFlashEffect(DISPLAYBLOCK* dPtr);
void MaintainNPCGunFlashEffect(DISPLAYBLOCK* dPtr, VECTORCH *position, MATRIXCH* orientation);
int Validate_Target(STRATEGYBLOCK *target,char *SBname);
int Validate_Strategy(STRATEGYBLOCK *target,char *SBname);
AIMODULE *NearNPC_GetTargetAIModuleForRetreat(STRATEGYBLOCK *sbPtr, NPC_MOVEMENTDATA *moveData);
extern void InitSquad(void);
extern void DoSquad(void);
extern void ZoneAlert(int level,AIMODULE *targetModule);
extern void Marine_CorpseSightingTest(STRATEGYBLOCK *corpse);
int MarineSight_FrustrumReject(STRATEGYBLOCK *sbPtr,VECTORCH *localOffset,STRATEGYBLOCK *target);
#ifdef __cplusplus
}
#endif
#endif