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.62 by root, Mon Dec 11 23:35:37 2006 UTC vs.
Revision 1.64 by root, Tue Dec 12 21:39:56 2006 UTC

526 526
527 if (settings.casting_time) 527 if (settings.casting_time)
528 casting_time = -1; 528 casting_time = -1;
529} 529}
530 530
531void object::clone (object *destination)
532{
533 *(object_copy *)destination = *this;
534 *(object_pod *)destination = *this;
535
536 if (self || cb)
537 INVOKE_OBJECT (CLONE, this, ARG_OBJECT (destination));
538}
539
540/* 531/*
541 * copy object first frees everything allocated by the second object, 532 * copy_to first frees everything allocated by the dst object,
542 * and then copies the contends of the first object into the second 533 * and then copies the contents of itself into the second
543 * object, allocating what needs to be allocated. Basically, any 534 * object, allocating what needs to be allocated. Basically, any
544 * data that is malloc'd needs to be re-malloc/copied. Otherwise, 535 * data that is malloc'd needs to be re-malloc/copied. Otherwise,
545 * if the first object is freed, the pointers in the new object 536 * if the first object is freed, the pointers in the new object
546 * will point at garbage. 537 * will point at garbage.
547 */ 538 */
548void 539void
549copy_object (object *op2, object *op) 540object::copy_to (object *dst)
550{ 541{
551 bool is_freed = QUERY_FLAG (op, FLAG_FREED); 542 bool is_freed = QUERY_FLAG (dst, FLAG_FREED);
552 bool is_removed = QUERY_FLAG (op, FLAG_REMOVED); 543 bool is_removed = QUERY_FLAG (dst, FLAG_REMOVED);
553 544
554 op2->clone (op); 545 *(object_copy *)dst = *this;
546 *(object_pod *)dst = *this;
547
548 if (self || cb)
549 INVOKE_OBJECT (CLONE, this, ARG_OBJECT (dst));
555 550
556 if (is_freed) 551 if (is_freed)
557 SET_FLAG (op, FLAG_FREED); 552 SET_FLAG (dst, FLAG_FREED);
558 553
559 if (is_removed) 554 if (is_removed)
560 SET_FLAG (op, FLAG_REMOVED); 555 SET_FLAG (dst, FLAG_REMOVED);
561 556
562 if (op2->speed < 0) 557 if (speed < 0)
563 op->speed_left = op2->speed_left - RANDOM () % 200 / 100.0; 558 dst->speed_left = speed_left - RANDOM () % 200 / 100.0;
564 559
565 /* Copy over key_values, if any. */ 560 /* Copy over key_values, if any. */
566 if (op2->key_values) 561 if (key_values)
567 { 562 {
568 key_value *tail = 0; 563 key_value *tail = 0;
569 key_value *i; 564 key_value *i;
570 565
571 op->key_values = 0; 566 dst->key_values = 0;
572 567
573 for (i = op2->key_values; i; i = i->next) 568 for (i = key_values; i; i = i->next)
574 { 569 {
575 key_value *new_link = new key_value; 570 key_value *new_link = new key_value;
576 571
577 new_link->next = 0; 572 new_link->next = 0;
578 new_link->key = i->key; 573 new_link->key = i->key;
579 new_link->value = i->value; 574 new_link->value = i->value;
580 575
581 /* Try and be clever here, too. */ 576 /* Try and be clever here, too. */
582 if (!op->key_values) 577 if (!dst->key_values)
583 { 578 {
584 op->key_values = new_link; 579 dst->key_values = new_link;
585 tail = new_link; 580 tail = new_link;
586 } 581 }
587 else 582 else
588 { 583 {
589 tail->next = new_link; 584 tail->next = new_link;
590 tail = new_link; 585 tail = new_link;
591 } 586 }
592 } 587 }
593 } 588 }
594 589
595 update_ob_speed (op); 590 update_ob_speed (dst);
596} 591}
597 592
598/* 593/*
599 * If an object with the IS_TURNABLE() flag needs to be turned due 594 * If an object with the IS_TURNABLE() flag needs to be turned due
600 * to the closest player being on the other side, this function can 595 * to the closest player being on the other side, this function can
909 904
910 if (QUERY_FLAG (this, FLAG_FRIENDLY)) 905 if (QUERY_FLAG (this, FLAG_FRIENDLY))
911 remove_friendly_object (this); 906 remove_friendly_object (this);
912 907
913 if (!QUERY_FLAG (this, FLAG_REMOVED)) 908 if (!QUERY_FLAG (this, FLAG_REMOVED))
914 remove_ob (this); 909 remove ();
915 910
916 SET_FLAG (this, FLAG_FREED); 911 SET_FLAG (this, FLAG_FREED);
917 912
918 if (more) 913 if (more)
919 { 914 {
944 939
945 while (op) 940 while (op)
946 { 941 {
947 object *tmp = op->below; 942 object *tmp = op->below;
948 943
949 remove_ob (op); 944 op->remove ();
950 945
951 if (QUERY_FLAG (op, FLAG_STARTEQUIP) 946 if (QUERY_FLAG (op, FLAG_STARTEQUIP)
952 || QUERY_FLAG (op, FLAG_NO_DROP) || op->type == RUNE || op->type == TRAP || QUERY_FLAG (op, FLAG_IS_A_TEMPLATE)) 947 || QUERY_FLAG (op, FLAG_NO_DROP) || op->type == RUNE || op->type == TRAP || QUERY_FLAG (op, FLAG_IS_A_TEMPLATE))
953 free_object (op); 948 op->destroy ();
954 else 949 else
955 { 950 {
956 op->x = x; 951 op->x = x;
957 op->y = y; 952 op->y = y;
958 insert_ob_in_map (op, map, 0, 0); /* Insert in same map as the envir */ 953 insert_ob_in_map (op, map, 0, 0); /* Insert in same map as the envir */
1015 op->carrying -= weight; 1010 op->carrying -= weight;
1016 op = op->env; 1011 op = op->env;
1017 } 1012 }
1018} 1013}
1019 1014
1020/* remove_ob(op): 1015/* op->remove ():
1021 * This function removes the object op from the linked list of objects 1016 * This function removes the object op from the linked list of objects
1022 * which it is currently tied to. When this function is done, the 1017 * which it is currently tied to. When this function is done, the
1023 * object will have no environment. If the object previously had an 1018 * object will have no environment. If the object previously had an
1024 * environment, the x and y coordinates will be updated to 1019 * environment, the x and y coordinates will be updated to
1025 * the previous environment. 1020 * the previous environment.
1203 { 1198 {
1204 top->nrof += op->nrof; 1199 top->nrof += op->nrof;
1205 1200
1206/* CLEAR_FLAG(top,FLAG_STARTEQUIP);*/ 1201/* CLEAR_FLAG(top,FLAG_STARTEQUIP);*/
1207 op->weight = 0; /* Don't want any adjustements now */ 1202 op->weight = 0; /* Don't want any adjustements now */
1208 remove_ob (op); 1203 op->destroy ();
1209 free_object (op);
1210 return top; 1204 return top;
1211 } 1205 }
1212 } 1206 }
1213 1207
1214 return 0; 1208 return 0;
1344 if (op->nrof && !(flag & INS_NO_MERGE)) 1338 if (op->nrof && !(flag & INS_NO_MERGE))
1345 for (tmp = GET_MAP_OB (op->map, x, y); tmp != NULL; tmp = tmp->above) 1339 for (tmp = GET_MAP_OB (op->map, x, y); tmp != NULL; tmp = tmp->above)
1346 if (CAN_MERGE (op, tmp)) 1340 if (CAN_MERGE (op, tmp))
1347 { 1341 {
1348 op->nrof += tmp->nrof; 1342 op->nrof += tmp->nrof;
1349 remove_ob (tmp); 1343 tmp->destroy ();
1350 free_object (tmp);
1351 } 1344 }
1352 1345
1353 CLEAR_FLAG (op, FLAG_APPLIED); /* hack for fixing F_APPLIED in items of dead people */ 1346 CLEAR_FLAG (op, FLAG_APPLIED); /* hack for fixing F_APPLIED in items of dead people */
1354 CLEAR_FLAG (op, FLAG_INV_LOCKED); 1347 CLEAR_FLAG (op, FLAG_INV_LOCKED);
1355 1348
1541 tmp1; 1534 tmp1;
1542 1535
1543 /* first search for itself and remove any old instances */ 1536 /* first search for itself and remove any old instances */
1544 1537
1545 for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above) 1538 for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above)
1546 {
1547 if (!strcmp (tmp->arch->name, arch_string)) /* same archetype */ 1539 if (!strcmp (tmp->arch->name, arch_string)) /* same archetype */
1548 { 1540 tmp->destroy ();
1549 remove_ob (tmp);
1550 free_object (tmp);
1551 }
1552 }
1553 1541
1554 tmp1 = arch_to_object (archetype::find (arch_string)); 1542 tmp1 = arch_to_object (archetype::find (arch_string));
1555 1543
1556 tmp1->x = op->x; 1544 tmp1->x = op->x;
1557 tmp1->y = op->y; 1545 tmp1->y = op->y;
1567 */ 1555 */
1568 1556
1569object * 1557object *
1570get_split_ob (object *orig_ob, uint32 nr) 1558get_split_ob (object *orig_ob, uint32 nr)
1571{ 1559{
1572 object * 1560 object *newob;
1573 newob;
1574 int
1575 is_removed = (QUERY_FLAG (orig_ob, FLAG_REMOVED) != 0); 1561 int is_removed = (QUERY_FLAG (orig_ob, FLAG_REMOVED) != 0);
1576 1562
1577 if (orig_ob->nrof < nr) 1563 if (orig_ob->nrof < nr)
1578 { 1564 {
1579 sprintf (errmsg, "There are only %d %ss.", orig_ob->nrof ? orig_ob->nrof : 1, &orig_ob->name); 1565 sprintf (errmsg, "There are only %d %ss.", orig_ob->nrof ? orig_ob->nrof : 1, &orig_ob->name);
1580 return NULL; 1566 return NULL;
1581 } 1567 }
1582 1568
1583 newob = object_create_clone (orig_ob); 1569 newob = object_create_clone (orig_ob);
1584 1570
1585 if ((orig_ob->nrof -= nr) < 1) 1571 if ((orig_ob->nrof -= nr) < 1)
1586 { 1572 orig_ob->destroy (1);
1587 if (!is_removed)
1588 remove_ob (orig_ob);
1589 free_object2 (orig_ob, 1);
1590 }
1591 else if (!is_removed) 1573 else if (!is_removed)
1592 { 1574 {
1593 if (orig_ob->env != NULL) 1575 if (orig_ob->env != NULL)
1594 sub_weight (orig_ob->env, orig_ob->weight * nr); 1576 sub_weight (orig_ob->env, orig_ob->weight * nr);
1595 if (orig_ob->env == NULL && orig_ob->map->in_memory != MAP_IN_MEMORY) 1577 if (orig_ob->env == NULL && orig_ob->map->in_memory != MAP_IN_MEMORY)
1659 esrv_send_item (tmp, op); 1641 esrv_send_item (tmp, op);
1660 } 1642 }
1661 } 1643 }
1662 else 1644 else
1663 { 1645 {
1664 remove_ob (op); 1646 op->remove ();
1665 op->nrof = 0; 1647 op->nrof = 0;
1666 if (tmp) 1648 if (tmp)
1667 { 1649 {
1668 esrv_del_item (tmp->contr, op->count); 1650 esrv_del_item (tmp->contr, op->count);
1669 } 1651 }
1675 1657
1676 if (i < op->nrof) 1658 if (i < op->nrof)
1677 op->nrof -= i; 1659 op->nrof -= i;
1678 else 1660 else
1679 { 1661 {
1680 remove_ob (op); 1662 op->remove ();
1681 op->nrof = 0; 1663 op->nrof = 0;
1682 } 1664 }
1683 1665
1684 /* Since we just removed op, op->above is null */ 1666 /* Since we just removed op, op->above is null */
1685 for (tmp = above; tmp != NULL; tmp = tmp->above) 1667 for (tmp = above; tmp != NULL; tmp = tmp->above)
1694 1676
1695 if (op->nrof) 1677 if (op->nrof)
1696 return op; 1678 return op;
1697 else 1679 else
1698 { 1680 {
1699 free_object (op); 1681 op->destroy ();
1700 return NULL; 1682 return NULL;
1701 } 1683 }
1702} 1684}
1703 1685
1704/* 1686/*
2536 src = src->head; 2518 src = src->head;
2537 2519
2538 prev = 0; 2520 prev = 0;
2539 for (part = src; part; part = part->more) 2521 for (part = src; part; part = part->more)
2540 { 2522 {
2541 tmp = get_object (); 2523 tmp = object::create ();
2542 copy_object (part, tmp); 2524 part->copy_to (tmp);
2543 tmp->x -= src->x; 2525 tmp->x -= src->x;
2544 tmp->y -= src->y; 2526 tmp->y -= src->y;
2545 2527
2546 if (!part->head) 2528 if (!part->head)
2547 { 2529 {
2591 } 2573 }
2592 2574
2593 fprintf (tempfile, obstr); 2575 fprintf (tempfile, obstr);
2594 fclose (tempfile); 2576 fclose (tempfile);
2595 2577
2596 op = get_object (); 2578 op = object::create ();
2597 2579
2598 object_thawer thawer (filename); 2580 object_thawer thawer (filename);
2599 2581
2600 if (thawer) 2582 if (thawer)
2601 load_object (thawer, op, 0); 2583 load_object (thawer, op, 0);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines