
drink_soft()
************


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
