/* -*- LPC -*- */ /* * $Id: upd_ate.c,v 1.4 1999/12/09 07:17:32 pinkfish Exp $ */ #include <creator.h> inherit "/cmds/base"; protected int do_update(object *ov) { string pname; object *invent; object rsv; object env; object dup; object loaded; object ob; mixed static_arg; mixed dynamic_arg; int i; rsv = load_object("room/void"); /* RSV = Room Slash Void */ if (!rsv) { /* Die in horror */ return notify_fail("The void is lost!\n"); } foreach (ob in ov) { if (!ob) { continue; } if (interactive(ob)) { write("Can't update interactive object: " + ob->query_name() + "\n"); continue; } env = environment(ob); invent = all_inventory(ob); for (i = 0; i < sizeof(invent); i++) { if (userp(invent[i]) || invent[i]->query_property("unique")) { invent[i]->move(rsv); } else { invent = delete(invent, i--, 1); } } pname = file_name(ob); if (sscanf(pname, "%s#%*d", pname) != 2) { /* a room ? */ static_arg = ob->query_static_auto_load(); dynamic_arg = ob->query_dynamic_auto_load(); ob->dest_me(); if (ob) { ob->dwep(); } if (ob) { destruct(ob); } if (ob) { return notify_fail("I can't seem to destruct the old object.\n"); } ob = load_object(pname); if (static_arg) { ob->init_static_arg(static_arg); } if (dynamic_arg) { ob->init_dynamic_arg(dynamic_arg); } } else { loaded = find_object(pname); static_arg = ob->query_static_auto_load(); dynamic_arg = ob->query_dynamic_auto_load(); if (loaded) { loaded->dest_me(); } if (loaded) { loaded->dwep(); } if (loaded) { destruct(loaded); } dup = clone_object(pname); if (dup && ob) { ob->dest_me(); if (ob) { ob->dwep(); } if (ob) { destruct(ob); } ob = dup; if (static_arg) { ob->init_static_arg(static_arg); } if (dynamic_arg) { ob->init_dynamic_arg(dynamic_arg); } } } if (!ob) { printf("I seem to have lost your object.\n"); return 1; } for (i = 0; i < sizeof(invent); i++) { if (invent[i]) { invent[i]->move(ob); } } if (env) { ob->move(env); } printf("Updated %s.\n", WIZ_PRESENT->desc_f_object(ob)); } return 1; } /* do_update() */ mixed cmd(string str) { string tring; string* filenames; string err; object ob; object* val; object* obs; int loop; notify_fail("No such object.\n"); tring = str; if (!str || str == "here") { str = file_name(environment(this_player())); if (str == "/room/void") { notify_fail("The Surgeon General warns you that it is hazardous to " "update the void while standing in it.\n"); return 0; } str = base_name(str); filenames = ({ "/" + str }); str = "here"; } else { filenames = this_player()->get_cfiles(str); } if (sizeof(filenames) == 0) { val = WIZ_PRESENT->wiz_present(tring, this_player()); if (!sizeof(val)) { notify_fail("No matching objects/filenames\n"); return 0; } return do_update(val); } obs = ({ }); for (loop = 0; loop < sizeof(filenames); loop++) { str = filenames[loop]; ob = find_object(str); if (!ob) { if (file_size(str) >= 0) { if (!(err = catch(load_object(str)))) { printf("Loaded %s\n", str); } else { printf("Failed to load %s, error: %s\n", str, err); } } else { val = WIZ_PRESENT->wiz_present(tring, this_player()); obs += val; } } else { obs += ({ ob }); } } if (!obs) { return 0; } else { return do_update(obs); } } /* cmd() */