drink_alcohol()
***************


FUNKTION
========

   public varargs int drink_alcohol(int strength, int testonly, string mytext)


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

   /std/living/life.c


ARGUMENTE
=========

   strength: wird zur aktuellen Saettigung P_ALCOHOL dazu addiert
   testonly: Ist das Flag gesetzt, wird dem Spieler kein ALCOHOL 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 "Nuechtern"-Meldung, die bei
           negativem strength auftreten kann, wenn P_ALCOHOL wieder 0 ist.


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

   Es wird geprueft, ob dem Spieler der angegebene Wert fuer 'strength'
   auf seine aktuelle P_ALCOHOL addiert werden kann oder nicht. Falls
   das moeglich ist und testonly = 0, wird P_ALCOHOL entsprechend
   aktualisiert.

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


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

   0 bei [potentiellem] Misserfolg (strength + P_ALCOHOL > P_MAX_ALCOHOL)
   1 bei [potentiellem] Erfolg
   * potentiell bezieht sich hier auf Nutzung mit 'testonly' != 0


BEMERKUNG
=========

   drink_alocohol() bitte anstatt eigener Manipulationen von P_ALCOHOL und
   P_MAX_ALCOHOL 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() {
     if(this_player()->drink_alcohol(10, 0,
                                     "Du prustest in den Schnaps. "
                                     "Der passt nicht mehr rein.\n")) {
       // Platz fuer 10 "Alkohol" war noch, diese sind jetzt bereits addiert
       // Nachricht an den Spieler:
       tell_object(this_player(),
                   break_string("Du trinkst den Schnaps aus.", 78));

       // Nachricht an andere Livings im Raum
       object ob = first_inventory(environment(this_player()));
       do {
         if(living(ob) && ob!=this_player())
           ob->ReceiveMsg(this_player()->Name()+" trinkt einen Schnaps aus.",
                          MT_LOOK|MT_LISTEN,
                          MA_DRINK);
         ob = next_inventory(ob);
       } while(ob);

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

     return 1;
    }


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

   Aehnlich:  consume, eat_food, 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
