1 /*
2 ===========================================================================
3 Copyright (C) 1999-2005 Id Software, Inc.
4 
5 This file is part of Quake III Arena source code.
6 
7 Quake III Arena source code is free software; you can redistribute it
8 and/or modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2 of the License,
10 or (at your option) any later version.
11 
12 Quake III Arena source code is distributed in the hope that it will be
13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with Quake III Arena source code; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 ===========================================================================
21 */
22 //
23 
24 /*****************************************************************************
25  * name:		ai_main.h
26  *
27  * desc:		Quake3 bot AI
28  *
29  * $Archive: /source/code/botai/ai_chat.c $
30  *
31  *****************************************************************************/
32 
33 //#define DEBUG
34 #define CTF
35 
36 #define MAX_ITEMS					256
37 //bot flags
38 #define BFL_STRAFERIGHT				1	//strafe to the right
39 #define BFL_ATTACKED				2	//bot has attacked last ai frame
40 #define BFL_ATTACKJUMPED			4	//bot jumped during attack last frame
41 #define BFL_AIMATENEMY				8	//bot aimed at the enemy this frame
42 #define BFL_AVOIDRIGHT				16	//avoid obstacles by going to the right
43 #define BFL_IDEALVIEWSET			32	//bot has ideal view angles set
44 #define BFL_FIGHTSUICIDAL			64	//bot is in a suicidal fight
45 //long term goal types
46 #define LTG_TEAMHELP				1	//help a team mate
47 #define LTG_TEAMACCOMPANY			2	//accompany a team mate
48 #define LTG_DEFENDKEYAREA			3	//defend a key area
49 #define LTG_GETFLAG					4	//get the enemy flag
50 #define LTG_RUSHBASE				5	//rush to the base
51 #define LTG_RETURNFLAG				6	//return the flag
52 #define LTG_CAMP					7	//camp somewhere
53 #define LTG_CAMPORDER				8	//ordered to camp somewhere
54 #define LTG_PATROL					9	//patrol
55 #define LTG_GETITEM					10	//get an item
56 #define LTG_KILL					11	//kill someone
57 #define LTG_HARVEST					12	//harvest skulls
58 #define LTG_ATTACKENEMYBASE			13	//attack the enemy base
59 #define LTG_MAKELOVE_UNDER			14
60 #define LTG_MAKELOVE_ONTOP			15
61 //some goal dedication times
62 #define TEAM_HELP_TIME				60	//1 minute teamplay help time
63 #define TEAM_ACCOMPANY_TIME			600	//10 minutes teamplay accompany time
64 #define TEAM_DEFENDKEYAREA_TIME		600	//10 minutes ctf defend base time
65 #define TEAM_CAMP_TIME				600	//10 minutes camping time
66 #define TEAM_PATROL_TIME			600	//10 minutes patrolling time
67 #define TEAM_LEAD_TIME				600	//10 minutes taking the lead
68 #define TEAM_GETITEM_TIME			60	//1 minute
69 #define	TEAM_KILL_SOMEONE			180	//3 minute to kill someone
70 #define TEAM_ATTACKENEMYBASE_TIME	600	//10 minutes
71 #define TEAM_HARVEST_TIME			120	//2 minutes
72 #define CTF_GETFLAG_TIME			600	//10 minutes ctf get flag time
73 #define CTF_RUSHBASE_TIME			120	//2 minutes ctf rush base time
74 #define CTF_RETURNFLAG_TIME			180	//3 minutes to return the flag
75 #define CTF_ROAM_TIME				60	//1 minute ctf roam time
76 //patrol flags
77 #define PATROL_LOOP					1
78 #define PATROL_REVERSE				2
79 #define PATROL_BACK					4
80 //teamplay task preference
81 #define TEAMTP_DEFENDER				1
82 #define TEAMTP_ATTACKER				2
83 //CTF strategy
84 #define CTFS_AGRESSIVE				1
85 //copied from the aas file header
86 #define PRESENCE_NONE				1
87 #define PRESENCE_NORMAL				2
88 #define PRESENCE_CROUCH				4
89 //
90 #define MAX_PROXMINES				64
91 
92 //check points
93 typedef struct bot_waypoint_s
94 {
95 	int			inuse;
96 	char		name[32];
97 	bot_goal_t	goal;
98 	struct		bot_waypoint_s *next, *prev;
99 } bot_waypoint_t;
100 
101 #define MAX_ACTIVATESTACK		8
102 #define MAX_ACTIVATEAREAS		32
103 
104 typedef struct bot_activategoal_s
105 {
106 	int inuse;
107 	bot_goal_t goal;						//goal to activate (buttons etc.)
108 	float time;								//time to activate something
109 	float start_time;						//time starting to activate something
110 	float justused_time;					//time the goal was used
111 	int shoot;								//true if bot has to shoot to activate
112 	int weapon;								//weapon to be used for activation
113 	vec3_t target;							//target to shoot at to activate something
114 	vec3_t origin;							//origin of the blocking entity to activate
115 	int areas[MAX_ACTIVATEAREAS];			//routing areas disabled by blocking entity
116 	int numareas;							//number of disabled routing areas
117 	int areasdisabled;						//true if the areas are disabled for the routing
118 	struct bot_activategoal_s *next;		//next activate goal on stack
119 } bot_activategoal_t;
120 
121 //bot state
122 typedef struct bot_state_s
123 {
124 	int inuse;										//true if this state is used by a bot client
125 	int botthink_residual;							//residual for the bot thinks
126 	int client;										//client number of the bot
127 	int entitynum;									//entity number of the bot
128 	playerState_t cur_ps;							//current player state
129 	int last_eFlags;								//last ps flags
130 	usercmd_t lastucmd;								//usercmd from last frame
131 	int entityeventTime[1024];						//last entity event time
132 	//
133 	bot_settings_t settings;						//several bot settings
134 	int (*ainode)(struct bot_state_s *bs);			//current AI node
135 	float thinktime;								//time the bot thinks this frame
136 	vec3_t origin;									//origin of the bot
137 	vec3_t velocity;								//velocity of the bot
138 	int presencetype;								//presence type of the bot
139 	vec3_t eye;										//eye coordinates of the bot
140 	int areanum;									//the number of the area the bot is in
141 	int inventory[MAX_ITEMS];						//string with items amounts the bot has
142 	int tfl;										//the travel flags the bot uses
143 	int flags;										//several flags
144 	int respawn_wait;								//wait until respawned
145 	int lasthealth;									//health value previous frame
146 	int lastkilledplayer;							//last killed player
147 	int lastkilledby;								//player that last killed this bot
148 	int botdeathtype;								//the death type of the bot
149 	int enemydeathtype;								//the death type of the enemy
150 	int botsuicide;									//true when the bot suicides
151 	int enemysuicide;								//true when the enemy of the bot suicides
152 	int setupcount;									//true when the bot has just been setup
153 	int map_restart;									//true when the map is being restarted
154 	int entergamechat;								//true when the bot used an enter game chat
155 	int num_deaths;									//number of time this bot died
156 	int num_kills;									//number of kills of this bot
157 	int revenge_enemy;								//the revenge enemy
158 	int revenge_kills;								//number of kills the enemy made
159 	int lastframe_health;							//health value the last frame
160 	int lasthitcount;								//number of hits last frame
161 	int chatto;										//chat to all or team
162 	float walker;									//walker charactertic
163 	float ltime;									//local bot time
164 	float entergame_time;							//time the bot entered the game
165 	float ltg_time;									//long term goal time
166 	float nbg_time;									//nearby goal time
167 	float respawn_time;								//time the bot takes to respawn
168 	float respawnchat_time;							//time the bot started a chat during respawn
169 	float chase_time;								//time the bot will chase the enemy
170 	float enemyvisible_time;						//time the enemy was last visible
171 	float check_time;								//time to check for nearby items
172 	float stand_time;								//time the bot is standing still
173 	float lastchat_time;							//time the bot last selected a chat
174 	float kamikaze_time;							//time to check for kamikaze usage
175 	float invulnerability_time;						//time to check for invulnerability usage
176 	float standfindenemy_time;						//time to find enemy while standing
177 	float attackstrafe_time;						//time the bot is strafing in one dir
178 	float attackcrouch_time;						//time the bot will stop crouching
179 	float attackchase_time;							//time the bot chases during actual attack
180 	float attackjump_time;							//time the bot jumped during attack
181 	float enemysight_time;							//time before reacting to enemy
182 	float enemydeath_time;							//time the enemy died
183 	float enemyposition_time;						//time the position and velocity of the enemy were stored
184 	float defendaway_time;							//time away while defending
185 	float defendaway_range;							//max travel time away from defend area
186 	float rushbaseaway_time;						//time away from rushing to the base
187 	float attackaway_time;							//time away from attacking the enemy base
188 	float harvestaway_time;							//time away from harvesting
189 	float ctfroam_time;								//time the bot is roaming in ctf
190 	float killedenemy_time;							//time the bot killed the enemy
191 	float arrive_time;								//time arrived (at companion)
192 	float lastair_time;								//last time the bot had air
193 	float teleport_time;							//last time the bot teleported
194 	float camp_time;								//last time camped
195 	float camp_range;								//camp range
196 	float weaponchange_time;						//time the bot started changing weapons
197 	float firethrottlewait_time;					//amount of time to wait
198 	float firethrottleshoot_time;					//amount of time to shoot
199 	float notblocked_time;							//last time the bot was not blocked
200 	float blockedbyavoidspot_time;					//time blocked by an avoid spot
201 	float predictobstacles_time;					//last time the bot predicted obstacles
202 	int predictobstacles_goalareanum;				//last goal areanum the bot predicted obstacles for
203 	vec3_t aimtarget;
204 	vec3_t enemyvelocity;							//enemy velocity 0.5 secs ago during battle
205 	vec3_t enemyorigin;								//enemy origin 0.5 secs ago during battle
206 	//
207 	int kamikazebody;								//kamikaze body
208 	int proxmines[MAX_PROXMINES];
209 	int numproxmines;
210 	//
211 	int character;									//the bot character
212 	int ms;											//move state of the bot
213 	int gs;											//goal state of the bot
214 	int cs;											//chat state of the bot
215 	int ws;											//weapon state of the bot
216 	//
217 	int enemy;										//enemy entity number
218 	int lastenemyareanum;							//last reachability area the enemy was in
219 	vec3_t lastenemyorigin;							//last origin of the enemy in the reachability area
220 	int weaponnum;									//current weapon number
221 	vec3_t viewangles;								//current view angles
222 	vec3_t ideal_viewangles;						//ideal view angles
223 	vec3_t viewanglespeed;
224 	//
225 	int ltgtype;									//long term goal type
226 	// team goals
227 	int teammate;									//team mate involved in this team goal
228 	int decisionmaker;								//player who decided to go for this goal
229 	int ordered;									//true if ordered to do something
230 	float order_time;								//time ordered to do something
231 	int owndecision_time;							//time the bot made it's own decision
232 	bot_goal_t teamgoal;							//the team goal
233 	bot_goal_t altroutegoal;						//alternative route goal
234 	float reachedaltroutegoal_time;					//time the bot reached the alt route goal
235 	float teammessage_time;							//time to message team mates what the bot is doing
236 	float teamgoal_time;							//time to stop helping team mate
237 	float teammatevisible_time;						//last time the team mate was NOT visible
238 	int teamtaskpreference;							//team task preference
239 	// last ordered team goal
240 	int lastgoal_decisionmaker;
241 	int lastgoal_ltgtype;
242 	int lastgoal_teammate;
243 	bot_goal_t lastgoal_teamgoal;
244 	// for leading team mates
245 	int lead_teammate;								//team mate the bot is leading
246 	bot_goal_t lead_teamgoal;						//team goal while leading
247 	float lead_time;								//time leading someone
248 	float leadvisible_time;							//last time the team mate was visible
249 	float leadmessage_time;							//last time a messaged was sent to the team mate
250 	float leadbackup_time;							//time backing up towards team mate
251 	//
252 	char teamleader[32];							//netname of the team leader
253 	float askteamleader_time;						//time asked for team leader
254 	float becometeamleader_time;					//time the bot will become the team leader
255 	float teamgiveorders_time;						//time to give team orders
256 	float lastflagcapture_time;						//last time a flag was captured
257 	int numteammates;								//number of team mates
258 	int redflagstatus;								//0 = at base, 1 = not at base
259 	int blueflagstatus;								//0 = at base, 1 = not at base
260 	int neutralflagstatus;							//0 = at base, 1 = our team has flag, 2 = enemy team has flag, 3 = enemy team dropped the flag
261 	int flagstatuschanged;							//flag status changed
262 	int forceorders;								//true if forced to give orders
263 	int flagcarrier;								//team mate carrying the enemy flag
264 	int ctfstrategy;								//ctf strategy
265 	char subteam[32];								//sub team name
266 	float formation_dist;							//formation team mate intervening space
267 	char formation_teammate[16];					//netname of the team mate the bot uses for relative positioning
268 	float formation_angle;							//angle relative to the formation team mate
269 	vec3_t formation_dir;							//the direction the formation is moving in
270 	vec3_t formation_origin;						//origin the bot uses for relative positioning
271 	bot_goal_t formation_goal;						//formation goal
272 
273 	bot_activategoal_t *activatestack;				//first activate goal on the stack
274 	bot_activategoal_t activategoalheap[MAX_ACTIVATESTACK];	//activate goal heap
275 
276 	bot_waypoint_t *checkpoints;					//check points
277 	bot_waypoint_t *patrolpoints;					//patrol points
278 	bot_waypoint_t *curpatrolpoint;					//current patrol point the bot is going for
279 	int patrolflags;								//patrol flags
280 } bot_state_t;
281 
282 //resets the whole bot state
283 void BotResetState(bot_state_t *bs);
284 //returns the number of bots in the game
285 int NumBots(void);
286 //returns info about the entity
287 void BotEntityInfo(int entnum, aas_entityinfo_t *info);
288 
289 extern float floattime;
290 #define FloatTime() floattime
291 
292 // from the game source
293 void	QDECL BotAI_Print(int type, char *fmt, ...);
294 void	QDECL QDECL BotAI_BotInitialChat( bot_state_t *bs, char *type, ... );
295 void	BotAI_Trace(bsp_trace_t *bsptrace, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, int passent, int contentmask);
296 int		BotAI_GetClientState( int clientNum, playerState_t *state );
297 int		BotAI_GetEntityState( int entityNum, entityState_t *state );
298 int		BotAI_GetSnapshotEntity( int clientNum, int sequence, entityState_t *state );
299 int		BotTeamLeader(bot_state_t *bs);
300