skylib_fluffos_v3/
skylib_fluffos_v3/bin/
skylib_fluffos_v3/bin/db/
skylib_fluffos_v3/fluffos-2.9-ds2.04/
skylib_fluffos_v3/fluffos-2.9-ds2.04/ChangeLog.old/
skylib_fluffos_v3/fluffos-2.9-ds2.04/Win32/
skylib_fluffos_v3/fluffos-2.9-ds2.04/compat/
skylib_fluffos_v3/fluffos-2.9-ds2.04/compat/simuls/
skylib_fluffos_v3/fluffos-2.9-ds2.04/include/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/clone/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/command/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/data/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/etc/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/include/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/inherit/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/inherit/master/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/log/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/tests/compiler/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/tests/efuns/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/tests/operators/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/u/
skylib_fluffos_v3/fluffos-2.9-ds2.04/tmp/
skylib_fluffos_v3/fluffos-2.9-ds2.04/windows/
skylib_fluffos_v3/mudlib/
skylib_fluffos_v3/mudlib/cmds/
skylib_fluffos_v3/mudlib/cmds/admin/
skylib_fluffos_v3/mudlib/cmds/guild-race/
skylib_fluffos_v3/mudlib/cmds/living/broken/
skylib_fluffos_v3/mudlib/cmds/player/group_cmds/
skylib_fluffos_v3/mudlib/cmds/playtester/
skylib_fluffos_v3/mudlib/d/admin/
skylib_fluffos_v3/mudlib/d/admin/room/
skylib_fluffos_v3/mudlib/d/admin/room/we_care/
skylib_fluffos_v3/mudlib/d/admin/save/
skylib_fluffos_v3/mudlib/d/admin/text/
skylib_fluffos_v3/mudlib/d/learning/TinyTown/buildings/
skylib_fluffos_v3/mudlib/d/learning/TinyTown/map/
skylib_fluffos_v3/mudlib/d/learning/TinyTown/roads/
skylib_fluffos_v3/mudlib/d/learning/chars/
skylib_fluffos_v3/mudlib/d/learning/functions/
skylib_fluffos_v3/mudlib/d/learning/handlers/
skylib_fluffos_v3/mudlib/d/learning/help_topics/
skylib_fluffos_v3/mudlib/d/learning/help_topics/npcs/
skylib_fluffos_v3/mudlib/d/learning/help_topics/objects/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rcs_demo/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rcs_demo/RCS/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rooms/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rooms/crowd/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rooms/situations/
skylib_fluffos_v3/mudlib/d/learning/save/
skylib_fluffos_v3/mudlib/d/learning/school/
skylib_fluffos_v3/mudlib/d/learning/school/add_sc/
skylib_fluffos_v3/mudlib/d/learning/school/characters/
skylib_fluffos_v3/mudlib/d/learning/school/general/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/basic_commands/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/edtutor/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/unix_tutor/
skylib_fluffos_v3/mudlib/d/learning/school/items/
skylib_fluffos_v3/mudlib/d/learning/school/npc_school/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/room_basic/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/situations/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/terrain_tutor/
skylib_fluffos_v3/mudlib/d/learning/text/
skylib_fluffos_v3/mudlib/d/liaison/
skylib_fluffos_v3/mudlib/d/mudlib/
skylib_fluffos_v3/mudlib/d/mudlib/changes/
skylib_fluffos_v3/mudlib/d/playtesters/
skylib_fluffos_v3/mudlib/d/playtesters/effects/
skylib_fluffos_v3/mudlib/d/playtesters/handlers/
skylib_fluffos_v3/mudlib/d/playtesters/items/
skylib_fluffos_v3/mudlib/d/sage/
skylib_fluffos_v3/mudlib/doc/
skylib_fluffos_v3/mudlib/doc/creator/
skylib_fluffos_v3/mudlib/doc/driver/
skylib_fluffos_v3/mudlib/doc/driver/efuns/arrays/
skylib_fluffos_v3/mudlib/doc/driver/efuns/buffers/
skylib_fluffos_v3/mudlib/doc/driver/efuns/calls/
skylib_fluffos_v3/mudlib/doc/driver/efuns/compile/
skylib_fluffos_v3/mudlib/doc/driver/efuns/filesystem/
skylib_fluffos_v3/mudlib/doc/driver/efuns/floats/
skylib_fluffos_v3/mudlib/doc/driver/efuns/functions/
skylib_fluffos_v3/mudlib/doc/driver/efuns/general/
skylib_fluffos_v3/mudlib/doc/driver/efuns/mappings/
skylib_fluffos_v3/mudlib/doc/driver/efuns/mixed/
skylib_fluffos_v3/mudlib/doc/driver/efuns/mudlib/
skylib_fluffos_v3/mudlib/doc/driver/efuns/numbers/
skylib_fluffos_v3/mudlib/doc/driver/efuns/parsing/
skylib_fluffos_v3/mudlib/doc/login/
skylib_fluffos_v3/mudlib/doc/lpc/basic_manual/
skylib_fluffos_v3/mudlib/doc/lpc/intermediate/
skylib_fluffos_v3/mudlib/doc/new/add_command/
skylib_fluffos_v3/mudlib/doc/new/events/
skylib_fluffos_v3/mudlib/doc/new/handlers/
skylib_fluffos_v3/mudlib/doc/new/living/race/
skylib_fluffos_v3/mudlib/doc/new/living/spells/
skylib_fluffos_v3/mudlib/doc/new/object/
skylib_fluffos_v3/mudlib/doc/new/player/
skylib_fluffos_v3/mudlib/doc/new/room/guild/
skylib_fluffos_v3/mudlib/doc/new/room/outside/
skylib_fluffos_v3/mudlib/doc/new/room/storeroom/
skylib_fluffos_v3/mudlib/doc/object/
skylib_fluffos_v3/mudlib/doc/playtesters/
skylib_fluffos_v3/mudlib/doc/policy/
skylib_fluffos_v3/mudlib/doc/weapons/
skylib_fluffos_v3/mudlib/global/
skylib_fluffos_v3/mudlib/global/creator/
skylib_fluffos_v3/mudlib/handlers/
skylib_fluffos_v3/mudlib/include/casino/
skylib_fluffos_v3/mudlib/include/cmds/
skylib_fluffos_v3/mudlib/include/effects/
skylib_fluffos_v3/mudlib/include/npc/
skylib_fluffos_v3/mudlib/include/room/
skylib_fluffos_v3/mudlib/include/shops/
skylib_fluffos_v3/mudlib/net/daemon/
skylib_fluffos_v3/mudlib/net/daemon/chars/
skylib_fluffos_v3/mudlib/net/inherit/
skylib_fluffos_v3/mudlib/net/obj/
skylib_fluffos_v3/mudlib/net/obj/BACKUPS/
skylib_fluffos_v3/mudlib/obj/amulets/
skylib_fluffos_v3/mudlib/obj/armours/plate/
skylib_fluffos_v3/mudlib/obj/b_day/
skylib_fluffos_v3/mudlib/obj/clothes/transport/horse/
skylib_fluffos_v3/mudlib/obj/faith/symbols/
skylib_fluffos_v3/mudlib/obj/fungi/
skylib_fluffos_v3/mudlib/obj/gatherables/
skylib_fluffos_v3/mudlib/obj/instruments/
skylib_fluffos_v3/mudlib/obj/media/
skylib_fluffos_v3/mudlib/obj/misc/player_shop/
skylib_fluffos_v3/mudlib/obj/monster/godmother/
skylib_fluffos_v3/mudlib/obj/monster/transport/
skylib_fluffos_v3/mudlib/obj/rings/
skylib_fluffos_v3/mudlib/obj/scabbards/
skylib_fluffos_v3/mudlib/obj/spells/
skylib_fluffos_v3/mudlib/obj/stationery/
skylib_fluffos_v3/mudlib/obj/stationery/envelopes/
skylib_fluffos_v3/mudlib/obj/toys/
skylib_fluffos_v3/mudlib/obj/vessels/
skylib_fluffos_v3/mudlib/obj/weapons/axes/
skylib_fluffos_v3/mudlib/obj/weapons/chains/
skylib_fluffos_v3/mudlib/obj/weapons/maces/BACKUPS/
skylib_fluffos_v3/mudlib/save/autodoc/
skylib_fluffos_v3/mudlib/save/book_handler/
skylib_fluffos_v3/mudlib/save/books/history/calarien/
skylib_fluffos_v3/mudlib/save/mail/
skylib_fluffos_v3/mudlib/save/new_soul/data/
skylib_fluffos_v3/mudlib/save/parcels/
skylib_fluffos_v3/mudlib/save/playerinfo/
skylib_fluffos_v3/mudlib/save/players/d/
skylib_fluffos_v3/mudlib/save/players/s/
skylib_fluffos_v3/mudlib/save/random_names/
skylib_fluffos_v3/mudlib/save/random_names/data/
skylib_fluffos_v3/mudlib/save/terrains/
skylib_fluffos_v3/mudlib/save/terrains/tutorial_desert/
skylib_fluffos_v3/mudlib/save/terrains/tutorial_grassy_field/
skylib_fluffos_v3/mudlib/save/terrains/tutorial_mountain/
skylib_fluffos_v3/mudlib/save/todo_lists/
skylib_fluffos_v3/mudlib/secure/
skylib_fluffos_v3/mudlib/secure/cmds/admin/
skylib_fluffos_v3/mudlib/secure/cmds/lord/
skylib_fluffos_v3/mudlib/secure/config/
skylib_fluffos_v3/mudlib/secure/handlers/autodoc/
skylib_fluffos_v3/mudlib/secure/handlers/intermud/
skylib_fluffos_v3/mudlib/secure/include/global/
skylib_fluffos_v3/mudlib/secure/save/
skylib_fluffos_v3/mudlib/secure/save/handlers/
skylib_fluffos_v3/mudlib/secure/std/
skylib_fluffos_v3/mudlib/secure/std/classes/
skylib_fluffos_v3/mudlib/secure/std/modules/
skylib_fluffos_v3/mudlib/std/creator/
skylib_fluffos_v3/mudlib/std/dom/
skylib_fluffos_v3/mudlib/std/effects/
skylib_fluffos_v3/mudlib/std/effects/external/
skylib_fluffos_v3/mudlib/std/effects/fighting/
skylib_fluffos_v3/mudlib/std/effects/magic/
skylib_fluffos_v3/mudlib/std/effects/magic/BACKUPS/
skylib_fluffos_v3/mudlib/std/effects/other/BACKUPS/
skylib_fluffos_v3/mudlib/std/effects/priest/
skylib_fluffos_v3/mudlib/std/effects/room/
skylib_fluffos_v3/mudlib/std/environ/
skylib_fluffos_v3/mudlib/std/guilds/
skylib_fluffos_v3/mudlib/std/guilds/old/
skylib_fluffos_v3/mudlib/std/languages/
skylib_fluffos_v3/mudlib/std/liquids/
skylib_fluffos_v3/mudlib/std/npc/
skylib_fluffos_v3/mudlib/std/npc/goals/
skylib_fluffos_v3/mudlib/std/npc/goals/basic/
skylib_fluffos_v3/mudlib/std/npc/goals/misc/
skylib_fluffos_v3/mudlib/std/npc/plans/
skylib_fluffos_v3/mudlib/std/npc/plans/basic/
skylib_fluffos_v3/mudlib/std/npc/types/
skylib_fluffos_v3/mudlib/std/npc/types/helper/
skylib_fluffos_v3/mudlib/std/npcs/
skylib_fluffos_v3/mudlib/std/outsides/
skylib_fluffos_v3/mudlib/std/races/shadows/
skylib_fluffos_v3/mudlib/std/room/basic/BACKUPS/
skylib_fluffos_v3/mudlib/std/room/basic/topography/
skylib_fluffos_v3/mudlib/std/room/controller/
skylib_fluffos_v3/mudlib/std/room/inherit/topography/
skylib_fluffos_v3/mudlib/std/room/topography/area/
skylib_fluffos_v3/mudlib/std/room/topography/iroom/
skylib_fluffos_v3/mudlib/std/room/topography/milestone/
skylib_fluffos_v3/mudlib/std/shadows/curses/
skylib_fluffos_v3/mudlib/std/shadows/disease/
skylib_fluffos_v3/mudlib/std/shadows/fighting/
skylib_fluffos_v3/mudlib/std/shadows/healing/
skylib_fluffos_v3/mudlib/std/shadows/magic/
skylib_fluffos_v3/mudlib/std/shadows/poison/
skylib_fluffos_v3/mudlib/std/shadows/room/
skylib_fluffos_v3/mudlib/std/shops/controllers/
skylib_fluffos_v3/mudlib/std/shops/objs/
skylib_fluffos_v3/mudlib/std/shops/player_shop/
skylib_fluffos_v3/mudlib/std/socket/
skylib_fluffos_v3/mudlib/std/soul/d/
skylib_fluffos_v3/mudlib/std/soul/e/
skylib_fluffos_v3/mudlib/std/soul/i/
skylib_fluffos_v3/mudlib/std/soul/j/
skylib_fluffos_v3/mudlib/std/soul/k/
skylib_fluffos_v3/mudlib/std/soul/l/
skylib_fluffos_v3/mudlib/std/soul/n/
skylib_fluffos_v3/mudlib/std/soul/o/
skylib_fluffos_v3/mudlib/std/soul/q/
skylib_fluffos_v3/mudlib/std/soul/r/
skylib_fluffos_v3/mudlib/std/soul/u/
skylib_fluffos_v3/mudlib/std/soul/v/
skylib_fluffos_v3/mudlib/std/soul/y/
skylib_fluffos_v3/mudlib/std/soul/z/
skylib_fluffos_v3/mudlib/std/stationery/
skylib_fluffos_v3/mudlib/w/
skylib_fluffos_v3/mudlib/w/default/
skylib_fluffos_v3/mudlib/w/default/armour/
skylib_fluffos_v3/mudlib/w/default/clothes/
skylib_fluffos_v3/mudlib/w/default/item/
skylib_fluffos_v3/mudlib/w/default/npc/
skylib_fluffos_v3/mudlib/w/default/room/
skylib_fluffos_v3/mudlib/w/default/weapon/
skylib_fluffos_v3/mudlib/www/
skylib_fluffos_v3/mudlib/www/java/
skylib_fluffos_v3/mudlib/www/secure/
skylib_fluffos_v3/mudlib/www/secure/lpc/advanced/
skylib_fluffos_v3/mudlib/www/secure/lpc/intermediate/
skylib_fluffos_v3/win32/
/**
 * This is the base object for creating typo, bug, idea etc reporting
 * commands from.  You should set the error type of the
 * object in its create function.  The use_last_error flag should
 * be set for those error report types which will need to use the last
 * runtime error on the player object.
 * @example
 * inherit "/cmds/report_base";
 *
 * void create() {
 *    ::create();
 *    set_error_type("TYPO");
 * } /\* create() *\/
 */

