final_realms_fluffos_v1/
final_realms_fluffos_v1/bin/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/ChangeLog.old/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/Win32/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/compat/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/compat/simuls/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/include/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/clone/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/command/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/data/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/etc/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/include/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/inherit/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/inherit/master/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/log/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/tests/compiler/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/tests/efuns/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/tests/operators/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/u/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/tmp/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/windows/
final_realms_fluffos_v1/lib/baseobs/guilds/
final_realms_fluffos_v1/lib/baseobs/misc/
final_realms_fluffos_v1/lib/baseobs/races/shadows/
final_realms_fluffos_v1/lib/cmds/god/
final_realms_fluffos_v1/lib/cmds/handlers/
final_realms_fluffos_v1/lib/cmds/handlers/cmds/
final_realms_fluffos_v1/lib/d/heaven/
final_realms_fluffos_v1/lib/d/heaven/heaven/ave/
final_realms_fluffos_v1/lib/d/mudlib/
final_realms_fluffos_v1/lib/d/newbie/
final_realms_fluffos_v1/lib/d/newbie/docs/
final_realms_fluffos_v1/lib/d/newbie/drow/armour/
final_realms_fluffos_v1/lib/d/newbie/drow/items/
final_realms_fluffos_v1/lib/d/newbie/drow/mobs/
final_realms_fluffos_v1/lib/d/newbie/drow/oldmobs/
final_realms_fluffos_v1/lib/d/newbie/drow/weapons/
final_realms_fluffos_v1/lib/d/newbie/duergar/weapons/
final_realms_fluffos_v1/lib/d/newbie/dwarf/weapons/
final_realms_fluffos_v1/lib/d/newbie/elf/cafe/
final_realms_fluffos_v1/lib/d/newbie/elf/chars/equip/
final_realms_fluffos_v1/lib/d/newbie/elf/items/armours/
final_realms_fluffos_v1/lib/d/newbie/elf/items/obj/
final_realms_fluffos_v1/lib/d/newbie/elf/items/weapons/
final_realms_fluffos_v1/lib/d/newbie/elf/quick_fix/
final_realms_fluffos_v1/lib/d/newbie/gnome/armour/
final_realms_fluffos_v1/lib/d/newbie/gnome/buildings/
final_realms_fluffos_v1/lib/d/newbie/gnome/items/
final_realms_fluffos_v1/lib/d/newbie/gnome/npcs/clones/
final_realms_fluffos_v1/lib/d/newbie/gnome/rooms/northrooms/
final_realms_fluffos_v1/lib/d/newbie/gnome/weapons/
final_realms_fluffos_v1/lib/d/newbie/goblin/armour/
final_realms_fluffos_v1/lib/d/newbie/goblin/items/
final_realms_fluffos_v1/lib/d/newbie/grads/log/
final_realms_fluffos_v1/lib/d/newbie/grads/npcs/
final_realms_fluffos_v1/lib/d/newbie/grads/rooms/
final_realms_fluffos_v1/lib/d/newbie/grads/rooms/cave1/
final_realms_fluffos_v1/lib/d/newbie/grads/temp/
final_realms_fluffos_v1/lib/d/newbie/guests/weapons/
final_realms_fluffos_v1/lib/d/newbie/half-elf/items/
final_realms_fluffos_v1/lib/d/newbie/half-elf/newroomss/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/castle/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/drows/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/savannah/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/secret/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/town/
final_realms_fluffos_v1/lib/d/newbie/halfling/
final_realms_fluffos_v1/lib/d/newbie/halfling/misc/
final_realms_fluffos_v1/lib/d/newbie/halfling/rooms/cave/
final_realms_fluffos_v1/lib/d/newbie/human/
final_realms_fluffos_v1/lib/d/newbie/human/armour/
final_realms_fluffos_v1/lib/d/newbie/human/monsters/
final_realms_fluffos_v1/lib/d/newbie/human/obj/
final_realms_fluffos_v1/lib/d/newbie/human/weapons/
final_realms_fluffos_v1/lib/d/newbie/lizard/armour/
final_realms_fluffos_v1/lib/d/newbie/lizard/items/
final_realms_fluffos_v1/lib/d/newbie/lizard/underwater/
final_realms_fluffos_v1/lib/d/newbie/lizard/weapons/
final_realms_fluffos_v1/lib/d/newbie/logs/
final_realms_fluffos_v1/lib/d/newbie/new_halfelf/
final_realms_fluffos_v1/lib/d/newbie/new_halfelf/npcs/
final_realms_fluffos_v1/lib/d/newbie/newdrow/npcs/
final_realms_fluffos_v1/lib/d/newbie/newdrow/rooms/
final_realms_fluffos_v1/lib/d/newbie/newelf/
final_realms_fluffos_v1/lib/d/newbie/newelf/chars/
final_realms_fluffos_v1/lib/d/newbie/newelf/npcs/
final_realms_fluffos_v1/lib/d/newbie/newelf/npcs/recopied/
final_realms_fluffos_v1/lib/d/newbie/newelf/obj/
final_realms_fluffos_v1/lib/d/newbie/newelf/quest_docs./
final_realms_fluffos_v1/lib/d/newbie/newken/
final_realms_fluffos_v1/lib/d/newbie/newken/chars/
final_realms_fluffos_v1/lib/d/newbie/newken/misc/
final_realms_fluffos_v1/lib/d/newbie/newken/npcs/
final_realms_fluffos_v1/lib/d/newbie/newken/obj/
final_realms_fluffos_v1/lib/d/newbie/newliz/
final_realms_fluffos_v1/lib/d/newbie/newliz/cave/
final_realms_fluffos_v1/lib/d/newbie/newliz/npcs/
final_realms_fluffos_v1/lib/d/newbie/orc/items/misc/
final_realms_fluffos_v1/lib/d/newbie/orc/items/weapons/
final_realms_fluffos_v1/lib/d/newbie/orc/tower/
final_realms_fluffos_v1/lib/d/vehicle/
final_realms_fluffos_v1/lib/doc/
final_realms_fluffos_v1/lib/doc/driver/
final_realms_fluffos_v1/lib/doc/driver/concepts/
final_realms_fluffos_v1/lib/doc/driver/driver/
final_realms_fluffos_v1/lib/doc/driver/efuns/arrays/
final_realms_fluffos_v1/lib/doc/driver/efuns/bitstrings/
final_realms_fluffos_v1/lib/doc/driver/efuns/communication/
final_realms_fluffos_v1/lib/doc/driver/efuns/core/
final_realms_fluffos_v1/lib/doc/driver/efuns/debugging/
final_realms_fluffos_v1/lib/doc/driver/efuns/filesystem/
final_realms_fluffos_v1/lib/doc/driver/efuns/interactive/
final_realms_fluffos_v1/lib/doc/driver/efuns/mappings/
final_realms_fluffos_v1/lib/doc/driver/efuns/objects/
final_realms_fluffos_v1/lib/doc/driver/efuns/security/
final_realms_fluffos_v1/lib/doc/driver/efuns/strings/
final_realms_fluffos_v1/lib/doc/driver/efuns/system/
final_realms_fluffos_v1/lib/doc/driver/efuns/types/
final_realms_fluffos_v1/lib/doc/driver/lpc/constructs/
final_realms_fluffos_v1/lib/doc/driver/lpc/types/
final_realms_fluffos_v1/lib/doc/driver/platforms/
final_realms_fluffos_v1/lib/doc/lpc/
final_realms_fluffos_v1/lib/doc/mail/
final_realms_fluffos_v1/lib/doc/man/
final_realms_fluffos_v1/lib/doc/man/html/
final_realms_fluffos_v1/lib/doc/man/html/applies/
final_realms_fluffos_v1/lib/doc/man/html/applies/parsing/
final_realms_fluffos_v1/lib/doc/man/html/driver/
final_realms_fluffos_v1/lib/doc/man/html/efuns/
final_realms_fluffos_v1/lib/doc/man/html/efuns/arrays/
final_realms_fluffos_v1/lib/doc/man/html/efuns/buffers/
final_realms_fluffos_v1/lib/doc/man/html/efuns/compile/
final_realms_fluffos_v1/lib/doc/man/html/efuns/floats/
final_realms_fluffos_v1/lib/doc/man/html/efuns/functions/
final_realms_fluffos_v1/lib/doc/man/html/efuns/general/
final_realms_fluffos_v1/lib/doc/man/html/efuns/numbers/
final_realms_fluffos_v1/lib/doc/man/html/efuns/parsing/
final_realms_fluffos_v1/lib/doc/man/local/
final_realms_fluffos_v1/lib/doc/man/local/applies/
final_realms_fluffos_v1/lib/doc/man/local/applies/interactive/
final_realms_fluffos_v1/lib/doc/man/local/applies/master/
final_realms_fluffos_v1/lib/doc/man/local/concepts/
final_realms_fluffos_v1/lib/doc/man/local/defines/
final_realms_fluffos_v1/lib/doc/man/local/driver/
final_realms_fluffos_v1/lib/doc/man/local/efuns/
final_realms_fluffos_v1/lib/doc/man/local/efuns/arrays/
final_realms_fluffos_v1/lib/doc/man/local/efuns/buffers/
final_realms_fluffos_v1/lib/doc/man/local/efuns/calls/
final_realms_fluffos_v1/lib/doc/man/local/efuns/compile/
final_realms_fluffos_v1/lib/doc/man/local/efuns/filesystem/
final_realms_fluffos_v1/lib/doc/man/local/efuns/floats/
final_realms_fluffos_v1/lib/doc/man/local/efuns/functions/
final_realms_fluffos_v1/lib/doc/man/local/efuns/general/
final_realms_fluffos_v1/lib/doc/man/local/efuns/interactive/
final_realms_fluffos_v1/lib/doc/man/local/efuns/internals/
final_realms_fluffos_v1/lib/doc/man/local/efuns/mappings/
final_realms_fluffos_v1/lib/doc/man/local/efuns/mudlib/
final_realms_fluffos_v1/lib/doc/man/local/efuns/numbers/
final_realms_fluffos_v1/lib/doc/man/local/efuns/objects/
final_realms_fluffos_v1/lib/doc/man/local/efuns/parsing/
final_realms_fluffos_v1/lib/doc/man/local/efuns/sockets/
final_realms_fluffos_v1/lib/doc/man/local/efuns/strings/
final_realms_fluffos_v1/lib/doc/man/local/efuns/system/
final_realms_fluffos_v1/lib/doc/man/local/historical/
final_realms_fluffos_v1/lib/doc/man/local/lfun/QC/
final_realms_fluffos_v1/lib/doc/man/local/lfun/events/
final_realms_fluffos_v1/lib/doc/man/local/lfun/monster/
final_realms_fluffos_v1/lib/doc/man/local/lfun/properties/
final_realms_fluffos_v1/lib/doc/man/local/lpc/
final_realms_fluffos_v1/lib/doc/man/local/lpc/constructs/
final_realms_fluffos_v1/lib/doc/man/local/lpc/types/
final_realms_fluffos_v1/lib/doc/man/local/standards/
final_realms_fluffos_v1/lib/doc/man/local/tutorials/
final_realms_fluffos_v1/lib/doc/man/local/tutorials/basic/
final_realms_fluffos_v1/lib/doc/man/local/tutorials/intermediate/
final_realms_fluffos_v1/lib/doc/man/mudos/applies/
final_realms_fluffos_v1/lib/doc/man/mudos/applies/interactive/
final_realms_fluffos_v1/lib/doc/man/mudos/applies/parsing/
final_realms_fluffos_v1/lib/doc/man/mudos/concepts/
final_realms_fluffos_v1/lib/doc/man/mudos/driver/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/arrays/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/buffers/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/calls/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/compile/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/filesystem/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/floats/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/functions/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/general/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/mappings/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/mixed/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/mudlib/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/numbers/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/parsing/
final_realms_fluffos_v1/lib/doc/man/mudos/lpc/constructs/
final_realms_fluffos_v1/lib/doc/man/mudos/lpc/types/
final_realms_fluffos_v1/lib/doc/races/
final_realms_fluffos_v1/lib/doc/races/old_race/
final_realms_fluffos_v1/lib/global/virtual/
final_realms_fluffos_v1/lib/global/wiz_backup/
final_realms_fluffos_v1/lib/net/config/
final_realms_fluffos_v1/lib/net/daemon/chars/
final_realms_fluffos_v1/lib/net/inherit/
final_realms_fluffos_v1/lib/net/intermud3/
final_realms_fluffos_v1/lib/net/intermud3/cmds/
final_realms_fluffos_v1/lib/net/intermud3/save/
final_realms_fluffos_v1/lib/net/intermud3/services/
final_realms_fluffos_v1/lib/net/obj/
final_realms_fluffos_v1/lib/net/old/
final_realms_fluffos_v1/lib/net/old/intermud/
final_realms_fluffos_v1/lib/net/old/intermud/adm/
final_realms_fluffos_v1/lib/net/old/intermud/services/
final_realms_fluffos_v1/lib/net/old/intermud/udp/
final_realms_fluffos_v1/lib/net/virtual/
final_realms_fluffos_v1/lib/obj/b_day/
final_realms_fluffos_v1/lib/obj/chars/
final_realms_fluffos_v1/lib/obj/handlers/lists/
final_realms_fluffos_v1/lib/obj/handlers/useless/
final_realms_fluffos_v1/lib/obj/monsters/
final_realms_fluffos_v1/lib/obj/roomgen/
final_realms_fluffos_v1/lib/obj/soul/
final_realms_fluffos_v1/lib/obj/vegetation/
final_realms_fluffos_v1/lib/obj/weapons/oldsys/
final_realms_fluffos_v1/lib/open/
final_realms_fluffos_v1/lib/players/g/
final_realms_fluffos_v1/lib/releasefiles/d/heaven/
final_realms_fluffos_v1/lib/releasefiles/d/mudlib/
final_realms_fluffos_v1/lib/releasefiles/d/newbie/
final_realms_fluffos_v1/lib/releasefiles/doc/
final_realms_fluffos_v1/lib/releasefiles/players/g/
final_realms_fluffos_v1/lib/releasefiles/save/
final_realms_fluffos_v1/lib/releasefiles/save/environ/
final_realms_fluffos_v1/lib/releasefiles/save/roomgen/
final_realms_fluffos_v1/lib/releasefiles/secure/
final_realms_fluffos_v1/lib/releasefiles/w/
final_realms_fluffos_v1/lib/releasefiles/w/god/
final_realms_fluffos_v1/lib/room/
final_realms_fluffos_v1/lib/save/
final_realms_fluffos_v1/lib/save/environ/
final_realms_fluffos_v1/lib/save/roomgen/
final_realms_fluffos_v1/lib/scripts/
final_realms_fluffos_v1/lib/secure/crerem/
final_realms_fluffos_v1/lib/secure/dom/
final_realms_fluffos_v1/lib/secure/log/
final_realms_fluffos_v1/lib/secure/misc/
final_realms_fluffos_v1/lib/std/adnd/
final_realms_fluffos_v1/lib/std/commands/shadows/
final_realms_fluffos_v1/lib/std/creator/
final_realms_fluffos_v1/lib/std/curses/
final_realms_fluffos_v1/lib/std/curses/old_sys/
final_realms_fluffos_v1/lib/std/curses/shadows/
final_realms_fluffos_v1/lib/std/dom/
final_realms_fluffos_v1/lib/std/effects/
final_realms_fluffos_v1/lib/std/effects/healing/
final_realms_fluffos_v1/lib/std/effects/other/
final_realms_fluffos_v1/lib/std/effects/poisons/
final_realms_fluffos_v1/lib/std/environ/
final_realms_fluffos_v1/lib/std/guilds/
final_realms_fluffos_v1/lib/std/guilds/priests/samples/
final_realms_fluffos_v1/lib/std/guilds/wizards/
final_realms_fluffos_v1/lib/std/living/baldy/
final_realms_fluffos_v1/lib/std/living/divstuff/
final_realms_fluffos_v1/lib/std/paran/
final_realms_fluffos_v1/lib/std/poisons/
final_realms_fluffos_v1/lib/std/poisons/shadows/
final_realms_fluffos_v1/lib/std/poisons/weapons/
final_realms_fluffos_v1/lib/std/race_groups/
final_realms_fluffos_v1/lib/std/room/
final_realms_fluffos_v1/lib/std/room/old/
final_realms_fluffos_v1/lib/std/rooms/
final_realms_fluffos_v1/lib/std/shadows/
final_realms_fluffos_v1/lib/std/shadows/test_shad/
final_realms_fluffos_v1/lib/std/socket/
final_realms_fluffos_v1/lib/std/spells/
final_realms_fluffos_v1/lib/std/vaults/
final_realms_fluffos_v1/lib/tmp/
final_realms_fluffos_v1/lib/w/
final_realms_fluffos_v1/lib/w/god/
final_realms_fluffos_v1/old/
final_realms_fluffos_v1/win32/
/*
 * Wonderflug, 1997.
 * - Fixed weight once and for all.  We have the invariant that
 *   contents_weight is ALWAYS correct, so we need not recalculate it
 *   constantly, we only need update it constantly.  Also, max_weight
 *   may never be negative.
 */

