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.330 by root, Sun Apr 18 14:01:33 2010 UTC vs.
Revision 1.341 by root, Fri Feb 25 07:23:38 2011 UTC

69static int maxfree[SIZEOFFREE] = { 69static int maxfree[SIZEOFFREE] = {
70 0, 70 0,
71 9, 10, 13, 14, 17, 18, 21, 22, 71 9, 10, 13, 14, 17, 18, 21, 22,
72 25, 26, 27, 30, 31, 32, 33, 36, 37, 39, 39, 42, 43, 44, 45, 48, 72 25, 26, 27, 30, 31, 32, 33, 36, 37, 39, 39, 42, 43, 44, 45, 48,
73 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49 73 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49
74};
75
76const char *wall_suffix[16] = {
77 "0",
78 "1_3",
79 "1_4",
80 "2_1_2",
81 "1_2",
82 "2_2_4",
83 "2_2_1",
84 "3_1",
85 "1_1",
86 "2_2_3",
87 "2_2_2",
88 "3_3",
89 "2_1_1",
90 "3_4",
91 "3_2",
92 "4"
74}; 93};
75 94
76static void 95static void
77write_uuid (uval64 skip, bool sync) 96write_uuid (uval64 skip, bool sync)
78{ 97{
426 445
427 return 0; 446 return 0;
428} 447}
429 448
430// adjust weight per container type ("of holding") 449// adjust weight per container type ("of holding")
431static sint32 450static uint32
432weight_adjust_for (object *op, sint32 weight) 451weight_adjust_for (object *op, uint32 weight)
433{ 452{
434 return op->type == CONTAINER 453 return op->type == CONTAINER
435 ? lerp (weight, 0, 100, 0, 100 - op->stats.Str) 454 ? weight - weight * op->stats.Str / 100
436 : weight; 455 : weight;
437} 456}
438 457
439/* 458/*
440 * adjust_weight(object, weight) adds the specified weight to an object, 459 * subtracts, then adds, the specified weight to an object,
441 * and also updates how much the environment(s) is/are carrying. 460 * and also updates how much the environment(s) is/are carrying.
442 */ 461 */
443static void 462static void
444adjust_weight (object *op, sint32 weight) 463adjust_weight (object *op, sint32 sub, sint32 add)
445{ 464{
446 while (op) 465 while (op)
447 { 466 {
448 // adjust by actual difference to account for rounding errors 467 sint32 ocarrying = op->carrying;
449 // i.e. (w2 - w1) / f != w2 / f - w1 / f and the latter is correct
450 weight = weight_adjust_for (op, op->carrying)
451 - weight_adjust_for (op, op->carrying - weight);
452 468
453 if (!weight) 469 op->carrying -= weight_adjust_for (op, sub);
454 return; 470 op->carrying += weight_adjust_for (op, add);
455
456 op->carrying += weight;
457 471
458 if (object *pl = op->visible_to ()) 472 if (object *pl = op->visible_to ())
459 if (pl != op) // player is handled lazily 473 if (pl != op) // player is handled lazily
460 esrv_update_item (UPD_WEIGHT, pl, op); 474 esrv_update_item (UPD_WEIGHT, pl, op);
461 475
476 sub = ocarrying;
477 add = op->carrying;
478
462 op = op->env; 479 op = op->env;
463 } 480 }
464} 481}
465 482
466/* 483/*
473{ 490{
474 sint32 sum = 0; 491 sint32 sum = 0;
475 492
476 for (object *op = inv; op; op = op->below) 493 for (object *op = inv; op; op = op->below)
477 { 494 {
478 if (op->inv)
479 op->update_weight (); 495 op->update_weight ();
480 496
481 sum += op->total_weight (); 497 sum += weight_adjust_for (this, op->total_weight ());
482 } 498 }
483
484 sum = weight_adjust_for (this, sum);
485 499
486 if (sum != carrying) 500 if (sum != carrying)
487 { 501 {
488 if (carrying != sum)//D 502 if (carrying != sum && carrying)//D
489 LOG (llevDebug, "updating weight got %ld, expected %ld (%s)\n", 503 LOG (llevDebug, "updating carrying got %ld, expected %ld (%s)\n",
490 (long long)sum, (long long)carrying, debug_desc ()); 504 (long long)sum, (long long)carrying, debug_desc ());
491 505
492 carrying = sum; 506 carrying = sum;
493 507
494 if (object *pl = visible_to ()) 508 if (object *pl = visible_to ())
653object::instantiate () 667object::instantiate ()
654{ 668{
655 if (!uuid.seq) // HACK 669 if (!uuid.seq) // HACK
656 uuid = UUID::gen (); 670 uuid = UUID::gen ();
657 671
658 // TODO: unclean state changes, should nt be done in copy_to AND instantiate 672 // TODO: unclean state changes, should not be done in copy_to AND instantiate
659 if (flag [FLAG_RANDOM_SPEED] && speed) 673 if (flag [FLAG_RANDOM_SPEED] && speed)
660 speed_left = - speed - rndm (); // TODO animation 674 speed_left = - speed - rndm (); // TODO animation
661 else 675 else
662 speed_left = -1.; 676 speed_left = -1.;
663 677
1144 flag [FLAG_REMOVED] = false; // hack around the issue of visible_to checking flag_removed 1158 flag [FLAG_REMOVED] = false; // hack around the issue of visible_to checking flag_removed
1145 if (object *pl = visible_to ()) 1159 if (object *pl = visible_to ())
1146 esrv_del_item (pl->contr, count); 1160 esrv_del_item (pl->contr, count);
1147 flag [FLAG_REMOVED] = true; // hack around the issue of visible_to checking flag_removed 1161 flag [FLAG_REMOVED] = true; // hack around the issue of visible_to checking flag_removed
1148 1162
1149 adjust_weight (env, -total_weight ()); 1163 adjust_weight (env, total_weight (), 0);
1150 1164
1151 object *pl = in_player (); 1165 object *pl = in_player ();
1152 1166
1153 /* we set up values so that it could be inserted into 1167 /* we set up values so that it could be inserted into
1154 * the map, but we don't actually do that - it is up 1168 * the map, but we don't actually do that - it is up
1168 1182
1169 if (pl && pl->is_player ()) 1183 if (pl && pl->is_player ())
1170 { 1184 {
1171 if (expect_false (pl->contr->combat_ob == this)) 1185 if (expect_false (pl->contr->combat_ob == this))
1172 { 1186 {
1173 pl->apply (pl->contr->combat_ob, AP_UNAPPLY); 1187 pl->apply (pl->contr->combat_ob, AP_UNAPPLY | AP_IGNORE_CURSE);
1174 pl->contr->combat_ob = 0; 1188 pl->contr->combat_ob = 0;
1175 if (pl->contr->ranged_ob) pl->apply (pl->contr->ranged_ob); 1189 if (pl->contr->ranged_ob) pl->apply (pl->contr->ranged_ob);
1176 } 1190 }
1177 1191
1178 if (expect_false (pl->contr->ranged_ob == this)) 1192 if (expect_false (pl->contr->ranged_ob == this))
1179 { 1193 {
1180 pl->apply (pl->contr->ranged_ob, AP_UNAPPLY); 1194 pl->apply (pl->contr->ranged_ob, AP_UNAPPLY | AP_IGNORE_CURSE);
1181 pl->contr->ranged_ob = 0; 1195 pl->contr->ranged_ob = 0;
1182 if (pl->contr->combat_ob) pl->apply (pl->contr->combat_ob); 1196 if (pl->contr->combat_ob) pl->apply (pl->contr->combat_ob);
1183 } 1197 }
1184 1198
1185 pl->contr->queue_stats_update (); 1199 pl->contr->queue_stats_update ();
1572 */ 1586 */
1573 1587
1574 /* if this is not the head or flag has been passed, don't check walk on status */ 1588 /* if this is not the head or flag has been passed, don't check walk on status */
1575 if (!(flag & INS_NO_WALK_ON) && op->is_head ()) 1589 if (!(flag & INS_NO_WALK_ON) && op->is_head ())
1576 { 1590 {
1577 if (check_move_on (op, originator)) 1591 if (check_move_on (op, originator, flag))
1578 return 0; 1592 return 0;
1579 1593
1580 /* If we are a multi part object, lets work our way through the check 1594 /* If we are a multi part object, let's work our way through the check
1581 * walk on's. 1595 * walk on's.
1582 */ 1596 */
1583 for (object *tmp = op->more; tmp; tmp = tmp->more) 1597 for (object *tmp = op->more; tmp; tmp = tmp->more)
1584 if (check_move_on (tmp, originator)) 1598 if (check_move_on (tmp, originator, flag))
1585 return 0; 1599 return 0;
1586 } 1600 }
1587 1601
1588 return op; 1602 return op;
1589} 1603}
1655 1669
1656 nr = min (nr, nrof); 1670 nr = min (nr, nrof);
1657 1671
1658 if (nrof > nr) 1672 if (nrof > nr)
1659 { 1673 {
1674 sint64 oweight = total_weight ();
1675
1660 nrof -= nr; 1676 nrof -= nr;
1661 adjust_weight (env, -weight * max (1, nr)); // carrying == 0
1662 1677
1663 if (object *pl = visible_to ()) 1678 if (object *pl = visible_to ())
1664 esrv_update_item (UPD_NROF, pl, this); 1679 esrv_update_item (UPD_NROF, pl, this);
1680
1681 adjust_weight (env, oweight, total_weight ());
1665 1682
1666 return true; 1683 return true;
1667 } 1684 }
1668 else 1685 else
1669 { 1686 {
1744 if (op->nrof) 1761 if (op->nrof)
1745 for (object *tmp = inv; tmp; tmp = tmp->below) 1762 for (object *tmp = inv; tmp; tmp = tmp->below)
1746 if (object::can_merge (tmp, op)) 1763 if (object::can_merge (tmp, op))
1747 { 1764 {
1748 /* return the original object and remove inserted object 1765 /* return the original object and remove inserted object
1749 (client needs the original object) */ 1766 (client prefers the original object) */
1767
1768 // carring must be 0 for mergable objects
1769 sint64 oweight = tmp->weight * tmp->nrof;
1770
1750 tmp->nrof += op->nrof; 1771 tmp->nrof += op->nrof;
1751 1772
1752 if (object *pl = tmp->visible_to ()) 1773 if (object *pl = tmp->visible_to ())
1753 esrv_update_item (UPD_NROF, pl, tmp); 1774 esrv_update_item (UPD_NROF, pl, tmp);
1754 1775
1755 adjust_weight (this, op->total_weight ()); 1776 adjust_weight (this, oweight, tmp->weight * tmp->nrof);
1756 1777
1757 op->destroy (); 1778 op->destroy ();
1758 op = tmp; 1779 op = tmp;
1759 goto inserted; 1780 goto inserted;
1760 } 1781 }
1776 op->flag [FLAG_REMOVED] = 0; 1797 op->flag [FLAG_REMOVED] = 0;
1777 1798
1778 if (object *pl = op->visible_to ()) 1799 if (object *pl = op->visible_to ())
1779 esrv_send_item (pl, op); 1800 esrv_send_item (pl, op);
1780 1801
1781 adjust_weight (this, op->total_weight ()); 1802 adjust_weight (this, 0, op->total_weight ());
1782 1803
1783inserted: 1804inserted:
1784 /* reset the light list and los of the players on the map */ 1805 /* reset the light list and los of the players on the map */
1785 if (op->glow_radius && is_on_map ()) 1806 if (op->glow_radius && is_on_map ())
1786 { 1807 {
1815 * MSW 2001-07-08: Check all objects on space, not just those below 1836 * MSW 2001-07-08: Check all objects on space, not just those below
1816 * object being inserted. insert_ob_in_map may not put new objects 1837 * object being inserted. insert_ob_in_map may not put new objects
1817 * on top. 1838 * on top.
1818 */ 1839 */
1819int 1840int
1820check_move_on (object *op, object *originator) 1841check_move_on (object *op, object *originator, int flags)
1821{ 1842{
1822 if (op->flag [FLAG_NO_APPLY]) 1843 if (op->flag [FLAG_NO_APPLY])
1823 return 0; 1844 return 0;
1824 1845
1825 object *tmp; 1846 object *tmp;
1884 1905
1885 /* Basically same logic as above, except now for actual apply. */ 1906 /* Basically same logic as above, except now for actual apply. */
1886 if ((!op->move_type && tmp->move_on & MOVE_WALK) || 1907 if ((!op->move_type && tmp->move_on & MOVE_WALK) ||
1887 ((op->move_type & tmp->move_on) && (op->move_type & ~tmp->move_on & ~tmp->move_block) == 0)) 1908 ((op->move_type & tmp->move_on) && (op->move_type & ~tmp->move_on & ~tmp->move_block) == 0))
1888 { 1909 {
1910 if ((flags & INS_NO_AUTO_EXIT)
1911 && (tmp->type == EXIT || tmp->type == TELEPORTER
1912 || tmp->type == HOLE || tmp->type == TRAPDOOR)) //TODO: temporary, fix exits instead
1913 continue;
1914
1889 move_apply (tmp, op, originator); 1915 move_apply (tmp, op, originator);
1890 1916
1891 if (op->destroyed ()) 1917 if (op->destroyed ())
1892 return 1; 1918 return 1;
1893 1919
2230#if 1 // new algorithm 2256#if 1 // new algorithm
2231 // this works by putting x, y into 16 sectors, which 2257 // this works by putting x, y into 16 sectors, which
2232 // are not equal sized, but are a better approximation 2258 // are not equal sized, but are a better approximation
2233 // then the old algorithm, and then using a mapping 2259 // then the old algorithm, and then using a mapping
2234 // table to map it into a direction value. 2260 // table to map it into a direction value.
2261 // basically, it maps these comparisons to each bit
2262 // bit #3: x < 0
2263 // bit #2: y < 0
2264 // bit #1: x > y
2265 // bit #0: x > 2y
2235 2266
2236 static const uint8 dir[16] = { 2267 static const uint8 dir[16] = {
2237 4, 5, 4, 3, 2268 4, 5, 4, 3,
2238 2, 1, 2, 3, 2269 2, 1, 2, 3,
2239 6, 5, 6, 7, 2270 6, 5, 6, 7,
2785 return contr->mark; 2816 return contr->mark;
2786 else 2817 else
2787 return 0; 2818 return 0;
2788} 2819}
2789 2820
2821// put marked object first in the inventory
2822// this is used by identify-like spells so players can influence
2823// the order a bit.
2824void
2825object::splay_marked ()
2826{
2827 if (object *marked = mark ())
2828 splay (marked);
2829}
2830

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines