/
lib/banish/
lib/d/coronos/
lib/d/coronos/w/alena/
lib/d/coronos/w/angel/
lib/d/coronos/w/angel/caves/
lib/d/coronos/w/angel/caves/monst/
lib/d/coronos/w/angel/city/chambers/
lib/d/coronos/w/angel/city/monst/
lib/d/coronos/w/angel/city/obj/
lib/d/coronos/w/angel/city/streets/
lib/d/coronos/w/angel/farms/plains/
lib/d/coronos/w/angel/monst/
lib/d/tempus/
lib/d/tempus/w/angel/
lib/d/tempus/w/kingbill/
lib/d/tempus/w/mirak/
lib/d/tempus/w/mirak/monst/
lib/d/tempus/w/mirak/obj/
lib/d/tempus/w/relgar/planes/baat/
lib/d/tempus/w/sarak/
lib/d/tempus/w/serepion/mon/
lib/d/tempus/w/valrejn/
lib/doc/
lib/doc/domains/
lib/doc/efun/
lib/include/fn_specs/
lib/info/
lib/inherit/base/
lib/log/
lib/log/mailbox/
lib/log/main/
lib/news/
lib/obj/party/
lib/objects/componen/
lib/open/
lib/open/party/
lib/open/paste/
lib/open/spells/
lib/open/valrejn/
lib/players/
lib/players/alena/
lib/players/alena/obj/
lib/players/alena/open/
lib/players/alena/private/
lib/players/angel/
lib/players/angel/obj/
lib/players/ash/
lib/players/biggs/
lib/players/biggs/food/
lib/players/biggs/gobkeep/
lib/players/biggs/mnstr/
lib/players/biggs/town/caves/
lib/players/biggs/town/tower/
lib/players/biggs/wpns/
lib/players/calris/
lib/players/deathurg/
lib/players/deathurg/open/
lib/players/deathurg/private/thief/
lib/players/dogberry/
lib/players/dogberry/library/
lib/players/dogberry/open/
lib/players/epsilon/
lib/players/epsilon/private/
lib/players/farewell/
lib/players/hippo/
lib/players/hippo/open/
lib/players/hippo/tools/
lib/players/jimpa/
lib/players/josh/
lib/players/josh/room/
lib/players/josh/room/mage/dungeon/
lib/players/josh/room/mage/dungeon/obj/
lib/players/josh/wep/
lib/players/kingbill/
lib/players/metatron/
lib/players/miette/
lib/players/mirak/
lib/players/mirak/open/
lib/players/parsilan/
lib/players/relgar/
lib/players/relgar/private/
lib/players/sarak/
lib/players/sarak/bugs/
lib/players/sarak/feelings/
lib/players/sarak/magical/
lib/players/sarak/minotaur/island/
lib/players/sarak/open/
lib/players/sarak/private/
lib/players/serepion/
lib/players/serepion/open/
lib/players/serepion/private/
lib/players/spike/
lib/players/spike/open/
lib/players/spike/private/
lib/players/spike/seaworld/
lib/players/valrejn/
lib/players/valrejn/open/
lib/players/valrejn/private/
lib/players/virus/
lib/players/wrath/
lib/players/wrath/arm/
lib/players/wrath/mon/
lib/players/wrath/room/
lib/players/wrath/room/entry/
lib/players/wrath/room/zolgath/
lib/players/wrath/weap/
lib/players/zil/
lib/room/
lib/room/city/arena/
lib/room/city/creator/
lib/room/city/garden/monst/
lib/room/city/library/
lib/room/city/library/open/books/
lib/room/city/shop/
lib/room/death/
lib/room/death/open/
lib/room/island/
lib/room/keeps/
lib/room/registry/
lib/room/ships/crew/
lib/room/ships/open/
lib/room/ships/open/types/bounty/
lib/room/ships/open/types/nebula/
lib/room/ships/open/types/phoenix/
lib/secure/udp_cmd_/
lib/skills/
lib/skills/fighter/
lib/skills/psionici/
lib/skills/thief/
lib/usr/
lib/usr/creators/
lib/usr/no_banis/
lib/usr/players/
#include <mudlib.h>
#include <i_to_str.h>

