ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/include/map.h
(Generate patch)

Comparing deliantra/server/include/map.h (file contents):
Revision 1.19 by root, Fri Sep 8 16:51:44 2006 UTC vs.
Revision 1.28 by root, Fri Dec 15 20:08:45 2006 UTC

1/*
2 * static char *rcsid_define_h =
3 * "$Id: map.h,v 1.19 2006/09/08 16:51:44 root Exp $";
4 */
5
6/* 1/*
7 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
8 3
9 Copyright (C) 2002-2005 Mark Wedel & Crossfire Development Team 4 Copyright (C) 2002-2005 Mark Wedel & Crossfire Development Team
10 Copyright (C) 1992 Frank Tore Johansen 5 Copyright (C) 1992 Frank Tore Johansen
21 16
22 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 20
26 The authors can be reached via e-mail at crossfire-devel@real-time.com 21 The authors can be reached via e-mail at crossfire@schmorp.de
27*/ 22*/
28 23
29/* 24/*
30 * The mapstruct is allocated each time a new map is opened. 25 * The maptile is allocated each time a new map is opened.
31 * It contains pointers (very indirectly) to all objects on the map. 26 * It contains pointers (very indirectly) to all objects on the map.
32 */ 27 */
33 28
34#ifndef MAP_H 29#ifndef MAP_H
35#define MAP_H 30#define MAP_H
67 */ 62 */
68#define MAP_DARKNESS(m) (m)->darkness 63#define MAP_DARKNESS(m) (m)->darkness
69 64
70#define MAP_WIDTH(m) (m)->width 65#define MAP_WIDTH(m) (m)->width
71#define MAP_HEIGHT(m) (m)->height 66#define MAP_HEIGHT(m) (m)->height
67
72/* Convenient function - total number of spaces is used 68/* Convenient function - total number of spaces is used
73 * in many places. 69 * in many places.
74 */ 70 */
75#define MAP_SIZE(m) ((m)->width * (m)->height) 71#define MAP_SIZE(m) ((m)->width * (m)->height)
76 72
110#define GET_MAP_LIGHT(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].light ) 106#define GET_MAP_LIGHT(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].light )
111#define SET_MAP_LIGHT(M,X,Y,L) ( (M)->spaces[(X) + (M)->width * (Y)].light = L ) 107#define SET_MAP_LIGHT(M,X,Y,L) ( (M)->spaces[(X) + (M)->width * (Y)].light = L )
112 108
113#define GET_MAP_OB(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].bottom ) 109#define GET_MAP_OB(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].bottom )
114#define GET_MAP_TOP(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].top ) 110#define GET_MAP_TOP(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].top )
111
115/* legacy */ 112/* legacy */
116#define get_map_ob GET_MAP_OB 113#define get_map_ob GET_MAP_OB
117 114
118#define SET_MAP_OB(M,X,Y,tmp) ( (M)->spaces[(X) + (M)->width * (Y)].bottom = (tmp) ) 115#define SET_MAP_OB(M,X,Y,tmp) ( (M)->spaces[(X) + (M)->width * (Y)].bottom = (tmp) )
119#define SET_MAP_TOP(M,X,Y,tmp) ( (M)->spaces[(X) + (M)->width * (Y)].top = (tmp) ) 116#define SET_MAP_TOP(M,X,Y,tmp) ( (M)->spaces[(X) + (M)->width * (Y)].top = (tmp) )
146/* These are used in the MapLook flags element. They are not used in 143/* These are used in the MapLook flags element. They are not used in
147 * in the object flags structure. 144 * in the object flags structure.
148 */ 145 */
149 146
150#define P_BLOCKSVIEW 0x01 147#define P_BLOCKSVIEW 0x01
151#define P_NO_MAGIC 0x02 /* Spells (some) can't pass this object */ 148#define P_NO_MAGIC 0x02 /* Spells (some) can't pass this object */
152 149
153/* AB_NO_PASS is used for arch_blocked() return value. It needs 150/* AB_NO_PASS is used for arch_blocked() return value. It needs
154 * to be here to make sure the bits don't match with anything. 151 * to be here to make sure the bits don't match with anything.
155 * Changed name to have AB_ prefix just to make sure no one 152 * Changed name to have AB_ prefix just to make sure no one
156 * is using the P_NO_PASS. AB_.. should only be used for 153 * is using the P_NO_PASS. AB_.. should only be used for
157 * arch_blocked and functions that examine the return value. 154 * arch_blocked and functions that examine the return value.
158 */ 155 */
159 156
160#define AB_NO_PASS 0x04 157#define AB_NO_PASS 0x04
161/*#define P_PASS_THRU 0x08 *//* */ 158
162#define P_SAFE 0x08 /* If this is set the map tile is a safe map, 159 /*#define P_PASS_THRU 0x08 *//* */
160#define P_SAFE 0x08
161 /* If this is set the map tile is a safe map,
163 * that means, nothing harmful there will be done, 162 * that means, nothing harmful there will be done,
164 * like: bombs, potion usage, alchemy, spells 163 * like: bombs, potion usage, alchemy, spells
165 * this was introduced to make shops more safe 164 * this was introduced to make shops more safe
166 * and propably other maps */ 165 * and propably other maps */
167#define P_IS_ALIVE 0x10 /* something alive is on this space */ 166#define P_IS_ALIVE 0x10 /* something alive is on this space */
168#define P_NO_CLERIC 0x20 /* no clerical spells cast here */ 167#define P_NO_CLERIC 0x20 /* no clerical spells cast here */
169#define P_NEED_UPDATE 0x40 /* this space is out of date */ 168#define P_NEED_UPDATE 0x40 /* this space is out of date */
170#define P_NO_ERROR 0x80 /* Purely temporary - if set, update_position 169#define P_NO_ERROR 0x80 /* Purely temporary - if set, update_position
171 * does not complain if the flags are different. 170 * does not complain if the flags are different.
172 */ 171 */
172
173/* The following two values are not stored in the MapLook flags, but instead 173/* The following two values are not stored in the MapLook flags, but instead
174 * used in the get_map_flags value - that function is used to return 174 * used in the get_map_flags value - that function is used to return
175 * the flag value, as well as other conditions - using a more general 175 * the flag value, as well as other conditions - using a more general
176 * function that does more of the work can hopefully be used to replace 176 * function that does more of the work can hopefully be used to replace
177 * lots of duplicate checks currently in the code. 177 * lots of duplicate checks currently in the code.
178 */ 178 */
179#define P_OUT_OF_MAP 0x100 /* This space is outside the map */ 179#define P_OUT_OF_MAP 0x100 /* This space is outside the map */
180#define P_NEW_MAP 0x200 /* Coordinates passed result in a new tiled map */ 180#define P_NEW_MAP 0x200
181 181 /* Coordinates passed result in a new tiled map */
182#if 0
183/* These go away with new movement code - can't do such simplistic
184 * checks anymore
185 */
186#define P_BLOCKED (P_NO_PASS | P_IS_ALIVE) /* convenience macro */
187#define P_WALL P_NO_PASS /* Just to match naming of wall function */
188#endif
189 182
190/* Can't use MapCell as that is used in newserver.h 183/* Can't use MapCell as that is used in newserver.h
191 * Instead of having numerous arrays that have information on a 184 * Instead of having numerous arrays that have information on a
192 * particular space (was map, floor, floor2, map_ob), 185 * particular space (was map, floor, floor2, map_ob),
193 * have this structure take care of that information. 186 * have this structure take care of that information.
194 * This puts it all in one place, and should also make it easier 187 * This puts it all in one place, and should also make it easier
195 * to extend information about a space. 188 * to extend information about a space.
196 */ 189 */
197 190
198struct MapSpace { 191struct MapSpace
192{
199 object *bottom; /* lowest object on this space */ 193 object *bottom; /* lowest object on this space */
200 object *top; /* Highest object on this space */ 194 object *top; /* Highest object on this space */
201 New_Face *faces[MAP_LAYERS]; /* faces for the 3 layers */ 195 New_Face *faces[MAP_LAYERS]; /* faces for the 3 layers */
202 object *faces_obj[MAP_LAYERS]; /* face objects for the 3 layers */ 196 object *faces_obj[MAP_LAYERS]; /* face objects for the 3 layers */
203 uint8 flags; /* flags about this space (see the P_ values above) */ 197 uint8 flags; /* flags about this space (see the P_ values above) */
204 sint8 light; /* How much light this space provides */ 198 sint8 light; /* How much light this space provides */
205 MoveType move_block; /* What movement types this space blocks */ 199 MoveType move_block; /* What movement types this space blocks */
206 MoveType move_slow; /* What movement types this space slows */ 200 MoveType move_slow; /* What movement types this space slows */
207 MoveType move_on; /* What movement types are activated */ 201 MoveType move_on; /* What movement types are activated */
208 MoveType move_off; /* What movement types are activated */ 202 MoveType move_off; /* What movement types are activated */
209}; 203};
210 204
211/* 205/*
212 * this is an overlay structure of the whole world. It exists as a simple 206 * this is an overlay structure of the whole world. It exists as a simple
213 * high level map, which doesn't contain the full data of the underlying map. 207 * high level map, which doesn't contain the full data of the underlying map.
215 * can keep the entire world parameters in memory, and act as a whole on 209 * can keep the entire world parameters in memory, and act as a whole on
216 * them at once. We can then, in a separate loop, update the actual world 210 * them at once. We can then, in a separate loop, update the actual world
217 * with the new values we have assigned. 211 * with the new values we have assigned.
218 */ 212 */
219 213
220struct weathermap_t { 214struct weathermap_t
215{
221 sint16 temp; /* base temperature of this tile (F) */ 216 sint16 temp; /* base temperature of this tile (F) */
222 sint16 pressure; /* barometric pressure (mb) */ 217 sint16 pressure; /* barometric pressure (mb) */
223 sint8 humid; /* humitidy of this tile */ 218 sint8 humid; /* humitidy of this tile */
224 sint8 windspeed; /* windspeed of this tile */ 219 sint8 windspeed; /* windspeed of this tile */
225 sint8 winddir; /* direction of wind */ 220 sint8 winddir; /* direction of wind */
226 sint8 sky; /* sky conditions */ 221 sint8 sky; /* sky conditions */
227 sint32 avgelev; /* average elevation */ 222 sint32 avgelev; /* average elevation */
228 uint32 rainfall; /* cumulative rainfall */ 223 uint32 rainfall; /* cumulative rainfall */
229 uint8 darkness; /* indicates level of darkness of map */ 224 uint8 darkness; /* indicates level of darkness of map */
230 uint8 water; /* 0-100 percentage of water tiles */ 225 uint8 water; /* 0-100 percentage of water tiles */
231 /*Dynamic parts*/ 226 /*Dynamic parts */
232 sint16 realtemp; /* temperature at a given calculation step for this tile*/ 227 sint16 realtemp; /* temperature at a given calculation step for this tile */
233}; 228};
234 229
235/* 230/*
236 * Each map is in a given region of the game world and links to a region definiton, so 231 * Each map is in a given region of the game world and links to a region definiton, so
237 * they have to appear here in the headers, before the mapdef 232 * they have to appear here in the headers, before the mapdef
238 */ 233 */
239struct region { 234struct region : zero_initialised
235{
240 struct region *next; /* pointer to next region, NULL for the last one */ 236 struct region *next; /* pointer to next region, NULL for the last one */
241 const char *name; /* Shortend name of the region as maps refer to it */ 237 const char *name; /* Shortend name of the region as maps refer to it */
242 const char *parent_name; /* 238 const char *parent_name; /*
243 * So that parent and child regions can be defined in 239 * So that parent and child regions can be defined in
244 * any order, we keep hold of the parent_name during 240 * any order, we keep hold of the parent_name during
245 * initialisation, and the children get assigned to their 241 * initialisation, and the children get assigned to their
246 * parents later. (before runtime on the server though) 242 * parents later. (before runtime on the server though)
247 * nothing outside the init code should ever use this value. 243 * nothing outside the init code should ever use this value.
248 */ 244 */
249 struct region *parent; /* 245 struct region *parent; /*
250 * Pointer to the region that is a parent of the current 246 * Pointer to the region that is a parent of the current
251 * region, if a value isn't defined in the current region 247 * region, if a value isn't defined in the current region
252 * we traverse this series of pointers until it is. 248 * we traverse this series of pointers until it is.
253 */ 249 */
254 const char *longname; /* Official title of the region, this might be defined 250 const char *longname; /* Official title of the region, this might be defined
255 * to be the same as name*/ 251 * to be the same as name*/
256 const char *msg; /* the description of the region */ 252 const char *msg; /* the description of the region */
257 uint32 counter; /* A generic counter for holding temporary data. */ 253 uint32 counter; /* A generic counter for holding temporary data. */
258 sint8 fallback; /* whether, in the event of a region not existing, 254 sint8 fallback; /* whether, in the event of a region not existing,
259 * this should be the one we fall back on as the default */ 255 * this should be the one we fall back on as the default */
260 char *jailmap; /*where a player that is arrested in this region should be imprisoned.*/ 256 char *jailmap; /*where a player that is arrested in this region should be imprisoned. */
261 sint16 jailx, jaily; /* The coodinates in jailmap to which the player should be sent. */ 257 sint16 jailx, jaily; /* The coodinates in jailmap to which the player should be sent. */
262}; 258};
263
264 259
265struct shopitems : zero_initialised 260struct shopitems : zero_initialised
266{ 261{
267 const char *name; /* name of the item in question, null if it is the default item */ 262 const char *name; /* name of the item in question, null if it is the default item */
268 const char *name_pl; /* plural name */ 263 const char *name_pl; /* plural name */
269 int typenum; /* itemtype number we need to match 0 if it is the default price*/ 264 int typenum; /* itemtype number we need to match 0 if it is the default price */
270 sint8 strength; /* the degree of specialisation the shop has in this item, 265 sint8 strength; /* the degree of specialisation the shop has in this item,
271 * as a percentage from -100 to 100 */ 266 * as a percentage from -100 to 100 */
272 int index; /* being the size of the shopitems array.*/ 267 int index; /* being the size of the shopitems array. */
273}; 268};
274 269
275/* In general, code should always use the macros 270/* In general, code should always use the macros
276 * above (or functions in map.c) to access many of the 271 * above (or functions in map.c) to access many of the
277 * values in the map structure. Failure to do this will 272 * values in the map structure. Failure to do this will
278 * almost certainly break various features. You may think 273 * almost certainly break various features. You may think
279 * it is safe to look at width and height values directly 274 * it is safe to look at width and height values directly
280 * (or even through the macros), but doing so will completely 275 * (or even through the macros), but doing so will completely
281 * break map tiling. 276 * break map tiling.
282 */ 277 */
283ACC_CLASS (mapstruct) 278ACC_CLASS (maptile)
284struct mapstruct : zero_initialised, attachable<mapstruct> 279struct maptile : zero_initialised, attachable<maptile>
285{ 280{
286 struct mapstruct *ACC (RW, next); /* Next map, linked list */ 281 maptile *ACC (RW, next); /* Next map, linked list */
287 char *ACC (RO, tmpname); /* Name of temporary file */ 282 char *ACC (RO, tmpname); /* Name of temporary file */
288 char *ACC (RO, name); /* Name of map as given by its creator */ 283 char *ACC (RO, name); /* Name of map as given by its creator */
289 struct region *ACC (RW, region); /* What jurisdiction in the game world this map is ruled by 284 struct region *ACC (RW, region); /* What jurisdiction in the game world this map is ruled by
290 * points to the struct containing all the properties of 285 * points to the struct containing all the properties of
291 * the region */ 286 * the region */
292 uint32 ACC (RW, reset_time); /* when this map should reset */ 287 uint32 ACC (RW, reset_time); /* when this map should reset */
293 uint32 ACC (RW, reset_timeout); /* How many seconds must elapse before this map 288 uint32 ACC (RW, reset_timeout); /* How many seconds must elapse before this map
294 * should be reset 289 * should be reset
295 */ 290 */
296 bool ACC (RW, fixed_resettime); /* if true, reset time is not affected by 291 bool ACC (RW, fixed_resettime); /* if true, reset time is not affected by
297 * players entering/exiting map 292 * players entering/exiting map
298 */ 293 */
299 bool ACC (RW, unique); /* if set, this is a per player unique map */ 294 bool ACC (RW, unique); /* if set, this is a per player unique map */
300 bool ACC (RW, templatemap); /* if set, this is a template map */ 295 bool ACC (RW, templatemap); /* if set, this is a template map */
301 bool ACC (RW, nosmooth); /* if set the content of this map has smoothlevel=0 forced*/ 296 bool ACC (RW, nosmooth); /* if set the content of this map has smoothlevel=0 forced */
302 sint32 ACC (RW, timeout); /* swapout is set to this */ 297 sint32 ACC (RW, timeout); /* swapout is set to this */
303 sint32 ACC (RW, swap_time); /* When it reaches 0, the map will be swapped out */ 298 sint32 ACC (RW, swap_time); /* When it reaches 0, the map will be swapped out */
304 sint16 ACC (RW, players); /* How many plares are on this level right now */ 299 sint16 ACC (RW, players); /* How many players are on this level right now */
305 uint32 ACC (RW, in_memory); /* If not true, the map has been freed and must 300 uint32 ACC (RW, in_memory); /* If not true, the map has been freed and must
306 * be loaded before used. The map,omap and map_ob 301 * be loaded before used. The map,omap and map_ob
307 * arrays will be allocated when the map is loaded */ 302 * arrays will be allocated when the map is loaded */
308 uint16 ACC (RW, difficulty); /* What level the player should be to play here */ 303 uint16 ACC (RW, difficulty); /* What level the player should be to play here */
309 304
310 uint8 ACC (RW, darkness); /* indicates level of darkness of map */ 305 uint8 ACC (RW, darkness); /* indicates level of darkness of map */
311 uint16 ACC (RO, width), ACC (RO, height); /* Width and height of map. */ 306 uint16 ACC (RO, width), ACC (RO, height); /* Width and height of map. */
312 uint16 ACC (RW, enter_x); /* enter_x and enter_y are default entrance location */ 307 uint16 ACC (RW, enter_x); /* enter_x and enter_y are default entrance location */
313 uint16 ACC (RW, enter_y); /* on the map if none are set in the exit */ 308 uint16 ACC (RW, enter_y); /* on the map if none are set in the exit */
314 bool ACC (RW, outdoor); /* True if an outdoor map */ 309 bool ACC (RW, outdoor); /* True if an outdoor map */
315 oblinkpt *buttons; /* Linked list of linked lists of buttons */ 310 oblinkpt *buttons; /* Linked list of linked lists of buttons */
316 struct MapSpace *spaces; /* Array of spaces on this map */ 311 struct MapSpace *spaces; /* Array of spaces on this map */
317 sint16 ACC (RW, temp); /* base temperature of this tile (F) */ 312 sint16 ACC (RW, temp); /* base temperature of this tile (F) */
318 sint16 ACC (RW, pressure); /* barometric pressure (mb) */ 313 sint16 ACC (RW, pressure); /* barometric pressure (mb) */
319 sint8 ACC (RW, humid); /* humitidy of this tile */ 314 sint8 ACC (RW, humid); /* humitidy of this tile */
320 sint8 ACC (RW, windspeed); /* windspeed of this tile */ 315 sint8 ACC (RW, windspeed); /* windspeed of this tile */
321 sint8 ACC (RW, winddir); /* direction of wind */ 316 sint8 ACC (RW, winddir); /* direction of wind */
322 sint8 ACC (RW, sky); /* sky conditions */ 317 sint8 ACC (RW, sky); /* sky conditions */
323 int ACC (RW, wpartx), ACC (RW, wparty); /*Highly fasten conversion between worldmap and weathermap*/ 318 int ACC (RW, wpartx), ACC (RW, wparty); /*Highly fasten conversion between worldmap and weathermap */
324 struct shopitems *shopitems; /* a semi-colon seperated list of item-types the map's shop will trade in */ 319 struct shopitems *shopitems; /* a semi-colon seperated list of item-types the map's shop will trade in */
325 char *ACC (RO, shoprace); /* the preffered race of the local shopkeeper */ 320 char *ACC (RO, shoprace); /* the preffered race of the local shopkeeper */
326 double ACC (RW, shopgreed); /* how much our shopkeeper overcharges */ 321 double ACC (RW, shopgreed); /* how much our shopkeeper overcharges */
327 uint64 ACC (RW, shopmin); /* minimum price a shop will trade for */ 322 sint64 ACC (RW, shopmin); /* minimum price a shop will trade for */
328 uint64 ACC (RW, shopmax); /* maximum price a shop will offer */ 323 sint64 ACC (RW, shopmax); /* maximum price a shop will offer */
329 char *ACC (RO, msg); /* Message map creator may have left */ 324 char *ACC (RO, msg); /* Message map creator may have left */
330 char *ACC (RO, maplore); /* Map lore information */ 325 char *ACC (RO, maplore); /* Map lore information */
331 char *tile_path[4]; /* path to adjoining maps */ 326 char *tile_path[4]; /* path to adjoining maps */
332 struct mapstruct *tile_map[4]; /* Next map, linked list */ 327 maptile *tile_map[4]; /* Next map, linked list */
333 char ACC (RW, path)[HUGE_BUF]; /* Filename of the map */ 328 char ACC (RW, path)[HUGE_BUF]; /* Filename of the map */
329
330 maptile ();
331 void allocate ();
334}; 332};
335 333
336/* This is used by get_rangevector to determine where the other 334/* This is used by get_rangevector to determine where the other
337 * creature is. get_rangevector takes into account map tiling, 335 * creature is. get_rangevector takes into account map tiling,
338 * so you just can not look the the map coordinates and get the 336 * so you just can not look the the map coordinates and get the
340 * can be negativbe. direction is the crossfire direction scheme 338 * can be negativbe. direction is the crossfire direction scheme
341 * that the creature should head. part is the part of the 339 * that the creature should head. part is the part of the
342 * monster that is closest. 340 * monster that is closest.
343 * Note: distance should be always >=0. I changed it to UINT. MT 341 * Note: distance should be always >=0. I changed it to UINT. MT
344 */ 342 */
345struct rv_vector { 343struct rv_vector
344{
346 unsigned int distance; 345 unsigned int distance;
347 int distance_x; 346 int distance_x;
348 int distance_y; 347 int distance_y;
349 int direction; 348 int direction;
350 object *part; 349 object *part;
351}; 350};
352 351
353#endif 352#endif
354 353

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines