UseSpell()
**********


FUNKTION
========

   public varargs int UseSpell(string str, string spell)


DEFINIERT IN
============

   /std/living/skills.c


ARGUMENTE
=========

   string str       Spell-Optionen
   string spell     optionaler Spellname


BESCHREIBUNG
============

   Benutzt einen Spell, dessen Spellname 'spell' ggf ueber query_verb()
   ermittelt wird. Dieser Spell sollte (als kleingeschriebener
   Skill/Spell) im Living vorliegen.



   Die Argumente 'str' werden als SI_SKILLARG temporaer in das
   Skillmapping eingetragen (also nur fuer diesen Aufruf gueltig).



   Eine ausfuehrbare Spell-Funktion zum Spell wird in folgender
   Reihenfolge bestimmt:
   - eine gesetzte SI_CLOSURE nutzen
   - "UseSpell" an einem gesetzten SI_SPELLBOOK nutzen
   - "UseSpell" an der gesetzten P_GUILD nutzen
     - [UseSpell der Gilde sucht iA ebenfalls nur den Spell am Spellbook]
   - eine Closure mit Rueckgabewert 0 erstellen
   Die so bestimmte Spell-Funktion wird dann als SI_CLOSURE im Spieler
   gesetzt und ist bis zur Zerstoerung der entsprechenden Objekte gueltig.
   Die Methode wird dann gerufen (der Spell also angewandt).

   Standardmaessig gibt ein UseSpell() also 0 zurueck, es sei denn, eine
   Funktion wurde fuer den Spell an einer der oben genannten Stellen
   implementiert.

   SI_INHERIT ist fuer Spells beim Aufruf wirkungslos (gilt aber bei
   LearnSkill normal).

   Ein Durchlauf von UseSpell durch den Spieler sieht in etwa so aus:
     1) Die Methode wird als Empfaenger fuer Kommandos bekannt gemacht.
        Das passiert mit der Anweisung
        'add_action("UseSpell", "", 1);' in den Dateien player/base.c und
        in living/npc.c.

     2) /std/living/skills::UseSpell wird durch Kommando oder Heartbeat
        gerufen.



     3) UseSpell() ermittelt eine SI_CLOSURE oder delegiert diesen Aufruf
        an die gueltige Gilde/das Spellbook weiter.



     4) Eine gueltige Closure wird ausgefuehrt. UseSpell() uebergibt dabei
        die Spell/Skill-Informationen und SI_SKILLARG.



     4.1.) Im Normalfall einer Gilde/Spellbook landet der Aufruf ueber
           /std/gilden_ob::UseSpell() in /std/spellbook::UseSpell() und
           dieses ruft eine Spellfunktion im Spellbook auf.
           Die Spellfunktion arbeitet mit den Spell-Informationen und
           gibt ein ERFOLG, MISSERFOLG oder 0 dafuer zurueck, ob das
           Spellbook Lernen/Fehlermeldung oder nichts machen soll.
           Dementsprechend werden P_SP, P_ATTACK_BUSY und
           P_NEXT_SPELL_TIME im Spellbook geaendert.

     5.) Der Aufruf der Closure kehrt zurueck und wird zurueckgegeben.
         Damit ist der 0-Rueckgabewert der Spellfunktion im Spellbook
         aequivalent einem nicht ausgefuehrten Kommando.


SIEHE AUCH
==========

   Skills Lernen:  LearnSkill, ModifySkill, LimitAbility
   * Nutzung:      UseSkill
   * Abfragen:     QuerySkill, QuerySkillAbility
   * Modifikation: ModifySkillAttribute, QuerySkillAttribute,
                   QuerySkillAttributeModifier, RemoveSkillAttributeModifier
     * Properties: P_SKILL_ATTRIBUTES, P_SKILL_ATTRIBUTE_OFFSETS
   * sonstig:      spruchermuedung, skill_info_liste
   * Properties:   P_NEWSKILLS
   Spellbook:      UseSpell (spellbook), Learn, SpellSuccess

5. Okt 2011 Gloinson
