--- 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"