#include <log.h>
#include <command.h>
#include <user_parser.h>

class errors {
   int type;
   string file;
   string error;
}

#define ROOM_BUG    1
#define OBJECT_BUG  2
#define RITUAL_BUG  3
#define SPELL_BUG   4
#define HELP_BUG    5
#define COMMAND_BUG 6
#define GENERAL_BUG 7
#define SOUL_BUG    8

private nosave mapping _globals;
private nosave string _error_type;
private nosave int _use_last_error;

void create() {
    _globals = ([ ]);
} /* create() */


/**
 * This sets the error type name.  The error type should be one
 * of "TYPO", "BUG", "IDEA".
 * @param type the type to set
 * @see query_verb()
 */
void set_error_type( string type ) { _error_type = type; }

/**
 * This sets the use_last_error flag.  If this flag is set to a non-zero
 * value then the last runtime error stored on the player object will
 * be attached to the error report.
 * @param error the new value of the last error flag
 */
void set_use_last_error( int error ) { _use_last_error = error; }

/**
 * This method returns the currently set value of the last error flag.
 * @return the current value of the last error flag
 */
int query_use_last_error() { return _use_last_error; }

/** @ignore yes */
int bug_room() {
    _globals[TP] = new( class errors,
                        type : ROOM_BUG,
                        error : "ROOM "+_error_type,
                        file : file_name(ENV(TP)) );

    TP->do_edit( 0, "end_of_edit");
    return 1;

} /* bug_room() */

