defuel_food()
=============

FUNKTION
--------
::

    int defuel_food();

DEFINIERT IN
------------
::

    /std/living/life.c

ARGUMENTE
---------
::

    Keine.

BESCHREIBUNG
------------
::

    Enttankt den Spieler automatisch um einen gewissen Essens-Wert,
    sofern der Spieler ueber einer bestimmten Enttank-Grenze liegt und seit
    seinem letzten Enttanken eine gewisse Zeit vergangen ist.
    Alle diese Werte sind rassenabhaengig.

    Es ist also NICHT moeglich, Einfluss auf die Menge des Enttankens
    zu nehmen. Das ist hier so gewollt.

    Hat der Spieler mindestens 
    * P_DEFUEL_LIMIT_FOOD in P_FOOD
    kann er alle
    * P_DEFUEL_TIME_FOOD
    um
    * (x=P_DRINK*P_DEFUEL_AMOUNT_FOOD/2) + random(x)
      (also um (50 bis 100 * P_FOOD) Prozent)
    enttanken.

RUECKGABEWERTE
--------------
::

    DEFUEL_TOO_SOON: -2, wenn Enttankintervallzeiten zu kurz.
    DEFUEL_TOO_LOW:  -1, wenn Enttankgrenze noch nicht erreicht.
    NO_DEFUEL:        0, wenn Enttanken nicht noetig war (Spieler war leer)
    >0, wenn Erfolg (enttankte Wert wird zurueckgegeben).

    (Konstanten kommen aus /sys/defuel.h)

BEMERKUNG
---------
::

    Bitte defuel_food() benutzen und nicht P_FOOD oder P_MAX_FOOD des
    Spielers manipulieren!

    Achtung: Nur Toiletten sollten diese Funktion im Spieler aufrufen!

BEISPIEL
--------
::

    int action_enttanken() {
      string msg;
      int val = this_player()->defuel_food();

      switch (val) {
        case DEFUEL_TOO_SOON:
          msg = "Du warst doch erst vor kurzem auf Toilette...";
          break;
        case DEFUEL_TOO_LOW:
          msg = "Du versuchst Dich zu entleeren, aber irgendwie will "
                "das nicht so recht klappen.";
          break;
        case NO_DEFUEL:
          msg = "Du hast seit langem nichts gegessen, wie willst Du dann "
                "was loswerden koennen?";
          break;
        default:
          string qualifier;
          int fuzzypercent = (90+random(20)) *
                             val/this_player()->QueryProp(P_MAX_FOOD);
          switch(fuzzypercent) {
            case 0..50:  qualifier = "etwas"; break;
            case 51..75: qualifier = "enorm"; break;
            default:     qualifier = "unglaublich"; break;
          }
          msg = "Du entleerst Dich "+qualifier"+. Puh, das tat gut!";
          break;
      }
      tell_object(this_player(), break_string(msg, 78));
      return 1;
    }

SIEHE AUCH
----------
::

     Aehnlich:  defuel_drink
     Tanken:    consume, drink_alcohol, drink_soft, eat_food
     Heilung:   heal_self, restore_spell_points, restore_hit_points, 
                buffer_hp, buffer_sp
     Timing:    check_and_update_timed_key
     Props:     P_DRINK, P_FOOD, P_ALCOHOL, P_SP, P_HP,
                P_DEFUEL_TIME_FOOD, P_DEFUEL_TIME_DRINK
     Konzepte:  heilung, enttanken, food

9. August 2015 Gloinson

