SetSpellFatigue

FUNKTION:
    public varargs int SetSpellFatigue(int duration, string key)

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

ARGUMENTE:
    int duration: Wie lang soll die Spruchermuedung andauern?
    string key  : Eindeutiger Name des Spruches, einer Gruppe von Spruechen
                  oder 0 fuer die globale Spruchermuedung.

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

    <duration> ist die Zeit (in Sekunden), welche die Spruchermuedung
    anhalten soll (nicht die Endzeit).

    Wird <key> nicht angegeben oder ist 0, wird die globale Spruchsperre
    gesetzt (identisch zu der Property P_NEXT_SPELL_TIME), anderenfalls die
    unter <key> gespeicherte Spruchermuedung.
    Setzt man einen Eintrag ohne Angabe von <key> bedeutet dies damit auch,
    dass der Wert von P_NEXT_SPELL_TIME geaendert wird.

RUeCKGABEWERT:
    -1    Der Eintrag <key> ist noch nicht abgelaufen, es wurde _keine_
          neue Spruchermuedung/-Sperre gespeichert.

    >0    Eintrag wurde gespeichert, Rueckgabewert ist die Zeit, zu der die
          Sperre ablaeuft.

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 (CalculateSpellSuccess(...) > x) {
      // Spellfatigue setzen (und Erfolg pruefen!)
      if (ob->SetSpellFatigue(5, "extrasuess") > -1) {
        tell_object(ob, "Du fuetterst " + enemy->Name(WEN) + " mit einem "
          "Stueck suesser Schokotorte.\n");
        ...
      }
      else {
        // Sauerei! Zu ermuedet fuer diesen Spruch. Fehlermdeldung ...
      }
    }
    Dieses setzt natuerlich voraus, dass alle anderen Sprueche der Gruppe
    "extrasuess" den gleichen <key> pruefen und setzen.
    (Will man vor CalculateSpellSuccess() wissen, ob der Spruch ueberhaupt
     gewirkt werden duerfte, sollte man hierzu dann CheckSpellFatigue()
     verwenden.)

BEMERKUNGEN:
    Die genauen Zeitdauern koennen von Spielern beeinflusst werden, sie
    unterliegen der jeweiligen Einstellung von 'spruchermuedung', d.h. koennen
    auf volle 2s aufgerundet werden. (Dies ist nicht der Fall bei NPC.)
    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:
    CheckSpellFatigue(L), DeleteSpellFatigue(L)
    P_NEXT_SPELL_TIME
    spruchermuedung

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

