skylib_mudos_v1/
skylib_mudos_v1/bin/
skylib_mudos_v1/bin/db/
skylib_mudos_v1/mudlib/banish/a/
skylib_mudos_v1/mudlib/banish/b/
skylib_mudos_v1/mudlib/banish/c/
skylib_mudos_v1/mudlib/banish/d/
skylib_mudos_v1/mudlib/banish/e/
skylib_mudos_v1/mudlib/banish/f/
skylib_mudos_v1/mudlib/banish/g/
skylib_mudos_v1/mudlib/banish/h/
skylib_mudos_v1/mudlib/banish/j/
skylib_mudos_v1/mudlib/banish/l/
skylib_mudos_v1/mudlib/banish/m/
skylib_mudos_v1/mudlib/banish/n/
skylib_mudos_v1/mudlib/banish/o/
skylib_mudos_v1/mudlib/banish/p/
skylib_mudos_v1/mudlib/banish/r/
skylib_mudos_v1/mudlib/banish/s/
skylib_mudos_v1/mudlib/banish/t/
skylib_mudos_v1/mudlib/banish/u/
skylib_mudos_v1/mudlib/banish/w/
skylib_mudos_v1/mudlib/cmds/
skylib_mudos_v1/mudlib/cmds/admin/
skylib_mudos_v1/mudlib/cmds/guild-race/
skylib_mudos_v1/mudlib/cmds/guild-race/crafts/
skylib_mudos_v1/mudlib/cmds/guild-race/magic/
skylib_mudos_v1/mudlib/cmds/guild-race/other/
skylib_mudos_v1/mudlib/cmds/living/broken/
skylib_mudos_v1/mudlib/cmds/player/group_cmds/
skylib_mudos_v1/mudlib/d/admin/
skylib_mudos_v1/mudlib/d/admin/room/
skylib_mudos_v1/mudlib/d/admin/room/we_care/
skylib_mudos_v1/mudlib/d/admin/save/
skylib_mudos_v1/mudlib/d/admin/text/
skylib_mudos_v1/mudlib/d/learning/TinyTown/buildings/
skylib_mudos_v1/mudlib/d/learning/TinyTown/map/
skylib_mudos_v1/mudlib/d/learning/TinyTown/roads/
skylib_mudos_v1/mudlib/d/learning/chars/
skylib_mudos_v1/mudlib/d/learning/functions/
skylib_mudos_v1/mudlib/d/learning/handlers/
skylib_mudos_v1/mudlib/d/learning/help_topics/
skylib_mudos_v1/mudlib/d/learning/help_topics/npcs/
skylib_mudos_v1/mudlib/d/learning/help_topics/objects/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/RCS/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/crowd/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/situations/
skylib_mudos_v1/mudlib/d/learning/save/
skylib_mudos_v1/mudlib/d/learning/school/
skylib_mudos_v1/mudlib/d/learning/school/add_sc/
skylib_mudos_v1/mudlib/d/learning/school/characters/
skylib_mudos_v1/mudlib/d/learning/school/general/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/basic_commands/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/edtutor/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/unix_tutor/
skylib_mudos_v1/mudlib/d/learning/school/items/
skylib_mudos_v1/mudlib/d/learning/school/npc_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/room_basic/
skylib_mudos_v1/mudlib/d/learning/school/room_school/situations/
skylib_mudos_v1/mudlib/d/learning/school/room_school/terrain_tutor/
skylib_mudos_v1/mudlib/d/learning/text/
skylib_mudos_v1/mudlib/d/liaison/
skylib_mudos_v1/mudlib/d/mudlib/
skylib_mudos_v1/mudlib/d/mudlib/changes/
skylib_mudos_v1/mudlib/d/playtesters/
skylib_mudos_v1/mudlib/d/playtesters/effects/
skylib_mudos_v1/mudlib/d/playtesters/handlers/
skylib_mudos_v1/mudlib/d/playtesters/items/
skylib_mudos_v1/mudlib/d/sage/
skylib_mudos_v1/mudlib/doc/
skylib_mudos_v1/mudlib/doc/creator/
skylib_mudos_v1/mudlib/doc/driver/
skylib_mudos_v1/mudlib/doc/driver/efuns/arrays/
skylib_mudos_v1/mudlib/doc/driver/efuns/buffers/
skylib_mudos_v1/mudlib/doc/driver/efuns/compile/
skylib_mudos_v1/mudlib/doc/driver/efuns/filesystem/
skylib_mudos_v1/mudlib/doc/driver/efuns/floats/
skylib_mudos_v1/mudlib/doc/driver/efuns/functions/
skylib_mudos_v1/mudlib/doc/driver/efuns/general/
skylib_mudos_v1/mudlib/doc/driver/efuns/mappings/
skylib_mudos_v1/mudlib/doc/driver/efuns/mixed/
skylib_mudos_v1/mudlib/doc/driver/efuns/mudlib/
skylib_mudos_v1/mudlib/doc/driver/efuns/numbers/
skylib_mudos_v1/mudlib/doc/driver/efuns/parsing/
skylib_mudos_v1/mudlib/doc/known_command/
skylib_mudos_v1/mudlib/doc/login/
skylib_mudos_v1/mudlib/doc/lpc/basic_manual/
skylib_mudos_v1/mudlib/doc/lpc/intermediate/
skylib_mudos_v1/mudlib/doc/new/add_command/
skylib_mudos_v1/mudlib/doc/new/events/
skylib_mudos_v1/mudlib/doc/new/handlers/
skylib_mudos_v1/mudlib/doc/new/living/race/
skylib_mudos_v1/mudlib/doc/new/living/spells/
skylib_mudos_v1/mudlib/doc/new/object/
skylib_mudos_v1/mudlib/doc/new/player/
skylib_mudos_v1/mudlib/doc/new/room/guild/
skylib_mudos_v1/mudlib/doc/new/room/outside/
skylib_mudos_v1/mudlib/doc/new/room/storeroom/
skylib_mudos_v1/mudlib/doc/object/
skylib_mudos_v1/mudlib/doc/playtesters/
skylib_mudos_v1/mudlib/doc/policy/
skylib_mudos_v1/mudlib/doc/weapons/
skylib_mudos_v1/mudlib/global/
skylib_mudos_v1/mudlib/global/creator/
skylib_mudos_v1/mudlib/global/handlers/
skylib_mudos_v1/mudlib/global/virtual/setup_compiler/
skylib_mudos_v1/mudlib/include/cmds/
skylib_mudos_v1/mudlib/include/effects/
skylib_mudos_v1/mudlib/include/npc/
skylib_mudos_v1/mudlib/include/room/
skylib_mudos_v1/mudlib/include/shops/
skylib_mudos_v1/mudlib/net/daemon/
skylib_mudos_v1/mudlib/net/daemon/chars/
skylib_mudos_v1/mudlib/net/inherit/
skylib_mudos_v1/mudlib/net/obj/
skylib_mudos_v1/mudlib/obj/amulets/
skylib_mudos_v1/mudlib/obj/b_day/
skylib_mudos_v1/mudlib/obj/clothes/
skylib_mudos_v1/mudlib/obj/dwarmours/plate/
skylib_mudos_v1/mudlib/obj/dwclothes/transport/horse/
skylib_mudos_v1/mudlib/obj/dwscabbards/
skylib_mudos_v1/mudlib/obj/dwweapons/axes/
skylib_mudos_v1/mudlib/obj/dwweapons/chains/
skylib_mudos_v1/mudlib/obj/faith/symbols/
skylib_mudos_v1/mudlib/obj/fungi/
skylib_mudos_v1/mudlib/obj/gatherables/
skylib_mudos_v1/mudlib/obj/instruments/
skylib_mudos_v1/mudlib/obj/magic/
skylib_mudos_v1/mudlib/obj/media/
skylib_mudos_v1/mudlib/obj/misc/player_shop/
skylib_mudos_v1/mudlib/obj/monster/godmother/
skylib_mudos_v1/mudlib/obj/monster/transport/
skylib_mudos_v1/mudlib/obj/rings/
skylib_mudos_v1/mudlib/obj/spells/
skylib_mudos_v1/mudlib/obj/stationery/
skylib_mudos_v1/mudlib/obj/stationery/envelopes/
skylib_mudos_v1/mudlib/obj/stationery/papers/
skylib_mudos_v1/mudlib/obj/toys/
skylib_mudos_v1/mudlib/obj/vessels/
skylib_mudos_v1/mudlib/obj/weapons/swords/
skylib_mudos_v1/mudlib/save/autodoc/
skylib_mudos_v1/mudlib/save/leaflets/
skylib_mudos_v1/mudlib/save/mail/
skylib_mudos_v1/mudlib/save/new_soul/data/
skylib_mudos_v1/mudlib/save/parcels/
skylib_mudos_v1/mudlib/save/playerinfo/
skylib_mudos_v1/mudlib/save/players/d/
skylib_mudos_v1/mudlib/save/random_names/
skylib_mudos_v1/mudlib/save/random_names/data/
skylib_mudos_v1/mudlib/save/terrains/
skylib_mudos_v1/mudlib/save/terrains/tutorial_desert/
skylib_mudos_v1/mudlib/save/terrains/tutorial_grassy_field/
skylib_mudos_v1/mudlib/save/terrains/tutorial_mountain/
skylib_mudos_v1/mudlib/save/todo_lists/
skylib_mudos_v1/mudlib/secure/
skylib_mudos_v1/mudlib/secure/cmds/admin/
skylib_mudos_v1/mudlib/secure/cmds/lord/
skylib_mudos_v1/mudlib/secure/config/
skylib_mudos_v1/mudlib/secure/handlers/autodoc/
skylib_mudos_v1/mudlib/secure/handlers/intermud/
skylib_mudos_v1/mudlib/secure/include/global/
skylib_mudos_v1/mudlib/secure/save/
skylib_mudos_v1/mudlib/secure/save/handlers/
skylib_mudos_v1/mudlib/secure/std/classes/
skylib_mudos_v1/mudlib/secure/std/modules/
skylib_mudos_v1/mudlib/std/commands/
skylib_mudos_v1/mudlib/std/commands/shadows/
skylib_mudos_v1/mudlib/std/creator/
skylib_mudos_v1/mudlib/std/dom/
skylib_mudos_v1/mudlib/std/effects/
skylib_mudos_v1/mudlib/std/effects/external/
skylib_mudos_v1/mudlib/std/effects/fighting/
skylib_mudos_v1/mudlib/std/effects/priest/
skylib_mudos_v1/mudlib/std/effects/room/
skylib_mudos_v1/mudlib/std/environ/
skylib_mudos_v1/mudlib/std/guilds/
skylib_mudos_v1/mudlib/std/guilds/old/
skylib_mudos_v1/mudlib/std/languages/
skylib_mudos_v1/mudlib/std/languages/BACKUPS/
skylib_mudos_v1/mudlib/std/liquids/
skylib_mudos_v1/mudlib/std/npc/
skylib_mudos_v1/mudlib/std/npc/goals/
skylib_mudos_v1/mudlib/std/npc/goals/basic/
skylib_mudos_v1/mudlib/std/npc/goals/misc/
skylib_mudos_v1/mudlib/std/npc/plans/
skylib_mudos_v1/mudlib/std/npc/plans/basic/
skylib_mudos_v1/mudlib/std/npc/types/
skylib_mudos_v1/mudlib/std/npc/types/helper/
skylib_mudos_v1/mudlib/std/npcs/
skylib_mudos_v1/mudlib/std/outsides/
skylib_mudos_v1/mudlib/std/races/shadows/
skylib_mudos_v1/mudlib/std/room/basic/topography/
skylib_mudos_v1/mudlib/std/room/controller/
skylib_mudos_v1/mudlib/std/room/inherit/topography/
skylib_mudos_v1/mudlib/std/room/topography/area/
skylib_mudos_v1/mudlib/std/room/topography/iroom/
skylib_mudos_v1/mudlib/std/room/topography/milestone/
skylib_mudos_v1/mudlib/std/shadows/curses/
skylib_mudos_v1/mudlib/std/shadows/disease/
skylib_mudos_v1/mudlib/std/shadows/fighting/
skylib_mudos_v1/mudlib/std/shadows/healing/
skylib_mudos_v1/mudlib/std/shadows/magic/
skylib_mudos_v1/mudlib/std/shadows/poison/
skylib_mudos_v1/mudlib/std/shadows/rituals/
skylib_mudos_v1/mudlib/std/shadows/room/
skylib_mudos_v1/mudlib/std/shops/controllers/
skylib_mudos_v1/mudlib/std/shops/objs/
skylib_mudos_v1/mudlib/std/shops/player_shop/
skylib_mudos_v1/mudlib/std/socket/
skylib_mudos_v1/mudlib/std/soul/
skylib_mudos_v1/mudlib/std/soul/d/
skylib_mudos_v1/mudlib/std/soul/e/
skylib_mudos_v1/mudlib/std/soul/i/
skylib_mudos_v1/mudlib/std/soul/j/
skylib_mudos_v1/mudlib/std/soul/k/
skylib_mudos_v1/mudlib/std/soul/l/
skylib_mudos_v1/mudlib/std/soul/n/
skylib_mudos_v1/mudlib/std/soul/o/
skylib_mudos_v1/mudlib/std/soul/q/
skylib_mudos_v1/mudlib/std/soul/u/
skylib_mudos_v1/mudlib/std/soul/v/
skylib_mudos_v1/mudlib/std/soul/y/
skylib_mudos_v1/mudlib/std/soul/z/
skylib_mudos_v1/mudlib/std/stationery/
skylib_mudos_v1/mudlib/w/
skylib_mudos_v1/mudlib/w/default/
skylib_mudos_v1/mudlib/w/default/armour/
skylib_mudos_v1/mudlib/w/default/clothes/
skylib_mudos_v1/mudlib/w/default/item/
skylib_mudos_v1/mudlib/w/default/npc/
skylib_mudos_v1/mudlib/w/default/room/
skylib_mudos_v1/mudlib/w/default/weapon/
skylib_mudos_v1/mudlib/www/
skylib_mudos_v1/mudlib/www/download/
skylib_mudos_v1/mudlib/www/java/
skylib_mudos_v1/mudlib/www/secure/
skylib_mudos_v1/mudlib/www/secure/lpc/advanced/
skylib_mudos_v1/mudlib/www/secure/lpc/intermediate/
skylib_mudos_v1/v22.2b14-DSv10/
skylib_mudos_v1/v22.2b14-DSv10/ChangeLog.old/
skylib_mudos_v1/v22.2b14-DSv10/Win32/
skylib_mudos_v1/v22.2b14-DSv10/compat/
skylib_mudos_v1/v22.2b14-DSv10/compat/simuls/
skylib_mudos_v1/v22.2b14-DSv10/include/
skylib_mudos_v1/v22.2b14-DSv10/mudlib/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/clone/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/command/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/data/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/etc/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/include/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/master/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/log/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/compiler/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/efuns/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/operators/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/u/
skylib_mudos_v1/v22.2b14-DSv10/tmp/
skylib_mudos_v1/v22.2b14-DSv10/windows/
/*
 * transient.c - reaction object, resulting from the mixing of two
 *     substances.
 *
 * The following pseudo-objects may be used in progress strings:
 *    #obj# - replaced by the filename of this object (virtual objects
 *            don't seem to handle file_name correctly)
 *    #env# - replaced by the filename of the environment
 *    #env2# - replaced by the filename of the environment of the environment
 *    #result# - replaced by the filename of the result object
 */

