FUNKTION:
    public varargs int drink_soft(int strength, int testonly, string mytext)

DEFINIERT IN:
    /std/living/life.c

ARGUMENTE:
    strength: Wird zu dem augenblicklichen Saettigungsgrad (P_DRINK) addiert.
    testonly: Ist das Flag gesetzt, wird dem Spieler kein DRINK 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 "Durst"-Meldung, die bei
            negativem strength auftritt, wenn P_DRINK wieder 0 ist.

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

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

RUECKGABEWERT:
     0, wenn strength + P_DRINK > P_MAX_DRINK
    >0, wenn Erfolg

BEMERKUNG:
    drink_soft() bitte anstatt eigener Manipulationen von P_DRINK und
    P_MAX_DRINK 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_soft(10, 0, "Du blubberst nicht ueberzeugt "
                                   "in der Limonade. Das ist zu viel.\n")) {
        // Platz fuer 10 "Trinken" war noch, diese sind jetzt bereits addiert
        // Nachricht an den Spieler:
        tell_object(this_player(), break_string("Du nimmst einen grossen "
                    "Schluck zuckersuesse Limonade.", 78));

        // alle anderen im Raum bekommen es ggf auch mit:
        // 1) filter(..., #'living) ergibt die Lebewesen im Raum
        // 2) filter_objects(..., "ReceiveMsg") ruft ReceiveMsg an jedem
        // 3) ReceiveMsg(...) bekommt die Folgeparameter
        filter_objects(filter(all_inventory(environment(this_player())),
                              #'living) - ({this_player()}),
                       "ReceiveMsg",
                       this_player()->Name()+
                         " trinkt einen Schluck Limonade.",
                       MT_LOOK|MT_LISTEN,
                       MA_DRINK);

        // Rassenabhaengige Heilung: Sofort oder in Schritten
        // Tragbare Heilungen sollten auch eher buffer_hp/_sp benutzen.
        if(this_player()->QueryProp(P_REAL_RACE)=="Saufziege")
          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, eat_food
     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
