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:		be_ai_move.h
26  *
27  * desc:		movement AI
28  *
29  * $Archive: /source/code/botlib/be_ai_move.h $
30  *
31  *****************************************************************************/
32 
33 //movement types
34 #define MOVE_WALK						1
35 #define MOVE_CROUCH						2
36 #define MOVE_JUMP						4
37 #define MOVE_GRAPPLE					8
38 #define MOVE_ROCKETJUMP					16
39 #define MOVE_BFGJUMP					32
40 //move flags
41 #define MFL_BARRIERJUMP					1		//bot is performing a barrier jump
42 #define MFL_ONGROUND					2		//bot is in the ground
43 #define MFL_SWIMMING					4		//bot is swimming
44 #define MFL_AGAINSTLADDER				8		//bot is against a ladder
45 #define MFL_WATERJUMP					16		//bot is waterjumping
46 #define MFL_TELEPORTED					32		//bot is being teleported
47 #define MFL_GRAPPLEPULL					64		//bot is being pulled by the grapple
48 #define MFL_ACTIVEGRAPPLE				128		//bot is using the grapple hook
49 #define MFL_GRAPPLERESET				256		//bot has reset the grapple
50 #define MFL_WALK						512		//bot should walk slowly
51 // move result flags
52 #define MOVERESULT_MOVEMENTVIEW			1		//bot uses view for movement
53 #define MOVERESULT_SWIMVIEW				2		//bot uses view for swimming
54 #define MOVERESULT_WAITING				4		//bot is waiting for something
55 #define MOVERESULT_MOVEMENTVIEWSET		8		//bot has set the view in movement code
56 #define MOVERESULT_MOVEMENTWEAPON		16		//bot uses weapon for movement
57 #define MOVERESULT_ONTOPOFOBSTACLE		32		//bot is ontop of obstacle
58 #define MOVERESULT_ONTOPOF_FUNCBOB		64		//bot is ontop of a func_bobbing
59 #define MOVERESULT_ONTOPOF_ELEVATOR		128		//bot is ontop of an elevator (func_plat)
60 #define MOVERESULT_BLOCKEDBYAVOIDSPOT	256		//bot is blocked by an avoid spot
61 //
62 #define MAX_AVOIDREACH					1
63 #define MAX_AVOIDSPOTS					32
64 // avoid spot types
65 #define AVOID_CLEAR						0		//clear all avoid spots
66 #define AVOID_ALWAYS					1		//avoid always
67 #define AVOID_DONTBLOCK					2		//never totally block
68 // restult types
69 #define RESULTTYPE_ELEVATORUP			1		//elevator is up
70 #define RESULTTYPE_WAITFORFUNCBOBBING	2		//waiting for func bobbing to arrive
71 #define RESULTTYPE_BADGRAPPLEPATH		4		//grapple path is obstructed
72 #define RESULTTYPE_INSOLIDAREA			8		//stuck in solid area, this is bad
73 
74 //structure used to initialize the movement state
75 //the or_moveflags MFL_ONGROUND, MFL_TELEPORTED and MFL_WATERJUMP come from the playerstate
76 typedef struct bot_initmove_s
77 {
78 	vec3_t origin;				//origin of the bot
79 	vec3_t velocity;			//velocity of the bot
80 	vec3_t viewoffset;			//view offset
81 	int entitynum;				//entity number of the bot
82 	int client;					//client number of the bot
83 	float thinktime;			//time the bot thinks
84 	int presencetype;			//presencetype of the bot
85 	vec3_t viewangles;			//view angles of the bot
86 	int or_moveflags;			//values ored to the movement flags
87 } bot_initmove_t;
88 
89 //NOTE: the ideal_viewangles are only valid if MFL_MOVEMENTVIEW is set
90 typedef struct bot_moveresult_s
91 {
92 	int failure;				//true if movement failed all together
93 	int type;					//failure or blocked type
94 	int blocked;				//true if blocked by an entity
95 	int blockentity;			//entity blocking the bot
96 	int traveltype;				//last executed travel type
97 	int flags;					//result flags
98 	int weapon;					//weapon used for movement
99 	vec3_t movedir;				//movement direction
100 	vec3_t ideal_viewangles;	//ideal viewangles for the movement
101 } bot_moveresult_t;
102 
103 #define bot_moveresult_t_cleared(x) bot_moveresult_t (x) = {0, 0, 0, 0, 0, 0, 0, {0, 0, 0}, {0, 0, 0}}
104 
105 typedef struct bot_avoidspot_s
106 {
107 	vec3_t origin;
108 	float radius;
109 	int type;
110 } bot_avoidspot_t;
111 
112 //resets the whole move state
113 void BotResetMoveState(int movestate);
114 //moves the bot to the given goal
115 void BotMoveToGoal(bot_moveresult_t *result, int movestate, bot_goal_t *goal, int travelflags);
116 //moves the bot in the specified direction using the specified type of movement
117 int BotMoveInDirection(int movestate, vec3_t dir, float speed, int type);
118 //reset avoid reachability
119 void BotResetAvoidReach(int movestate);
120 //resets the last avoid reachability
121 void BotResetLastAvoidReach(int movestate);
122 //returns a reachability area if the origin is in one
123 int BotReachabilityArea(vec3_t origin, int client);
124 //view target based on movement
125 int BotMovementViewTarget(int movestate, bot_goal_t *goal, int travelflags, float lookahead, vec3_t target);
126 //predict the position of a player based on movement towards a goal
127 int BotPredictVisiblePosition(vec3_t origin, int areanum, bot_goal_t *goal, int travelflags, vec3_t target);
128 //returns the handle of a newly allocated movestate
129 int BotAllocMoveState(void);
130 //frees the movestate with the given handle
131 void BotFreeMoveState(int handle);
132 //initialize movement state before performing any movement
133 void BotInitMoveState(int handle, bot_initmove_t *initmove);
134 //add a spot to avoid (if type == AVOID_CLEAR all spots are removed)
135 void BotAddAvoidSpot(int movestate, vec3_t origin, float radius, int type);
136 //must be called every map change
137 void BotSetBrushModelTypes(void);
138 //setup movement AI
139 int BotSetupMoveAI(void);
140 //shutdown movement AI
141 void BotShutdownMoveAI(void);
142 
143