--- deliantra/server/include/map.h 2011/05/07 20:03:28 1.145
+++ deliantra/server/include/map.h 2012/11/12 03:14:32 1.152
@@ -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 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
*/
@@ -57,8 +57,8 @@
{
TILE_NORTH,
TILE_SOUTH,
- TILE_EAST ,
TILE_WEST,
+ TILE_EAST,
TILE_UP,
TILE_DOWN,
TILE_NUM
@@ -206,7 +206,7 @@
}
// return the item volume on this mapspace in cm³
- MTH uint64 volume ()
+ MTH volume_t volume ()
{
update ();
return volume_ * 1024;
@@ -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
@@ -330,8 +330,8 @@
physics_queue pq[PHYSICS_QUEUES];
MTH void queue_physics (object *ob, int after = 0);
MTH void queue_physics_at (int x, int y);
- MTH void post_load_physics ();
MTH int run_physics (tick_t tick, int max_objects);
+ MTH void activate_physics ();
// the maptile:: is neccessary here for the perl interface to work
MTH sint8 darklevel (sint8 outside = maptile::outdoor_darkness) const
@@ -342,7 +342,6 @@
static void adjust_daylight ();
MTH void activate ();
- MTH void activate_physics ();
MTH void deactivate ();
// allocates all (empty) mapspace
@@ -408,6 +407,12 @@
MTH void touch () { last_access = runtime; }
+ // returns the map at given direction. if the map isn't linked yet,
+ // it will either return false (if load is false), or otherwise try to link
+ // it - if linking fails because the map is not loaded yet, it will
+ // start loading the map and return 0.
+ // thus, if you get 0, the map exists and load is true, then some later
+ // call (some tick or so later...) will eventually succeed.
MTH maptile *tile_available (int dir, bool load = true);
// find the map that is at coordinate x|y relative to this map
@@ -597,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"