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.21 by root, Sat Sep 16 22:24:12 2006 UTC vs.
Revision 1.30 by root, Wed Dec 20 11:36:39 2006 UTC

16 16
17 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
18 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 20
21 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
22*/ 22*/
23 23
24/* 24/*
25 * The maptile is allocated each time a new map is opened. 25 * The maptile is allocated each time a new map is opened.
26 * It contains pointers (very indirectly) to all objects on the map. 26 * It contains pointers (very indirectly) to all objects on the map.
42 * map pointers. 42 * map pointers.
43 */ 43 */
44#define MAGIC_MAP_SIZE 50 44#define MAGIC_MAP_SIZE 50
45#define MAGIC_MAP_HALF MAGIC_MAP_SIZE/2 45#define MAGIC_MAP_HALF MAGIC_MAP_SIZE/2
46 46
47
48#define MAP_LAYERS 4 47#define MAP_LAYERS 4
49 48
50/* This is when the map will reset */ 49/* This is when the map will reset */
51#define MAP_WHEN_RESET(m) ((m)->reset_time) 50#define MAP_WHEN_RESET(m) ((m)->reset_time)
52 51
99/* GET_MAP_FLAGS really shouldn't be used very often - get_map_flags should 98/* GET_MAP_FLAGS really shouldn't be used very often - get_map_flags should
100 * really be used, as it is multi tile aware. However, there are some cases 99 * really be used, as it is multi tile aware. However, there are some cases
101 * where it is known the map is not tiled or the values are known 100 * where it is known the map is not tiled or the values are known
102 * consistent (eg, op->map, op->x, op->y) 101 * consistent (eg, op->map, op->x, op->y)
103 */ 102 */
104#define GET_MAP_FLAGS(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].flags ) 103// all those macros are herewith declared legacy
105#define SET_MAP_FLAGS(M,X,Y,C) ( (M)->spaces[(X) + (M)->width * (Y)].flags = C ) 104#define GET_MAP_FLAGS(M,X,Y) (M)->at((X),(Y)).flags ()
106#define GET_MAP_LIGHT(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].light ) 105#define GET_MAP_LIGHT(M,X,Y) (M)->at((X),(Y)).light
107#define SET_MAP_LIGHT(M,X,Y,L) ( (M)->spaces[(X) + (M)->width * (Y)].light = L ) 106#define GET_MAP_OB(M,X,Y) (M)->at((X),(Y)).bottom
108 107#define GET_MAP_TOP(M,X,Y) (M)->at((X),(Y)).top
109#define GET_MAP_OB(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].bottom ) 108#define GET_MAP_FACE(M,X,Y,L) (M)->at((X),(Y)).faces[L]
110#define GET_MAP_TOP(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].top )
111
112/* legacy */
113#define get_map_ob GET_MAP_OB
114
115#define SET_MAP_OB(M,X,Y,tmp) ( (M)->spaces[(X) + (M)->width * (Y)].bottom = (tmp) )
116#define SET_MAP_TOP(M,X,Y,tmp) ( (M)->spaces[(X) + (M)->width * (Y)].top = (tmp) )
117#define set_map_ob SET_MAP_OB
118
119#define SET_MAP_FACE(M,X,Y,C,L) ( (M)->spaces[(X) + (M)->width * (Y)].faces[L] = C )
120#define GET_MAP_FACE(M,X,Y,L) ( (M)->spaces[(X) + (M)->width * (Y)].faces[L] )
121
122#define SET_MAP_FACE_OBJ(M,X,Y,C,L) ( (M)->spaces[(X) + (M)->width * (Y)].faces_obj[L] = C )
123#define GET_MAP_FACE_OBJ(M,X,Y,L) ( (M)->spaces[(X) + (M)->width * (Y)].faces_obj[L] ) 109#define GET_MAP_FACE_OBJ(M,X,Y,L) (M)->at((X),(Y)).faces_obj[L]
124
125#define GET_MAP_MOVE_BLOCK(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].move_block ) 110#define GET_MAP_MOVE_BLOCK(M,X,Y) (M)->at((X),(Y)).move_block
126#define SET_MAP_MOVE_BLOCK(M,X,Y,C) ( (M)->spaces[(X) + (M)->width * (Y)].move_block = C )
127
128#define GET_MAP_MOVE_SLOW(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].move_slow ) 111#define GET_MAP_MOVE_SLOW(M,X,Y) (M)->at((X),(Y)).move_slow
129#define SET_MAP_MOVE_SLOW(M,X,Y,C) ( (M)->spaces[(X) + (M)->width * (Y)].move_slow = C )
130
131#define GET_MAP_MOVE_ON(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].move_on ) 112#define GET_MAP_MOVE_ON(M,X,Y) (M)->at((X),(Y)).move_on
132#define SET_MAP_MOVE_ON(M,X,Y,C) ( (M)->spaces[(X) + (M)->width * (Y)].move_on = C )
133
134#define GET_MAP_MOVE_OFF(M,X,Y) ( (M)->spaces[(X) + (M)->width * (Y)].move_off ) 113#define GET_MAP_MOVE_OFF(M,X,Y) (M)->at((X),(Y)).move_off
135#define SET_MAP_MOVE_OFF(M,X,Y,C) ( (M)->spaces[(X) + (M)->width * (Y)].move_off = C )
136 114
137/* You should really know what you are doing before using this - you 115/* You should really know what you are doing before using this - you
138 * should almost always be using out_of_map instead, which takes into account 116 * should almost always be using out_of_map instead, which takes into account
139 * map tiling. 117 * map tiling.
140 */ 118 */
141#define OUT_OF_REAL_MAP(M,X,Y) ((X)<0 || (Y)<0 || (X)>=(M)->width || (Y)>=(M)->height) 119#define OUT_OF_REAL_MAP(M,X,Y) ((X)<0 || (Y)<0 || (X)>=(M)->width || (Y)>=(M)->height)
142 120
143/* These are used in the MapLook flags element. They are not used in 121/* These are used in the MapLook flags element. They are not used in
144 * in the object flags structure. 122 * in the object flags structure.
145 */ 123 */
146
147#define P_BLOCKSVIEW 0x01 124#define P_BLOCKSVIEW 0x01
148#define P_NO_MAGIC 0x02 /* Spells (some) can't pass this object */ 125#define P_NO_MAGIC 0x02 /* Spells (some) can't pass this object */
149 126#define P_PLAYER 0x04 /* a player (or something seeing these objects) is on this mapspace */
150/* AB_NO_PASS is used for arch_blocked() return value. It needs 127#define P_SAFE 0x08 /* If this is set the map tile is a safe space,
151 * to be here to make sure the bits don't match with anything.
152 * Changed name to have AB_ prefix just to make sure no one
153 * is using the P_NO_PASS. AB_.. should only be used for
154 * arch_blocked and functions that examine the return value.
155 */
156
157#define AB_NO_PASS 0x04
158
159 /*#define P_PASS_THRU 0x08 *//* */
160#define P_SAFE 0x08
161 /* If this is set the map tile is a safe map,
162 * that means, nothing harmful there will be done, 128 * that means, nothing harmful can be done,
163 * like: bombs, potion usage, alchemy, spells 129 * such as: bombs, potion usage, alchemy, spells
164 * this was introduced to make shops more safe 130 * this was introduced to make shops safer
165 * and propably other maps */ 131 * but is useful in other situations */
166#define P_IS_ALIVE 0x10 /* something alive is on this space */ 132#define P_IS_ALIVE 0x10 /* something alive is on this space */
167#define P_NO_CLERIC 0x20 /* no clerical spells cast here */ 133#define P_NO_CLERIC 0x20 /* no clerical spells cast here */
134
168#define P_NEED_UPDATE 0x40 /* this space is out of date */ 135#define P_NEED_UPDATE 0x80 /* this space is out of date */
169#define P_NO_ERROR 0x80 /* Purely temporary - if set, update_position
170 * does not complain if the flags are different.
171 */
172 136
173/* The following two values are not stored in the MapLook flags, but instead 137/* 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 138 * 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 139 * 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 140 * function that does more of the work can hopefully be used to replace
177 * lots of duplicate checks currently in the code. 141 * lots of duplicate checks currently in the code.
178 */ 142 */
179#define P_OUT_OF_MAP 0x100 /* This space is outside the map */ 143#define P_OUT_OF_MAP 0x10000 /* This space is outside the map */
180#define P_NEW_MAP 0x200 144#define P_NEW_MAP 0x20000
181 /* Coordinates passed result in a new tiled map */ 145 /* Coordinates passed result in a new tiled map */
182 146
183/* Can't use MapCell as that is used in newserver.h 147/* P_NO_PASS is used for ob_blocked() return value. It needs
148 * to be here to make sure the bits don't match with anything.
149 */
150#define P_NO_PASS 0x80000
151
184 * Instead of having numerous arrays that have information on a 152/* Instead of having numerous arrays that have information on a
185 * particular space (was map, floor, floor2, map_ob), 153 * particular space (was map, floor, floor2, map_ob),
186 * have this structure take care of that information. 154 * have this structure take care of that information.
187 * This puts it all in one place, and should also make it easier 155 * This puts it all in one place, and should also make it easier
188 * to extend information about a space. 156 * to extend information about a space.
189 */ 157 */
190
191struct MapSpace 158struct mapspace
192{ 159{
193 object *bottom; /* lowest object on this space */ 160 object *bottom; /* lowest object on this space */
194 object *top; /* Highest object on this space */ 161 object *top; /* Highest object on this space */
195 New_Face *faces[MAP_LAYERS]; /* faces for the 3 layers */ 162 New_Face *faces[MAP_LAYERS]; /* faces for the 3 layers */
196 object *faces_obj[MAP_LAYERS]; /* face objects for the 3 layers */ 163 object *faces_obj[MAP_LAYERS];/* face objects for the 3 layers */
197 uint8 flags; /* flags about this space (see the P_ values above) */ 164 uint8 flags_; /* flags about this space (see the P_ values above) */
198 sint8 light; /* How much light this space provides */ 165 sint8 light; /* How much light this space provides */
199 MoveType move_block; /* What movement types this space blocks */ 166 MoveType move_block; /* What movement types this space blocks */
200 MoveType move_slow; /* What movement types this space slows */ 167 MoveType move_slow; /* What movement types this space slows */
201 MoveType move_on; /* What movement types are activated */ 168 MoveType move_on; /* What movement types are activated */
202 MoveType move_off; /* What movement types are activated */ 169 MoveType move_off; /* What movement types are activated */
170
171 void update_ ();
172 void update ()
173 {
174 if (flags_ & P_NEED_UPDATE)
175 update_ ();
176 }
177
178 uint8 flags ()
179 {
180 update ();
181 return flags_;
182 }
183
184 // maybe only inline quick flags_ checking?
185 object *player ()
186 {
187 if (flags () & P_PLAYER)
188 for (object *op = bottom; op; op = op->above)
189 if (op->type == PLAYER)
190 return op;
191
192 return 0;
193 }
203}; 194};
204 195
205/* 196/*
206 * 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
207 * 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.
229 220
230/* 221/*
231 * 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
232 * they have to appear here in the headers, before the mapdef 223 * they have to appear here in the headers, before the mapdef
233 */ 224 */
234struct region 225struct region : zero_initialised
235{ 226{
236 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 */
237 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 */
238 const char *parent_name; /* 229 const char *parent_name; /*
239 * So that parent and child regions can be defined in 230 * So that parent and child regions can be defined in
255 * 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 */
256 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. */
257 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. */
258}; 249};
259 250
260
261struct shopitems : zero_initialised 251struct shopitems : zero_initialised
262{ 252{
263 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 */
264 const char *name_pl; /* plural name */ 254 const char *name_pl; /* plural name */
265 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 */
277 * break map tiling. 267 * break map tiling.
278 */ 268 */
279ACC_CLASS (maptile) 269ACC_CLASS (maptile)
280struct maptile : zero_initialised, attachable<maptile> 270struct maptile : zero_initialised, attachable<maptile>
281{ 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
282 maptile *ACC (RW, next); /* Next map, linked list */ 275 maptile *ACC (RW, next); /* Next map, linked list */
283 char *ACC (RO, tmpname); /* Name of temporary file */ 276 char *ACC (RO, tmpname); /* Name of temporary file */
284 char *ACC (RO, name); /* Name of map as given by its creator */ 277 char *ACC (RO, name); /* Name of map as given by its creator */
285 struct region *ACC (RW, 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
286 * points to the struct containing all the properties of 279 * points to the struct containing all the properties of
295 bool ACC (RW, unique); /* if set, this is a per player unique map */ 288 bool ACC (RW, unique); /* if set, this is a per player unique map */
296 bool ACC (RW, templatemap); /* if set, this is a template map */ 289 bool ACC (RW, templatemap); /* if set, this is a template map */
297 bool ACC (RW, nosmooth); /* 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 */
298 sint32 ACC (RW, timeout); /* swapout is set to this */ 291 sint32 ACC (RW, timeout); /* swapout is set to this */
299 sint32 ACC (RW, 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 */
300 sint16 ACC (RW, players); /* How many plares are on this level right now */
301 uint32 ACC (RW, 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
302 * be loaded before used. The map,omap and map_ob 294 * be loaded before used. The map,omap and map_ob
303 * 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 */
304 uint16 ACC (RW, difficulty); /* What level the player should be to play here */ 297 uint16 ACC (RW, difficulty); /* What level the player should be to play here */
305 298
306 uint8 ACC (RW, darkness); /* indicates level of darkness of map */ 299 uint8 ACC (RW, darkness); /* indicates level of darkness of map */
307 uint16 ACC (RO, width), ACC (RO, height); /* Width and height of map. */
308 uint16 ACC (RW, 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 */
309 uint16 ACC (RW, 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 */
310 bool ACC (RW, outdoor); /* True if an outdoor map */ 302 bool ACC (RW, outdoor); /* True if an outdoor map */
311 oblinkpt *buttons; /* Linked list of linked lists of buttons */ 303 oblinkpt *buttons; /* Linked list of linked lists of buttons */
312 struct MapSpace *spaces; /* Array of spaces on this map */
313 sint16 ACC (RW, temp); /* base temperature of this tile (F) */ 304 sint16 ACC (RW, temp); /* base temperature of this tile (F) */
314 sint16 ACC (RW, pressure); /* barometric pressure (mb) */ 305 sint16 ACC (RW, pressure); /* barometric pressure (mb) */
315 sint8 ACC (RW, humid); /* humitidy of this tile */ 306 sint8 ACC (RW, humid); /* humitidy of this tile */
316 sint8 ACC (RW, windspeed); /* windspeed of this tile */ 307 sint8 ACC (RW, windspeed); /* windspeed of this tile */
317 sint8 ACC (RW, winddir); /* direction of wind */ 308 sint8 ACC (RW, winddir); /* direction of wind */
318 sint8 ACC (RW, sky); /* sky conditions */ 309 sint8 ACC (RW, sky); /* sky conditions */
319 int ACC (RW, wpartx), ACC (RW, wparty); /*Highly fasten conversion between worldmap and weathermap */ 310 int ACC (RW, wpartx), ACC (RW, wparty); /*Highly fasten conversion between worldmap and weathermap */
320 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 */
321 char *ACC (RO, shoprace); /* the preffered race of the local shopkeeper */ 312 char *ACC (RO, shoprace); /* the preffered race of the local shopkeeper */
322 double ACC (RW, shopgreed); /* how much our shopkeeper overcharges */ 313 double ACC (RW, shopgreed); /* how much our shopkeeper overcharges */
323 uint64 ACC (RW, shopmin); /* minimum price a shop will trade for */ 314 sint64 ACC (RW, shopmin); /* minimum price a shop will trade for */
324 uint64 ACC (RW, shopmax); /* maximum price a shop will offer */ 315 sint64 ACC (RW, shopmax); /* maximum price a shop will offer */
325 char *ACC (RO, msg); /* Message map creator may have left */ 316 char *ACC (RO, msg); /* Message map creator may have left */
326 char *ACC (RO, maplore); /* Map lore information */ 317 char *ACC (RO, maplore); /* Map lore information */
327 char *tile_path[4]; /* path to adjoining maps */ 318 char *tile_path[4]; /* path to adjoining maps */
328 maptile *tile_map[4]; /* Next map, linked list */ 319 maptile *tile_map[4]; /* Next map, linked list */
329 char ACC (RW, path)[HUGE_BUF]; /* Filename of the map */ 320 char ACC (RW, path)[HUGE_BUF]; /* Filename of the map */
321
322 maptile ();
323 void allocate ();
324
325 mapspace const &at (uint32 x, uint32 y) const { return spaces [x + width * y]; }
326 mapspace &at (uint32 x, uint32 y) { return spaces [x + width * y]; }
330}; 327};
331 328
332/* This is used by get_rangevector to determine where the other 329/* This is used by get_rangevector to determine where the other
333 * creature is. get_rangevector takes into account map tiling, 330 * creature is. get_rangevector takes into account map tiling,
334 * so you just can not look the the map coordinates and get the 331 * so you just can not look the the map coordinates and get the
335 * righte value. distance_x/y are distance away, which 332 * righte value. distance_x/y are distance away, which
336 * can be negativbe. direction is the crossfire direction scheme 333 * can be negative. direction is the crossfire direction scheme
337 * that the creature should head. part is the part of the 334 * that the creature should head. part is the part of the
338 * monster that is closest. 335 * monster that is closest.
339 * Note: distance should be always >=0. I changed it to UINT. MT 336 * Note: distance should be always >=0. I changed it to UINT. MT
340 */ 337 */
341struct rv_vector 338struct rv_vector
346 int direction; 343 int direction;
347 object *part; 344 object *part;
348}; 345};
349 346
350#endif 347#endif
348

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines