inherit "/std/npc";

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

/*
  Hier wird die Prop definiert, die wir im Spieler setzen. Die bleibt
  bis Ende oder Reboot beim Spieler gesetzt. Wer das nicht moechte, kann
  sie sich per
    xcall $me->SetProp("notstrom_tutorial2018_beispiel1", 0);
  wieder entfernen. Wenn er Magier ist jedenfalls. Abfragen kann der
  Magier die Prop bei sich mit
    xcall $me->QueryProp("notstrom_tutorial2018_beispiel1");
 */
#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(
      "Kawumm vergisst, von wem er schon alles gehauen wurde. Seine "
      "Blessuren verschwinden wie von Magierhand."));
    hauer = ([]);
  }
}

private string look() {
  string msg = "Dies ist Kawumm, 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 kawumm";
  return BSLF(msg);
}

private int hauen() {
  if (TP->QueryProp(MYPROP)) {
    tell_object(TP, BSLF(
      "Aber nicht doch. Du hast Kawumm bereits gehauen."));
  } else {
    tell_object(TP, BSLF(
      "Gut, Du haust also Kawumm welche auf die Omme. Kawumm zuckt kurz, "
      "steht dann aber unbewegt weiter rum. Er hat sich das aber bestimmt "
      "gemerkt ..."));
    tell_room(ENV(), BSLF(
      TPN+" haut Kawumm eins auf die Omme. Dem scheint das aber nicht viel "
      "auszumachen. Typisch Zwerg, solange er Alk kriegt, ist er zufrieden."),
      ({TP}));
    /* Damit geprueft werden kann, ob der Spieler diesen Reset schon drauf-
       gehauen hat, setzen wir im Spieler eine Prop: */
    TP->SetProp(MYPROP, 1);
    /* Damit wir huebsch ausgeben koennen, wer alles schonmal draufgehauen
       hat, merken wir uns bis zum Reset die Uebeltaeter. Die kann man dann
       auch huebsch ausgeben.
       Der Haken ist natuerlich, dass die Prop im Spieler bestehen bleibt,
       auch wenn der Zwerg schon vergessen hat, wer ihn gehauen hat. Man
       kann ihn dann also nicht wieder hauen, wenn man die Prop nicht
       losgeworden ist. Das KANN Absicht sein, aber hier wuerde man das
       eigentlich anders loesen.
       Als Beispiel behalten wir das aber dennoch so einmal bei. */
    m_add(hauer, capitalize(TP->query_real_name()), 1);
  }
  return 1;
}

/* Diese Func wird vom Raum gerufen, um zu schauen, wer Kawumm schon alles
   vermoppt hat, deswegen public! */
public string get_gehauen() {
  if (!sizeof(hauer)) return 0;
  return CountUp(m_indices(hauer));
}

