--- deliantra/server/common/map.C 2007/01/19 17:50:10 1.78 +++ deliantra/server/common/map.C 2007/01/29 16:11:48 1.82 @@ -794,7 +794,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 @@ -873,7 +873,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) { @@ -934,20 +934,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; @@ -1451,7 +1454,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) @@ -1552,7 +1555,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. * @@ -1633,9 +1636,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)) { @@ -1682,3 +1684,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 (); +} +