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.7 by elmex, Tue Aug 15 15:00:20 2006 UTC vs.
Revision 1.38 by root, Wed Dec 27 09:28:01 2006 UTC

1/*
2 * static char *rcsid_define_h =
3 * "$Id: map.h,v 1.7 2006/08/15 15:00:20 elmex 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
36 31
32#include "cfperl.h"
33
37/* We set this size - this is to make magic map work properly on 34/* We set this size - this is to make magic map work properly on
38 * tiled maps. There is no requirement that this matches the 35 * tiled maps. There is no requirement that this matches the
39 * tiled maps size - it just seemed like a reasonable value. 36 * tiled maps size - it just seemed like a reasonable value.
40 * Magic map code now always starts out putting the player in the 37 * Magic map code now always starts out putting the player in the
41 * center of the map - this makes the most sense when dealing 38 * center of the map - this makes the most sense when dealing
42 * with tiled maps. 39 * with tiled maps.
43 * We also figure out the magicmap color to use as we process the 40 * We also figure out the magicmap color to use as we process the
45 * map pointers. 42 * map pointers.
46 */ 43 */
47#define MAGIC_MAP_SIZE 50 44#define MAGIC_MAP_SIZE 50
48#define MAGIC_MAP_HALF MAGIC_MAP_SIZE/2 45#define MAGIC_MAP_HALF MAGIC_MAP_SIZE/2
49 46
50
51#define MAP_LAYERS 4 47#define MAP_LAYERS 3
52
53/* This is when the map will reset */
54#define MAP_WHEN_RESET(m) ((m)->reset_time)
55
56#define MAP_RESET_TIMEOUT(m) ((m)->reset_timeout)
57#define MAP_DIFFICULTY(m) ((m)->difficulty)
58#define MAP_TIMEOUT(m) ((m)->timeout)
59#define MAP_SWAP_TIME(m) ((m)->swap_time)
60#define MAP_OUTDOORS(m) ((m)->outdoor)
61
62/* mape darkness used to enforce the MAX_DARKNESS value.
63 * but IMO, if it is beyond max value, that should be fixed
64 * on the map or in the code.
65 */
66#define MAP_DARKNESS(m) (m)->darkness
67
68#define MAP_WIDTH(m) (m)->width
69#define MAP_HEIGHT(m) (m)->height
70/* Convenient function - total number of spaces is used
71 * in many places.
72 */
73#define MAP_SIZE(m) ((m)->width * (m)->height)
74
75#define MAP_ENTER_X(m) (m)->enter_x
76#define MAP_ENTER_Y(m) (m)->enter_y
77
78#define MAP_TEMP(m) (m)->temp
79#define MAP_PRESSURE(m) (m)->pressure
80#define MAP_HUMID(m) (m)->humid
81#define MAP_WINDSPEED(m) (m)->windspeed
82#define MAP_WINDDIRECTION(m) (m)->winddir
83#define MAP_SKYCOND(m) (m)->sky
84#define MAP_WORLDPARTX(m) (m)->wpartx
85#define MAP_WORLDPARTY(m) (m)->wparty
86#define MAP_NOSMOOTH(m) (m)->nosmooth
87 48
88/* options passed to ready_map_name and load_original_map */ 49/* options passed to ready_map_name and load_original_map */
89#define MAP_FLUSH 0x1 50#define MAP_FLUSH 0x01
90#define MAP_PLAYER_UNIQUE 0x2 51#define MAP_PLAYER_UNIQUE 0x02
91#define MAP_BLOCK 0x4 52#define MAP_BLOCK 0x04
92#define MAP_STYLE 0x8 53#define MAP_STYLE 0x08
93#define MAP_OVERLAY 0x10 54#define MAP_OVERLAY 0x10
94 55
95/* Values for in_memory below. Should probably be an enumerations */ 56/* Values for in_memory below. Should probably be an enumerations */
96#define MAP_IN_MEMORY 1 57#define MAP_IN_MEMORY 1
97#define MAP_SWAPPED 2 58#define MAP_SWAPPED 2
101/* GET_MAP_FLAGS really shouldn't be used very often - get_map_flags should 62/* GET_MAP_FLAGS really shouldn't be used very often - get_map_flags should
102 * really be used, as it is multi tile aware. However, there are some cases 63 * really be used, as it is multi tile aware. However, there are some cases
103 * where it is known the map is not tiled or the values are known 64 * where it is known the map is not tiled or the values are known
104 * consistent (eg, op->map, op->x, op->y) 65 * consistent (eg, op->map, op->x, op->y)
105 */ 66 */
106#define GET_MAP_FLAGS(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].flags ) 67// all those macros are herewith declared legacy
107#define SET_MAP_FLAGS(M,X,Y,C) ( (M)->spaces[(X) + (M)->width * (Y)].flags = C ) 68#define GET_MAP_FLAGS(M,X,Y) (M)->at((X),(Y)).flags ()
108#define GET_MAP_LIGHT(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].light ) 69#define GET_MAP_LIGHT(M,X,Y) (M)->at((X),(Y)).light
109#define SET_MAP_LIGHT(M,X,Y,L) ( (M)->spaces[(X) + (M)->width * (Y)].light = L ) 70#define GET_MAP_OB(M,X,Y) (M)->at((X),(Y)).bot
110 71#define GET_MAP_TOP(M,X,Y) (M)->at((X),(Y)).top
111#define GET_MAP_OB(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].bottom ) 72#define GET_MAP_FACE(M,X,Y,L) (M)->at((X),(Y)).faces[L]
112#define GET_MAP_TOP(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].top )
113/* legacy */
114#define get_map_ob GET_MAP_OB
115
116#define SET_MAP_OB(M,X,Y,tmp) ( (M)->spaces[(X) + (M)->width * (Y)].bottom = (tmp) )
117#define SET_MAP_TOP(M,X,Y,tmp) ( (M)->spaces[(X) + (M)->width * (Y)].top = (tmp) )
118#define set_map_ob SET_MAP_OB
119
120#define SET_MAP_FACE(M,X,Y,C,L) ( (M)->spaces[(X) + (M)->width * (Y)].faces[L] = C )
121#define GET_MAP_FACE(M,X,Y,L) ( (M)->spaces[(X) + (M)->width * (Y)].faces[L] )
122
123#define SET_MAP_FACE_OBJ(M,X,Y,C,L) ( (M)->spaces[(X) + (M)->width * (Y)].faces_obj[L] = C )
124#define GET_MAP_FACE_OBJ(M,X,Y,L) ( (M)->spaces[(X) + (M)->width * (Y)].faces_obj[L] ) 73#define GET_MAP_FACE_OBJ(M,X,Y,L) (M)->at((X),(Y)).faces_obj[L]
125
126#define GET_MAP_MOVE_BLOCK(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].move_block ) 74#define GET_MAP_MOVE_BLOCK(M,X,Y) (M)->at((X),(Y)).move_block
127#define SET_MAP_MOVE_BLOCK(M,X,Y,C) ( (M)->spaces[(X) + (M)->width * (Y)].move_block = C )
128
129#define GET_MAP_MOVE_SLOW(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].move_slow ) 75#define GET_MAP_MOVE_SLOW(M,X,Y) (M)->at((X),(Y)).move_slow
130#define SET_MAP_MOVE_SLOW(M,X,Y,C) ( (M)->spaces[(X) + (M)->width * (Y)].move_slow = C )
131
132#define GET_MAP_MOVE_ON(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].move_on ) 76#define GET_MAP_MOVE_ON(M,X,Y) (M)->at((X),(Y)).move_on
133#define SET_MAP_MOVE_ON(M,X,Y,C) ( (M)->spaces[(X) + (M)->width * (Y)].move_on = C )
134
135#define GET_MAP_MOVE_OFF(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].move_off ) 77#define GET_MAP_MOVE_OFF(M,X,Y) (M)->at((X),(Y)).move_off
136#define SET_MAP_MOVE_OFF(M,X,Y,C) ( (M)->spaces[(X) + (M)->width * (Y)].move_off = C )
137 78
138/* You should really know what you are doing before using this - you 79/* You should really know what you are doing before using this - you
139 * should almost always be using out_of_map instead, which takes into account 80 * should almost always be using out_of_map instead, which takes into account
140 * map tiling. 81 * map tiling.
141 */ 82 */
142#define OUT_OF_REAL_MAP(M,X,Y) ((X)<0 || (Y)<0 || (X)>=(M)->width || (Y)>=(M)->height) 83#define OUT_OF_REAL_MAP(M,X,Y) ((X)<0 || (Y)<0 || (X)>=(M)->width || (Y)>=(M)->height)
143 84
144/* These are used in the MapLook flags element. They are not used in 85/* These are used in the MapLook flags element. They are not used in
145 * in the object flags structure. 86 * in the object flags structure.
146 */ 87 */
147
148#define P_BLOCKSVIEW 0x01 88#define P_BLOCKSVIEW 0x01
149#define P_NO_MAGIC 0x02 /* Spells (some) can't pass this object */ 89#define P_NO_MAGIC 0x02 /* Spells (some) can't pass this object */
150 90#define P_PLAYER 0x04 /* a player (or something seeing these objects) is on this mapspace */
151/* AB_NO_PASS is used for arch_blocked() return value. It needs 91#define P_SAFE 0x08 /* If this is set the map tile is a safe space,
152 * to be here to make sure the bits don't match with anything. 92 * that means, nothing harmful can be done,
153 * Changed name to have AB_ prefix just to make sure no one 93 * such as: bombs, potion usage, alchemy, spells
154 * is using the P_NO_PASS. AB_.. should only be used for 94 * this was introduced to make shops safer
155 * arch_blocked and functions that examine the return value. 95 * but is useful in other situations */
156 */
157
158#define AB_NO_PASS 0x04
159/*#define P_PASS_THRU 0x08 *//* */
160#define P_IS_ALIVE 0x10 /* something alive is on this space */ 96#define P_IS_ALIVE 0x10 /* something alive is on this space */
161#define P_NO_CLERIC 0x20 /* no clerical spells cast here */ 97#define P_NO_CLERIC 0x20 /* no clerical spells cast here */
98
162#define P_NEED_UPDATE 0x40 /* this space is out of date */ 99#define P_NEED_UPDATE 0x80 /* this space is out of date */
163#define P_NO_ERROR 0x80 /* Purely temporary - if set, update_position 100
164 * does not complain if the flags are different.
165 */
166/* The following two values are not stored in the MapLook flags, but instead 101/* The following two values are not stored in the MapLook flags, but instead
167 * used in the get_map_flags value - that function is used to return 102 * used in the get_map_flags value - that function is used to return
168 * the flag value, as well as other conditions - using a more general 103 * the flag value, as well as other conditions - using a more general
169 * function that does more of the work can hopefully be used to replace 104 * function that does more of the work can hopefully be used to replace
170 * lots of duplicate checks currently in the code. 105 * lots of duplicate checks currently in the code.
171 */ 106 */
172#define P_OUT_OF_MAP 0x100 /* This space is outside the map */ 107#define P_OUT_OF_MAP 0x10000 /* This space is outside the map */
173#define P_NEW_MAP 0x200 /* Coordinates passed result in a new tiled map */ 108#define P_NEW_MAP 0x20000
174#define P_SAFE_MAP 0x400 /* If this is set the map is a safe map, 109 /* Coordinates passed result in a new tiled map */
175 * that means, nothing harmful there will be done,
176 * like: bombs, potion usage, alchemy, spells
177 * this was introduced to make shops more safe
178 * and propably other maps */
179 110
180#if 0 111/* P_NO_PASS is used for ob_blocked() return value. It needs
181/* These go away with new movement code - can't do such simplistic 112 * to be here to make sure the bits don't match with anything.
182 * checks anymore
183 */ 113 */
184#define P_BLOCKED (P_NO_PASS | P_IS_ALIVE) /* convenience macro */ 114#define P_NO_PASS 0x80000
185#define P_WALL P_NO_PASS /* Just to match naming of wall function */
186#endif
187 115
188/* Can't use MapCell as that is used in newserver.h
189 * Instead of having numerous arrays that have information on a 116/* Instead of having numerous arrays that have information on a
190 * particular space (was map, floor, floor2, map_ob), 117 * particular space (was map, floor, floor2, map_ob),
191 * have this structure take care of that information. 118 * have this structure take care of that information.
192 * This puts it all in one place, and should also make it easier 119 * This puts it all in one place, and should also make it easier
193 * to extend information about a space. 120 * to extend information about a space.
194 */ 121 */
195
196struct MapSpace { 122struct mapspace
123{
197 object *bottom; /* lowest object on this space */ 124 object *bot, *top; /* lowest/highest object on this space */
198 object *top; /* Highest object on this space */
199 New_Face *faces[MAP_LAYERS]; /* faces for the 3 layers */ 125 New_Face *faces[MAP_LAYERS]; /* faces for the 3 layers */
200 object *faces_obj[MAP_LAYERS]; /* face objects for the 3 layers */ 126 object *faces_obj[MAP_LAYERS];/* face objects for the 3 layers */
201 uint8 flags; /* flags about this space (see the P_ values above) */ 127 uint8 flags_; /* flags about this space (see the P_ values above) */
202 sint8 light; /* How much light this space provides */ 128 sint8 light; /* How much light this space provides */
203 MoveType move_block; /* What movement types this space blocks */ 129 MoveType move_block; /* What movement types this space blocks */
204 MoveType move_slow; /* What movement types this space slows */ 130 MoveType move_slow; /* What movement types this space slows */
205 MoveType move_on; /* What movement types are activated */ 131 MoveType move_on; /* What movement types are activated */
206 MoveType move_off; /* What movement types are activated */ 132 MoveType move_off; /* What movement types are activated */
133
134 void update_ ();
135 void update ()
136 {
137 if (flags_ & P_NEED_UPDATE)
138 update_ ();
139 }
140
141 uint8 flags ()
142 {
143 update ();
144 return flags_;
145 }
146
147 // maybe only inline quick flags_ checking?
148 object *player ()
149 {
150 // search from the top, because players are usually on top
151 // make usually == always and this non-amortized O(1)
152 // could gte rid of P_PLAYER, too, then
153 if (flags () & P_PLAYER)
154 for (object *op = top; op; op = op->below)
155 if (op->type == PLAYER)
156 return op;
157
158 return 0;
159 }
207}; 160};
208 161
209/* 162/*
210 * this is an overlay structure of the whole world. It exists as a simple 163 * this is an overlay structure of the whole world. It exists as a simple
211 * high level map, which doesn't contain the full data of the underlying map. 164 * high level map, which doesn't contain the full data of the underlying map.
213 * can keep the entire world parameters in memory, and act as a whole on 166 * can keep the entire world parameters in memory, and act as a whole on
214 * them at once. We can then, in a separate loop, update the actual world 167 * them at once. We can then, in a separate loop, update the actual world
215 * with the new values we have assigned. 168 * with the new values we have assigned.
216 */ 169 */
217 170
218struct weathermap_t { 171struct weathermap_t
172{
219 sint16 temp; /* base temperature of this tile (F) */ 173 sint16 temp; /* base temperature of this tile (F) */
220 sint16 pressure; /* barometric pressure (mb) */ 174 sint16 pressure; /* barometric pressure (mb) */
221 sint8 humid; /* humitidy of this tile */ 175 sint8 humid; /* humitidy of this tile */
222 sint8 windspeed; /* windspeed of this tile */ 176 sint8 windspeed; /* windspeed of this tile */
223 sint8 winddir; /* direction of wind */ 177 sint8 winddir; /* direction of wind */
224 sint8 sky; /* sky conditions */ 178 sint8 sky; /* sky conditions */
225 sint32 avgelev; /* average elevation */ 179 sint32 avgelev; /* average elevation */
226 uint32 rainfall; /* cumulative rainfall */ 180 uint32 rainfall; /* cumulative rainfall */
227 uint8 darkness; /* indicates level of darkness of map */ 181 uint8 darkness; /* indicates level of darkness of map */
228 uint8 water; /* 0-100 percentage of water tiles */ 182 uint8 water; /* 0-100 percentage of water tiles */
229 /*Dynamic parts*/ 183 /*Dynamic parts */
230 sint16 realtemp; /* temperature at a given calculation step for this tile*/ 184 sint16 realtemp; /* temperature at a given calculation step for this tile */
231}; 185};
232 186
233/* 187/*
234 * Each map is in a given region of the game world and links to a region definiton, so 188 * Each map is in a given region of the game world and links to a region definiton, so
235 * they have to appear here in the headers, before the mapdef 189 * they have to appear here in the headers, before the mapdef
236 */ 190 */
237struct region { 191struct region : zero_initialised
192{
238 struct region *next; /* pointer to next region, NULL for the last one */ 193 struct region *next; /* pointer to next region, NULL for the last one */
239 const char *name; /* Shortend name of the region as maps refer to it */ 194 const char *name; /* Shortend name of the region as maps refer to it */
240 const char *parent_name; /* 195 const char *parent_name; /*
241 * So that parent and child regions can be defined in 196 * So that parent and child regions can be defined in
242 * any order, we keep hold of the parent_name during 197 * any order, we keep hold of the parent_name during
243 * initialisation, and the children get assigned to their 198 * initialisation, and the children get assigned to their
244 * parents later. (before runtime on the server though) 199 * parents later. (before runtime on the server though)
245 * nothing outside the init code should ever use this value. 200 * nothing outside the init code should ever use this value.
246 */ 201 */
247 struct region *parent; /* 202 struct region *parent; /*
248 * Pointer to the region that is a parent of the current 203 * Pointer to the region that is a parent of the current
249 * region, if a value isn't defined in the current region 204 * region, if a value isn't defined in the current region
250 * we traverse this series of pointers until it is. 205 * we traverse this series of pointers until it is.
251 */ 206 */
252 const char *longname; /* Official title of the region, this might be defined 207 const char *longname; /* Official title of the region, this might be defined
253 * to be the same as name*/ 208 * to be the same as name*/
254 const char *msg; /* the description of the region */ 209 const char *msg; /* the description of the region */
255 uint32 counter; /* A generic counter for holding temporary data. */ 210 uint32 counter; /* A generic counter for holding temporary data. */
256 sint8 fallback; /* whether, in the event of a region not existing, 211 sint8 fallback; /* whether, in the event of a region not existing,
257 * this should be the one we fall back on as the default */ 212 * this should be the one we fall back on as the default */
258 char *jailmap; /*where a player that is arrested in this region should be imprisoned.*/ 213 char *jailmap; /*where a player that is arrested in this region should be imprisoned. */
259 sint16 jailx, jaily; /* The coodinates in jailmap to which the player should be sent. */ 214 sint16 jailx, jaily; /* The coodinates in jailmap to which the player should be sent. */
260}; 215};
261 216
262 217struct shopitems : zero_initialised
263struct shopitems { 218{
264 const char *name; /* name of the item in question, null if it is the default item */ 219 const char *name; /* name of the item in question, null if it is the default item */
265 const char *name_pl; /* plural name */ 220 const char *name_pl; /* plural name */
266 int typenum; /* itemtype number we need to match 0 if it is the default price*/ 221 int typenum; /* itemtype number we need to match 0 if it is the default price */
267 sint8 strength; /* the degree of specialisation the shop has in this item, 222 sint8 strength; /* the degree of specialisation the shop has in this item,
268 * as a percentage from -100 to 100 */ 223 * as a percentage from -100 to 100 */
269 int index; /* being the size of the shopitems array.*/ 224 int index; /* being the size of the shopitems array. */
270}; 225};
271 226
272/* In general, code should always use the macros 227/* In general, code should always use the macros
273 * above (or functions in map.c) to access many of the 228 * above (or functions in map.c) to access many of the
274 * values in the map structure. Failure to do this will 229 * values in the map structure. Failure to do this will
275 * almost certainly break various features. You may think 230 * almost certainly break various features. You may think
276 * it is safe to look at width and height values directly 231 * it is safe to look at width and height values directly
277 * (or even through the macros), but doing so will completely 232 * (or even through the macros), but doing so will completely
278 * break map tiling. 233 * break map tiling.
279 */ 234 */
280struct mapstruct { 235INTERFACE_CLASS (maptile)
281 struct mapstruct *next; /* Next map, linked list */ 236struct maptile : zero_initialised, attachable
237{
238 sint32 ACC (RO, width), ACC (RO, height); /* Width and height of map. */
239 struct mapspace *spaces; /* Array of spaces on this map */
240
241 maptile *ACC (RW, next); /* Next map, linked list */
282 char *tmpname; /* Name of temporary file */ 242 char *ACC (RO, tmpname); /* Name of temporary file */
283 char *name; /* Name of map as given by its creator */ 243 char *ACC (RO, name); /* Name of map as given by its creator */
284 struct region *region; /* What jurisdiction in the game world this map is ruled by 244 struct region *ACC (RW, region); /* What jurisdiction in the game world this map is ruled by
285 * points to the struct containing all the properties of 245 * points to the struct containing all the properties of
286 * the region */ 246 * the region */
287 uint32 reset_time; /* when this map should reset */ 247 uint32 ACC (RW, reset_time); /* when this map should reset */
288 uint32 reset_timeout; /* How many seconds must elapse before this map 248 uint32 ACC (RW, reset_timeout); /* How many seconds must elapse before this map
289 * should be reset 249 * should be reset
290 */ 250 */
291 uint32 fixed_resettime:1; /* if true, reset time is not affected by 251 bool ACC (RW, fixed_resettime); /* if true, reset time is not affected by
292 * players entering/exiting map 252 * players entering/exiting map
293 */ 253 */
294 uint32 unique:1; /* if set, this is a per player unique map */ 254 bool ACC (RW, unique); /* if set, this is a per player unique map */
295 uint32 safe_map:1; /* if set, this map doesn't allow using magic or harmful stuff in any way */
296 uint32 templatemap:1; /* if set, this is a template map */ 255 bool ACC (RW, templatemap); /* if set, this is a template map */
297 uint32 nosmooth:1; /* if set the content of this map has smoothlevel=0 forced*/ 256 bool ACC (RW, nosmooth); /* if set the content of this map has smoothlevel=0 forced */
298 sint32 timeout; /* swapout is set to this */ 257 sint32 ACC (RW, timeout); /* swapout is set to this */
299 sint32 swap_time; /* When it reaches 0, the map will be swapped out */ 258 sint32 ACC (RW, swap_time); /* When it reaches 0, the map will be swapped out */
300 sint16 players; /* How many plares are on this level right now */
301 uint32 in_memory; /* If not true, the map has been freed and must 259 uint32 ACC (RW, in_memory); /* If not true, the map has been freed and must
302 * be loaded before used. The map,omap and map_ob 260 * be loaded before used. The map,omap and map_ob
303 * arrays will be allocated when the map is loaded */ 261 * arrays will be allocated when the map is loaded */
304 uint8 compressed; /* Compression method used */ 262 sint16 ACC (RW, players); /* How many players are on this level right now */
305 uint16 difficulty; /* What level the player should be to play here */ 263 uint16 ACC (RW, difficulty); /* What level the player should be to play here */
306 264
307 uint8 darkness; /* indicates level of darkness of map */ 265 uint8 ACC (RW, darkness); /* indicates level of darkness of map */
308 uint16 width,height; /* Width and height of map. */
309 uint16 enter_x; /* enter_x and enter_y are default entrance location */ 266 uint16 ACC (RW, enter_x); /* enter_x and enter_y are default entrance location */
310 uint16 enter_y; /* on the map if none are set in the exit */ 267 uint16 ACC (RW, enter_y); /* on the map if none are set in the exit */
311 uint32 outdoor:1; /* True if an outdoor map */ 268 bool ACC (RW, outdoor); /* True if an outdoor map */
312 oblinkpt *buttons; /* Linked list of linked lists of buttons */ 269 oblinkpt *buttons; /* Linked list of linked lists of buttons */
313 struct MapSpace *spaces; /* Array of spaces on this map */
314 sint16 temp; /* base temperature of this tile (F) */ 270 sint16 ACC (RW, temp); /* base temperature of this tile (F) */
315 sint16 pressure; /* barometric pressure (mb) */ 271 sint16 ACC (RW, pressure); /* barometric pressure (mb) */
316 sint8 humid; /* humitidy of this tile */ 272 sint8 ACC (RW, humid); /* humitidy of this tile */
317 sint8 windspeed; /* windspeed of this tile */ 273 sint8 ACC (RW, windspeed); /* windspeed of this tile */
318 sint8 winddir; /* direction of wind */ 274 sint8 ACC (RW, winddir); /* direction of wind */
319 sint8 sky; /* sky conditions */ 275 sint8 ACC (RW, sky); /* sky conditions */
320 int wpartx,wparty; /*Highly fasten conversion between worldmap and weathermap*/ 276 int ACC (RW, worldpartx), ACC (RW, worldparty); /*Highly fasten conversion between worldmap and weathermap */
321 struct shopitems *shopitems; /* a semi-colon seperated list of item-types the map's shop will trade in */ 277 struct shopitems *shopitems; /* a semi-colon seperated list of item-types the map's shop will trade in */
322 char *shoprace; /* the preffered race of the local shopkeeper */ 278 char *ACC (RO, shoprace); /* the preffered race of the local shopkeeper */
323 double shopgreed; /* how much our shopkeeper overcharges */ 279 double ACC (RW, shopgreed); /* how much our shopkeeper overcharges */
324 uint64 shopmin; /* minimum price a shop will trade for */ 280 sint64 ACC (RW, shopmin); /* minimum price a shop will trade for */
325 uint64 shopmax; /* maximum price a shop will offer */ 281 sint64 ACC (RW, shopmax); /* maximum price a shop will offer */
326 char *msg; /* Message map creator may have left */ 282 char *ACC (RO, msg); /* Message map creator may have left */
327 char *maplore; /* Map lore information */ 283 char *ACC (RO, maplore); /* Map lore information */
328 char *tile_path[4]; /* path to adjoining maps */ 284 char *tile_path[4]; /* path to adjoining maps */
329 struct mapstruct *tile_map[4]; /* Next map, linked list */ 285 maptile *tile_map[4]; /* Next map, linked list */
330 char path[HUGE_BUF]; /* Filename of the map */ 286 char ACC (RW, path)[HUGE_BUF]; /* Filename of the map */
287
288 maptile ();
289 ~maptile ();
290 void do_destroy ();
291 void gather_callbacks (AV *&callbacks, event_type event) const;
292
293 MTH void allocate ();
294 MTH int size () const { return width * height; }
295
296 MTH object *insert (object *op, int x, int y, object *originator = 0, int flags = 0);
297
298 mapspace const &at (uint32 x, uint32 y) const { return spaces [x * height + y]; }
299 mapspace &at (uint32 x, uint32 y) { return spaces [x * height + y]; }
331}; 300};
301
302#define for_all_maps(var) for (maptile *var = first_map; var; var = var->next)
332 303
333/* This is used by get_rangevector to determine where the other 304/* This is used by get_rangevector to determine where the other
334 * creature is. get_rangevector takes into account map tiling, 305 * creature is. get_rangevector takes into account map tiling,
335 * so you just can not look the the map coordinates and get the 306 * so you just can not look the the map coordinates and get the
336 * righte value. distance_x/y are distance away, which 307 * righte value. distance_x/y are distance away, which
337 * can be negativbe. direction is the crossfire direction scheme 308 * can be negative. direction is the crossfire direction scheme
338 * that the creature should head. part is the part of the 309 * that the creature should head. part is the part of the
339 * monster that is closest. 310 * monster that is closest.
340 * Note: distance should be always >=0. I changed it to UINT. MT 311 * Note: distance should be always >=0. I changed it to UINT. MT
341 */ 312 */
342struct rv_vector { 313struct rv_vector
314{
343 unsigned int distance; 315 unsigned int distance;
344 int distance_x; 316 int distance_x;
345 int distance_y; 317 int distance_y;
346 int direction; 318 int direction;
347 object *part; 319 object *part;
348}; 320};
349 321
350extern void (*load_original_map_callback)(mapstruct *map); 322inline mapspace &
351extern void (*load_temporary_map_callback)(mapstruct *map); 323object::ms () const
352extern void (*clean_temporary_map_callback)(mapstruct *map); 324{
325 return map->at (x, y);
326}
353 327
354#endif 328#endif
329

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines