--- deliantra/server/common/object.C 2008/05/04 11:12:40 1.231 +++ deliantra/server/common/object.C 2008/05/06 20:00:12 1.235 @@ -356,7 +356,7 @@ // adjust weight per container type ("of holding") static sint32 -weight_adjust (object *op, sint32 weight) +weight_adjust_for (object *op, sint32 weight) { return op->type == CONTAINER ? lerp (weight, 0, 100, 0, 100 - op->stats.Str) @@ -372,7 +372,10 @@ { while (op) { - weight = weight_adjust (op, weight); + // adjust by actual difference to account for rounding errors + // i.e. (w2 - w1) / f != w2 / f - w1 / f and the latter is correct + weight = weight_adjust_for (op, op->carrying) + - weight_adjust_for (op, op->carrying - weight); if (!weight) return; @@ -405,7 +408,7 @@ sum += op->total_weight (); } - sum = weight_adjust (this, sum); + sum = weight_adjust_for (this, sum); if (sum != carrying) { @@ -1116,16 +1119,7 @@ if (below) below->above = above; else - { - /* Nothing below, which means we need to relink map object for this space - * use translated coordinates in case some oddness with map tiling is - * evident - */ - if (GET_MAP_OB (map, x, y) != this) - LOG (llevError, "remove_ob: GET_MAP_OB does not return object to be removed even though it appears to be on the bottom? %s\n", debug_desc ()); - - ms.bot = above; /* goes on above it. */ - } + ms.bot = above; above = 0; below = 0; @@ -1292,7 +1286,7 @@ */ if (!xy_normalise (m, op->x, op->y)) { - op->destroy (1); + op->head_ ()->destroy (1);// remove head_ once all tail object destroyers found return 0; }