consume()
*********

public varargs int consume(mapping cinfo, int testonly)


FUNKTION
========

   public varargs int consume(mapping cinfo, int testonly);

   Aenderung der Gesundheit eines Lebewesens durch etwas Konsumierbares.


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

   /std/living/life.c


ARGUMENTE
=========

   cinfo
     Mapping mit Informationen ueber die Gesundheitsaenderung. Folgende
     Schluessel koennen verwendet werden:
     H_EFFECTS - Mapping der zu aendernden Properties mit dem Umfang der
                 Aenderung, erlaubte Properties siehe H_ALLOWED_EFFECTS
                 (P_HP, P_SP, P_POISON).
     H_CONDITIONS - Mapping der zu pruefenden Properties mit dem Umfang der
                    Aenderung, erlaubte Properties siehe
                    H_ALLOWED_CONDITIONS (P_FOOD, P_DRINK, P_ALCOHOL)
     H_DISTRIBUTION - Verteilung der Aenderung fuer P_HP, P_SP
                      HD_INSTANT:  sofortige Heilung
                      HD_STANDARD: 5 pro Heartbeat
                      1 - 50:      angebene Zahl pro Heartbeat
     Aenderungen koennen sowohl positiv als auch negativ sein.

   testonly
     Gibt an, ob nur die Bedingungen abgetestet werden sollen, oder
     auch die Wirkung eintreten soll.


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

    1 erfolgreich konsumiert
    0 keine oder falsche Aenderungsdaten in cinfo (nicht benutzbar)
   <0 Bedingung fuer konsumieren nicht erfuellt.
      Der Rueckgabewert ist dann ein Bitset aus:
      HC_MAX_FOOD_REACHED    - Kann nichts mehr essen
      HC_MAX_DRINK_REACHED   - Kann nichts mehr trinken
      HC_MAX_ALCOHOL_REACHED - Kann nichts mehr saufen
      HC_HOOK_CANCELLATION   - durch H_HOOK_CONSUME abgebrochen

    Hinweis: Wenn eine der Bedingungen nicht erfuellt ist, wird gar keine
    Heilung ausgefuehrt, aber es sind stets alle Fehlercodes im
    Rueckgabewert eingetragen.


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

   Die Funktion stellt eine Moeglichkeit zur Verfuegung, die Aenderung
   der Gesundheit eines Lebewesens beim Konsumieren von irgendetwas (z.B in
   einer Kneipe, durch eine Heilstellte oder tragbare Tanke, ...) zentral zu
   erledigen. Sie vereint in sich die Pruefung auf Durchfuerbarkeit der
   Aenderung und Anwendung der Aenderung.

   Das erste Argument gibt die Eigenschaften der Aenderung an, der zweite
   ob ausschliesslich die Pruefung auf Anwendbarkeit erfolgen soll.


BEMERKUNGEN
===========

   Hierbei bitte beachten, dass Tanken/Entanken sowie Heilungen ggf. von
   der (Heilungs-)Balance genehmigt werden muessen!

   Historischer Code enthaelt u.U. auch eine einfache Angabe der
   betroffenen Properties als Argument enthalten. Dies in neuem Code
   nicht mehr machen, dort ein Mapping wie oben beschrieben nutzen.

   H_ALLOWED_CONDITIONS und H_ALLOWED_EFFECTS sind in /sys/living/life.h
   definiert.


BEISPIELE
=========

   Heilung um 100 KP, 50 LP, aber nur wenn 30 P_FOOD gegessen werden kann:

   consume( ([H_EFFECTS:    ([P_HP:50, P_SP:100]),
              H_CONDITIONS: ([P_FOOD:30]) ]) );

   Heilung um 100 KP und Vergiftung um 2, wenn 15 Alkohol getrunken werden
   koennen. Die SP werden zeitverzoegert mit 10 pro Heartbeat zugefuehrt.

   consume( ([H_EFFECTS:      ([P_SP: 100, P_POISON: 2]),
              H_CONDITIONS:   ([P_ALCOHOL: 15]),
              H_DISTRIBUTION: 10]) );


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

   Aehnlich:  drink_alcohol, 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


LETZTE AeNDERUNG
================

   29.05.2015, Boing