// This use to be /obj/cont_medium, but /obj/food has more features
inherit "/obj/food";

#include <move_failures.h>

// Default amount per unit weight (for setting weight of non-continuous
// items)
#define AMT_PER_WGT 200

// progress_msg is an array of data structures of the form:
//   ({({ msg_1, ({function_str1a, function_str1b, ...})}),
//     ({ msg_2, ({function_str2a, function_str2b, ...})}),
//     ...
//   })
// At interval n, msg_n is printed out and function_strnx is called, after
// having the substitutions above performed and being passed through
// process_string.  This should give plenty of functionality (if not, I
// can always add more :).

mixed *progress_msg = ({});
int duration, interval, counter, hp_base;
float result_amt;
string result, result_alias;
string final = "boom";
int in_progress;

void set_progress_msg(mixed *msg) { progress_msg = msg; }
void set_final(string s) { final = s; }
void set_result(string s) { result = s; }
void set_result_alias(string s) { result_alias = s; }
void set_result_amt(float amt) { result_amt = amt; }

void set_duration(int time) {
    // NOTE that this must be called after the progress_msg has been set
    duration = time;
    if (sizeof(progress_msg)) {
        interval = duration / sizeof(progress_msg);
    } else {
        interval = duration;
    }
}

void add_progress_msg(mixed *msg) {
    progress_msg += ({msg});
    set_duration(duration); // calculate new interval
}

