--- deliantra/server/common/object.C 2008/05/04 11:12:40 1.231 +++ deliantra/server/common/object.C 2008/05/06 18:47:32 1.233 @@ -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; @@ -1292,7 +1295,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; }