/** @ignore yes */
int bug_general() {
    string dir, *bits, file;

    // For a general bug put it in the domains base directory.
    dir = file_name(ENV(TP));
    bits = explode( dir, "/");
    file = ( bits[0] == "d" ? implode(bits[0..1], "/")+"/general" : dir );

    _globals[TP] = new( class errors,
                        type : GENERAL_BUG,
                        error : "GENERAL "+_error_type,
                        file : file );

    TP->do_edit( 0, "end_of_edit");
    return 1;

} /* bug_general() */

/** @ignore yes */
int bug_command( string str ) {
    mixed coms;
    class command cmd;
    class errors bing;

    bing = new( class errors );
    cmd = new( class command, verb : str );
    coms = ({ });

    if( CMD_D->HandleStars(cmd) &&
        sizeof( ( coms = (mixed)CMD_D->GetPaths(cmd->verb ) &
        (mixed)TP->GetSearchPath() ) ) ) {
        bing->file = coms[0]+"/"+cmd->verb;
    } else {
        if( coms = TP->query_parse_command(str) ) {
            bing->file = base_name(coms[0][OBJS]);
        } else {
            if( coms = SOUL_H->query_soul_command(str) ) {
                bing->file = SOUL_H;
            } else if( _error_type == "IDEA") {
                bing->file = "/cmds/IDEA";
            } else {
                return notify_fail("Command "+str+" not found.\n");
            }
        }
    }

    bing->error = "COMMAND "+_error_type+" "+str;
    bing->type = COMMAND_BUG;

    _globals[TP] = bing;
    TP->do_edit(0, "end_of_edit");
    return 1;

} /* bug_command() */

