inherit "/std/room";

#include __PATH__(1)"defs.h"

int cmd_obst();


protected void create() {
  ::create();

  SetProp(P_INT_SHORT, "Eine Huette mit Obst");
  SetProp(P_INT_LONG, BSLF(
    "Die Huette ist irgendwie beleuchtet, aber das ist es nicht, was "
    "Deine Aufmerksamkeit fesselt. Auf dem Tisch, der in der Mitte des "
    "Raumes steht, befindet sich eine Schale voller Obst. Das sieht "
    "wirklich appetitlich aus, Du moechtest es direkt essen."));

  SetProp(P_LIGHT, 1);
  SetProp(P_INDOORS, 1);
  SetProp(P_LIGHT_TYPE, LT_GLOWING);

  AddCmd("iss|ess|esse&obst", #'cmd_obst,
    "Wen oder was willst Du essen?^");
}


/*
  Sollverhalten der Tanke:
  Alle 40 min pro Spieler je 100+random(60) Food und Drink tanken, dabei
  Ticks von 12 LP/KP. Saettigung nur 5 Food.
*/

/*
  Anmerkung:
  Es ist guter Stil, in einem Kommentar vor dem Code der Tanke zu
  dokumentieren, welche Werte Du mit dem Erzmagier der Heilungsbalance
  ausgehandelt hast.

  Dies sind exakt die Werte, die die Tanke am Bergpfad oberhalb von
  Kobayashis Seilbahnstation verwendet. Sprich Deine Tanken auf jeden
  Fall mit dem Erzmagier, der fuer die Heilungsbalance zustaendig ist, ab.
  (Das ist momentan Humni, falls sich das aendert, weiss Dein Sponsor das
  aber.)

  Generell solltest Du fuer Heilungsangelegenheiten die Manpage wiz/heilung
  lesen.
*/
int cmd_obst() {
  /* 
     Allgemeiner Hinweis zum Arbeiten mit Timed Keys und Heilstellen:

     Als erstes solltest Du bitte die Manpages zu check_timed_key() und
     check_and_update_timed_key() nachlesen.
     Wir haben hier einen Sonderfall: Wir wollen nur Heilung alle 40
     Minuten erlauben, UND wir wollen nicht, dass der Spieler erst wieder
     40 Minuten warten muss, wenn er dieses Mal nichts essen kann, weil
     er gerade ueberfressen ist. Deshalb pruefen wir erst den Key, bevor
     wir "wie ueblich" mit check_and_update_timed_key() arbeiten.

     Wenn der Spieler auch die Wartezeit aufgebrummt bekommen soll, falls
     er gerade ueberfressen ist, dann sollte man so vorgehen wie in dem
     Beispiel der Manpage.
  */

  /*
     Da der Timed Key ueber das ganze Mud eindeutig sein muss, empfiehlt
     es sich, den eigenen Magiernamen darin zu verwenden. Gute Praxis ist
     es, wenn Du etwas wie "Magiername_Gebiet_Stelle" verwendest, dann
     kommst Du auch mit Deinen eigenen Timed Keys nicht durcheinander.
  */

  // Beim Ueberpruefen nicht Key setzen, TP koennte ja vollgefuttert sein:
  if (TP->check_timed_key("notstrom_tutorial2018_obst")==0) {
    if (TP->eat_food(5, 0,
        "'Esst Obst, und Ihr bleibt gesund', sagten sie. Jetzt hast Du "
        "schon so viel Obst gegessen, und Dir wird immer schlechter ...")) {
      // Returnwert wurde bereits oben geprueft:
      TP->check_and_update_timed_key(2400, "notstrom_tutorial2018_obst");
      /* Diese beiden Zeilen fuehren die eigentliche Heilung durch. Bitte
         auch hier die Manpages lesen: */
      TP->buffer_hp(100+random(60), 12);
      TP->buffer_sp(100+random(60), 12);

      tell_object(TP, BSLF(
        "Du verzehrst etwas Obst aus der Schale und fuehlst Dich gleich "
        "besser."));
      tell_room(TO, BSLF(
        TPN+" etwas mampft Obst aus der Schale."),
        ({TP}));
    }
  } else {
    tell_object(TP, BSLF(
      "Du hast Dich hier erst kuerzlich bedient und kannst gerade kein "
      "Obst sehen. Vielleicht ein andermal ..."));
  }
  return 1;
}