// Note: hp_base is hps of damage done per unit.  If it's being carried
// by a living thing, it does full damage.  Otherwise, it does 1/5 damage
// to everyone in the room (sort of an arbitrary decision, but I'm trying
// to keep the number of parameters down).

void set_hp_base(int hp) { hp_base = hp; }

void start_reaction() {
    /*
     * NOTE: this is the function that sets off the call_outs.  Call it
     * after everything else has been set up.
     */
    if (sizeof(progress_msg) > 1) {
        call_out("progress", interval);
    } else {
        call_out(final, interval);
    }
    in_progress = 1;
}

void stop_reaction() {
    if (counter < sizeof(progress_msg)-1) {
        remove_call_out("progress");
    } else {
        remove_call_out(final);
    }
    in_progress = 0;
}

void restart_reaction() {
    if (counter < sizeof(progress_msg)-1) {
        call_out("progress", interval);
    } else {
        call_out(final, interval);
    }
    in_progress = 1;
}

void progress() {
    object env, env2;
    string msg, fcn;
    int i;

    env = environment(this_object());
    env2 = environment(env);
    if (progress_msg[counter][0]) {
        msg = replace(progress_msg[counter][0],
                      ({"#env#", file_name(env),
                        "#env2#", env2?file_name(env2):0,
                        "#obj#", file_name(this_object()),
                        "#result#", ""}));
        msg = process_string(msg);
        tell_room(env2, msg);
    }
    if (progress_msg[counter][1]) {
        for (i = 0; i < sizeof(progress_msg[counter][1]); i++) {
            fcn = replace(progress_msg[counter][1][i],
                  ({"#env#", file_name(env),
                    "#env2#", env2?file_name(env2):0,
                    "#obj#", file_name(this_object()),
                    "#result#", ""}));
            process_string("@@"+fcn+"@@");
        }
    }
    counter++;
    if (counter < sizeof(progress_msg)-1) {
        call_out("progress", interval);
    } else {
        call_out(final, interval);
    }
}

