--- deliantra/server/common/map.C 2008/04/21 23:35:24 1.136 +++ deliantra/server/common/map.C 2008/05/04 20:40:52 1.140 @@ -813,13 +813,13 @@ } } - sfree (spaces, size ()), spaces = 0; + sfree0 (spaces, size ()); } if (buttons) free_objectlinkpt (buttons), buttons = 0; - sfree (regions, size ()); regions = 0; + sfree0 (regions, size ()); delete [] regionmap; regionmap = 0; } @@ -983,10 +983,17 @@ { total_exp += op->stats.exp; - if (archetype *at = type_to_archetype (GENERATE_TYPE (op))) - total_exp += at->stats.exp * 8; + if (archetype *at = op->other_arch) + { + total_exp += at->stats.exp * 8; + monster_cnt++; + } - monster_cnt++; + for (object *inv = op->inv; inv; inv = inv->below) + { + total_exp += op->stats.exp * 8; + monster_cnt++; + } } } @@ -1066,8 +1073,7 @@ * light bulbs do not illuminate twice as far as once since * it is a dissapation factor that is cubed. */ - if (tmp->glow_radius > light) - light = tmp->glow_radius; + light = max (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). @@ -1589,11 +1595,9 @@ } /* picks a random object from a style map. - * Redone by MSW so it should be faster and not use static - * variables to generate tables. */ object * -maptile::pick_random_object () const +maptile::pick_random_object (rand_gen &gen) const { /* while returning a null object will result in a crash, that * is actually preferable to an infinite loop. That is because @@ -1603,15 +1607,15 @@ */ for (int i = 1000; --i;) { - object *pick = at (rndm (width), rndm (height)).bot; + object *pick = at (gen (width), gen (height)).bot; // do not prefer big monsters just because they are big. - if (pick && pick->head_ () == pick) + if (pick && pick->is_head ()) return pick->head_ (); } // instead of crashing in the unlikely(?) case, try to return *something* - return get_archetype ("blocked"); + return archetype::find ("bug"); } void