#include "move_failures.h"

inherit "std/object";
inherit "std/basic/cute_look";

int max_weight;              /* maximum allowable weight, 0 = no limit */
static int contents_weight;  /* current contained weight */

void create() 
{
  max_weight = 0;
  contents_weight = 0;
  object::create();
} /* create() */

int query_max_weight() { return max_weight; }
int query_contents_weight() { return contents_weight; }
int query_empty_weight() { return ::query_weight(); }
int query_weight() 
{ 
  return contents_weight + ::query_weight();
}


/****** The following functions may, in effect, have force_ preceding their
 ****** names.  They adjust things no matter what, and then remove any
 ****** inconsistencies afterward.
 ******/

void set_max_weight( int newmax ) 
{ 
  if ( newmax < 0 )
    newmax = 1;
  else
    max_weight = newmax; 
  this_object()->rebalance( ({ }) );
}

void adjust_max_weight( int amount )
{
  /* if it's adjusting, and hitting 0, we have it be 1, in fact, since
   * 0 is a reserved value for max_weight.  It's not likely someone is
   * setting the object to have unlimited weight by using adjust_max_weight
   */
  if ( max_weight + amount == 0 )
    return set_max_weight( 1 );
  return set_max_weight( max_weight + amount );
}

/* NOT to be used in any domain code */
void adjust_contained_weight(int n) 
{
  contents_weight += n;
  /* propogate the change to the environment */
  if ( environment() )
    environment()->adjust_contained_weight( n );
}