void boom() {
    object env, env2, cont, new_env;
    object *victims, *contents;
    object result_ob;
    int hp, i, amt, tmp;
    string msg, fcn;
    
    // Assume substance is in a container
    env = environment(this_object());
    env2 = environment(env);
    amt = query_amount();
    if (living(env)) {
        // Held by a living
        hp = hp_base*amt;
        env->adjust_hp(-hp);
    } else if (living(env2)) {
        // In a container held by a living
        hp = (hp_base*amt)/2;
        env2->adjust_hp(-hp);
    } else if (env->query_co_ord()) {
        // Sitting in a room
        hp = (hp_base*amt)/2;
        victims = all_inventory(env);
        for (i = 0; i < sizeof(victims); i++) {
            if (living(victims[i])) {
                victims[i]->adjust_hp(-hp);
            }
        }
    } else if (env2->query_co_ord()) {
        // Sitting in a container in a room
        hp = (hp_base*amt)/5;
        victims = all_inventory(env2);
        for (i = 0; i < sizeof(victims); i++) {
            if (living(victims[i])) {
                victims[i]->adjust_hp(-hp);
            }
        }
    }
    if (result) {
        result_ob = clone_object(result);
        if (result_alias) {
            // result_alias should be 0 if this isn't a cont_medium
            result_ob->set_medium_alias(result_alias);
        }
        if (function_exists("set_amount", result_ob)) {
            result_ob->set_amount(to_int(result_amt*query_amount()));
        } else if (result_amt > 0.0) {
            result_ob->set_weight(to_int(result_amt*query_amount()/AMT_PER_WGT));
        }
    }
    if (sizeof(progress_msg)) {
        if (progress_msg[counter][0]) {
            msg = replace(progress_msg[counter][0],
                          ({"#env#", file_name(env),
                            "#env2#", env2?file_name(env2):0,
                            "#obj#", file_name(this_object()),
                            "#result#", result_ob?file_name(result_ob):0}));
            msg = process_string(msg);
            tell_room(env2, msg);
        }
        if (progress_msg[counter][1]) {
            for (i = 0; i < sizeof(progress_msg[counter][1]); i++) {
                fcn = replace(progress_msg[counter][1][i],
                              ({"#env#", file_name(env),
                                "#env2#", env2?file_name(env2):0,
                                "#obj#", file_name(this_object()),
                                "#result#", ""}));
                process_string("@@"+fcn+"@@");
            }
        }
    }
    move("/room/void");
    // Destroy container (unless living or a room) and move contents
    // up.
    contents = all_inventory(env);
    if (result_ob) contents += ({result_ob});
    for (i = 0; i < sizeof(contents); i++) {
        if (contents[i]->query_continuous()) {
            contents[i]->dest_me();
            continue;
        }
        new_env = env2;
        while (new_env && ((tmp=contents[i]->move(new_env)) != MOVE_OK)) {
            new_env = environment(new_env);
        }
        if (!new_env) contents[i]->dest_me();
    }
    if (!living(env) && !function_exists("query_co_ord", env)) {
        env->dest_me();
    }
    call_out("dest_me", 0);
}

