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.18 by root, Fri Sep 8 12:56:43 2006 UTC vs.
Revision 1.33 by root, Mon Dec 25 14:43:23 2006 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines