
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
