--- deliantra/server/common/map.C 2007/01/06 14:42:29 1.71 +++ deliantra/server/common/map.C 2007/01/19 17:50:10 1.78 @@ -1,26 +1,26 @@ /* - CrossFire, A Multiplayer game for X-windows - - Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team - Copyright (C) 2001-2003 Mark Wedel & Crossfire Development Team - Copyright (C) 1992 Frank Tore Johansen - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 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 GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - The authors can be reached via e-mail at -*/ + * CrossFire, A Multiplayer game for X-windows + * + * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team + * Copyright (C) 2001-2003 Mark Wedel & Crossfire Development Team + * Copyright (C) 1992 Frank Tore Johansen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 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 GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * The authors can be reached via e-mail at + */ #include #include @@ -230,7 +230,6 @@ return 0; } - /* * Returns true if the given object can't fit in the given spot. * This is meant for multi space objects - for single space objecs, @@ -402,7 +401,7 @@ * mapflags is the same as we get with load_original_map */ bool -maptile::load_objects (object_thawer &thawer) +maptile::_load_objects (object_thawer &thawer) { int unique; object *op, *prev = NULL, *last_more = NULL, *otmp; @@ -488,23 +487,25 @@ } bool -maptile::save_objects (object_freezer &freezer, int flags) +maptile::_save_objects (object_freezer &freezer, int flags) { static int cede_count = 0; if (flags & IO_HEADER) - save_header (freezer); + _save_header (freezer); if (!spaces) return false; for (int i = 0; i < size (); ++i) { +#if 0 // temporarily disabled for improved(?) stability, schmorp #TODO#d#//D if (cede_count >= 500) { cede_count = 0; coroapi::cede (); } +#endif int unique = 0; for (object *op = spaces [i].bot; op; op = op->above) @@ -532,7 +533,7 @@ } bool -maptile::load_objects (const char *path, bool skip_header) +maptile::_load_objects (const char *path, bool skip_header) { object_thawer thawer (path); @@ -550,15 +551,15 @@ thawer.skip_kv (kw); } - return load_objects (thawer); + return _load_objects (thawer); } bool -maptile::save_objects (const char *path, int flags) +maptile::_save_objects (const char *path, int flags) { object_freezer freezer; - if (!save_objects (freezer, flags)) + if (!_save_objects (freezer, flags)) return false; return freezer.save (path); @@ -732,7 +733,7 @@ * MSW 2001-07-01 */ bool -maptile::load_header (object_thawer &thawer) +maptile::_load_header (object_thawer &thawer) { for (;;) { @@ -818,14 +819,14 @@ } bool -maptile::load_header (const char *path) +maptile::_load_header (const char *path) { object_thawer thawer (path); if (!thawer) return false; - return load_header (thawer); + return _load_header (thawer); } /****************************************************************************** @@ -858,7 +859,7 @@ } bool -maptile::save_header (object_freezer &freezer) +maptile::_save_header (object_freezer &freezer) { #define MAP_OUT(k) freezer.put (KW_ ## k, k) #define MAP_OUT2(k,v) freezer.put (KW_ ## k, v) @@ -917,11 +918,11 @@ } bool -maptile::save_header (const char *path) +maptile::_save_header (const char *path) { object_freezer freezer; - if (!save_header (freezer)) + if (!_save_header (freezer)) return false; return freezer.save (path); @@ -1110,8 +1111,8 @@ mapspace::update_ () { object *tmp, *last = 0; - uint8 flags = 0, light = 0, anywhere = 0; - New_Face *top, *floor, *middle; + uint8 flags = P_UPTODATE, light = 0, anywhere = 0; + facetile *top, *floor, *middle; object *top_obj, *floor_obj, *middle_obj; MoveType move_block = 0, move_slow = 0, move_on = 0, move_off = 0, move_allow = 0; @@ -1608,14 +1609,16 @@ best = tmp; } } + if (best != op1) { retval->distance_x += op1->x - best->x; retval->distance_y += op1->y - best->y; } } + retval->part = best; - retval->distance = isqrt (retval->distance_x * retval->distance_x + retval->distance_y * retval->distance_y); + retval->distance = idistance (retval->distance_x, retval->distance_y); retval->direction = find_dir_2 (-retval->distance_x, -retval->distance_y); } } @@ -1649,7 +1652,7 @@ retval->distance_y += op2->y - y; retval->part = NULL; - retval->distance = isqrt (retval->distance_x * retval->distance_x + retval->distance_y * retval->distance_y); + retval->distance = idistance (retval->distance_x, retval->distance_y); retval->direction = find_dir_2 (-retval->distance_x, -retval->distance_y); } }