Files
DoomRTX/neo/doom3/game/bots/Bot_weapons.h
T
2026-05-19 08:28:43 -07:00

161 lines
3.3 KiB
C++

// Bot_weapons.h
//
#pragma once
#define BOT_MAX_WEAPONS 32
//projectile flags
#define PFL_WINDOWDAMAGE 1 //projectile damages through window
#define PFL_RETURN 2 //set when projectile returns to owner
//weapon flags
#define WFL_FIRERELEASED 1 //set when projectile is fired with key-up event
//damage types
#define DAMAGETYPE_IMPACT 1 //damage on impact
#define DAMAGETYPE_RADIAL 2 //radial damage
#define DAMAGETYPE_VISIBLE 4 //damage to all entities visible to the projectile
struct projectileinfo_t
{
projectileinfo_t()
{
name = "";
model = "";
flags = 0;
gravity = 0;
damage = 0;
radius = 0;
visdamage = 0;
damagetype = 0;
healthinc = 0;
push = 0;
detonation = 0;
bounce = 0;
bouncefric = 0;
bouncestop = 0;
}
idStr name;
idStr model;
int flags;
float gravity;
int damage;
float radius;
int visdamage;
int damagetype;
int healthinc;
float push;
float detonation;
float bounce;
float bouncefric;
float bouncestop;
};
struct weaponinfo_t
{
weaponinfo_t()
{
valid = 0;
number = 0;
name = "";
model = "";
level = 0;
weaponindex = 0;
flags = 0;
projectile = "";
numprojectiles = 0;
hspread = 0;
vspread = 0;
speed = 0;
acceleration = 0;
recoil.Zero();
offset.Zero();
angleoffset.Zero();
extrazvelocity = 0;
ammoamount = 0;
ammoindex = 0;
activate = 0;
reload = 0;
spinup = 0;
spindown = 0;
}
int valid; //true if the weapon info is valid
int number; //number of the weapon
idStr name;
idStr model;
int level;
int weaponindex;
int flags;
idStr projectile;
int numprojectiles;
float hspread;
float vspread;
float speed;
float acceleration;
idVec3 recoil;
idVec3 offset;
idVec3 angleoffset;
float extrazvelocity;
int ammoamount;
int ammoindex;
float activate;
float reload;
float spinup;
float spindown;
projectileinfo_t proj; //pointer to the used projectile
};
struct bot_weaponstate_t
{
bot_weaponstate_t()
{
Reset();
}
void Reset()
{
inUse = false;
weaponweightconfig = NULL;
for( int i = 0; i < BOT_MAX_WEAPONS; i++ )
{
weaponweightindex[i] = 0;
}
}
bool inUse;
weightconfig_t* weaponweightconfig;
int weaponweightindex[BOT_MAX_WEAPONS]; //weapon weight index
};
//
// idBotWeaponInfoManager
//
class idBotWeaponInfoManager
{
public:
void Init( void );
int BotLoadWeaponWeights( int weaponstate, char* filename );
void BotGetWeaponInfo( int weaponstate, int weapon, weaponinfo_t* weaponinfo );
int BotChooseBestFightWeapon( int weaponstate, int* inventory );
void BotResetWeaponState( int weaponstate );
int BotAllocWeaponState( void );
void BotFreeWeaponState( int ws );
private:
int BotValidWeaponNumber( int weaponnum );
bot_weaponstate_t* BotWeaponStateFromHandle( int handle );
void WeaponWeightIndex( weightconfig_t* wwc, bot_weaponstate_t* weaponState );
void BotFreeWeaponWeights( int weaponstate );
private:
void LoadWeaponConfig( char* filename );
void ParseWeaponInfo( idParser& parser, weaponinfo_t& newWeaponInfo );
void ParseProjectileInfo( idParser& parser, projectileinfo_t& newProjectileInfo );
private:
idList<projectileinfo_t> projectileinfo;
bot_weaponstate_t botweaponstates[MAX_CLIENTS + 1];
weaponinfo_t weaponinfo[BOT_MAX_WEAPONS];
};
extern idBotWeaponInfoManager botWeaponInfoManager;