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/
/**
 * This is the peddler object, it acts as a walking talking item
 * shop.
 */

#define MAX_PROP "max per reset"
#define TYPE "item shop type"
#define NUM_SOLD "number sold this reset"

inherit NPC_OBJ;

object cont;

object query_cont() { return cont; }

void create() {
   do_setup++;
   ::create();
   cont = clone_object( "/std/container" );
   cont->set_name("peddler_store");
   do_setup--;
   if ( !do_setup )
      TO->setup();
   call_out("reset_me", 1800);
} /* create() */

/** @ignore yes */
void init() {
   ::init();
   TP->add_command( "browse", TO,
                               "<indirect:object:" + file_name(cont) +
                               "> {from|of} <direct:living:here>" );
   TP->add_command( "buy", TO,
                               "<indirect:object:" + file_name(cont) +
                               "> from <direct:living:here>" );
   TP->add_command( "list", TO,
                               "goods {from|of} <direct:living:here>" );
} /* init() */

/** @ignore yes */
void dest_me() {
   if ( cont ) {
      cont->dest_me();
   }
   ::dest_me();
} /* dest_me() */

/** @ignore yes */
private void check_cont() {
   if ( !cont ) {
      cont = clone_object( "/std/container" );
   }
} /* check_cont() */

/**
 * @ignore yes
 */
void reset_me(){
 object item;

 check_cont();
 foreach(item in all_inventory(cont)){
  item->add_property( NUM_SOLD, 0 );
 }
 call_out("reset_me", 1800);
}

/**
 * This method adds an armour in as something to be able to be bought
 * from the peddles.
 * @param word the name of the armoud
 * @param number the number of the items that can be sold
 * @return 1 on success, 0 on failure
 */
int add_armour( string word, int number ) {
   object thing;

   check_cont();
   thing = (object)TO->create_object( word );

   if( !thing )
       thing = (object)ARMOURY_H->request_item( word, 100 );

   if( !thing )
       return 0;

   thing->move( cont );
   thing->add_property( "item name", word );
   thing->add_property( MAX_PROP, number );
   thing->add_property( TYPE, "armour" );

   return 1;

} /* add_armour() */

/**
 * This method adds an weapon in as something to be able to be bought
 * from the peddles.
 * @param word the name of the armoud
 * @param number the number of the items that can be sold
 * @return 1 on success, 0 on failure
 */
int add_weapon( string word, int number ) {
   object thing;

   check_cont();
   thing = (object)TO->create_object( word );

   if( !thing )
       thing = (object)ARMOURY_H->request_item( word, 100 );

   if( !thing )
       return 0;

   thing->move( cont );
   thing->add_property( "item name", word );
   thing->add_property( MAX_PROP, number );
   thing->add_property( TYPE, "weapon" );

   return 1;

} /* add_weapon() */

/**
 * This method adds an object in as something to be able to be bought
 * from the peddles.
 * @param word the name of the armoud
 * @param number the number of the items that can be sold
 * @return 1 on success, 0 on failure
 */
int add_object( string word, int number ) {
   object thing;

   check_cont();
   thing = (object)TO->create_object( word );
   if ( !thing ) {
      thing = clone_object( word );
   }
   if ( !thing ) {
      return 0;
   }
   thing->move( cont );
   thing->add_property( "item name", word );
   thing->add_property( MAX_PROP, number );
   thing->add_property( TYPE, "object" );
   return 1;
} /* add_object() */

/**
 * This method returns the cost of the specified item to the buyer.
 * @param thing the thing to cost
 * @param buyer who is buying it
 * @return the cost of the item
 */
int query_cost( object thing, object buyer ) {
   return (int)thing->query_value_at( TO );
} /* query_cost() */

/**
 * This method returns the costs of the item as a string.
 * @param thing the thing to buy
 * @param place the money area it is being bought in
 * @param buyer the person who is buying the object
 * @return the string money value
 */
string cost_string( object thing, string place, object buyer ) {
   return (string)MONEY_H->money_value_string(
         query_cost( thing, buyer ), place );
} /* cost_string() */

/**
 * The main entrace to the browse for things command.
 * @return 1 on success, 0 on failure
 */
int do_browse( mixed indirect_obs, string dir_match, string indir_match,
      string *words ) {
   int i;
   string place;
   object *things;

   place = query_property( "place" );
   if ( !place || ( place == "" ) ) {
      place = "default";
   }
   check_cont();
   things = indirect_obs;
   if( !sizeof( things ) ) {
      init_command( "say I'm afraid I don't have any of those.", 2 );
   } else {
      for ( i = 0; i < sizeof( things ); i++ ) {
         init_command( "say $C$"+
                       strip_colours((string)things[ i ]->the_short())+
               " is priced at "+ cost_string( things[ i ], place,
               TP ) +".  Let me show it to you.", 4 * i + 2 );
// Added in by Oaf 11/99 - peddler doesn't have item in inventory, so just
// tell the player the long() of the item.
         write( TO->one_short()+" shows you "+
            things[i]->one_short()+":\n"+things[i]->long() );

/*         init_command("show " + things[i]->query_name() + " to " +
                       TP->query_name(), 4*i+3);
 */
/*
         call_out("show_it", 4*i+3, evaluate(things[i]->the_short()),
               evaluate(things[ i ]->long()));
 */
      }
   }
   TP->add_succeeded_mess( TO, "$N ask$s $D "+
         "about "+ words[ 0 ] +".\n", ({ }) );
   return 1;
} /* do_browse() */

