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/
/**
 * The basic container inheritable, please note this is *not* a container
 * like a bucket.  This now allows things inside the container to
 * inform us that they should be used as part of the inventory of this
 * object.  This means the contents of containers will look like they
 * are not inside containers to the outside world.
 * @author Pinkfish
 * @see /obj/container.c
 * @see /obj/baggage.c
 * @see /obj/vessel.c
 * @see /obj/clothing.c
 */

#include <move_failures.h>
#include <player.h>

inherit OBJECT_OBJ;
inherit "/std/basic/cute_look";
inherit "/std/basic/export_inventory";

nosave int max_weight, loc_weight, prevent_insert;

/*
 * This changes the containers properties based on if
 * something with get/drop properties is placed inside it.
 */
private nosave int int_pickup_flag;
private nosave string ownership;
private nosave int n_tracked_items;
private nosave int tracking;

void create() {
    registered_containers = ({ });
    n_tracked_items = 0;
    tracking = 1;
    export_inventory::create();
    object::create();
} /* create() */

/**
 * This method returns the maximum amount of weight that can
 * be carried in this container.
 * @return the maximum weight
 * @see set_max_weight()
 */
int query_max_weight() { return max_weight; }

/**
 * This method sets the maximum amount of weight that can
 * be carried in this container.
 * @param number the new maximum weight
 * @see query_max_weight()
 */
void set_max_weight( int number ) { max_weight = number; }

/**
 * This method returns the current local weight in this
 * container.
 * @return the local weight
 */
int query_loc_weight() { return loc_weight; }

/**
 * This method determines the current local weight from all the
 * objects inside the conatiner
 * @see query_loc_weight()
 */
void update_loc_weight() {
    object thing;

    loc_weight = 0;

    foreach ( thing in INV(TO) )
        loc_weight += thing->query_complete_weight();

} /* update_loc_weight() */

/**
 * This method returns the complete weight of the object.  This is the
 * weight of the container itself, plus the weight of the things
 * inside it
 * @return the complete_weight()
 * @see /std/basic/misc->query_weight()
 * @see query_loc_weight()
 */
int query_complete_weight() {
    return ::query_complete_weight() + loc_weight;
} /* query_complete_weight() */

/**
 * This method is called in the move functions, it adds extra
 * weight onto the object when something is moved inside it.
 * @return 1 if successfuly added
 * @param n the amount to add
 * @see /std/basic/misc->query_weight()
 */
int add_weight( int n ) {
    if( prevent_insert )
        return 0;

    if( !max_weight ) {
        loc_weight += n;
        return 1;
    }

    if( n + loc_weight > max_weight )
        return 0;

    if( !environment() ) {
        loc_weight += n;
        return 1;
    }

    if( !environment()->add_weight( n ) )
        return 0;

    loc_weight += n;
    return 1;

} /* add_weight() */

/**
 * This returns who owns the container, if it set to 0 then no one
 * owns it.  This is used in the theft determination for the object.
 * @return who owns the container
 * @see set_ownership()
 */
string query_ownership() { return ownership; }

/**
 * This sets who owns the container, if it set to 0 then no one
 * owns it.  This is used in the theft determination for the object.
 * @param word who owns the container
 * @see query_ownership()
 */
void set_ownership( string word ) { ownership = word; }

/**
 * This method checks to see if the object can be taken out of
 * us.
 * @param thing the object coming out
 * @param flag the move flag
 * @param dest the destination object
 * @see /std/basic/move.c
 * @return 1 if it can be taken out, 0 if not.
 */
int test_remove( object thing, int flag, mixed dest ) {
    object owner;

    if( !ownership || !TP )
        return 1;

    if( objectp( dest ) )
        dest = file_name( dest );

    if( dest == "/room/rubbish")
        return 1;

    if( TP->query_name() == ownership || !PLAYER_H->test_user( ownership ) )
        return 1;

    if( owner = find_player( ownership ) ) {
        if( !pk_check( TP, owner ) ) {
            event( ENV(TP), "theft", TP, TO, ({ thing }) );
            return 1;
        }
    }

    write("An unseen force stays your hand.\n");
    return 0;

} /* test_remove() */