/* NOT to be used in any domain code */
void mudlib_adjust_contained_weight(int n)
{
  contents_weight += n;
}

/****** This function is only to be used rarely, it is expensive, but
 ****** rebalances things completely.  Excess objects get expelled to
 ****** the environment, and then the environment gets rebalanced.
 ****** Preferred are objects already expelled somewhere or
 ****** suspected to be causing the inconsistency (eg, they've just
 ****** changed weight).  However they must already have been moved
 ****** into this_object().  Note cursed objects (in use and unable
 ****** to remove from use) will never be expelled, regardless of
 ****** preferred status.
 ******/
void rebalance( object* preferred ) 
{
  object* stuff;
  int i;
  int curr_weight = contents_weight;

  if ( !max_weight || max_weight >= contents_weight )
    return ;

  if ( !preferred )
    preferred = ({ });

  /* first check if throwing out some preferred stuff rebalances things */
  preferred = filter_array( preferred, "check_rebalanceable", this_object() );
  for ( i=0; i<sizeof( preferred ); i++ )
  {
    curr_weight -= preferred[i]->query_weight();
    if ( max_weight >= curr_weight )
    {
      /* we can let everything else stay */
      this_object()->rebalance_move( preferred[0..i] );
      return ;
    }
  }

  /* preferred didn't cut it, we must throw out some additional stuff now.
   */
  stuff = all_inventory(this_object()) - preferred;
  stuff = filter_array( stuff, "check_rebalanceable", this_object() );

  for(i=0;i<sizeof(stuff);i++)
  {
    curr_weight -= stuff[i]->query_weight();
    if ( max_weight >= curr_weight )
    {
      this_object()->rebalance_move( preferred + stuff[0..i] );
      return ;
    }
  }

  /* if we reach here.. we're throwing out everything and still not good
   * enough.  This is probably a bad sign, but may just mean they're
   * overloaded with cursed items.  In any case, we'll let them keep on.
   */
  this_object()->rebalance_move( preferred + stuff );
}  

