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 inheritable deals with sending and receiving parcels.
 * Please call set_use_servant() and use the built-in 'servant'
 * variable if you decide to have a serving NPC in your post
 * office, so that some of the messaging could be done through
 * the servant for more interactivity.
 * @see /handlers/parcel_handler.c
 * @author Sandoz
 */

#define QMS(x,y)    query_multiple_short(x,y)

inherit ROOM_OBJ;

object shelf, servant;
string office_name;
int use_servant;

/** @ignore yes */
void create() {
    ::create();

    add_help_file("parcel_office");

    if( base_name(TO) == __FILE__[0..<3] )
        return;

    if( !office_name || office_name == "") {
        error("No office name set.\n");
        return;
    }

    if( !PARCEL_H->query_post_office( office_name ) ) {
        error("Invalid office name set.\n");
        return;
    }

} /* create() */

/**
 * This method queries whether or not we are a parcel office.
 * @return always return 1
 */
int query_parcel_office() { return 1; }

/**
 * This method sets the name for this parcel office that will
 * be used in notification mails etc.
 * @param name the name of the parcel office
 */
void set_office_name( string name ) { office_name = name; }

/**
 * This method returns the name of this parcel office.
 */
string query_office_name() { return office_name; }

/**
 * This function is used to set the location used for calculation
 * of which currency we accept.
 * @param location the name of the location
 */
void set_location( string location ) { add_property("place", location ); }

/**
 * This method returns the location of the post office.  This is used
 * for calculation of which currency we operate with.
 * @return the location of the place, or default if none is set
 */
string query_location() {
    string str;

    if( ( str = query_property("place") ) && str != "")
        return str;

    return "default";

} /* query_location() */

/**
 * This method is called by the parcel handler to give a message to
 * the player when they successfully send a parcel to someone.
 * Feel free to override this method in your parcel office, however
 * try to have the same checks in your override.
 * @param to the person we sent the parcel to
 * @param where the name of the post office we sent the parcel to
 * @param time the time when they should receive the parcel
 */
void event_parcel_sent( string to, string where, int when ) {
    if( where == office_name )
        where = "Thank you for the business!  We shall notify "+
            CAP(to)+" of the parcel immediately.";
    else
        where = "Thank you for the business!  The parcel should reach "+
            where+" on "+ctime(when)+", and they shall notify "+
            CAP(to)+" of its arrival immediately.";

    if( use_servant && servant && ENV(servant) && ENV(servant) == TO )
        servant->do_command("'"+where );
    else
        tell_object( TP, where+"\n");

} /* event_parcel_sent() */

/**
 * This method is called by the parcel handler to give a message to
 * the player when they successfully collected a parcel, and should
 * actually move the parcel into the player.
 * Feel free to override this method in your parcel office, however
 * you should be careful to have all the same checks in your
 * override.
 * @param obs the parcels we received
 * @param left the number of parcels left for the player
 */
void event_parcel_collected( object *obs, int left ) {
    object *failed;
    string str, them;

    str = "Thank you for the business!  ";

    switch( left ) {
      case 0 :
        str += "There are no more parcels";
      break;
      case 1 :
        str += "There is one more parcel";
      break;
      default :
        str += "There are "+query_num(left)+" more parcels";
    }

    str += " left for you to collect now.";

    if( use_servant && servant && ENV(servant) && ENV(servant) == TO )
        servant->do_command("'"+str );
    else
        tell_object( TP, "A postal worker says: "+str+"\n");

    them = ({"it", "all of them"})[query_group(obs)];
    str = ( servant ? servant->the_short() : "A postal worker")+" gives "+
        TP->the_short()+" "+QMS(obs, "a");

    tell_room( TO, str+".\n", TP );

    if( sizeof( failed = filter( obs, (: $1->move($2) :), TP ) ) ) {
        str += ", however you are too burdened to accept "+them+", so "+
            ( servant ? servant->HE : "he")+" places ";
        if( shelf ) {
            obs = filter( failed, (: $1->move($2) :), shelf );
            failed -= obs;
            if( sizeof(failed) )
                str += QMS(failed, "the")+" on "+shelf->the_short();
            if( sizeof( obs ) ) {
                obs->move(TO);
                if( sizeof(failed) )
                    str += " and ";
                str += QMS(obs, "the")+" "+( query_property("here") ||
                    "on the floor");
            }
        } else {
            failed->move(TO);
            str += QMS(obs, "the")+" "+( query_property("here") ||
                "on the floor");
        }
    }

    tell_object( TP, str+".\n");

    if( servant ) {
        servant->do_command("'I hope it's something good!");
        servant->do_command("beam");
    }

} /* event_parcel_collected() */