#define AMT_MONEY  (int)this_object()->query_money()
#define NAME       (string)this_object()->query_name()
#define LEVEL      (int)this_player()->query_level()

/**************************************************************************/
/* put */

status put(string item) 
{ 
  object *items;
  string container; 
  int size, i, wt;
  object ob, to; 
  
  string item_name;
  int abort;
  status havePut;
     
  if(this_object()->query_ghost()) 
  {
    tell_object(this_object(),"It passes straight through your hands...\n");
    return 1; 
  } 
  
  if((int)this_object()->query_real_light() < 1) 
  {
    tell_object(this_object(), "It's too dark to do that.\n");
    return 1;
  }

  if(!item) 
  {
    tell_object(this_object(),"Usage: put <item> in <container>\n");
    return 1;
  } 
  sscanf(item, "%s in %s", item, container); 
  sscanf(item, "%s on %s", item, container); 
  if(!container) 
  {
    tell_object(this_object(),"Usage: put <item> in <container>\n");
    return 1;
  }
  container = lower_case(container); 
  if(!(to = present(container, this_object()))) 
  {
    if(!(to = present(container, environment()))) 
    {
      tell_object(this_object(),"There are no " + container + "s here!\n"); 
      return 1; 
    } 
    if(living(to)) 
    {
      tell_object(this_object(),"You cannot do that!\n");
      return 1;
    }      
  }
  if(item == "all") 
  { 
    items = all_inventory(); 
  } 
  else if(!(ob = present(item, this_object()))) 
  {
    if (!(ob = present (item, environment())))
    {
      tell_object(this_object(),"You do not have "+ item +".\n"); 
      return 1; 
    }
  }
  if(ob) items = ({ ob, });

  for(i = 0, size = sizeof(items); i < size; i++) 
  {
    if(items[i] == to) continue; /* can't move items into self */
    if(!objectp(items[i]) || living(items[i])) continue; /* no move living */ 
    if(!(item_name = (string)items[i]->short())) continue; /* no move invis*/
    if(++abort > 30) 
    {
      tell_object(this_object(), "You only pick up "+int_to_str(30)+
      " "+items[i]->query_short()+"\n");
      return 1;
    }
    item = (string)items[i]->query_name();
    if (item)
      item_name = item;

    if ((this_object() == environment(items[i]) && items[i]->drop())
     || (this_object() != environment(items[i]) && !items[i]->get()))
    {
      write ("You cannot put the "+ item_name +" in "+ container +".\n");    
      continue;
    } 
 
    if(!to->can_put_and_get(0)) 
    {
      tell_object(this_object(),"You cannot do that!\n");
      return 1;
    }
     
    wt = (int)items[i]->query_weight();
    if (!to->add_weight(wt))
    {
      write ("The "+ container +" cannot hold the "+ item_name +".\n");
      say (NAME+" attempts to put the "+item_name+" in the "+container+".\n"); 
      continue;
    }
    environment(items[i])->add_weight(-wt);
      
#ifdef NATIVE_MODE
    items[i]->move(to);
#else
    move_object(items[i], to);
#endif /* NATIVE_MODE */
    write("You put the "+ item_name +" into the "+ container +".\n");
    say(NAME+" puts the "+ item_name +" into the "+ container + ".\n");
    havePut = 1;    
  } 
  if (!havePut)
  {
    tell_object(this_object(),"Put? You move the air about in the "+ 
                               container +".\n");
  }
  return 1; 
} 


/***************************************************************************/
/* get */