int check_rebalanceable( object ob )
{
  if ( !ob->droppable() ||
       (ob->query_in_use() && !ob->set_in_use(0)) )
    return 0;
  return 1;
}
  

/* Dumps all the objects to the environment, or crushes them
 * if there's no environment 
 */
void rebalance_move( object* obs )
{
  if ( environment() )
  {
    obs->mudlib_move( environment() );
    environment()->rebalance( obs + ({ this_object() }) );
  }
  else
    this_object()->rebalance_crush( obs );
}

/* Destroys all the objects; this happens when there isn't enough
 * contents space for all the contents, and there is no environment
 * to expell the objects to. 
 */
void rebalance_crush( object* obs )
{
  int i;

  tell_room( this_object(), query_multiple_short(obs)+" are crushed!\n");
  for( i=0; i<sizeof(obs); i++ )
    if ( living(obs[i]) )
      obs[i]->do_death(this_object());
    else
      obs[i]->dest_me();
}



/****** The permission functions.  Determine whether the proposed action
 ****** would cause inconsistency.
 ******/

/*
 * test_add/remove_object; these perform all the necessary checks as to
 * whether an object may be added/removed from the container.  Return
 * a move_failures.h return code
 *
 * NOTE the default here, is that non-droppable items may
 * be removed, and non-gettable items may be added.  
 * This gets overridden in living objects.  (see /std/living/living.c)
 */
