--- deliantra/server/common/loader.C 2007/08/01 01:07:42 1.95 +++ deliantra/server/common/loader.C 2007/09/04 05:43:20 1.100 @@ -603,6 +603,10 @@ LOG (llevError, "%s uses unknown other_arch '%s'.\n", debug_desc (), f.get_str ()); break; + case KW_owner: + f.delayed_deref (this, owner, f.get_str ()); + break; + case KW_animation: { CLEAR_FLAG (this, FLAG_ANIMATE); @@ -641,10 +645,14 @@ case KW_sound: sound = sound_find (f.get_str ()); + if (!sound) + f.parse_warn ("sound not found"); break; - case KW_sound_die: - sound = sound_find (f.get_str ()); + case KW_sound_destroy: + sound_destroy = sound_find (f.get_str ()); + if (!sound_destroy) + f.parse_warn ("sound not found"); break; case KW_x: f.get (x); break; @@ -1045,7 +1053,6 @@ { object_thawer f (buf, (AV *)0); - f.next (); return op->parse_kv (f); } @@ -1267,8 +1274,11 @@ f.put (KW_uuid, (const char *)uids); } -#define CMP_OUT(v) if (op->v != tmp->v) f.put (KW_ ## v, op->v) -#define CMP_OUT2(k,v) if (op->v != tmp->v) f.put (KW_ ## k, op->v) +#define CMP_OUT(v) if (expect_false (op->v != tmp->v)) f.put (KW_ ## v, op->v) +#define CMP_OUT2(k,v) if (expect_false (op->v != tmp->v)) f.put (KW_ ## k, op->v) + + if (object *owner = op->owner) + f.put (KW_owner, static_cast(owner->ref ())); CMP_OUT (name); CMP_OUT (name_pl); @@ -1281,9 +1291,9 @@ if (op->msg != tmp->msg ) f.put (KW_msg , KW_endmsg , op->msg ); if (op->lore != tmp->lore) f.put (KW_lore, KW_endlore, op->lore); - if (op->face != tmp->face ) f.put (KW_face , op->face ? &faces [op->face ] : 0); - if (op->sound != tmp->sound ) f.put (KW_sound , op->sound ? &faces [op->sound ] : 0); - if (op->sound_die != tmp->sound_die) f.put (KW_sound_die, op->sound_die ? &faces [op->sound_die] : 0); + if (op->face != tmp->face ) f.put (KW_face , op->face ? &faces [op->face ] : 0); + if (op->sound != tmp->sound ) f.put (KW_sound , op->sound ? &faces [op->sound ] : 0); + if (op->sound_destroy != tmp->sound_destroy) f.put (KW_sound_destroy, op->sound_destroy ? &faces [op->sound_destroy] : 0); if (op->animation_id != tmp->animation_id) if (op->animation_id) @@ -1335,7 +1345,7 @@ CMP_OUT (attacktype); for (i = 0; i < NROFATTACKS; i++) - if (op->resist[i] != tmp->resist[i]) + if (expect_false (op->resist[i] != tmp->resist[i])) f.put (resist_save[i], op->resist[i]); CMP_OUT (path_attuned); @@ -1387,12 +1397,12 @@ if (op->flag != tmp->flag) for (i = 0; i <= NUM_FLAGS; i++) - if (flag_names [i] && op->flag [i] != tmp->flag [i]) + if (expect_false (flag_names [i] && op->flag [i] != tmp->flag [i])) f.put (flag_names [i], op->flag [i] ? "1" : "0"); // save body locations for (i = 0; i < NUM_BODY_LOCATIONS; i++) - if (op->slot[i].info != tmp->slot[i].info) + if (expect_false (op->slot[i].info != tmp->slot[i].info)) f.put (body_locations[i].save_name, op->slot[i].info); } @@ -1404,12 +1414,6 @@ bool object::write (object_freezer &f) { - /* Even if the object does have an owner, it would seem that we should - * still save it. - */ - if (owner) - return true; - archetype *at = arch ? (archetype *)arch : empty_archetype; f.put (KW_arch, at->archname); @@ -1435,8 +1439,6 @@ bool success = false; bool seen_arch = false; - f.next (); - for (;;) { switch (f.kw)