status pick_up(string item) 
{ 
  string container;
  object from;
  object *items, ob; 
  int abort, haveGet;
  string item_name;
  int size, i, wt;
    
  if(this_object()->query_ghost()) 
  {
    tell_object(this_object(),"It passes straight through your hands...\n");
    return 1; 
  } 
  
  if((int)this_object()->query_real_light() < 1) 
  {
    tell_object(this_object(), "It's too dark to do that.\n");
    return 1;
  }
  
  if(!item) 
  {
    tell_object(this_object(),"Usage: get <item|all>\n"+
       "       get <item|all> from <container>\n"); 
    return 1; 
  } 
  sscanf(item, "%s from %s", item, container);
  if(container) 
  {
    container = lower_case(container);
    if(!(from = present(container, this_object()))) {
      if(!(from = present(container, environment()))) {
        if(!environment()->id(container)) 
        {
          write("There is no " + container + " here.\n");
        }
        else 
        {
          tell_object(this_object(),"You cannot get anything from the "+
                                    container +".\n");
        }
        return 1; 
    }
    } 
    if(living(from)) 
    {
      tell_object(this_object(),"You cannot do that!\n");
      return 1;
    }      
  }
  else 
  {
    from = environment();
  }
  if(item == "all") 
  { 
    items = all_inventory(from); 
  } 
  else if(!(ob = present(item, from))) 
  {
    if(!environment()->id(item)) 
    {
      tell_object(this_object(),"There is no "+ item +" in the "+
                     ((container) ? container : "room") +".\n"); 
    }
    else 
    {
      tell_object(this_object(),"You cannot get the "+ item +".\n");
    }
    return 1; 
  }
  if(ob) items = ({ ob, });

  for(i = 0, size = sizeof(items); i < size; i++) 
  {
    if(items[i] == this_object()) continue; /* can't move items into self */
    if(!items[i]->get())          continue; /* can't pick it up */
    if(!objectp(items[i]) || living(items[i])) continue; /* no move living */ 
    if(!(item_name = (string)items[i]->short())) continue; /* no move invis*/
    if(++abort > 30) 
    {
      tell_object(this_object(), "You get only "+int_to_str(30)+
      " "+items[i]->query_short()+"\n");
      return 1;
    }
    item = (string)items[i]->query_name();
    if (item)
      item_name = item;

/*
    if((environment() != environment(items[i])) || (!items[i]->get())) 
    {
      write ("You cannot get the "+ item_name +".\n");
      continue;
    } 
*/

    if (!from->can_put_and_get(0))
    {
      tell_object(this_object(),"You cannot do that!\n");
      return 1;
    }
     
    wt = (int)items[i]->query_weight();
    if (!this_object()->add_weight(wt))
    {
      write ("You're not strong enough to carry the "+ item_name +".\n");
      say (NAME+" attempts to carry the "+item_name+".\n"); 
      continue;
    }
    environment(items[i])->add_weight(-wt);
      
#ifdef NATIVE_MODE
    items[i]->move(this_object());
#else
    move_object(items[i], this_object());
#endif /* NATIVE_MODE */
    write("You get the "+ item_name +".\n");
    say(NAME+" gets the "+ item_name +".\n");
    haveGet = 1;    
  } 
  if (!haveGet)
  {
    tell_object(this_object(),"Get? You move the air about.\n");
  }
  return 1;
}

/***************************************************************************/
/* give */

