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  * name:		be_aas_def.h
25  *
26  * desc:		AAS
27  *
28  * $Archive: /source/code/botlib/be_aas_def.h $
29  *
30  *****************************************************************************/
31 
32 //debugging on
33 #define AAS_DEBUG
34 
35 #define MAX_CLIENTS			64
36 #define	MAX_MODELS			256		// these are sent over the net as 8 bits
37 #define	MAX_SOUNDS			256		// so they cannot be blindly increased
38 #define	MAX_CONFIGSTRINGS	1024
39 
40 #define	CS_SCORES			32
41 #define	CS_MODELS			(CS_SCORES+MAX_CLIENTS)
42 #define	CS_SOUNDS			(CS_MODELS+MAX_MODELS)
43 
44 #define DF_AASENTNUMBER(x)		(x - aasworld.entities)
45 #define DF_NUMBERAASENT(x)		(&aasworld.entities[x])
46 #define DF_AASENTCLIENT(x)		(x - aasworld.entities - 1)
47 #define DF_CLIENTAASENT(x)		(&aasworld.entities[x + 1])
48 
49 #ifndef MAX_PATH
50 	#define MAX_PATH				MAX_QPATH
51 #endif
52 
53 //string index (for model, sound and image index)
54 typedef struct aas_stringindex_s
55 {
56 	int numindexes;
57 	char **index;
58 } aas_stringindex_t;
59 
60 //structure to link entities to areas and areas to entities
61 typedef struct aas_link_s
62 {
63 	int entnum;
64 	int areanum;
65 	struct aas_link_s *next_ent, *prev_ent;
66 	struct aas_link_s *next_area, *prev_area;
67 } aas_link_t;
68 
69 //structure to link entities to leaves and leaves to entities
70 typedef struct bsp_link_s
71 {
72 	int entnum;
73 	int leafnum;
74 	struct bsp_link_s *next_ent, *prev_ent;
75 	struct bsp_link_s *next_leaf, *prev_leaf;
76 } bsp_link_t;
77 
78 typedef struct bsp_entdata_s
79 {
80 	vec3_t origin;
81 	vec3_t angles;
82 	vec3_t absmins;
83 	vec3_t absmaxs;
84 	int solid;
85 	int modelnum;
86 } bsp_entdata_t;
87 
88 //entity
89 typedef struct aas_entity_s
90 {
91 	//entity info
92 	aas_entityinfo_t i;
93 	//links into the AAS areas
94 	aas_link_t *areas;
95 	//links into the BSP leaves
96 	bsp_link_t *leaves;
97 } aas_entity_t;
98 
99 typedef struct aas_settings_s
100 {
101 	vec3_t phys_gravitydirection;
102 	float phys_friction;
103 	float phys_stopspeed;
104 	float phys_gravity;
105 	float phys_waterfriction;
106 	float phys_watergravity;
107 	float phys_maxvelocity;
108 	float phys_maxwalkvelocity;
109 	float phys_maxcrouchvelocity;
110 	float phys_maxswimvelocity;
111 	float phys_walkaccelerate;
112 	float phys_airaccelerate;
113 	float phys_swimaccelerate;
114 	float phys_maxstep;
115 	float phys_maxsteepness;
116 	float phys_maxwaterjump;
117 	float phys_maxbarrier;
118 	float phys_jumpvel;
119 	float phys_falldelta5;
120 	float phys_falldelta10;
121 	float rs_waterjump;
122 	float rs_teleport;
123 	float rs_barrierjump;
124 	float rs_startcrouch;
125 	float rs_startgrapple;
126 	float rs_startwalkoffledge;
127 	float rs_startjump;
128 	float rs_rocketjump;
129 	float rs_bfgjump;
130 	float rs_jumppad;
131 	float rs_aircontrolledjumppad;
132 	float rs_funcbob;
133 	float rs_startelevator;
134 	float rs_falldamage5;
135 	float rs_falldamage10;
136 	float rs_maxfallheight;
137 	float rs_maxjumpfallheight;
138 } aas_settings_t;
139 
140 #define CACHETYPE_PORTAL		0
141 #define CACHETYPE_AREA			1
142 
143 //routing cache
144 typedef struct aas_routingcache_s
145 {
146 	byte type;									//portal or area cache
147 	float time;									//last time accessed or updated
148 	int size;									//size of the routing cache
149 	int cluster;								//cluster the cache is for
150 	int areanum;								//area the cache is created for
151 	vec3_t origin;								//origin within the area
152 	float starttraveltime;						//travel time to start with
153 	int travelflags;							//combinations of the travel flags
154 	struct aas_routingcache_s *prev, *next;
155 	struct aas_routingcache_s *time_prev, *time_next;
156 	unsigned char *reachabilities;				//reachabilities used for routing
157 	unsigned short int traveltimes[1];			//travel time for every area (variable sized)
158 } aas_routingcache_t;
159 
160 //fields for the routing algorithm
161 typedef struct aas_routingupdate_s
162 {
163 	int cluster;
164 	int areanum;								//area number of the update
165 	vec3_t start;								//start point the area was entered
166 	unsigned short int tmptraveltime;			//temporary travel time
167 	unsigned short int *areatraveltimes;		//travel times within the area
168 	qboolean inlist;							//true if the update is in the list
169 	struct aas_routingupdate_s *next;
170 	struct aas_routingupdate_s *prev;
171 } aas_routingupdate_t;
172 
173 //reversed reachability link
174 typedef struct aas_reversedlink_s
175 {
176 	int linknum;								//the aas_areareachability_t
177 	int areanum;								//reachable from this area
178 	struct aas_reversedlink_s *next;			//next link
179 } aas_reversedlink_t;
180 
181 //reversed area reachability
182 typedef struct aas_reversedreachability_s
183 {
184 	int numlinks;
185 	aas_reversedlink_t *first;
186 } aas_reversedreachability_t;
187 
188 //areas a reachability goes through
189 typedef struct aas_reachabilityareas_s
190 {
191 	int firstarea, numareas;
192 } aas_reachabilityareas_t;
193 
194 typedef struct aas_s
195 {
196 	int loaded;									//true when an AAS file is loaded
197 	int initialized;							//true when AAS has been initialized
198 	int savefile;								//set true when file should be saved
199 	int bspchecksum;
200 	//current time
201 	float time;
202 	int numframes;
203 	//name of the aas file
204 	char filename[MAX_PATH];
205 	char mapname[MAX_PATH];
206 	//bounding boxes
207 	int numbboxes;
208 	aas_bbox_t *bboxes;
209 	//vertexes
210 	int numvertexes;
211 	aas_vertex_t *vertexes;
212 	//planes
213 	int numplanes;
214 	aas_plane_t *planes;
215 	//edges
216 	int numedges;
217 	aas_edge_t *edges;
218 	//edge index
219 	int edgeindexsize;
220 	aas_edgeindex_t *edgeindex;
221 	//faces
222 	int numfaces;
223 	aas_face_t *faces;
224 	//face index
225 	int faceindexsize;
226 	aas_faceindex_t *faceindex;
227 	//convex areas
228 	int numareas;
229 	aas_area_t *areas;
230 	//convex area settings
231 	int numareasettings;
232 	aas_areasettings_t *areasettings;
233 	//reachablity list
234 	int reachabilitysize;
235 	aas_reachability_t *reachability;
236 	//nodes of the bsp tree
237 	int numnodes;
238 	aas_node_t *nodes;
239 	//cluster portals
240 	int numportals;
241 	aas_portal_t *portals;
242 	//cluster portal index
243 	int portalindexsize;
244 	aas_portalindex_t *portalindex;
245 	//clusters
246 	int numclusters;
247 	aas_cluster_t *clusters;
248 	//
249 	int numreachabilityareas;
250 	float reachabilitytime;
251 	//enities linked in the areas
252 	aas_link_t *linkheap;						//heap with link structures
253 	int linkheapsize;							//size of the link heap
254 	aas_link_t *freelinks;						//first free link
255 	aas_link_t **arealinkedentities;			//entities linked into areas
256 	//entities
257 	int maxentities;
258 	int maxclients;
259 	aas_entity_t *entities;
260 	//string indexes
261 	char *configstrings[MAX_CONFIGSTRINGS];
262 	int indexessetup;
263 	//index to retrieve travel flag for a travel type
264 	int travelflagfortype[MAX_TRAVELTYPES];
265 	//travel flags for each area based on contents
266 	int *areacontentstravelflags;
267 	//routing update
268 	aas_routingupdate_t *areaupdate;
269 	aas_routingupdate_t *portalupdate;
270 	//number of routing updates during a frame (reset every frame)
271 	int frameroutingupdates;
272 	//reversed reachability links
273 	aas_reversedreachability_t *reversedreachability;
274 	//travel times within the areas
275 	unsigned short ***areatraveltimes;
276 	//array of size numclusters with cluster cache
277 	aas_routingcache_t ***clusterareacache;
278 	aas_routingcache_t **portalcache;
279 	//cache list sorted on time
280 	aas_routingcache_t *oldestcache;		// start of cache list sorted on time
281 	aas_routingcache_t *newestcache;		// end of cache list sorted on time
282 	//maximum travel time through portal areas
283 	int *portalmaxtraveltimes;
284 	//areas the reachabilities go through
285 	int *reachabilityareaindex;
286 	aas_reachabilityareas_t *reachabilityareas;
287 } aas_t;
288 
289 #define AASINTERN
290 
291 #ifndef BSPCINCLUDE
292 
293 #include "be_aas_main.h"
294 #include "be_aas_entity.h"
295 #include "be_aas_sample.h"
296 #include "be_aas_cluster.h"
297 #include "be_aas_reach.h"
298 #include "be_aas_route.h"
299 #include "be_aas_routealt.h"
300 #include "be_aas_debug.h"
301 #include "be_aas_file.h"
302 #include "be_aas_optimize.h"
303 #include "be_aas_bsp.h"
304 #include "be_aas_move.h"
305 
306 #endif //BSPCINCLUDE
307