object morph() {
    // Returns the object created...
    object env, env2, result_ob, new_env, *contents;
    string msg, fcn;
    int i, mv_stat;

    env = environment(this_object());
    env2 = environment(env);
    // Need to move out of the container to make room
    move("/room/void");
    if (stringp(result)) {
        result_ob = clone_object(result);
        if (stringp(result_alias)) {
            // result_alias should be 0 if this isn't a cont_medium
            result_ob->set_medium_alias(result_alias);
            result_ob->set_amount(to_int(result_amt*query_amount()));
        } else if (result_amt > 0.0) {
            result_ob->set_weight(to_int(result_amt*query_amount()/AMT_PER_WGT));
        }
        mv_stat = result_ob->move(env);
        if (mv_stat) {
            //write("Uh oh, move error: " + mv_stat + "\n");
            // Destroy container (unless living or a room) and contents.
            contents = all_inventory(env);
            for (i = 0; i < sizeof(contents); i++) {
                contents[i]->dest_me();
            }
            if (!living(env) && !function_exists("query_co_ord", env)) {
                tell_room(env2, "The " + env->short(0) +
                          " explodes, splattering the contents all over.\n");
                env->dest_me();
            }
            result_ob->dest_me();
            result_ob = 0;
        }
    }
    if (sizeof(progress_msg)) {
        if (progress_msg[counter][0]) {
            msg = replace(progress_msg[counter][0],
                          ({"#env#", env?file_name(env):0,
                            "#env2#", env2?file_name(env2):0,
                            "#obj#", file_name(this_object()),
                            "#result#", result_ob?file_name(result_ob):0}));
            msg = process_string(msg);
            tell_room(env2, msg);
        }
        if (progress_msg[counter][1]) {
            for (i = 0; i < sizeof(progress_msg[counter][1]); i++) {
                fcn = replace(progress_msg[counter][1][i],
                          ({"#env#", env?file_name(env):0,
                            "#env2#", env2?file_name(env2):0,
                            "#obj#", file_name(this_object()),
                            "#result#", result_ob?file_name(result_ob):0}));
                process_string("@@"+fcn+"@@");
            }
        }
    }
    call_out("dest_me", 0);
    return result_ob;
}
    