int test_remove_object(object ob) 
{ 
  if ( !max_weight )
    return MOVE_OK;

  if ( contents_weight - ob->query_weight() > max_weight )
  {
    /* it might be cursed objects that are the real cause of the
     * overbalance; in that case, we allow objects to be removed
     */
    if ( contents_weight < max_weight )
      /* the object has negative weight and would overbalance us */
      return MOVE_TOO_HEAVY_FOR_SOURCE;
  }

  if ( environment() &&
       !environment()->test_adjust_contained_weight( -ob->query_weight() ) )
    return MOVE_TOO_HEAVY_FOR_SOURCE;
  else
    return MOVE_OK;
}

int test_add_object(object ob)
{

  if ( !max_weight )
    return MOVE_OK;

  if ( contents_weight + ob->query_weight() > max_weight )
    return MOVE_TOO_HEAVY_FOR_DEST;

  if ( environment() &&
       !environment()->test_adjust_contained_weight( ob->query_weight() ) )
    return MOVE_TOO_HEAVY_FOR_DEST;
  else
    return MOVE_OK;
}

/*
 * test_swallow/expell_object; these work much as add/remove, but imply
 * that the object is being received/moved from/to the immediate environment,
 * so the weight constraints aren't the same; ie, if we asked the environment
 * if adding the additional weight was ok, we would (faultily) require
 * extra free space in the environment to perform the move; but in effect, the
 * environment sees no change of weight.  Note this is different, if there
 * is a weight reduction applied.  See /obj/container.c
 */