/** @ignore yes */
int bug_soul( string str ) {
    mixed coms;
    class errors bing;

    bing = new( class errors );
    coms = ({ });

    if( coms = SOUL_H->query_soul_command(str) ) {
        bing->file = SOUL_H;
    } else if( _error_type == "IDEA" ) {
        bing->file = "/std/soul/IDEA";
    } else {
        return notify_fail("Soul command "+str+" not found.\n");
    }

    bing->error = "SOUL "+_error_type+" "+str;
    bing->type = SOUL_BUG;

    _globals[TP] = bing;
    TP->do_edit( 0, "end_of_edit");
    return 1;

} /* bug_soul() */

/** @ignore yes */
int bug_help( string str ) {
    mixed stuff;
    class errors bing;
    string tmp;

    bing = new( class errors );
    tmp = "/cmds/player/help"->query_synonym(str);
    if( strlen(tmp) )
        str = tmp;

    stuff = "/cmds/player/help"->query_help_on(str);
    if( !sizeof(stuff) )
        return notify_fail("Could not find the help file '"+str+"'.\n");

    sscanf( stuff[0][0], "%*s (%s)", bing->file );
    bing->error = "HELP "+_error_type+" "+str;
    bing->type = HELP_BUG;

    _globals[TP] = bing;
    TP->do_edit(0,"end_of_edit");
    return 1;

} /* bug_help() */