status give_object(string item) 
{  
  string who;  
  object *items;
  object ob, dest_ob;  
  int amt;  
  int size, i, wt;
  string item_name;
  int abort;
  
  int haveGive;
  string coins_type;
     
  if(this_object()->query_ghost()) 
  {
    write("It passes straight through your hands...\n");
    return 1; 
  } 
  
  if((int)this_object()->query_real_light() < 1) 
  {
    tell_object(this_object(), "It's too dark to do that.\n");
    return 1;
  }

  if(!item) 
  {
    write("Usage: give <item|all> to <who>\n"+
       "       give <amount> coins to <who>\n");
    return 1;
  }  
  sscanf(item, "%s to %s", item, who);
  sscanf(item, "%d %s coins to %s", amt, coins_type, who);
  sscanf(item, "%d coins to %s", amt, who);
  sscanf(item, "%d coin to %s", amt, who);
  if(!who) return give_object(0); 
  if(!(dest_ob = present(who, environment()))) 
  {
    write(capitalize(who)+" is not here.\n");
    return 1;
  }
  
  if(!living(dest_ob)) 
  {
    write("Thats not giving it away, its throwing it away.\n");
    return 1;
  }

  if(amt) 
  {
    if(amt < 1) 
    {
      write("Are you looking for a loan?\n");
      return 1;
    }
    if(LEVEL < 2) 
    {
      write("Your level is not high enough to be a money lender.\n");
      return 1;
    }
    if(coins_type == "platinum") amt *= PLATINUM;
    else
      if(coins_type == "gold") amt *= GOLD;
    else
      if(coins_type == "silver") amt *= SILVER;
    else
      amt *= COPPER;

    if(amt > AMT_MONEY) amt = AMT_MONEY;
    this_object()->add_money(-amt);
    this_object()->save_me(1);
    dest_ob->add_money(amt);
    dest_ob->save_character();
    tell_object(this_object(),"You give "+capitalize(who)+" "+amt+
       "  coin"+((amt == 1) ? "" : "s")+".\n");
    say(NAME+" gives "+capitalize(who)+" "+amt+
     " coin"+((amt == 1) ? "" : "s")+".\n", dest_ob);
    tell_object(dest_ob,NAME+" gives you "+amt+
     " coin"+((amt == 1) ? "" : "s")+".\n");
    return 1;
  }   
  if(item == "all") { 
    items = all_inventory(); 
  } 
  else if(!(ob = present(item, this_object()))) 
  {
    if(!(ob = present(item, environment()))) 
    {
      tell_object(this_object(),"You do not have "+ item +".\n"); 
      return 1;
    } 
  }
  if(ob) items = ({ ob, });

  for(i = 0, size = sizeof(items); i < size; i++) 
  {
    if(items[i] == dest_ob) continue; /* can't move items into self */
    if(!objectp(items[i]) || living(items[i])) continue; /* no move living */ 
    if(!(item_name = (string)items[i]->short())) continue; /* no move invis*/
    if(++abort > 30) 
    {
      tell_object(this_object(), "You give only "+int_to_str(30)+
      " "+items[i]->query_short()+"\n");
      return 1;
    }
    item = (string)items[i]->query_name();
    if (item)
      item_name = item;

    if ((this_object() == environment(items[i]) && items[i]->drop())
     || (this_object() != environment(items[i]) && !items[i]->get()))
    {
      write ("You cannot give away the "+ item_name +".\n");
      continue;
    } 
     
    wt = (int)items[i]->query_weight();
    if (!dest_ob->add_weight(wt))
    {
      write (dest_ob->query_name()+" cannot carry the "+ item_name +".\n");
      say (NAME+" attempts give "+ item_name +" to "+
               dest_ob->query_name()+".\n",dest_ob); 
      tell_object (dest_ob,NAME+" trys to give you the "+ item_name
                           +" but you cannot carry it.\n");
      continue;
    }
    environment(items[i])->add_weight(-wt);
      
#ifdef NATIVE_MODE
    items[i]->move(dest_ob);
#else
    move_object(items[i], dest_ob);
#endif /* NATIVE_MODE */
    write("You give the "+ item_name +" to "+ dest_ob->query_name() +".\n");
    say(NAME+" gives the "+ item_name +" to "+ dest_ob->query_name() 
       +".\n",dest_ob);
    tell_object(dest_ob,NAME +" gives you the "+ item_name +".\n");
    haveGive = 1;    
  } 
  if (!haveGive)
  {
    tell_object(this_object(),"Give? You move the air about.\n");
  }
  return 1;
}  

 
/***********************************************************************/
/* drop */