int test_swallow_object( object ob )
{
  if ( !max_weight )
    return MOVE_OK;

  if ( contents_weight + ob->query_weight() > max_weight )
    return MOVE_TOO_HEAVY_FOR_DEST;

  return MOVE_OK;
}

int test_expell_object( object ob )
{
  if ( !max_weight )
    return MOVE_OK;

  if ( contents_weight - ob->query_weight() > max_weight 
       && contents_weight <= max_weight )
    return MOVE_TOO_HEAVY_FOR_SOURCE;

  return MOVE_OK;
}

/*
 * test_adjust_contained_weight; test if the given change to the contained
 * weight would cause an inconsistency. 1=no, ie allowable, 0=yes
 */
int test_adjust_contained_weight( int n )
{
  if ( contents_weight + n > max_weight )
    return 0;

  if ( environment() )
    return environment()->test_adjust_contained_weight( n );
  else
    return 1;
}



/****** Miscellaneous stuff */

object *find_inv_match(string str) 
{
  return all_inventory(this_object());
} /* find_inv_match() */

mixed stats() 
{
  return ::stats() + 
  ({
    ({ "contents_weight", query_contents_weight(), }),
    ({ "max_weight", query_max_weight(), }),
  });
} /* stats() */

int transfer_all_to(object dest) 
{
  object *ob;
  int i;
 
  ob = all_inventory(this_object());
  ob -= ({ dest });
  for (i=0;i<sizeof(ob);i++)
    ob[i]->move(dest);

  if (first_inventory(this_object())) 
    return 0;
  return 1;
} /* transfer_all_to() */

