--- deliantra/server/common/object.C 2006/12/06 13:59:00 1.59 +++ deliantra/server/common/object.C 2006/12/13 00:42:03 1.65 @@ -106,7 +106,7 @@ uuid.seq = uid; write_uuid (); - LOG (llevDebug, "read UID: %lld\n", uid); + LOG (llevDebug, "read UID: %" PRId64 "\n", uid); fclose (fp); } @@ -528,49 +528,44 @@ casting_time = -1; } -void object::clone (object *destination) -{ - *(object_copy *)destination = *this; - *(object_pod *)destination = *this; - - if (self || cb) - INVOKE_OBJECT (CLONE, this, ARG_OBJECT (destination)); -} - /* - * copy object first frees everything allocated by the second object, - * and then copies the contends of the first object into the second + * copy_to first frees everything allocated by the dst object, + * and then copies the contents of itself into the second * object, allocating what needs to be allocated. Basically, any * data that is malloc'd needs to be re-malloc/copied. Otherwise, * if the first object is freed, the pointers in the new object * will point at garbage. */ void -copy_object (object *op2, object *op) +object::copy_to (object *dst) { - bool is_freed = QUERY_FLAG (op, FLAG_FREED); - bool is_removed = QUERY_FLAG (op, FLAG_REMOVED); + bool is_freed = QUERY_FLAG (dst, FLAG_FREED); + bool is_removed = QUERY_FLAG (dst, FLAG_REMOVED); + + *(object_copy *)dst = *this; + *(object_pod *)dst = *this; - op2->clone (op); + if (self || cb) + INVOKE_OBJECT (CLONE, this, ARG_OBJECT (dst)); if (is_freed) - SET_FLAG (op, FLAG_FREED); + SET_FLAG (dst, FLAG_FREED); if (is_removed) - SET_FLAG (op, FLAG_REMOVED); + SET_FLAG (dst, FLAG_REMOVED); - if (op2->speed < 0) - op->speed_left = op2->speed_left - RANDOM () % 200 / 100.0; + if (speed < 0) + dst->speed_left = speed_left - RANDOM () % 200 / 100.0; /* Copy over key_values, if any. */ - if (op2->key_values) + if (key_values) { key_value *tail = 0; key_value *i; - op->key_values = 0; + dst->key_values = 0; - for (i = op2->key_values; i; i = i->next) + for (i = key_values; i; i = i->next) { key_value *new_link = new key_value; @@ -579,9 +574,9 @@ new_link->value = i->value; /* Try and be clever here, too. */ - if (!op->key_values) + if (!dst->key_values) { - op->key_values = new_link; + dst->key_values = new_link; tail = new_link; } else @@ -592,7 +587,15 @@ } } - update_ob_speed (op); + update_ob_speed (dst); +} + +object * +object::clone () +{ + object *neu = create (); + copy_to (neu); + return neu; } /* @@ -911,7 +914,7 @@ remove_friendly_object (this); if (!QUERY_FLAG (this, FLAG_REMOVED)) - remove_ob (this); + remove (); SET_FLAG (this, FLAG_FREED); @@ -946,11 +949,11 @@ { object *tmp = op->below; - remove_ob (op); + op->remove (); if (QUERY_FLAG (op, FLAG_STARTEQUIP) || QUERY_FLAG (op, FLAG_NO_DROP) || op->type == RUNE || op->type == TRAP || QUERY_FLAG (op, FLAG_IS_A_TEMPLATE)) - free_object (op); + op->destroy (); else { op->x = x; @@ -1017,7 +1020,7 @@ } } -/* remove_ob(op): +/* op->remove (): * This function removes the object op from the linked list of objects * which it is currently tied to. When this function is done, the * object will have no environment. If the object previously had an @@ -1205,8 +1208,7 @@ /* CLEAR_FLAG(top,FLAG_STARTEQUIP);*/ op->weight = 0; /* Don't want any adjustements now */ - remove_ob (op); - free_object (op); + op->destroy (); return top; } } @@ -1346,8 +1348,7 @@ if (CAN_MERGE (op, tmp)) { op->nrof += tmp->nrof; - remove_ob (tmp); - free_object (tmp); + tmp->destroy (); } CLEAR_FLAG (op, FLAG_APPLIED); /* hack for fixing F_APPLIED in items of dead people */ @@ -1543,13 +1544,8 @@ /* first search for itself and remove any old instances */ for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above) - { - if (!strcmp (tmp->arch->name, arch_string)) /* same archetype */ - { - remove_ob (tmp); - free_object (tmp); - } - } + if (!strcmp (tmp->arch->name, arch_string)) /* same archetype */ + tmp->destroy (); tmp1 = arch_to_object (archetype::find (arch_string)); @@ -1569,10 +1565,8 @@ object * get_split_ob (object *orig_ob, uint32 nr) { - object * - newob; - int - is_removed = (QUERY_FLAG (orig_ob, FLAG_REMOVED) != 0); + object *newob; + int is_removed = (QUERY_FLAG (orig_ob, FLAG_REMOVED) != 0); if (orig_ob->nrof < nr) { @@ -1583,11 +1577,7 @@ newob = object_create_clone (orig_ob); if ((orig_ob->nrof -= nr) < 1) - { - if (!is_removed) - remove_ob (orig_ob); - free_object2 (orig_ob, 1); - } + orig_ob->destroy (1); else if (!is_removed) { if (orig_ob->env != NULL) @@ -1661,7 +1651,7 @@ } else { - remove_ob (op); + op->remove (); op->nrof = 0; if (tmp) { @@ -1677,7 +1667,7 @@ op->nrof -= i; else { - remove_ob (op); + op->remove (); op->nrof = 0; } @@ -1696,7 +1686,7 @@ return op; else { - free_object (op); + op->destroy (); return NULL; } } @@ -2526,34 +2516,37 @@ object * object_create_clone (object *asrc) { - object * - dst = NULL, *tmp, *src, *part, *prev, *item; + object *dst = 0, *tmp, *src, *part, *prev, *item; if (!asrc) - return NULL; + return 0; + src = asrc; if (src->head) src = src->head; - prev = NULL; + prev = 0; for (part = src; part; part = part->more) { - tmp = get_object (); - copy_object (part, tmp); + tmp = part->clone (); tmp->x -= src->x; tmp->y -= src->y; + if (!part->head) { dst = tmp; - tmp->head = NULL; + tmp->head = 0; } else { tmp->head = dst; } - tmp->more = NULL; + + tmp->more = 0; + if (prev) prev->more = tmp; + prev = tmp; } @@ -2589,7 +2582,7 @@ fprintf (tempfile, obstr); fclose (tempfile); - op = get_object (); + op = object::create (); object_thawer thawer (filename);