/** @ignore yes */
int bug_ritual( string str ) {
    mixed junk;
    class errors bing;

    if( !junk = TP->query_spell(str) ) {
        map_delete( _globals, TP );
        return notify_fail("Ritual "+str+" not found.\n");
    }

    bing = new( class errors );
    bing->file = junk[0];
    bing->error = "RITUAL "+_error_type+" "+str;
    bing->type = RITUAL_BUG;

    _globals[TP] = bing;
    TP->do_edit( 0, "end_of_edit");
    return 1;

} /* bug_ritual() */

/** @ignore yes */
int bug_spell( string str ) {
    mixed junk;
    class errors bing;

    if( !junk = TP->query_spell(str) ) {
        map_delete( _globals, TP );
        return notify_fail("Spell "+str+" not found.\n");
    }

    bing = new( class errors );
    bing->file = junk[0];
    bing->error = "SPELL "+_error_type+" "+str;
    bing->type = SPELL_BUG;

    _globals[TP] = bing;
    TP->do_edit( 0, "end_of_edit");
    return 1;

} /* bug_spell() */

/** @ignore yes */
int bug_object( object *obs, string str ) {
    object ob;
    string info, tmp;
    class errors bing;

    if( sizeof(obs) > 1 ) {
        notify_fail("More than one object can be identified with the name "+
            str+".  Please be more specific.\n");
        map_delete( _globals, TP );
        return 0;
    }

    ob = obs[0];
    bing = new( class errors );
    bing->file = base_name(ob);

    switch( bing->file ) {
      case "/std/room/basic/item" :
        bing->file = base_name(ENV(TP));
        if( sizeof( tmp = ob->short() ) )
            str = tmp;
        info = sprintf("Room item: %s.\n\n", str );
      break;
      case "/std/room/basic/door" :
        bing->file = base_name(ENV(TP));
        if( sizeof( tmp = ob->short() ) )
            str = tmp;
        info = sprintf("Room door: %s.\n\n", str );
      break;
      default:
        if( tmp = ob->query_property("virtual name") ) {
            bing->file = tmp;
            info = sprintf("VObject: %s, Object: %s\nName: %s, Short: %s\n\n",
                       tmp, bing->file, ob->query_name(), ob->short() );
        } else {
            info = sprintf("Name: %s, Short: %s\n\n",
                       ob->query_name(), ob->short() );
        }
    }

    bing->error = "OBJECT "+_error_type+" "+str;
    bing->type = OBJECT_BUG;

    _globals[TP] = bing;
    TP->do_edit( 0, "end_of_edit", 0, 0, info );
    return 1;

} /* bug_object() */

