--- deliantra/server/common/map.C 2008/05/04 20:40:52 1.140 +++ deliantra/server/common/map.C 2008/12/23 06:58:23 1.153 @@ -24,11 +24,11 @@ #include #include "global.h" - #include "loader.h" - #include "path.h" +sint8 maptile::outdoor_darkness; + /* This rolls up wall, blocks_magic, blocks_view, etc, all into * one function that just returns a P_.. value (see map.h) * it will also do map translation for tiled maps, returning @@ -262,6 +262,19 @@ tmp->flag [flag] = value; } +void +maptile::post_load_original () +{ + if (!spaces) + return; + + set_object_flag (FLAG_OBJ_ORIGINAL); + + for (mapspace *ms = spaces + size (); ms-- > spaces; ) + for (object *tmp = ms->bot; tmp; tmp = tmp->above) + INVOKE_OBJECT (RESET, tmp); +} + /* link_multipart_objects go through all the objects on the map looking * for objects whose arch says they are multipart yet according to the * info we have, they only have the head (as would be expected when @@ -643,6 +656,7 @@ case KW_per_player: thawer.get (per_player); break; case KW_per_party: thawer.get (per_party); break; case KW_no_reset: thawer.get (no_reset); break; + case KW_no_drop: thawer.get (no_drop); break; case KW_region: default_region = region::find (thawer.get_str ()); break; case KW_shopitems: shopitems = parse_shop_string (thawer.get_str ()); break; @@ -702,10 +716,7 @@ unique = 1; if (op->head_ () == op && (QUERY_FLAG (op, FLAG_UNIQUE) || unique)) - { - op->destroy_inv (false); - op->destroy (); - } + op->destroy (); op = above; } @@ -726,6 +737,7 @@ MAP_OUT (reset_timeout); MAP_OUT (fixed_resettime); MAP_OUT (no_reset); + MAP_OUT (no_drop); MAP_OUT (difficulty); if (default_region) MAP_OUT2 (region, default_region->name); @@ -802,10 +814,7 @@ object *head = op->head_ (); if (op == head) - { - op->destroy_inv (false); - op->destroy (); - } + op->destroy (); else if (head->map != op->map) { LOG (llevDebug, "bad luck for object crossing map borders: %s", head->debug_desc ()); @@ -958,10 +967,10 @@ * difficulty does not have a lot to do with character level, * but does have a lot to do with treasure on the map. * - * Difficulty can now be set by the map creature. If the value stored - * in the map is zero, then use this routine. Maps should really - * have a difficulty set than using this function - human calculation - * is much better than this functions guesswork. + * Difficulty can now be set by the map creator. If the value stored + * in the map is zero, then use this routine. Maps should really + * have a difficulty set rather than using this function - human calculation + * is much better than this function's guesswork. */ int maptile::estimate_difficulty () const @@ -1042,6 +1051,7 @@ /* All clients need to get re-updated for the change */ update_all_map_los (this); + return 1; } @@ -1054,8 +1064,9 @@ void mapspace::update_ () { - object *tmp, *last = 0; - uint8 flags = P_UPTODATE, light = 0, anywhere = 0; + object *last = 0; + uint8 flags = P_UPTODATE, anywhere = 0; + sint8 light = 0; MoveType move_block = 0, move_slow = 0, move_on = 0, move_off = 0, move_allow = 0; //object *middle = 0; @@ -1066,14 +1077,10 @@ object *&middle = faces_obj[1] = 0; object *&floor = faces_obj[2] = 0; - for (tmp = bot; tmp; last = tmp, tmp = tmp->above) + for (object *tmp = bot; tmp; last = tmp, tmp = tmp->above) { - /* This could be made additive I guess (two lights better than - * one). But if so, it shouldn't be a simple additive - 2 - * light bulbs do not illuminate twice as far as once since - * it is a dissapation factor that is cubed. - */ - light = max (light, tmp->glow_radius); + // Lights are additive, up to MAX_LIGHT_RADIUS, see los.C) + light += tmp->glow_radius; /* This call is needed in order to update objects the player * is standing in that have animations (ie, grass, fire, etc). @@ -1102,6 +1109,7 @@ middle = tmp; anywhere = 1; } + /* Find the highest visible face around. If equal * visibilities, we still want the one nearer to the * top @@ -1130,7 +1138,7 @@ if (QUERY_FLAG (tmp, FLAG_DAMNED)) flags |= P_NO_CLERIC; } - this->light = light; + this->light = min (light, MAX_LIGHT_RADIUS); this->flags_ = flags; this->move_block = move_block & ~move_allow; this->move_on = move_on; @@ -1160,7 +1168,7 @@ * 3) neither middle or top is set - need to set both. */ - for (tmp = last; tmp; tmp = tmp->below) + for (object *tmp = last; tmp; tmp = tmp->below) { /* Once we get to a floor, stop, since we already have a floor object */ if (QUERY_FLAG (tmp, FLAG_IS_FLOOR)) @@ -1573,9 +1581,6 @@ object * maptile::insert (object *op, int x, int y, object *originator, int flags) { - if (!op->flag [FLAG_REMOVED]) - op->remove (); - return insert_ob_in_map_at (op, this, originator, flags, x, y); } @@ -1624,17 +1629,16 @@ if (!sound) return; - for_all_players (pl) - if (pl->ob->map == this) - if (client *ns = pl->ns) - { - int dx = x - pl->ob->x; - int dy = y - pl->ob->y; + for_all_players_on_map (pl, this) + if (client *ns = pl->ns) + { + int dx = x - pl->ob->x; + int dy = y - pl->ob->y; - int distance = idistance (dx, dy); + int distance = idistance (dx, dy); - if (distance <= MAX_SOUND_DISTANCE) - ns->play_sound (sound, dx, dy); - } + if (distance <= MAX_SOUND_DISTANCE) + ns->play_sound (sound, dx, dy); + } }