mirror of
https://github.com/jmarshall23/DoomRTX.git
synced 2026-08-16 08:10:32 +02:00
926 lines
28 KiB
C++
926 lines
28 KiB
C++
// Bot.h
|
|
//
|
|
|
|
class rvmBotAIBotActionBase;
|
|
|
|
// These need to match items.def
|
|
#define INVENTORY_ARMOR 1
|
|
#define INVENTORY_GAUNTLET 4
|
|
#define INVENTORY_SHOTGUN 5
|
|
#define INVENTORY_MACHINEGUN 6
|
|
#define INVENTORY_GRENADELAUNCHER 7
|
|
#define INVENTORY_ROCKETLAUNCHER 8
|
|
#define INVENTORY_LIGHTNING 9
|
|
#define INVENTORY_RAILGUN 10
|
|
#define INVENTORY_PLASMAGUN 11
|
|
#define INVENTORY_BFG10K 13
|
|
#define INVENTORY_GRAPPLINGHOOK 14
|
|
#define INVENTORY_NAILGUN 15
|
|
#define INVENTORY_PROXLAUNCHER 16
|
|
#define INVENTORY_CHAINGUN 17
|
|
#define INVENTORY_SHELLS 18
|
|
#define INVENTORY_BULLETS 19
|
|
#define INVENTORY_GRENADES 20
|
|
#define INVENTORY_CELLS 21
|
|
#define INVENTORY_LIGHTNINGAMMO 22
|
|
#define INVENTORY_ROCKETS 23
|
|
#define INVENTORY_SLUGS 24
|
|
#define INVENTORY_BFGAMMO 25
|
|
#define INVENTORY_NAILS 26
|
|
#define INVENTORY_MINES 27
|
|
#define INVENTORY_BELT 28
|
|
#define INVENTORY_HEALTH 29
|
|
#define INVENTORY_TELEPORTER 30
|
|
#define INVENTORY_MEDKIT 31
|
|
#define INVENTORY_KAMIKAZE 32
|
|
#define INVENTORY_PORTAL 33
|
|
#define INVENTORY_INVULNERABILITY 34
|
|
#define INVENTORY_QUAD 35
|
|
#define INVENTORY_ENVIRONMENTSUIT 36
|
|
#define INVENTORY_HASTE 37
|
|
#define INVENTORY_INVISIBILITY 38
|
|
#define INVENTORY_REGEN 39
|
|
#define INVENTORY_FLIGHT 40
|
|
#define INVENTORY_SCOUT 41
|
|
#define INVENTORY_GUARD 42
|
|
#define INVENTORY_DOUBLER 43
|
|
#define INVENTORY_AMMOREGEN 44
|
|
#define INVENTORY_REDFLAG 45
|
|
#define INVENTORY_BLUEFLAG 46
|
|
#define INVENTORY_NEUTRALFLAG 47
|
|
#define INVENTORY_REDCUBE 48
|
|
#define INVENTORY_BLUECUBE 49
|
|
#define INVENTORY_DOUBLESHOTGUN 50
|
|
|
|
#define MODELINDEX_DEFAULT 0
|
|
#define MODELINDEX_ARMORSHARD 1
|
|
#define MODELINDEX_ARMORCOMBAT 2
|
|
#define MODELINDEX_ARMORBODY 3
|
|
#define MODELINDEX_HEALTHSMALL 4
|
|
#define MODELINDEX_HEALTH 5
|
|
#define MODELINDEX_HEALTHLARGE 6
|
|
#define MODELINDEX_HEALTHMEGA 7
|
|
#define MODELINDEX_GAUNTLET 8
|
|
#define MODELINDEX_SHOTGUN 9
|
|
#define MODELINDEX_MACHINEGUN 10
|
|
#define MODELINDEX_GRENADELAUNCHER 11
|
|
#define MODELINDEX_ROCKETLAUNCHER 12
|
|
#define MODELINDEX_LIGHTNING 13
|
|
#define MODELINDEX_RAILGUN 14
|
|
#define MODELINDEX_PLASMAGUN 15
|
|
#define MODELINDEX_BFG10K 16
|
|
#define MODELINDEX_GRAPPLINGHOOK 17
|
|
#define MODELINDEX_SHELLS 18
|
|
#define MODELINDEX_BULLETS 19
|
|
#define MODELINDEX_GRENADES 20
|
|
#define MODELINDEX_CELLS 21
|
|
#define MODELINDEX_LIGHTNINGAMMO 22
|
|
#define MODELINDEX_ROCKETS 23
|
|
#define MODELINDEX_SLUGS 24
|
|
#define MODELINDEX_BFGAMMO 25
|
|
#define MODELINDEX_TELEPORTER 26
|
|
#define MODELINDEX_MEDKIT 27
|
|
#define MODELINDEX_QUAD 28
|
|
#define MODELINDEX_ENVIRONMENTSUIT 29
|
|
#define MODELINDEX_HASTE 30
|
|
#define MODELINDEX_INVISIBILITY 31
|
|
#define MODELINDEX_REGEN 32
|
|
#define MODELINDEX_FLIGHT 33
|
|
#define MODELINDEX_REDFLAG 34
|
|
#define MODELINDEX_BLUEFLAG 35
|
|
#define MODELINDEX_KAMIKAZE 36
|
|
#define MODELINDEX_PORTAL 37
|
|
#define MODELINDEX_INVULNERABILITY 38
|
|
#define MODELINDEX_NAILS 39
|
|
#define MODELINDEX_MINES 40
|
|
#define MODELINDEX_BELT 41
|
|
#define MODELINDEX_SCOUT 42
|
|
#define MODELINDEX_GUARD 43
|
|
#define MODELINDEX_DOUBLER 44
|
|
#define MODELINDEX_AMMOREGEN 45
|
|
#define MODELINDEX_NEUTRALFLAG 46
|
|
#define MODELINDEX_REDCUBE 47
|
|
#define MODELINDEX_BLUECUBE 48
|
|
#define MODELINDEX_NAILGUN 49
|
|
#define MODELINDEX_PROXLAUNCHER 50
|
|
#define MODELINDEX_CHAINGUN 51
|
|
#define MODELINDEX_POINTABLUE 52
|
|
#define MODELINDEX_POINTBBLUE 53
|
|
#define MODELINDEX_POINTARED 54
|
|
#define MODELINDEX_POINTBRED 55
|
|
#define MODELINDEX_POINTAWHITE 56
|
|
#define MODELINDEX_POINTBWHITE 57
|
|
#define MODELINDEX_POINTWHITE 58
|
|
#define MODELINDEX_POINTRED 59
|
|
#define MODELINDEX_POINTBLUE 60
|
|
#define WEAPONINDEX_GAUNTLET 1
|
|
#define WEAPONINDEX_MACHINEGUN 2
|
|
#define WEAPONINDEX_SHOTGUN 3
|
|
#define WEAPONINDEX_GRENADE_LAUNCHER 4
|
|
#define WEAPONINDEX_ROCKET_LAUNCHER 5
|
|
#define WEAPONINDEX_LIGHTNING 6
|
|
#define WEAPONINDEX_RAILGUN 7
|
|
#define WEAPONINDEX_PLASMAGUN 8
|
|
#define WEAPONINDEX_BFG 9
|
|
#define WEAPONINDEX_GRAPPLING_HOOK 10
|
|
#define WEAPONINDEX_NAILGUN 11
|
|
#define WEAPONINDEX_PROXLAUNCHER 12
|
|
#define WEAPONINDEX_CHAINGUN 13
|
|
|
|
//enemy stuff
|
|
#define ENEMY_HORIZONTAL_DIST 200
|
|
#define ENEMY_HEIGHT 201
|
|
|
|
#define MAX_AVOIDGOALS 256
|
|
#define MAX_GOALSTACK 8
|
|
|
|
#define GFL_NONE 0
|
|
#define GFL_ITEM 1
|
|
#define GFL_ROAM 2
|
|
#define GFL_DROPPED 4
|
|
|
|
#define BLERR_NOERROR 0 //no error
|
|
#define BLERR_LIBRARYNOTSETUP 1 //library not setup
|
|
#define BLERR_INVALIDENTITYNUMBER 2 //invalid entity number
|
|
#define BLERR_NOAASFILE 3 //no AAS file available
|
|
#define BLERR_CANNOTOPENAASFILE 4 //cannot open AAS file
|
|
#define BLERR_WRONGAASFILEID 5 //incorrect AAS file id
|
|
#define BLERR_WRONGAASFILEVERSION 6 //incorrect AAS file version
|
|
#define BLERR_CANNOTREADAASLUMP 7 //cannot read AAS file lump
|
|
#define BLERR_CANNOTLOADICHAT 8 //cannot load initial chats
|
|
#define BLERR_CANNOTLOADITEMWEIGHTS 9 //cannot load item weights
|
|
#define BLERR_CANNOTLOADITEMCONFIG 10 //cannot load item config
|
|
#define BLERR_CANNOTLOADWEAPONWEIGHTS 11 //cannot load weapon weights
|
|
#define BLERR_CANNOTLOADWEAPONCONFIG 12 //cannot load weapon config
|
|
|
|
#define WT_BALANCE 1
|
|
#define MAX_WEIGHTS 128
|
|
|
|
//fuzzy seperator
|
|
struct fuzzyseperator_t
|
|
{
|
|
fuzzyseperator_t()
|
|
{
|
|
Reset();
|
|
}
|
|
|
|
void Reset()
|
|
{
|
|
inUse = false;
|
|
index = 0;
|
|
value = 0;
|
|
type = 0;
|
|
weight = 0;
|
|
minweight = 0.0f;
|
|
maxweight = 0.0f;
|
|
child = nullptr;
|
|
next = nullptr;
|
|
}
|
|
|
|
bool inUse;
|
|
int index;
|
|
int value;
|
|
int type;
|
|
float weight;
|
|
float minweight;
|
|
float maxweight;
|
|
fuzzyseperator_t* child;
|
|
fuzzyseperator_t* next;
|
|
};
|
|
|
|
//fuzzy weight
|
|
struct weight_t
|
|
{
|
|
weight_t()
|
|
{
|
|
Reset();
|
|
}
|
|
|
|
void Reset()
|
|
{
|
|
name.Clear();
|
|
firstseperator = nullptr;
|
|
}
|
|
|
|
idStr name;
|
|
fuzzyseperator_t* firstseperator;
|
|
};
|
|
|
|
//weight configuration
|
|
struct weightconfig_t
|
|
{
|
|
weightconfig_t()
|
|
{
|
|
Reset();
|
|
}
|
|
|
|
void Reset()
|
|
{
|
|
inUse = false;
|
|
numweights = 0;
|
|
filename.Clear();
|
|
|
|
for( int i = 0; i < MAX_WEIGHTS; i++ )
|
|
{
|
|
weights[i].Reset();
|
|
}
|
|
}
|
|
|
|
bool inUse;
|
|
int numweights;
|
|
weight_t weights[MAX_WEIGHTS];
|
|
idStr filename;
|
|
};
|
|
|
|
// ------------------------------------------------------------------------------------
|
|
|
|
#define BOTFILESBASEFOLDER "botfiles"
|
|
//debug line colors
|
|
#define LINECOLOR_NONE -1
|
|
#define LINECOLOR_RED 1//0xf2f2f0f0L
|
|
#define LINECOLOR_GREEN 2//0xd0d1d2d3L
|
|
#define LINECOLOR_BLUE 3//0xf3f3f1f1L
|
|
#define LINECOLOR_YELLOW 4//0xdcdddedfL
|
|
#define LINECOLOR_ORANGE 5//0xe0e1e2e3L
|
|
|
|
//Print types
|
|
#define PRT_MESSAGE 1
|
|
#define PRT_WARNING 2
|
|
#define PRT_ERROR 3
|
|
#define PRT_FATAL 4
|
|
#define PRT_EXIT 5
|
|
|
|
//console message types
|
|
#define CMS_NORMAL 0
|
|
#define CMS_CHAT 1
|
|
|
|
//action flags
|
|
#define ACTION_ATTACK 0x0000001
|
|
#define ACTION_USE 0x0000002
|
|
#define ACTION_RESPAWN 0x0000008
|
|
#define ACTION_JUMP 0x0000010
|
|
#define ACTION_MOVEUP 0x0000020
|
|
#define ACTION_CROUCH 0x0000080
|
|
#define ACTION_MOVEDOWN 0x0000100
|
|
#define ACTION_MOVEFORWARD 0x0000200
|
|
#define ACTION_MOVEBACK 0x0000800
|
|
#define ACTION_MOVELEFT 0x0001000
|
|
#define ACTION_MOVERIGHT 0x0002000
|
|
#define ACTION_DELAYEDJUMP 0x0008000
|
|
#define ACTION_TALK 0x0010000
|
|
#define ACTION_GESTURE 0x0020000
|
|
#define ACTION_WALK 0x0080000
|
|
#define ACTION_AFFIRMATIVE 0x0100000
|
|
#define ACTION_NEGATIVE 0x0200000
|
|
#define ACTION_GETFLAG 0x0800000
|
|
#define ACTION_GUARDBASE 0x1000000
|
|
#define ACTION_PATROL 0x2000000
|
|
#define ACTION_FOLLOWME 0x8000000
|
|
|
|
|
|
//#define DEBUG
|
|
#define CTF
|
|
|
|
#define MAX_ITEMS 256
|
|
//bot flags
|
|
#define BFL_STRAFERIGHT 1 //strafe to the right
|
|
#define BFL_ATTACKED 2 //bot has attacked last ai frame
|
|
#define BFL_ATTACKJUMPED 4 //bot jumped during attack last frame
|
|
#define BFL_AIMATENEMY 8 //bot aimed at the enemy this frame
|
|
#define BFL_AVOIDRIGHT 16 //avoid obstacles by going to the right
|
|
#define BFL_IDEALVIEWSET 32 //bot has ideal view angles set
|
|
#define BFL_FIGHTSUICIDAL 64 //bot is in a suicidal fight
|
|
//long term goal types
|
|
#define LTG_TEAMHELP 1 //help a team mate
|
|
#define LTG_TEAMACCOMPANY 2 //accompany a team mate
|
|
#define LTG_DEFENDKEYAREA 3 //defend a key area
|
|
#define LTG_GETFLAG 4 //get the enemy flag
|
|
#define LTG_RUSHBASE 5 //rush to the base
|
|
#define LTG_RETURNFLAG 6 //return the flag
|
|
#define LTG_CAMP 7 //camp somewhere
|
|
#define LTG_CAMPORDER 8 //ordered to camp somewhere
|
|
#define LTG_PATROL 9 //patrol
|
|
#define LTG_GETITEM 10 //get an item
|
|
#define LTG_KILL 11 //kill someone
|
|
#define LTG_HARVEST 12 //harvest skulls
|
|
#define LTG_ATTACKENEMYBASE 13 //attack the enemy base
|
|
#define LTG_MAKELOVE_UNDER 14
|
|
#define LTG_MAKELOVE_ONTOP 15
|
|
//some goal dedication times
|
|
#define TEAM_HELP_TIME 60 //1 minute teamplay help time
|
|
#define TEAM_ACCOMPANY_TIME 600 //10 minutes teamplay accompany time
|
|
#define TEAM_DEFENDKEYAREA_TIME 600 //10 minutes ctf defend base time
|
|
#define TEAM_CAMP_TIME 600 //10 minutes camping time
|
|
#define TEAM_PATROL_TIME 600 //10 minutes patrolling time
|
|
#define TEAM_LEAD_TIME 600 //10 minutes taking the lead
|
|
#define TEAM_GETITEM_TIME 60 //1 minute
|
|
#define TEAM_KILL_SOMEONE 180 //3 minute to kill someone
|
|
#define TEAM_ATTACKENEMYBASE_TIME 600 //10 minutes
|
|
#define TEAM_HARVEST_TIME 120 //2 minutes
|
|
#define CTF_GETFLAG_TIME 600 //10 minutes ctf get flag time
|
|
#define CTF_RUSHBASE_TIME 120 //2 minutes ctf rush base time
|
|
#define CTF_RETURNFLAG_TIME 180 //3 minutes to return the flag
|
|
#define CTF_ROAM_TIME 60 //1 minute ctf roam time
|
|
//patrol flags
|
|
#define PATROL_LOOP 1
|
|
#define PATROL_REVERSE 2
|
|
#define PATROL_BACK 4
|
|
//teamplay task preference
|
|
#define TEAMTP_DEFENDER 1
|
|
#define TEAMTP_ATTACKER 2
|
|
//CTF strategy
|
|
#define CTFS_AGRESSIVE 1
|
|
//copied from the aas file header
|
|
#define PRESENCE_NONE 1
|
|
#define PRESENCE_NORMAL 2
|
|
#define PRESENCE_CROUCH 4
|
|
//
|
|
#define MAX_PROXMINES 64
|
|
|
|
|
|
#define MAX_CHARACTERISTICS 80
|
|
|
|
#define CT_INTEGER 1
|
|
#define CT_FLOAT 2
|
|
#define CT_STRING 3
|
|
|
|
#define DEFAULT_CHARACTER "bots/default_c.c"
|
|
|
|
#define MAX_AVOIDGOALS 256
|
|
#define MAX_GOALSTACK 8
|
|
|
|
#define GFL_NONE 0
|
|
#define GFL_ITEM 1
|
|
#define GFL_ROAM 2
|
|
#define GFL_DROPPED 4
|
|
#define MAX_EPAIRKEY 128
|
|
|
|
//characteristic value
|
|
struct cvalue
|
|
{
|
|
cvalue()
|
|
{
|
|
integer = 0;
|
|
_float = 0.0f;
|
|
string = "";
|
|
}
|
|
|
|
int integer;
|
|
float _float;
|
|
idStr string;
|
|
};
|
|
|
|
//a characteristic
|
|
struct bot_characteristic_t
|
|
{
|
|
bot_characteristic_t()
|
|
{
|
|
type = 0;
|
|
}
|
|
|
|
char type; //characteristic type
|
|
cvalue value; //characteristic value
|
|
};
|
|
|
|
//a bot character
|
|
struct bot_character_t
|
|
{
|
|
bot_character_t()
|
|
{
|
|
filename = "";
|
|
inUse = false;
|
|
skill = 0.0f;
|
|
}
|
|
|
|
idStr filename;
|
|
bool inUse;
|
|
float skill;
|
|
bot_characteristic_t c[MAX_CHARACTERISTICS];
|
|
};
|
|
|
|
//the bot input, will be converted to an usercmd_t
|
|
//the bot input, will be converted to an usercmd_t
|
|
struct bot_input_t
|
|
{
|
|
bot_input_t()
|
|
{
|
|
Reset();
|
|
}
|
|
|
|
void Reset()
|
|
{
|
|
thinktime = 0;
|
|
dir.Zero();
|
|
speed = 0;
|
|
viewangles.Zero();
|
|
actionflags = 0;
|
|
weapon = 0;
|
|
lastWeaponNum = 0;
|
|
respawn = false;
|
|
}
|
|
|
|
float thinktime; //time since last output (in seconds)
|
|
idVec3 dir; //movement direction
|
|
float speed; //speed in the range [0, 400]
|
|
idAngles viewangles; //the view angles
|
|
int actionflags; //one of the ACTION_? flags
|
|
int weapon; //weapon to use
|
|
int lastWeaponNum;
|
|
bool respawn;
|
|
};
|
|
|
|
#if 0
|
|
//entity state
|
|
typedef struct bot_entitystate_s
|
|
{
|
|
int type; // entity type
|
|
int flags; // entity flags
|
|
vec3_t origin; // origin of the entity
|
|
vec3_t angles; // angles of the model
|
|
vec3_t old_origin; // for lerping
|
|
vec3_t mins; // bounding box minimums
|
|
vec3_t maxs; // bounding box maximums
|
|
int groundent; // ground entity
|
|
int solid; // solid type
|
|
int modelindex; // model used
|
|
int modelindex2; // weapons, CTF flags, etc
|
|
int frame; // model frame number
|
|
int event; // impulse events -- muzzle flashes, footsteps, etc
|
|
int eventParm; // even parameter
|
|
int powerups; // bit flags
|
|
int weapon; // determines weapon and flash model, etc
|
|
int legsAnim; // mask off ANIM_TOGGLEBIT
|
|
int torsoAnim; // mask off ANIM_TOGGLEBIT
|
|
} bot_entitystate_t;
|
|
|
|
//check points
|
|
typedef struct bot_waypoint_s
|
|
{
|
|
int inuse;
|
|
char name[32];
|
|
bot_goal_t goal;
|
|
struct bot_waypoint_s* next, * prev;
|
|
} bot_waypoint_t;
|
|
|
|
//bot settings
|
|
typedef struct bot_settings_s
|
|
{
|
|
char characterfile[MAX_QPATH];
|
|
float skill;
|
|
char team[MAX_QPATH];
|
|
} bot_settings_t;
|
|
|
|
#define MAX_ACTIVATESTACK 8
|
|
#define MAX_ACTIVATEAREAS 32
|
|
|
|
typedef struct bot_activategoal_s
|
|
{
|
|
int inuse;
|
|
bot_goal_t goal; //goal to activate (buttons etc.)
|
|
float time; //time to activate something
|
|
float start_time; //time starting to activate something
|
|
float justused_time; //time the goal was used
|
|
int shoot; //true if bot has to shoot to activate
|
|
int weapon; //weapon to be used for activation
|
|
vec3_t target; //target to shoot at to activate something
|
|
vec3_t origin; //origin of the blocking entity to activate
|
|
int areas[MAX_ACTIVATEAREAS]; //routing areas disabled by blocking entity
|
|
int numareas; //number of disabled routing areas
|
|
int areasdisabled; //true if the areas are disabled for the routing
|
|
struct bot_activategoal_s* next; //next activate goal on stack
|
|
} bot_activategoal_t;
|
|
|
|
//bot state
|
|
typedef struct bot_state_s
|
|
{
|
|
int inuse; //true if this state is used by a bot client
|
|
int botthink_residual; //residual for the bot thinks
|
|
int client; //client number of the bot
|
|
int entitynum; //entity number of the bot
|
|
playerState_t cur_ps; //current player state
|
|
int last_eFlags; //last ps flags
|
|
usercmd_t lastucmd; //usercmd from last frame
|
|
int entityeventTime[1024]; //last entity event time
|
|
//
|
|
bot_settings_t settings; //several bot settings
|
|
int ( *ainode )( struct bot_state_s* bs ); //current AI node
|
|
float thinktime; //time the bot thinks this frame
|
|
vec3_t origin; //origin of the bot
|
|
vec3_t velocity; //velocity of the bot
|
|
int presencetype; //presence type of the bot
|
|
vec3_t eye; //eye coordinates of the bot
|
|
int areanum; //the number of the area the bot is in
|
|
int inventory[MAX_ITEMS]; //string with items amounts the bot has
|
|
int tfl; //the travel flags the bot uses
|
|
int flags; //several flags
|
|
int respawn_wait; //wait until respawned
|
|
int lasthealth; //health value previous frame
|
|
int lastkilledplayer; //last killed player
|
|
int lastkilledby; //player that last killed this bot
|
|
int botdeathtype; //the death type of the bot
|
|
int enemydeathtype; //the death type of the enemy
|
|
int botsuicide; //true when the bot suicides
|
|
int enemysuicide; //true when the enemy of the bot suicides
|
|
int setupcount; //true when the bot has just been setup
|
|
int map_restart; //true when the map is being restarted
|
|
int entergamechat; //true when the bot used an enter game chat
|
|
int num_deaths; //number of time this bot died
|
|
int num_kills; //number of kills of this bot
|
|
int revenge_enemy; //the revenge enemy
|
|
int revenge_kills; //number of kills the enemy made
|
|
int lastframe_health; //health value the last frame
|
|
int lasthitcount; //number of hits last frame
|
|
int chatto; //chat to all or team
|
|
float walker; //walker charactertic
|
|
float ltime; //local bot time
|
|
float entergame_time; //time the bot entered the game
|
|
float ltg_time; //long term goal time
|
|
float nbg_time; //nearby goal time
|
|
float respawn_time; //time the bot takes to respawn
|
|
float respawnchat_time; //time the bot started a chat during respawn
|
|
float chase_time; //time the bot will chase the enemy
|
|
float enemyvisible_time; //time the enemy was last visible
|
|
float check_time; //time to check for nearby items
|
|
float stand_time; //time the bot is standing still
|
|
float lastchat_time; //time the bot last selected a chat
|
|
float kamikaze_time; //time to check for kamikaze usage
|
|
float invulnerability_time; //time to check for invulnerability usage
|
|
float standfindenemy_time; //time to find enemy while standing
|
|
float attackstrafe_time; //time the bot is strafing in one dir
|
|
float attackcrouch_time; //time the bot will stop crouching
|
|
float attackchase_time; //time the bot chases during actual attack
|
|
float attackjump_time; //time the bot jumped during attack
|
|
float enemysight_time; //time before reacting to enemy
|
|
float enemydeath_time; //time the enemy died
|
|
float enemyposition_time; //time the position and velocity of the enemy were stored
|
|
float defendaway_time; //time away while defending
|
|
float defendaway_range; //max travel time away from defend area
|
|
float rushbaseaway_time; //time away from rushing to the base
|
|
float attackaway_time; //time away from attacking the enemy base
|
|
float harvestaway_time; //time away from harvesting
|
|
float ctfroam_time; //time the bot is roaming in ctf
|
|
float killedenemy_time; //time the bot killed the enemy
|
|
float arrive_time; //time arrived (at companion)
|
|
float lastair_time; //last time the bot had air
|
|
float teleport_time; //last time the bot teleported
|
|
float camp_time; //last time camped
|
|
float camp_range; //camp range
|
|
float weaponchange_time; //time the bot started changing weapons
|
|
float firethrottlewait_time; //amount of time to wait
|
|
float firethrottleshoot_time; //amount of time to shoot
|
|
float notblocked_time; //last time the bot was not blocked
|
|
float blockedbyavoidspot_time; //time blocked by an avoid spot
|
|
float predictobstacles_time; //last time the bot predicted obstacles
|
|
int predictobstacles_goalareanum; //last goal areanum the bot predicted obstacles for
|
|
vec3_t aimtarget;
|
|
vec3_t enemyvelocity; //enemy velocity 0.5 secs ago during battle
|
|
vec3_t enemyorigin; //enemy origin 0.5 secs ago during battle
|
|
//
|
|
int kamikazebody; //kamikaze body
|
|
int proxmines[MAX_PROXMINES];
|
|
int numproxmines;
|
|
//
|
|
bot_character_t* character; //the bot character
|
|
int ms; //move state of the bot
|
|
int gs; //goal state of the bot
|
|
int cs; //chat state of the bot
|
|
int ws; //weapon state of the bot
|
|
//
|
|
int enemy; //enemy entity number
|
|
int lastenemyareanum; //last reachability area the enemy was in
|
|
vec3_t lastenemyorigin; //last origin of the enemy in the reachability area
|
|
int weaponnum; //current weapon number
|
|
vec3_t viewangles; //current view angles
|
|
vec3_t ideal_viewangles; //ideal view angles
|
|
vec3_t viewanglespeed;
|
|
//
|
|
int ltgtype; //long term goal type
|
|
// team goals
|
|
int teammate; //team mate involved in this team goal
|
|
int decisionmaker; //player who decided to go for this goal
|
|
int ordered; //true if ordered to do something
|
|
float order_time; //time ordered to do something
|
|
int owndecision_time; //time the bot made it's own decision
|
|
bot_goal_t teamgoal; //the team goal
|
|
bot_goal_t altroutegoal; //alternative route goal
|
|
float reachedaltroutegoal_time; //time the bot reached the alt route goal
|
|
float teammessage_time; //time to message team mates what the bot is doing
|
|
float teamgoal_time; //time to stop helping team mate
|
|
float teammatevisible_time; //last time the team mate was NOT visible
|
|
int teamtaskpreference; //team task preference
|
|
// last ordered team goal
|
|
int lastgoal_decisionmaker;
|
|
int lastgoal_ltgtype;
|
|
int lastgoal_teammate;
|
|
bot_goal_t lastgoal_teamgoal;
|
|
// for leading team mates
|
|
int lead_teammate; //team mate the bot is leading
|
|
bot_goal_t lead_teamgoal; //team goal while leading
|
|
float lead_time; //time leading someone
|
|
float leadvisible_time; //last time the team mate was visible
|
|
float leadmessage_time; //last time a messaged was sent to the team mate
|
|
float leadbackup_time; //time backing up towards team mate
|
|
//
|
|
char teamleader[32]; //netname of the team leader
|
|
float askteamleader_time; //time asked for team leader
|
|
float becometeamleader_time; //time the bot will become the team leader
|
|
float teamgiveorders_time; //time to give team orders
|
|
float lastflagcapture_time; //last time a flag was captured
|
|
int numteammates; //number of team mates
|
|
int redflagstatus; //0 = at base, 1 = not at base
|
|
int blueflagstatus; //0 = at base, 1 = not at base
|
|
int neutralflagstatus; //0 = at base, 1 = our team has flag, 2 = enemy team has flag, 3 = enemy team dropped the flag
|
|
int flagstatuschanged; //flag status changed
|
|
int forceorders; //true if forced to give orders
|
|
int flagcarrier; //team mate carrying the enemy flag
|
|
int ctfstrategy; //ctf strategy
|
|
char subteam[32]; //sub team name
|
|
float formation_dist; //formation team mate intervening space
|
|
char formation_teammate[16]; //netname of the team mate the bot uses for relative positioning
|
|
float formation_angle; //angle relative to the formation team mate
|
|
vec3_t formation_dir; //the direction the formation is moving in
|
|
vec3_t formation_origin; //origin the bot uses for relative positioning
|
|
bot_goal_t formation_goal; //formation goal
|
|
|
|
bot_activategoal_t* activatestack; //first activate goal on the stack
|
|
bot_activategoal_t activategoalheap[MAX_ACTIVATESTACK]; //activate goal heap
|
|
|
|
bot_waypoint_t* checkpoints; //check points
|
|
bot_waypoint_t* patrolpoints; //patrol points
|
|
bot_waypoint_t* curpatrolpoint; //current patrol point the bot is going for
|
|
int patrolflags; //patrol flags
|
|
|
|
// jmarshall
|
|
bot_goal_t currentgoal;
|
|
|
|
vec3_t currentMoveGoal;
|
|
vec3_t movement_waypoints[NAV_MAX_PATHSTEPS];
|
|
int numMovementWaypoints;
|
|
int currentWaypoint;
|
|
|
|
vec3_t last_origin;
|
|
vec3_t very_short_term_origin;
|
|
|
|
int stuck_time;
|
|
|
|
vec3_t last_enemy_visible_position;
|
|
vec3_t random_move_position;
|
|
// jmarshall end
|
|
|
|
bot_input_t input;
|
|
} bot_state_t;
|
|
|
|
void BotUpdateInput( bot_state_t* bs, int time, int elapsed_time );
|
|
qboolean BotIsDead( bot_state_t* bs );
|
|
|
|
void AIEnter_Respawn( bot_state_t* bs, char* s );
|
|
|
|
extern float floattime;
|
|
#define FloatTime() floattime
|
|
|
|
|
|
float Characteristic_BFloat( bot_character_t* ch, int index, float min, float max );
|
|
void Characteristic_String( bot_character_t* ch, int index, char* buf, int size );
|
|
|
|
bot_character_t* BotLoadCharacterFromFile( char* charfile, int skill );
|
|
|
|
void BotInitLevelItems( void );
|
|
|
|
void BotChooseWeapon( bot_state_t* bs );
|
|
|
|
inline float AAS_Time()
|
|
{
|
|
return floattime;
|
|
}
|
|
|
|
unsigned short int BotTravelTime( vec3_t start, vec3_t end );
|
|
#endif
|
|
|
|
#define MAX_BOT_INVENTORY 256
|
|
|
|
typedef enum
|
|
{
|
|
NULLMOVEFLAG = -1,
|
|
MOVE_PRONE,
|
|
MOVE_CROUCH,
|
|
MOVE_WALK,
|
|
MOVE_RUN2,
|
|
MOVE_SPRINT,
|
|
MOVE_JUMP,
|
|
} botMoveFlags_t;
|
|
|
|
//
|
|
// rvmBotUtil
|
|
//
|
|
class rvmBotUtil
|
|
{
|
|
public:
|
|
static float random()
|
|
{
|
|
return ( ( rand() & 0x7fff ) / ( ( float )0x7fff ) );
|
|
}
|
|
|
|
static float crandom()
|
|
{
|
|
return ( 2.0 * ( random() - 0.5 ) );
|
|
}
|
|
};
|
|
|
|
#include "Bot_char.h"
|
|
#include "Bot_weights.h"
|
|
#include "Bot_weapons.h"
|
|
#include "Bot_goal.h"
|
|
|
|
struct bot_state_t
|
|
{
|
|
bot_state_t()
|
|
{
|
|
character = NULL;
|
|
gs = 0;
|
|
ws = 0;
|
|
Reset();
|
|
}
|
|
void Reset()
|
|
{
|
|
attackerEntity = NULL;
|
|
client = 0;
|
|
entitynum = 0;
|
|
setupcount = 0;
|
|
entergame_time = 0;
|
|
weaponnum = 0;
|
|
lasthealth = 0;
|
|
ltg_time = 0;
|
|
weaponchange_time = 0;
|
|
enemy = 0;
|
|
enemyvisible_time = 0;
|
|
enemysuicide = 0;
|
|
enemysight_time = 0;
|
|
check_time = 0;
|
|
nbg_time = 0;
|
|
enemydeath_time = 0;
|
|
teleport_time = 0;
|
|
flags = 0;
|
|
firethrottlewait_time = 0;
|
|
attackchase_time = 0;
|
|
attackcrouch_time = 0;
|
|
attackstrafe_time = 0;
|
|
attackjump_time = 0;
|
|
firethrottleshoot_time = 0;
|
|
chase_time = 0;
|
|
thinktime = 0;
|
|
useRandomPosition = false;
|
|
aimtarget.Zero();
|
|
lastenemyorigin.Zero();
|
|
origin.Zero();
|
|
enemyorigin.Zero();
|
|
random_move_position.Zero();
|
|
last_enemy_visible_position.Zero();
|
|
viewangles.Zero();
|
|
eye.Zero();
|
|
memset( &inventory[0], 0, sizeof( inventory ) );
|
|
}
|
|
|
|
bot_character_t* character;
|
|
int gs;
|
|
int ws;
|
|
int enemy;
|
|
int client;
|
|
idEntity* attackerEntity;
|
|
int lasthealth;
|
|
int entitynum;
|
|
int setupcount;
|
|
int ltg_time;
|
|
int flags;
|
|
int weaponnum;
|
|
bool useRandomPosition;
|
|
float thinktime;
|
|
float chase_time;
|
|
float attackjump_time;
|
|
float attackcrouch_time;
|
|
float attackstrafe_time;
|
|
float attackchase_time;
|
|
float firethrottlewait_time;
|
|
float firethrottleshoot_time;
|
|
float nbg_time; //nearby goal time
|
|
float entergame_time;
|
|
float weaponchange_time;
|
|
float check_time;
|
|
float teleport_time;
|
|
float enemyvisible_time; //time the enemy was last visible
|
|
int enemysuicide; //true when the enemy of the bot suicides
|
|
float enemysight_time; //time before reacting to enemy
|
|
float enemydeath_time; //time the enemy died
|
|
float aggressiveAttackTime;
|
|
float enemyposition_time;
|
|
idVec3 origin;
|
|
idVec3 aimtarget;
|
|
idVec3 random_move_position;
|
|
idVec3 last_enemy_visible_position;
|
|
idAngles viewangles;
|
|
idVec3 enemyorigin;
|
|
idVec3 eye;
|
|
idVec3 lastenemyorigin;
|
|
int inventory[MAX_BOT_INVENTORY];
|
|
bot_goal_t currentGoal;
|
|
bot_input_t botinput;
|
|
};
|
|
|
|
#include "Bot_chat.h"
|
|
|
|
#define Bot_Time() ((float)gameLocal.time / 1000.0f)
|
|
|
|
//
|
|
// rvmBot
|
|
//
|
|
class rvmBot : public idPlayer
|
|
{
|
|
public:
|
|
friend class rvmBotAI;
|
|
|
|
CLASS_PROTOTYPE( rvmBot );
|
|
|
|
rvmBot();
|
|
~rvmBot();
|
|
|
|
void Spawn( void );
|
|
virtual void Think( void ) override;
|
|
virtual void SpawnToPoint( const idVec3& spawn_origin, const idAngles& spawn_angles ) override;
|
|
virtual void Damage( idEntity* inflictor, idEntity* attacker, const idVec3& dir, const char* damageDefName, const float damageScale, const int location ) override;
|
|
virtual void InflictedDamageEvent(idEntity* target) override;
|
|
virtual void StateThreadChanged(void) override;
|
|
|
|
virtual bool IsBot(void) override
|
|
{
|
|
return true;
|
|
}
|
|
|
|
void SetEnemy( idPlayer* player, idVec3 origin );
|
|
|
|
void BotInputFrame( void );
|
|
void Bot_ResetUcmd( usercmd_t& ucmd );
|
|
|
|
static void PresenceTypeBoundingBox( int presencetype, idVec3& mins, idVec3& maxs );
|
|
private:
|
|
void BotSendChatMessage(botChat_t chat, const char *targetName);
|
|
|
|
void BotInputToUserCommand( bot_input_t* bi, usercmd_t* ucmd, int time );
|
|
|
|
void BotMoveToGoalOrigin( idVec3 goalOrigin );
|
|
|
|
void ServerThink( void );
|
|
void BotUpdateInventory( void );
|
|
|
|
bool HasWeapon( int index )
|
|
{
|
|
return inventory.weapons & ( 1 << index );
|
|
}
|
|
private:
|
|
bot_state_t bs;
|
|
bool hasSpawned;
|
|
|
|
private:
|
|
int weapon_machinegun;
|
|
int weapon_shotgun;
|
|
int weapon_plasmagun;
|
|
int weapon_rocketlauncher;
|
|
protected:
|
|
bool BotIsDead(bot_state_t* bs);
|
|
bool BotReachedGoal(bot_state_t* bs, bot_goal_t* goal);
|
|
int BotGetItemLongTermGoal(bot_state_t* bs, int tfl, bot_goal_t* goal);
|
|
void BotChooseWeapon(bot_state_t* bs);
|
|
int BotFindEnemy(bot_state_t* bs, int curenemy);
|
|
bool EntityIsDead(idEntity* entity);
|
|
float BotEntityVisible(int viewer, idVec3 eye, idAngles viewangles, float fov, int ent);
|
|
float BotEntityVisibleTest(int viewer, idVec3 eye, idAngles viewangles, float fov, int ent, bool allowHeightTest);
|
|
void BotUpdateBattleInventory(bot_state_t* bs, int enemy);
|
|
float BotAggression(bot_state_t* bs);
|
|
int BotWantsToRetreat(bot_state_t* bs);
|
|
void BotBattleUseItems(bot_state_t* bs);
|
|
void BotAimAtEnemy(bot_state_t* bs);
|
|
void BotCheckAttack(bot_state_t* bs);
|
|
bool BotWantsToChase(bot_state_t* bs);
|
|
int BotNearbyGoal(bot_state_t* bs, int tfl, bot_goal_t* ltg, float range);
|
|
void BotGetRandomPointNearPosition(idVec3 point, idVec3& randomPoint, float radius);
|
|
int BotMoveInRandomDirection(bot_state_t* bs);
|
|
void BotMoveToGoal(bot_state_t* bs, bot_goal_t* goal);
|
|
|
|
void MoveToCoverPoint(void);
|
|
|
|
static int WP_MACHINEGUN;
|
|
static int WP_SHOTGUN;
|
|
static int WP_PLASMAGUN;
|
|
static int WP_ROCKET_LAUNCHER;
|
|
private:
|
|
stateResult_t state_Chase(stateParms_t* parms);
|
|
stateResult_t state_BattleFight(stateParms_t* parms);
|
|
stateResult_t state_BattleNBG(stateParms_t* parms);
|
|
stateResult_t state_Retreat(stateParms_t* parms);
|
|
stateResult_t state_Respawn(stateParms_t* parms);
|
|
stateResult_t state_SeekNBG(stateParms_t* parms);
|
|
stateResult_t state_SeekLTG(stateParms_t* parms);
|
|
stateResult_t state_Attacked(stateParms_t* parms);
|
|
private:
|
|
idAAS* aas;
|
|
};
|
|
|
|
extern idCVar bot_skill; |