string query_pounds() { return "about " + ::query_weight()/9; }

void query_progress_msg() {
    int i, j;
    
    write("({\n");
    for (i = 0; i < sizeof(progress_msg); i++) {
        write(progress_msg[i][0] + " ({\n");
        if (!progress_msg[i][0]) {
            write("0})\n");
        } else {
            for (j = 0; j < sizeof(progress_msg[i][1]); j++) {
                write(progress_msg[i][1][j] + "\n");
            }
            write("})\n");
        }
    }
}

mixed stats() {
  return ::stats() + ({
      ({ "duration", duration }),
      ({ "interval", interval }),
      ({ "counter", counter }),
      ({ "hp base", hp_base }),
      ({ "result amt", result_amt }),
      ({ "result", result }),
      ({ "result alias", result_alias }),
      ({ "final", final }),
      ({ "in progress", in_progress }),
  });
} /* stats() */

mapping query_dynamic_auto_load() {
    return ([
             "::": ::query_dynamic_auto_load(),
             "progress_msg" : progress_msg,
             "duration" : duration,
             "interval" : interval,
             "counter" : counter,
             "hp_base" : hp_base,
             "result_amt" : result_amt,
             "result" : result,
             "result_alias" : result_alias,
             "final" : final,
             "in_progress" : in_progress,
           ]);
} /* query_dynamic_auto_load() */

