--- deliantra/server/common/map.C 2007/01/04 16:56:39 1.69 +++ deliantra/server/common/map.C 2007/01/20 22:09:51 1.79 @@ -1,25 +1,26 @@ /* - CrossFire, A Multiplayer game for X-windows - - 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 @@ -229,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, @@ -401,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; @@ -487,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) @@ -531,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); @@ -549,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); @@ -731,12 +733,8 @@ * MSW 2001-07-01 */ bool -maptile::load_header (object_thawer &thawer) +maptile::_load_header (object_thawer &thawer) { - char buf[HUGE_BUF], msgbuf[HUGE_BUF], maplorebuf[HUGE_BUF], *key = NULL, *value, *end; - int msgpos = 0; - int maplorepos = 0; - for (;;) { keyword kw = thawer.get_kv (); @@ -750,6 +748,11 @@ case KW_end: return true; + default: + case KW_ERROR: + LOG (llevError, "%s: skipping errornous line (%s) while reading map header.\n", &path, thawer.last_keyword); + break; + case KW_msg: thawer.get_ml (KW_endmsg, msg); break; @@ -809,10 +812,6 @@ case KW_tile_path_2: thawer.get (tile_path [1]); break; case KW_tile_path_3: thawer.get (tile_path [2]); break; case KW_tile_path_4: thawer.get (tile_path [3]); break; - - default: - LOG (llevError, "%s: skipping unknown key in map header: %s\n", &path, keyword_str [kw]); - break; } } @@ -820,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); } /****************************************************************************** @@ -860,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) @@ -919,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); @@ -1112,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; @@ -1553,7 +1552,7 @@ * creature is. get_rangevector takes into account map tiling, * so you just can not look the the map coordinates and get the * righte value. distance_x/y are distance away, which - * can be negativbe. direction is the crossfire direction scheme + * can be negative. direction is the crossfire direction scheme * that the creature should head. part is the part of the * monster that is closest. * @@ -1610,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); } } @@ -1651,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); } }