inherit "/std/npc";

#include <new_skills.h>
#include __PATH__(1)"defs.h"

#define MYPROP notstrom_tutorial2018_beispiel1

private string look();
private int hauen();

private mapping hauer = ([]);

protected void create() {
  if (!clonep()) {
    set_next_reset(-1);
    return;
  }
  ::create();

  create_default_npc(20, 600);

  SetProp(P_SHORT, "Ein Zwerg");
  Set(P_LONG, #'look, F_QUERY_METHOD);
  SetProp(P_NAME, "Kawumm");
  SetProp(P_ARTICLE, 0);
  SetProp(P_GENDER, MALE);

  AddId(({"zwerg", "kawumm"}));
  SetProp(P_ALIGN, 100);
  SetProp(P_RACE, "Zwerg");
  SetProp(P_SIZE, 102);

  AddCmd("hau|haue&@ID", #'hauen,
    "Wen willst Du hauen?");
}

void reset() {
  ::reset();

  if (sizeof(hauer)) {
    tell_room(ENV(), BSLF(
      "Krawumm vergisst, von wem er schon alles gehauen wurde. Seine "
      "Blessuren verschwinden wie von Magierhand."));
    hauer = ([]);
  }
}

private string look() {
  string msg = "Dies ist Krawumm, der Zwerg. ";
  if (!sizeof(hauer)) {
    msg += "Niemand hat ihm bisher eins auf die Omme gehauen, obwohl er so "
      "verfuehrerisch herumsteht.\n";
  } else {
    msg += "Er hat schon durchaus was auf die Omme bekommen, und zwar von "+
      CountUp(hauer)+"\n";
  }
  msg += "Wenn Du ihm was draufsemmeln willst, dann versuche einfach:\n"
    "  haue krawumm";
  return BSLF(msg);
}

private int hauen() {
  if (TP->QueryProp(MYPROP)) {
    tell_object(TP, BSLF(
      "Aber nicht doch. Du hast Krawumm bereits gehauen."));
  } else {
    tell_object(TP, BSLF(
      "Gut, Du haust also Krawumm welche auf die Omme. Krawumm zuckt kurz, "
      "steht dann aber unbewegt weiter rum. Er hat sich das aber bestimmt "
      "gemerkt ..."));
    tell_room(ENV(), BSLF(
      TPN+" haut Krawumm eins auf die Omme. Dem scheint das aber nicht viel "
      "auszumachen. Typisch Zwerg, solange er Alk kriegt, ist er zufrieden."),
      ({TP}));
    TP->SetProp(MYPROP, 1);
    m_add(hauer, getuuid(TP), 1);
  }
  return 1;
}