void init_dynamic_arg(mapping args) {
    if (args["::"])
      ::init_dynamic_arg(args["::"]);
    if (!undefinedp(args["progress_msg"]))
      progress_msg = args["progress_msg"];
    if (!undefinedp(args["duration"]))
      duration = args["duration"];
    if (!undefinedp(args["interval"]))
      interval = args["interval"];
    if (!undefinedp(args["counter"]))
      counter = args["counter"];
    if (!undefinedp(args["hp_base"]))
      hp_base = args["hp_base"];
    if (!undefinedp(args["result_amt"]))
      result_amt = args["result_amt"];
    if (!undefinedp(args["result"]))
      result = args["result"];
    if (!undefinedp(args["result_alias"]))
      result_alias = args["result_alias"];
    if (!undefinedp(args["final"]))
      final = args["final"];
    if (!undefinedp(args["in_progress"])) {
        in_progress = args["in_progress"];
        if (in_progress)
          restart_reaction();
    }
} /* init_dynamic_arg() */

mapping int_query_static_auto_load() {
   return ([
      "::": ::int_query_static_auto_load(),
   ]);
} /* int_query_static_auto_load() */

mapping query_static_auto_load() {
   if ( file_name( this_object() )[ 0 .. 22 ] == "/obj/reagents/transient" )
      return int_query_static_auto_load();
   return 0;
} /* query_static_auto_load() */

void init_static_arg( mapping map ) {
   if ( map[ "::" ] )
      ::init_static_arg( map[ "::" ] );
} /* init_static_arg() */