/**
 * This method shows the object in question to the player.
 * @param short the short description
 * @param long the long description
void show_it(string short, string long){
  if(environment(TP) != environment(TO)){
    do_command("'Hey... Where'd the fellow go?  Anyway....");
    return;
  }
  tell_room(environment(TO), capitalize(evaluate(the_short()))+
   " shows "+TP->the_short()+" "+short+
   ".\n");
  tell_object(TP, long);
} * show_it() */

/**
 * The main entrace to the buy things command.
 * @return 1 on success, 0 on failure
 */
int do_buy( mixed indirect_obs, string dir_match, string indir_match,
      string *words ) {
   int i, num_left;
   object *things;

   check_cont();
   things = indirect_obs;
   if ( !sizeof( things ) )
      init_command( "say I'm afraid I don't have any of those.", 2 );
   else
      for ( i = 0; i < sizeof( things ); i++ ) {
         num_left = (int)things[ i ]->query_property( MAX_PROP ) -
               (int)things[ i ]->query_property( NUM_SOLD );
         if ( num_left < 1 ) {
            init_command( "say I'm afraid I have no "+
                          strip_colours((string)things[ i ]->query_plural()) +
                          " left.", 2 * i + 2 );
            continue;
         }
         call_out( "sell_thing", 2 * i, TP, things[ i ] );
      }
   TP->add_succeeded_mess( TO, "$N ask$s $D "+
         "about buying "+ words[ 0 ] +".\n", ({ }) );
   return 1;
} /* do_buy() */

/**
 * The main entrace to the list stuff command.
 * @return 1 on success, 0 on failure
 */
int do_list() {
   int num_left;
   string place, *list;
   object thing;

   list = ({ });
   place = query_property( "place" );
   if ( !place || ( place == "" ) )
      place = "default";
   check_cont();
   /*just in case - If the call out was lost, reset it now!*/
   if(find_call_out("reset_me") == -1)
    reset_me();
   thing = first_inventory( cont );
   while ( thing ) {
      num_left = (int)thing->query_property( MAX_PROP ) -
            (int)thing->query_property( NUM_SOLD );
      if ( num_left < 1 ) {
         thing = next_inventory( thing );
         continue;
      }
      list += ({ (string)thing->a_short() +" for "+ cost_string( thing,
            place, TP ) +" ("+ query_num( num_left, 0 ) +
            " left)" });
      thing = next_inventory( thing );
   }
   if ( sizeof( list ) ) {
      init_command( "say I have the following items for sale:", 2 );
      init_command( "say $C$"+ query_multiple_short( list ) +".", 4 );
   } else
      init_command( "say I'm afraid I have nothing for sale.", 2 );
   TP->add_succeeded_mess( TO, "$N ask$s $D what "+
         "goods "+ (string)TO->query_pronoun() +" has "+
         "in stock.\n", ({ }) );
   return 1;
} /* do_list() */

/**
 * The main entrace to the sell stuff command.
 * @return 1 on success, 0 on failure
 */
void sell_thing( object player, object thing ) {
   int value;
   string item_name, place;
   object copy;

   if ( !player )
      return;
   if ( environment( player ) != environment( TO ) )
      return;
   if ( !thing )
      return;
   item_name = (string)thing->query_property( "item name" );
   copy = (object)TO->create_object( item_name );
   if ( !copy )
      switch ( (string)thing->query_property( TYPE ) ) {
         case "armour" :
         case "weapon" :
            copy = (object)ARMOURY_H->request_item( item_name,
                80 + random( 20 ) );
            break;
         case "object" :
            copy = clone_object( item_name );
            break;
      }
   if ( !copy )
      copy = clone_object( explode( file_name( thing ), "#" )[ 0 ] );
   if ( !copy )
      return;
   place = query_property( "place" );
   if ( !place || ( place == "" ) )
      place = "default";
   value = (int)player->query_value_in( place );
   if ( place != "default" )
      value += (int)player->query_value_in( "default" );
   if ( (int)TO->query_cost( copy, player ) > value ) {
      do_command( "say I'm afraid you can't afford to buy "+
            (string)copy->a_short() +"." );
      copy->move( "/room/rubbish" );
      return;
   }
   thing->add_property( NUM_SOLD, (int)thing->query_property( NUM_SOLD ) +
         1 );
   player->pay_money( (mixed)MONEY_H->create_money_array(
         (int)TO->query_cost( copy, player ), place ), place );
   tell_object( player, "You pay "+ the_short() +" "+
         cost_string( copy, place, player ) +".\n" );
   tell_room( environment(), (string)player->one_short() +
         " gives "+ the_short() +" some money.\n", player );
   if( (int)copy->move( player ) ) {
      do_command( "'Well, here's "+ (string)copy->the_short() +", but you "+
            "can't carry it at the moment.  I'll put it on the floor." );
      copy->move( environment() );
      do_command( ":puts "+ (string)copy->a_short() +" on the ground." );
   } else {
      tell_room( environment(), the_short() +" gives "+
            (string)player->one_short() +" "+ (string)copy->a_short() +".\n" );
   }
} /* sell_thing() */