/** @ignore yes */
void end_of_edit( string body, string header ) {
    if( strlen(body) ) {
        int ending;
        string name, trace = 0;
        mapping last_error;
        class errors bing;

        bing = _globals[TP];

        if( body[<1] != '\n')
            ending = 1;

        if( ENV(TP) && bing->type != ROOM_BUG ) {
            if( ending ) {
                body += "\n";
                ending = 0;
            }
            body += sprintf("\nEnvironment: %s\n", file_name(ENV(TP)) );
        }
        body += sprintf("\nMudtime: %s\n", mudtime(time()) );

        if( _use_last_error ) {
            last_error = (mapping)TP->get_last_error();
            if( mapp(last_error) ) {
                trace = (string)master()->standard_trace( last_error, 1 );
                TP->set_last_error(0);
            }
        }

        if( ending )
            body += "\n";

        name = (string)TP->query_name();

        if( sizeof(header) )
            body = header + body;

        if( _error_type == "REPORT" ) {
            BOARD_H->add_message("ptreports", CAP(name), bing->error+" by "+
                CAP(name)+" ("+bing->file+")", body );
        } else {
            SMART_LOG->smart_log( bing->error, name, body, trace,
                bing->file );
        }

        PLAYTESTERS_H->report_made( name, bing->error, bing->file,
            body + (_use_last_error && trace ? "\nError:\n" + trace : "") );
        printf("Thank you for your "+( _error_type == "REPORT" ? "" : "%s ")+
            "report.\n", lower_case(_error_type) );
    } else {
        printf("Not saving "+( _error_type == "REPORT" ? "" : "%s ")+
            "report, aborting.\n", lower_case(_error_type) );
    }

    map_delete(_globals, TP );

} /* end_of_edit() */

/** @ignore yes */
mixed query_patterns() {
   return ({ "command <string'name'>", (: bug_command($4[0]) :),
             "soul <string'name'>", (: bug_soul($4[0]) :),
             "spell <string'name'>", (: bug_spell($4[0]) :),
             "object <indirect:wiz-present'name of NPC or item'>",
             (: bug_object($1, $4[0]) :),
             "ritual <string'name'>", (: bug_ritual($4[0]) :),
             "help <string'subject'>", (: bug_help($4[0]) :),
             "room", (: bug_room() :),
             "general", (: bug_general() :),
             });
} /* query_patterns() */