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(m_indices(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, TP->query_real_name(), 1);
  }
  return 1;
}

public string get_gehauen() {
  if (!sizeof(hauer)) return 0;
  return CountUp(m_indices(hauer));
}
