--- deliantra/server/common/map.C 2007/01/14 18:00:33 1.73 +++ deliantra/server/common/map.C 2007/02/05 01:24:45 1.84 @@ -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 @@ -69,9 +69,9 @@ int mode = 0; if (prepend_dir) - strcpy (buf, create_pathname (name)); + assign (buf, create_pathname (name)); else - strcpy (buf, name); + assign (buf, name); /* old method (strchr(buf, '\0')) seemd very odd to me - * this method should be equivalant and is clearer. @@ -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, @@ -742,18 +741,6 @@ switch (kw) { - case KW_EOF: - LOG (llevError, "%s: end of file while reading map header, aborting header load.\n", &path); - return false; - - 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; @@ -795,7 +782,7 @@ case KW_per_player: thawer.get (per_player); break; case KW_per_party: thawer.get (per_party); break; - case KW_region: get_region_by_name (thawer.get_str ()); break; + case KW_region: default_region = region::find (thawer.get_str ()); break; case KW_shopitems: shopitems = parse_shop_string (thawer.get_str ()); break; // old names new names @@ -813,6 +800,14 @@ 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; + + case KW_end: + return true; + + default: + if (!thawer.parse_error (kw, "map", 0)) + return false; + break; } } @@ -874,7 +869,7 @@ MAP_OUT (fixed_resettime); MAP_OUT (difficulty); - if (region) MAP_OUT2 (region, region->name); + if (default_region) MAP_OUT2 (region, default_region->name); if (shopitems) { @@ -935,20 +930,23 @@ void maptile::clear () { - if (!spaces) - return; + sfree (regions, size ()), regions = 0; + free (regionmap), regionmap = 0; - for (mapspace *ms = spaces + size (); ms-- > spaces; ) - while (object *op = ms->bot) - { - if (op->head) - op = op->head; + if (spaces) + { + for (mapspace *ms = spaces + size (); ms-- > spaces; ) + while (object *op = ms->bot) + { + if (op->head) + op = op->head; - op->destroy_inv (false); - op->destroy (); - } + op->destroy_inv (false); + op->destroy (); + } - sfree (spaces, size ()), spaces = 0; + sfree (spaces, size ()), spaces = 0; + } if (buttons) free_objectlinkpt (buttons), buttons = 0; @@ -1112,8 +1110,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; @@ -1452,7 +1450,7 @@ * Return whether map2 is adjacent to map1. If so, store the distance from * map1 to map2 in dx/dy. */ -static int +int adjacent_map (const maptile *map1, const maptile *map2, int *dx, int *dy) { if (!map1 || !map2) @@ -1553,7 +1551,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 +1608,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); } } @@ -1632,9 +1632,8 @@ * for something in the future. Also, since no object is pasted, the best * field of the rv_vector is set to NULL. */ - void -get_rangevector_from_mapcoord (const maptile *m, int x, int y, const object *op2, rv_vector * retval, int flags) +get_rangevector_from_mapcoord (const maptile *m, int x, int y, const object *op2, rv_vector *retval, int flags) { if (!adjacent_map (m, op2->map, &retval->distance_x, &retval->distance_y)) { @@ -1651,7 +1650,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); } } @@ -1681,3 +1680,18 @@ return insert_ob_in_map_at (op, this, originator, flags, x, y); } +region * +maptile::region (int x, int y) const +{ + if (regions + && regionmap + && !OUT_OF_REAL_MAP (this, x, y)) + if (struct region *reg = regionmap [regions [y * width + x]]) + return reg; + + if (default_region) + return default_region; + + return ::region::default_region (); +} +