/**
 * This method notifies the room that we are using a servant NPC.
 * This is needed for open/close checks and for some messages which
 * will be spoken through the NPC for more interactivity.
 */
void set_use_servant() { use_servant = 1; }

/**
 * This method queries whether or not we are using a servant NPC.
 * @return 1 if we are using a servant NPC, 0 if not
 */
int query_use_servant() { return use_servant; }

/**
 * This method sets the servant NPC for the room
 * @param ob the servant NPC to use
 */
void set_servant( object ob ) { servant = ob; }

/**
 * This method returns the servant NPC, if we have one.
 * @return the servant NPC, or 0 none is set, or has been killed
 */
object query_servant() { return servant; }

/**
 * Makes a shelf and moves it to the room, if there is a shelf
 * and a player is too burdened to accept a parcel, the items
 * collected will be moved to it, otherwise they just get moved
 * to the floor.
 * @param short the short desc of the shelf
 * @param long the long desc of the shelf
 * @return the created shelf object for further modifications
 */
object make_shelf( string short, string long ) {
    string *bits;

    shelf = clone_object("/std/surface");

    bits = explode( short, " ");

    shelf->set_name( bits[<1] );

    if( sizeof(bits) > 1 )
        shelf->add_adjective( bits[0..<2] );

    shelf->set_short( short );
    shelf->set_long( long );
    shelf->set_max_weight( 10000 );
    shelf->move(TO);
    shelf->reset_get();

    return shelf;

} /* make_shelf() */

/** @ignore yes */
int do_open_checks() {
    if( !use_servant || ( servant && ENV(servant) && ENV(servant) == TO ) )
        return 1;

    add_failed_mess("There is no-one here to serve you.\n");
    return 0;

} /* do_open_checks() */

/** @ignore yes */
int do_send( object *obs, string where, string to ) {
    if( do_open_checks() ) {
        where = PARCEL_H->query_real_office_name(where);
        tell_object( TP, "You enquire about sending "+QMS(obs, "the")+" to "+
            where+" for "+CAP(lower_case(to))+".\n");
        tell_room( TO, TP->the_short()+" $V$0=enquires,enquire$V$ about "
            "sending a parcel to "+where+".\n", TP );
        return PARCEL_H->do_send( obs, to, where, office_name,
            query_location(), servant );
    }

    return 0;

} /* do_send() */

/** @ignore yes */
int do_cost( object *obs, string where ) {
    if( do_open_checks() ) {
        where = PARCEL_H->query_real_office_name(where);
        tell_object( TP, "You enquire about the cost of sending "+
            QMS(obs, "the")+" to "+where+".\n");
        tell_room( TO, TP->the_short()+" $V$0=enquires,enquire$V$ about "
            "the cost of sending a parcel to "+where+".\n", TP );
        return PARCEL_H->do_cost( obs, office_name, where,
            query_location(), servant );
    }

    return 0;

} /* do_send() */

/** @ignore yes */
int do_collect() {
    if( do_open_checks() ) {
        tell_object( TP, "You enquire about collecting the parcels that have "
            "been sent to you.\n");
        tell_room( TO, TP->the_short()+" $V$0=enquires,enquire$V$ about "
            "collecting the parcels that have been sent to "+
            verbalize("them", TP->HIM )+".\n", TP );
        return PARCEL_H->do_collect( office_name, servant );
    }

    return 0;

} /* do_collect() */

/** @ignore yes */
int do_list_offices() {
    if( do_open_checks() ) {
        tell_object( TP, "You enquire about the list of valid post "
            "offices.\n");
        tell_room( TO, TP->the_short()+" $V$0=enquires,enquire$V$ about "
            "the list of valid post offices.\n", TP );
        return PARCEL_H->do_list( servant );
    }

    return 0;

} /* do_list() */

/** @ignore */
void init() {
    add_command("list", "offices", (: do_list_offices() :) );
    add_command("send",
        "<indirect:object:me> to <string'post office'> for <word'player'>",
        (: do_send( $1, $4[1], $4[2] ) :) );
    add_command("cost",
        "<indirect:object:me> to <string'post office'>",
        (: do_cost( $1, $4[1] ) :) );
    add_command("collect", "");
} /* init() */

/** @ignore yes */
mixed stats() {
    return ::stats() + ({
        ({"office name", office_name }),
        ({"location", query_location() }),
        ({"using servant", use_servant ? "yes" : "no" }),
        ({"servant", servant }),
        ({"shelf", shelf }),
    });
} /* stats() */