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