status  drop_thing(string item) 
{  
  string container;  
  int size, i, wt;
  object ob, to;  
  object *items;
  int amt;  
  string item_name;
  string coins_type;
  int abort;
  status haveDrop;
     
  if(!item) 
  {
    write("Usage: drop <item|all>\n"+
       "       drop <item|all> in <container>\n"+
       "       drop <amount> coins\n"); 
    return 1;
  }  
  sscanf(item, "%d %s coins", amt, coins_type);
  sscanf(item, "%d coins", amt);
  sscanf(item, "%d coin", amt);
  sscanf(item, "%s in %s", item, container);
  if(amt) 
  {
    if(amt < 1) 
    {
      write("Are you looking for a loan?\n");
      return 1;
    }
    if(LEVEL < 2) 
    {
      write("Something prevents you.\n");
      return 1;
    }
    if(coins_type == "platinum") amt *= PLATINUM;
    else if(coins_type == "gold") amt *= GOLD;
    else if(coins_type == "silver") amt *= SILVER;
    else amt *= COPPER;

    if(amt > AMT_MONEY) amt = AMT_MONEY;
    this_object()->add_money(-amt);
    this_object()->save_me(1);
    ob = clone_object(MONEY);
    ob->set_money(amt);
#ifdef NATIVE_MODE
    ob->move(environment());
#else
    move_object(ob, environment());
#endif /* NATIVE_MODE */
    write("You drop "+amt+" coin"+((amt == 1) ? "" : "s")+".\n");
    say(NAME+" drops "+amt+" coin"+((amt == 1) ? "" : "s")+".\n");
    return 1;
  }   
  if(container) 
  {
    container = lower_case(container);
    if(!(to = present(container, this_object()))) 
    {
      if(!(to = present(container, environment()))) 
      {
         write("There is no " + container + " here.\n");
         return 1; 
      }
    }
    if(living(to)) 
    {
      write("You can't do that!\n");
      return 1;
    }
  }  
  else 
  {
    to = environment();
  }
  if(item == "all") { 
    items = all_inventory(); 
  } 
  else if(!(ob = present(item, this_object()))) 
  {
    tell_object(this_object(),"You don't have the  "+ item +".\n"); 
    return 1; 
  }
  if(ob) items = ({ ob, });  

  for(i = 0, size = sizeof(items); i < size; i++) 
  {
    if(!objectp(items[i]) || living(items[i])) continue; /* no move living */ 
    if(!(item_name = (string)items[i]->short())) continue; /* no move invis*/
    if(++abort > 30) 
    {
      tell_object(this_object(), "You drop only "+int_to_str(30)+
      " "+items[i]->query_short()+"\n");
      return 1;
    }
    item = (string)items[i]->query_name();
    if (item)
      item_name = item;

    if ((this_object() == environment(items[i]) && items[i]->drop())
     || (this_object() != environment(items[i]) && !items[i]->get()))
    {
      write ("You cannot drop the "+ item_name +".\n");
      continue;
    } 

    wt = (int)items[i]->query_weight();
    if (to != environment())
    {
      if (!to->can_put_and_get(0))
      {
        tell_object(this_object(),"You cannot do that!\n");
        return 1;
      }

      if (!to->add_weight(wt))
      {
        write ("You cannot drop the "+ item_name +".\n");
        say (NAME+" attempts drop the "+ item_name +".\n"); 
        continue;
      }
    }
    this_object()->add_weight(-wt);
      
#ifdef NATIVE_MODE
    items[i]->move(to);
#else
    move_object(items[i], to);
#endif /* NATIVE_MODE */
    write("You drop the "+ item_name +".\n");
    say(NAME+" drops the "+ item_name +".\n");
    haveDrop = 1;    
  } 
  if (!haveDrop)
  {
    tell_object(this_object(),"Drop? You fidget in your pockets.\n");
  }

  return 1;
}