/**
 * This method allows things to be added into us.  If we have an
 * environment check that for the ability to add into us.
 * @param ob the object being added
 * @param flag the add flags
 * @see /std/basic/move.c
 * @see add_weight()
 */
int test_add( object ob, int flag ) { return 1; }

/**
 * This prevents this container from being added into other containers.
 * @see reset_prevent_insert()
 * @see query_prevent_insert()
 */
int set_prevent_insert() { prevent_insert = 1; }

/**
 * This allows this container to be added into other containers (default).
 * @see set_prevent_insert()
 * @see query_prevent_insert()
 */
int reset_prevent_insert() { prevent_insert = 0; }

/**
 * If this is true, this container cannot be added into other
 * containers.
 * @see reset_prevent_insert()
 * @see set_prevent_insert()
 */
int query_prevent_insert() { return prevent_insert; }

/** @ignore yes */
varargs int move( mixed dest, mixed messin, mixed messout ) {
    if( prevent_insert && loc_weight && !living(dest) && ENV(dest) )
        return MOVE_INVALID_DEST;
    return object::move( dest, messin, messout );
} /* move() */

/**
 * This method finds the matching objects inside this object
 * that are visible to the looker.  This will also use the
 * registered containers and add them into the array returned
 * (if visible and contained in the object).
 * @see /secure/simul_efun->find_match()
 * @param words the words matched on
 * @param looker who is looking
 * @see add_inventory_container()
 */
object *find_inv_match( string words, object looker ) {
    return filter( INV(TO), (: $1->short(0) &&
        ( !$2 || $1->query_visible($2) ) :), looker );
} /* find_inv_match() */

/**
 * This method handles moving objects into the inventory from an auto
 * load.  This should be over ridden by things inheriting us to
 * make sure that the objects can be moved into the inventory.  It
 * should handle the bypassing of open/close/locked etc flags.
 * @param ob the object to move into ourselves
 */
protected int handle_restore_inventory( object ob ) {
    // The standard container needs to do nothing special.
    int move_flag;

    ob->disable_item_tracking();
    move_flag = ob->move(TO);
    ob->enable_item_tracking();

    return move_flag;

} /* handle_restore_inventory() */

/** @ignore yes */
mixed stats() {
    return ::stats() + ({
        ({"loc_weight", query_loc_weight() }),
        ({"max_weight", query_max_weight() }),
        ({"export invent", query_can_export_inventory() }),
    });
} /* stats() */

/** @ignore yes */
mapping int_query_static_auto_load() {
    return ([
        "::" : ::int_query_static_auto_load(),
        "max weight" : max_weight,
        "prevent insert" : prevent_insert,
        "can export inventory" : can_export_inventory,
    ]);
} /* int_query_static_auto_load() */

/** @ignore yes */
mapping query_dynamic_auto_load() {
    mixed inventory;

    // Check the player's object.
    if( TP )
        catch( inventory = TP->create_auto_load( INV(TO) ) );

    // Try the autoload object.
    if( !inventory )
        catch( inventory = AUTO_LOAD_OB->create_auto_load( INV(TO) ) );

    // Try the main player object.
    if( !inventory )
        catch( inventory = PLAYER_OBJ->create_auto_load( INV(TO) ) );

    return ([
        "::" : object::query_dynamic_auto_load(),
        "inv" : inventory,
    ]);

} /* query_dynamic_auto_load() */

/**
 * This method enables item tracking
 * @see event_enter_tracked_item
 * @see disable_item_tracking
 */
nomask void enable_item_tracking() { tracking = 1; }

/**
 * This method disables item tracking
 * @see event_enter_tracked_item
 * @see enable_item_tracking
 */
nomask void disable_item_tracking() { tracking = 0; }

/**
 * This method handles the movement of the containers of this object.
 * Tracked items want to be notified if the container moves or anything
 * containing it does.  The movement of the outmost moving container is
 * propagated down to all tracked items.
 * @param mover the outermost container object that moved
 * @param from the start environment of the outermost container
 * @param to the destination of the outermost container
 * @see event_enter_tracked_item
 */
nomask void event_container_move( object mover, mixed from, mixed to ) {
    if( n_tracked_items )
        all_inventory()->event_container_move( mover, from, to );
} /* event_container_move() */

