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.10 by root, Sun Aug 27 16:15:12 2006 UTC vs.
Revision 1.47 by root, Thu Jan 4 16:19:32 2007 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines