2012-08-04 10:54:37 +00:00
|
|
|
// Copyright (C) 1999-2000 Id Software, Inc.
|
2012-01-22 21:34:33 +00:00
|
|
|
//
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
* name: ai_main.h
|
|
|
|
*
|
|
|
|
* desc: Quake3 bot AI
|
|
|
|
*
|
2012-08-04 10:54:37 +00:00
|
|
|
* $Archive: /StarTrek/Code-DM/game/ai_main.h $
|
|
|
|
* $Author: Jmonroe $
|
|
|
|
* $Revision: 1 $
|
|
|
|
* $Modtime: 1/21/00 10:12p $
|
|
|
|
* $Date: 1/25/00 6:26p $
|
2012-01-22 21:34:33 +00:00
|
|
|
*
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
//#define DEBUG
|
|
|
|
#define CTF
|
|
|
|
|
|
|
|
#define MAX_ITEMS 256
|
|
|
|
//bot flags
|
2012-08-04 10:54:37 +00:00
|
|
|
#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
|
2012-01-22 21:34:33 +00:00
|
|
|
//long term goal types
|
2012-08-04 10:54:37 +00:00
|
|
|
#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
|
2012-01-22 21:34:33 +00:00
|
|
|
//some goal dedication times
|
2012-08-04 10:54:37 +00:00
|
|
|
#define TEAM_HELP_TIME 10 //!<1 minute teamplay help time
|
|
|
|
#define TEAM_ACCOMPANY_TIME 10 //!<10 minutes teamplay accompany time
|
|
|
|
#define TEAM_DEFENDKEYAREA_TIME 600 //!<5 minutes ctf defend base time
|
|
|
|
#define TEAM_CAMP_TIME 10 //!<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 10 //!<1 minute
|
|
|
|
#define TEAM_KILL_SOMEONE 10 //!<3 minute to kill someone
|
|
|
|
#define CTF_GETFLAG_TIME 600 //!<5 minutes ctf get flag time
|
|
|
|
#define CTF_RUSHBASE_TIME 600 //!<2 minutes ctf rush base time
|
|
|
|
#define CTF_RETURNFLAG_TIME 600 //!<3 minutes to return the flag
|
|
|
|
#define CTF_ROAM_TIME 600 //!<1 minute ctf roam time
|
2012-01-22 21:34:33 +00:00
|
|
|
//patrol flags
|
|
|
|
#define PATROL_LOOP 1
|
|
|
|
#define PATROL_REVERSE 2
|
|
|
|
#define PATROL_BACK 4
|
2012-08-04 10:54:37 +00:00
|
|
|
//CTF task preference
|
|
|
|
#define CTFTP_DEFENDER 1
|
|
|
|
#define CTFTP_ATTACKER 2
|
2012-01-22 21:34:33 +00:00
|
|
|
//CTF strategy
|
2012-08-04 10:54:37 +00:00
|
|
|
#define CTFS_PASSIVE 1
|
2012-01-22 21:34:33 +00:00
|
|
|
//copied from the aas file header
|
|
|
|
#define PRESENCE_NONE 1
|
|
|
|
#define PRESENCE_NORMAL 2
|
|
|
|
#define PRESENCE_CROUCH 4
|
|
|
|
|
2012-08-04 10:54:37 +00:00
|
|
|
//!check points
|
2012-01-22 21:34:33 +00:00
|
|
|
typedef struct bot_waypoint_s
|
|
|
|
{
|
|
|
|
int inuse;
|
|
|
|
char name[32];
|
|
|
|
bot_goal_t goal;
|
|
|
|
struct bot_waypoint_s *next, *prev;
|
|
|
|
} bot_waypoint_t;
|
|
|
|
|
2012-08-04 10:54:37 +00:00
|
|
|
//!bot state
|
2012-01-22 21:34:33 +00:00
|
|
|
typedef struct bot_state_s
|
|
|
|
{
|
2012-08-04 10:54:37 +00:00
|
|
|
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
|
2012-01-22 21:34:33 +00:00
|
|
|
//
|
2012-08-04 10:54:37 +00:00
|
|
|
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 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 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 activate_time; //!<time to activate something
|
|
|
|
float activatemessage_time; //!<time to show activate message
|
|
|
|
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 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
|
2012-01-22 21:34:33 +00:00
|
|
|
vec3_t aimtarget;
|
2012-08-04 10:54:37 +00:00
|
|
|
vec3_t enemyvelocity; //!<enemy velocity 0.5 secs ago during battle
|
|
|
|
vec3_t enemyorigin; //!<enemy origin 0.5 secs ago during battle
|
2012-01-22 21:34:33 +00:00
|
|
|
//
|
2012-08-04 10:54:37 +00:00
|
|
|
int 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
|
2012-01-22 21:34:33 +00:00
|
|
|
//
|
2012-08-04 10:54:37 +00:00
|
|
|
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
|
2012-01-22 21:34:33 +00:00
|
|
|
vec3_t viewanglespeed;
|
|
|
|
//
|
2012-08-04 10:54:37 +00:00
|
|
|
int ltgtype; //!<long term goal type
|
2012-01-22 21:34:33 +00:00
|
|
|
//
|
2012-08-04 10:54:37 +00:00
|
|
|
int teammate; //!<team mate
|
|
|
|
bot_goal_t teamgoal; //!<the team 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 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 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_goal_t activategoal; //!<goal to activate (buttons etc.)
|
|
|
|
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
|
2012-01-22 21:34:33 +00:00
|
|
|
} bot_state_t;
|
|
|
|
|
2012-08-04 10:54:37 +00:00
|
|
|
//!resets the whole bot state
|
2012-01-22 21:34:33 +00:00
|
|
|
void BotResetState(bot_state_t *bs);
|
2012-08-04 10:54:37 +00:00
|
|
|
//!returns the number of bots in the game
|
2012-01-22 21:34:33 +00:00
|
|
|
int NumBots(void);
|
2012-08-04 10:54:37 +00:00
|
|
|
//!returns info about the entity
|
2012-01-22 21:34:33 +00:00
|
|
|
void BotEntityInfo(int entnum, aas_entityinfo_t *info);
|
|
|
|
|
|
|
|
// from the game source
|
2012-09-10 10:55:24 +00:00
|
|
|
void QDECL BotAI_Print(int type, char *fmt, ...) __attribute__ ((format (printf, 2, 3)));
|
2012-01-22 21:34:33 +00:00
|
|
|
void QDECL QDECL BotAI_BotInitialChat( bot_state_t *bs, char *type, ... );
|
|
|
|
void BotAI_Trace(bsp_trace_t *bsptrace, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, int passent, int contentmask);
|
|
|
|
int BotAI_GetClientState( int clientNum, playerState_t *state );
|
|
|
|
int BotAI_GetEntityState( int entityNum, entityState_t *state );
|
|
|
|
int BotAI_GetSnapshotEntity( int clientNum, int sequence, entityState_t *state );
|
|
|
|
int BotTeamLeader(bot_state_t *bs);
|