/**
 * This method is called from move to notify any tracked items contained of
 * the move using event_container_moved.
 * @param from start
 * @param to destination
 */
void event_move_object( mixed from, mixed to ) {
    if( n_tracked_items && tracking && !interactive() ) {
        all_inventory()->event_container_move( TO, from, to );
        if( objectp(from) )
            from->remove_tracked_items( n_tracked_items );
        if( objectp(to) )
            to->add_tracked_items( n_tracked_items );
    }
} /* event_move_object() */

/**
 * This method is called to adjust the status reason.
 * occurences.
 * @see event_buried
 * @see event_player_quit
 * @see event_enter_tracked_item
 */
nomask void set_tracked_item_status_reason( string reason ) {
    if( n_tracked_items )
        all_inventory()->set_tracked_item_status( reason );
} /* set_tracked_item_status_reason() */

/**
 * This method handles the addition of tracked items.
 * Tracked items want to be notified if the container moves.
 * @param n_items the number of tracked items added
 * @see remove_tracked_items
 * @see event_container_move
 */
nomask void add_tracked_items( int n_items ) {
    n_tracked_items += n_items;
    if( environment() )
        environment()->add_tracked_items( n_items );
} /* add_tracked_items() */

/**
 * This method handles the removal of tracked items.
 * Tracked items want to be notified if the container moves.
 * @param n_items the number of tracked items  removed
 * @see add_tracked_items
 * @see event_container_move
 */
nomask void remove_tracked_items( int n_items ) {
    n_tracked_items -= n_items;
    if( environment() )
        environment()->remove_tracked_items( n_items );
} /* remove_tracked_items() */

/**
 * This method returns the number of tracked item contained.
 * Tracked items want to be notified if the container moves.
 * @see add_tracked_items
 * @see event_container_move
 */
nomask int query_tracked_items() { return n_tracked_items; }

/**
 * This method allows the container to have stuff inside it checked.
 * @param looker the person doing the checking
 * @return 1 on success, 0 on failur
 */
int can_find_match_recurse_into(object looker) {
    object env;

    // If the looked is one of our environments, then yes, they can.
    env = environment();

    while( env && !living(env) && env != looker && env != ENV(looker) )
        env = ENV(looker);

    return env == looker || env == ENV(looker);

} /* can_find_match_recurse_into() */

/**
 * This method checks to see if the find match code can actually
 * reference this object inside us.
 * @param thing the thing to reference
 * @param looker the person looking at it
 * @return 1 if they can, 0 if they cannot
 */
int can_find_match_reference_inside_object( object thing, object looker ) {
    return 1;
} /* can_find_match_reference_inside_object() */

/** @ignore yes */
void init_dynamic_arg( mapping bing ) {
    function f;

    if( bing[ "::" ] )
        ::init_dynamic_arg( bing["::"] );

    // Potential order of inventory generation problem here.
    // The upper parts of the container don't initialise until after we return.
    if( bing["inv"] ) {
        f = (: handle_restore_inventory($1) :);
        if( !player )
            player = TP;
        if( player )
            player->load_auto_load_to_inventory( bing["inv"], TO, player, f );
        else
            PLAYER_OBJ->load_auto_load_to_inventory( bing["inv"], TO, TP, f );
    }

} /* init_dynamic_arg() */

/** @ignore yes */
void init_static_arg( mapping bing ) {
    if( bing["::"] )
        ::init_static_arg( bing["::"] );

    if( !undefinedp( bing["max weight"] ) )
        max_weight = bing["max weight"];

    if( !undefinedp( bing["prevent insert"] ) )
        prevent_insert = bing["prevent insert"];

    if( !undefinedp( bing["can export inventory"] ) )
        can_export_inventory = bing["can export inventory"];

} /* init_static_arg() */

/** @ignore yes */
mixed query_static_auto_load() {
    if( base_name(TO) == __FILE__[0..<3] )
        return int_query_static_auto_load();
    return ([ ]);
} /* query_static_auto_load() */

/** @ignore yes */
void dest_me() {
    all_inventory(TO)->dest_me();
    ::dest_me();
} /* dest_me() */