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.63 by root, Tue Dec 12 20:53:02 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
948 943
949 op->remove (); 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 op->destroy (0); 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 */
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 op->remove ();
1209 op->destroy (0); 1203 op->destroy ();
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 tmp->remove ();
1350 tmp->destroy (0); 1343 tmp->destroy ();
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 {
1549 tmp->remove ();
1550 tmp->destroy (0); 1540 tmp->destroy ();
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;
1690 1676
1691 if (op->nrof) 1677 if (op->nrof)
1692 return op; 1678 return op;
1693 else 1679 else
1694 { 1680 {
1695 op->destroy (0); 1681 op->destroy ();
1696 return NULL; 1682 return NULL;
1697 } 1683 }
1698} 1684}
1699 1685
1700/* 1686/*
2532 src = src->head; 2518 src = src->head;
2533 2519
2534 prev = 0; 2520 prev = 0;
2535 for (part = src; part; part = part->more) 2521 for (part = src; part; part = part->more)
2536 { 2522 {
2537 tmp = get_object (); 2523 tmp = object::create ();
2538 copy_object (part, tmp); 2524 part->copy_to (tmp);
2539 tmp->x -= src->x; 2525 tmp->x -= src->x;
2540 tmp->y -= src->y; 2526 tmp->y -= src->y;
2541 2527
2542 if (!part->head) 2528 if (!part->head)
2543 { 2529 {
2587 } 2573 }
2588 2574
2589 fprintf (tempfile, obstr); 2575 fprintf (tempfile, obstr);
2590 fclose (tempfile); 2576 fclose (tempfile);
2591 2577
2592 op = get_object (); 2578 op = object::create ();
2593 2579
2594 object_thawer thawer (filename); 2580 object_thawer thawer (filename);
2595 2581
2596 if (thawer) 2582 if (thawer)
2597 load_object (thawer, op, 0); 2583 load_object (thawer, op, 0);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines