CheckSpellFatigue

FUNKTION:
    public varargs int CheckSpellFatigue(string key)

DEFINIERT IN:
    /std/living/skills.c
    /std/player/skills.c
    /sys/living/skills.h

ARGUMENTE:
    string key  : Eindeutiger Name des Spruches, einer Gruppe von Spruechen
                  oder 0 fuer die globale Spruchermuedung.

BESCHREIBUNG:
    Diese Funktion dient zum Pruefen von individuellen Spruchermuedungen
    (Spellfatigue, Spruchsperren).
    Hiermit lassen sich unabhaengige Ermuedungen/Sperren fuer einzelne
    Sprueche oder Gruppen von Spruechen gestalten.

    Wird <key> nicht angegeben oder ist 0, wird die globale Spruchsperre
    geprueft (identisch zu der Property P_NEXT_SPELL_TIME), anderenfalls 
    die unter <key> gespeicherte Spruchermuedung.
    Prueft man einen Eintrag ohne Angabe von <key> ist das Ergebnis dieser
    Funktion identisch zur Abfrage von P_NEXT_SPELL_TIME.

RUeCKGABEWERT:
    0    Spruchermuedung existiert nicht oder ist abgelaufen.

    >0   Spruchermuedung ist noch nicht abgelaufen, Rueckgabewert ist die
         Zeit, bei der dieser Eintrag ablaeuft. Der Spruch darf _nicht_
         ausgefuehrt werden.

BEISPIELE:
    Ein Spell gehoert zu einer Gruppe von Spells mit dem Namen 'extrasuess'.
    Er darf nur ausgefuehrt werden, wenn seit 5s kein anderer Spruch aus der
    Gruppe ausgefuehrt wurde.
    if (ob->CheckSpellFatigue("extrasuess") {
      // alte Sperre noch nicht abgelaufen.
      tell_object(ob, "Deine unendliche Schokotorte ist noch nicht wieder "
        "nachgewachsen.\n");
      return ... ;
    }

BEMERKUNGEN:
    Die genauen Zeitdauern koennen von Spielern beeinflusst werden, sie
    unterliegen der jeweiligen Einstellung von 'spruchermuedung', d.h. koennen
    auf volle 2s aufgerundet werden.
    Auch wenn diese Funktion zum Verwalten von beliebigen Zeitsperren genutzt
    werden koennen, beschraenkt euch bitte auf Spruchermuedungen und benutzt
    ansonsten check_and_update_timed_key(). Falls ihr diesbzgl. weitere/andere
    Wuensche habt, sprecht den/die Mudlib-EM an.

SIEHE AUCH:
    SetSpellFatigue(L), DeleteSpellFatigue(L)
    P_NEXT_SPELL_TIME
    spruchermuedung

----------------------------------------------------------------------------
27.03.2010, Zesstra