string long(string str, int dark) 
{
  string ret;

  ret = ::long(str, dark);
  ret += calc_extra_look();
  /* this is stupid.  corpse.c should redefine long() itself. 
   *if(this_object()->query_corpse())
   *  ret += (string)this_object()->query_living_contents(0);
   *
   * else
   */
  ret += query_contents(short(dark)+" contains:\n", all_inventory() - 
                        query_labels());
  return ret;
} /* long() */


/****** Autoload stuff */

/*
 * Derived can be:
 *   -1 = unknown, check
 *    0 = not derived
 *    1 = derived
 */
mapping query_auto_load_attributes( int derived )
{
  mapping tmp;

  if ( derived < 0 )
  {
    if (file_name(this_object())[0..13] == "/std/container")
      derived = 0;
    else
      derived = 1;
  }

  tmp = ::query_auto_load_attributes( derived );

  if ( !derived )
    return 
      ([
        "::" : tmp,
        "max weight" : max_weight,
        "inv" : "/global/auto_load"->create_auto_load(
                    all_inventory(this_object()) - labels ),
      ]);
  else
    return
      ([
        "::" : tmp,
        "inv" : "/global/auto_load"->create_auto_load(
                    all_inventory(this_object()) - labels ),
      ]);
}

void init_auto_load_attributes( mapping attribute_map )
{
  if (attribute_map["::"])
    ::init_auto_load_attributes(attribute_map["::"]);
  if (!undefinedp(attribute_map["max weight"]))
    max_weight = attribute_map["max weight"];

  if (attribute_map["inv"])
    "/global/mortal"->load_auto_load(attribute_map["inv"], this_object());
} /* init_dynamic_arg() */