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
