--- deliantra/server/include/map.h 2011/05/08 21:51:26 1.148
+++ deliantra/server/include/map.h 2017/09/16 22:17:42 1.155
@@ -1,24 +1,24 @@
/*
* This file is part of Deliantra, the Roguelike Realtime MMORPG.
- *
- * Copyright (©) 2005,2006,2007,2008,2009,2010,2011 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
+ *
+ * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
* Copyright (©) 2002-2005 Mark Wedel & Crossfire Development Team
* Copyright (©) 1992 Frank Tore Johansen
- *
+ *
* Deliantra is free software: you can redistribute it and/or modify it under
* the terms of the Affero GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the Affero GNU General Public License
* and the GNU General Public License along with this program. If not, see
* .
- *
+ *
* The authors can be reached via e-mail to
*/
@@ -206,7 +206,7 @@
}
// return the item volume on this mapspace in cm³
- MTH uint64 volume ()
+ MTH volume_t volume ()
{
update ();
return volume_ * 1024;
@@ -251,7 +251,7 @@
const char *name; /* name of the item in question, null if it is the default item */
const char *name_pl; /* plural name */
int typenum; /* itemtype number we need to match 0 if it is the default price */
- sint8 strength; /* the degree of specialisation the shop has in this item,
+ sint8 strength; /* the degree of specialisation the shop has in this item,
* as a percentage from -100 to 100 */
int index; /* being the size of the shopitems array. */
};
@@ -263,8 +263,8 @@
IO_UNIQUES = 0x04, // unique objects
};
-/* In general, code should always use the macros
- * above (or functions in map.c) to access many of the
+/* In general, code should always use the macros
+ * above (or functions in map.c) to access many of the
* values in the map structure. Failure to do this will
* almost certainly break various features. You may think
* it is safe to look at width and height values directly
@@ -282,8 +282,8 @@
tstamp ACC (RW, last_access); /* last time this map was accessed somehow */
shstr ACC (RW, name); /* Name of map as given by its creator */
- region_ptr ACC (RW, default_region); /* What jurisdiction in the game world this map is ruled by
- * points to the struct containing all the properties of
+ region_ptr ACC (RW, default_region); /* What jurisdiction in the game world this map is ruled by
+ * points to the struct containing all the properties of
* the region */
double ACC (RW, reset_time);
uint32 ACC (RW, reset_timeout); /* How many seconds must elapse before this map
@@ -322,7 +322,7 @@
shstr ACC (RW, tile_path[TILE_NUM]); /* path to adjoining maps */
maptile *ACC (RW, tile_map[TILE_NUM]); /* Next map, linked list */
shstr ACC (RW, path); /* Filename of the map */
- uint64 ACC (RW, max_volume); // maximum volume for all items on a mapspace
+ volume_t ACC (RW, max_volume); // maximum volume for all items on a mapspace
int ACC (RW, max_items); // maximum number of items on a mapspace
//-GPL
@@ -529,7 +529,7 @@
mapxy &move (int dir)
{
- return move (freearr_x [dir], freearr_y [dir]);
+ return move (DIRX (dir), DIRY (dir));
}
operator void *() const { return (void *)m; }
@@ -602,6 +602,33 @@
extern dynbuf mapwalk_buf; // can be used in simple non-recursive situations
+// special "grave" map used to store all removed objects
+// till they can be destroyed - saves a lot of checks in the rest
+// of the code
+struct freed_map
+: maptile
+{
+ freed_map ()
+ : maptile (3, 3)
+ {
+ path = "";
+ name = "/internal/freed_objects_map";
+ no_drop = 1;
+ no_reset = 1;
+
+ state = MAP_ACTIVE;
+ }
+
+ ~freed_map ()
+ {
+ destroy ();
+ }
+};
+
+// initialised in common/shstr.C, due to shstr usage we need defined
+// initialisation order!
+extern struct freed_map freed_map; // freed objects are moved here to avoid crashes
+
// loop over every space in the given maprect,
// setting m, nx, ny to the map and -coordinate and dx, dy to the offset relative to dx0,dy0
// the iterator code must be a single statement following this macro call, similar to "if"