#pragma strict_types

inherit "/std/npc";

#include <properties.h>
#include <moving.h>

void create()
{
  if (!clonep(this_object())) return;
  ::create();

  SetProp(P_SHORT,"Ein Muellschlucker");
  SetProp(P_LONG,break_string(
    "Der Muellschlucker gehoert zu Familie der Kleinsaurier und zeichnet "+
    "sich durch ein sehr grosses Maul und nahezu unbegrenzten Appetit aus. "+
    "Das einzige, was er nicht mag, sind Dinge, die materiellen Wert haben. "+
    "Alles andere kann man ihm mit 'fuettere muellschlucker mit <name>' "+
    "in den Rachen stopfen.",78));
  SetProp(P_INFO,break_string(
    "Dieser Muellschlucker verschlingt auch lose herumliegende Dinge. Also "+
    "pass auf, was Du wegwirfst.",78));
  SetProp(P_NAME,"Muellschlucker");
  SetProp(P_GENDER, MALE);
  SetProp(P_RACE,"saurier");
  SetProp(P_ARTICLE,1);
  SetProp(P_SIZE, 60);
  SetProp(P_WEIGHT, 7000);
  AddId(({"muellschlucker","schlucker","kleinsaurier","saurier"}));
  create_default_npc( 1 );
  SetProp(P_XP,0);
  SetProp(P_BODY,100);
  SetProp(P_HANDS,({" mit dem alles verschlingenden Gebiss",20}));
  SetProp(P_ALIGN, 0);
  seteuid(getuid(this_object()));
  SetProp(P_DEFAULT_INFO,"grunzt nur vor sich hin.\n");
  SetProp(P_MSGIN,"rollt herein");
  SetProp(P_MSGOUT,"rollt");
  SetProp(P_MAX_WEIGHT, 200000);
  AddCmd(({"fuetter","fuettere"}),"haps");
  enable_commands();
}

int haps(string str)
{
  string s1,s2;
  object ob;
  notify_fail("Syntax: fuettere muellschlucker mit <name>\n");
  if(!str)return 0;
  if(sscanf(str,"%s mit %s",s1,s2)!=2)return 0;
  if(!id(s1))return 0;
  notify_fail("So etwas hast Du nicht.\n");
  if((!ob=present(s2,this_player())) && 
     (!ob=present(s2,environment()))) return 0;
  if(({int|string})ob->QueryProp(P_NODROP) || ({int})ob->QueryProp(P_NEVERDROP)){
    write("Das kannst Du nicht wegwerfen.\n");
    return 1;
  }
  if(living(ob)){
    write("Der Muellschlucker frisst keine Lebewesen.\n");
    return 1;
  }
  if(({int})ob->QueryProp(P_VALUE)){
    write("Das ist zu wertvoll, das vertraegt der Muellschlucker nicht.\n");
    return 1;
  }
  if (({int|string})ob->QueryProp(P_CURSED)) {
    write("Verfluchte Dinge bekommen dem Muellschlucker nicht!\n");
    return 1;
  }
  ({int})ob->remove();
  if(ob){
    write("Aus irgendeinem Grund scheint das dem Muellschlucker nicht "+
    "zu schmecken.\n");
    return 1;
  }
  write("Mit einem lauten Ruelpsen verschlingt der Muellschlucker alles.\n");

  return 1;
}

void reset()
{
  int i;
  object *inv;
  ::reset();
  
  inv=all_inventory(this_object());
  if(inv && sizeof(inv))
    for(i=sizeof(inv)-1;i>=0;i--)
      destruct(inv[i]);
  command("nimm alles");
}

