
eat_food()
**********


FUNKTION
========

   public varargs int eat_food(int food, int testonly, string mytext)


DEFINIERT IN
============

   /std/living/life.c


ARGUMENTE
=========

   food: Wird zu dem augenblicklichen Saettigungsgrad (P_FOOD) addiert.
   testonly: Ist das Flag gesetzt, wird dem Spieler kein FOOD zugefuehrt.
             Darf nur zum Testen der Heilstelle verwendet werden und muss
             im normalen Betrieb auf '0' stehen!
   mytext: Wer selber einen Text bei Misserfolg ausgeben lassen moechte,
           darf sich hier was nettes ausdenken.
           Achtung: Das unterdrueckt nicht die "Hunger"-Meldung, die bei
           negativem food auftreten kann, wenn P_FOOD wieder 0 ist.


BESCHREIBUNG
============

   Es wird geprueft, ob dem Spieler der angebene Wert "strength" auf seine
   aktuelle P_FOOD addiert werden kann oder nicht. Ist dies moeglich, wird
   wird es gemacht, es sei denn das testonly != 0.

   Sollen neben P_FOOD noch weitere Props manipuliert werden - bspw. zur
   Heilung eines Lebewesens - bietet sich die Funktion consume() an.


RUECKGABEWERT
=============

    0, wenn strength + P_FOOD > P_MAX_FOOD.
   >0, wenn Erfolg.


BEMERKUNG
=========

   eat_food() bitte anstatt eigener Manipulationen von P_FOOD und
   P_MAX_FOOD verwenden.

   Achtung: Immer erst VOR einer Heilung ausfuehren und bei Erfolg heilen.

   Bei Heilstellen sollte eine evtl. Heilung des Spielers mit der eigens
   dafuer eingerichteten Funktion check_and_update_timed_key realisiert
   werden.


BEISPIEL
========

   int heilstelle() {
     // Wenn auf das P_FOOD des Spielers die angegebenen 10 nicht mehr addiert
     // addiert werden koennen (weil sonst P_MAX_FOOD ueberschritten wird),
     // wird die Fehlermeldung ausgegeben, dass der Spieler nichts mehr
     // essen/trinken kann.
     // Bei gesetztem 'mytext' wird 'mytext' an den Spieler ausgegeben.
     // Ansonsten wird die Standardmeldung ausgegeben.
     if (!this_player()->eat_food(10, 0, "Der Keks ist einfach "
                                         "zuviel fuer Dich.\n") )
       return 1;

     // Spieler hatte noch ausreichend Spielraum bei P_FOOD. Die 10 sind
     // schon addiert worden. Jetzt Nachricht ausgeben:
     tell_object(this_player(), break_string("Du knabberst ein bisschen an "
                 "dem Keks herum und fuehlst Dich gleich viel besser.", 78));

     // alle Lebewesen im Raum bekommen das auch mit
     foreach(object ob:
             (filter(all_inventory(environment(this_player())), #'living) -
              ({this_player()})))
       ob->ReceiveMsg(this_player()->Name()+" knuspert einen Keks weg.",
                      MT_LOOK|MT_LISTEN,
                      MA_EAT);

     // Rassenabhaengige Heilung: Sofort oder in Schritten
     // Tragbare Heilungen sollten auch eher buffer_hp/_sp benutzen.
     if(this_player()->QueryProp(P_REAL_RACE)=="Kruemelmonster")
       this_player()->heal_self(30);
     else {
       this_player()->buffer_hp(30,5);
       this_player()->buffer_sp(30,5);
     }

     return 1;
   }


SIEHE AUCH
==========

   Aehnlich:  consume, drink_alcohol, drink_soft
   Heilung:   heal_self, restore_spell_points, restore_hit_points,
              buffer_hp, buffer_sp
   Timing:    check_and_update_timed_key
   Enttanken: defuel_drink, defuel_food
   Props:     P_DRINK, P_FOOD, P_ALCOHOL, P_SP, P_HP,
              P_DEFUEL_TIME_DRINK
   Konzepte:  heilung, enttanken, food

9. August 2015 Gloinson
