ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/object.C
(Generate patch)

Comparing deliantra/server/common/object.C (file contents):
Revision 1.231 by root, Sun May 4 11:12:40 2008 UTC vs.
Revision 1.235 by root, Tue May 6 20:00:12 2008 UTC

354 return 0; 354 return 0;
355} 355}
356 356
357// adjust weight per container type ("of holding") 357// adjust weight per container type ("of holding")
358static sint32 358static sint32
359weight_adjust (object *op, sint32 weight) 359weight_adjust_for (object *op, sint32 weight)
360{ 360{
361 return op->type == CONTAINER 361 return op->type == CONTAINER
362 ? lerp (weight, 0, 100, 0, 100 - op->stats.Str) 362 ? lerp (weight, 0, 100, 0, 100 - op->stats.Str)
363 : weight; 363 : weight;
364} 364}
370static void 370static void
371adjust_weight (object *op, sint32 weight) 371adjust_weight (object *op, sint32 weight)
372{ 372{
373 while (op) 373 while (op)
374 { 374 {
375 // adjust by actual difference to account for rounding errors
376 // i.e. (w2 - w1) / f != w2 / f - w1 / f and the latter is correct
375 weight = weight_adjust (op, weight); 377 weight = weight_adjust_for (op, op->carrying)
378 - weight_adjust_for (op, op->carrying - weight);
376 379
377 if (!weight) 380 if (!weight)
378 return; 381 return;
379 382
380 op->carrying += weight; 383 op->carrying += weight;
403 op->update_weight (); 406 op->update_weight ();
404 407
405 sum += op->total_weight (); 408 sum += op->total_weight ();
406 } 409 }
407 410
408 sum = weight_adjust (this, sum); 411 sum = weight_adjust_for (this, sum);
409 412
410 if (sum != carrying) 413 if (sum != carrying)
411 { 414 {
412 carrying = sum; 415 carrying = sum;
413 416
1114 1117
1115 /* Relink the object below us, if there is one */ 1118 /* Relink the object below us, if there is one */
1116 if (below) 1119 if (below)
1117 below->above = above; 1120 below->above = above;
1118 else 1121 else
1119 { 1122 ms.bot = above;
1120 /* Nothing below, which means we need to relink map object for this space
1121 * use translated coordinates in case some oddness with map tiling is
1122 * evident
1123 */
1124 if (GET_MAP_OB (map, x, y) != this)
1125 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 ());
1126
1127 ms.bot = above; /* goes on above it. */
1128 }
1129 1123
1130 above = 0; 1124 above = 0;
1131 below = 0; 1125 below = 0;
1132 1126
1133 if (map->in_memory == MAP_SAVING) 1127 if (map->in_memory == MAP_SAVING)
1290 * of areas of callers (eg, anything that uses find_free_spot would now 1284 * of areas of callers (eg, anything that uses find_free_spot would now
1291 * need extra work 1285 * need extra work
1292 */ 1286 */
1293 if (!xy_normalise (m, op->x, op->y)) 1287 if (!xy_normalise (m, op->x, op->y))
1294 { 1288 {
1295 op->destroy (1); 1289 op->head_ ()->destroy (1);// remove head_ once all tail object destroyers found
1296 return 0; 1290 return 0;
1297 } 1291 }
1298 1292
1299 if (object *more = op->more) 1293 if (object *more = op->more)
1300 if (!insert_ob_in_map (more, m, originator, flag)) 1294 if (!insert_ob_in_map (more, m, originator, flag))

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines