Misserfolg()
************


FUNKTION
========

   void Misserfolg(object caster, string spell, mapping sinfo)


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

   /std/spellbook.c


ARGUMENTE
=========

   object caster    Spell sprechender Spieler
   string spell     Spellname
   mapping sinfo    Spell-Info-Mapping mit allen Informationen


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

   Wird bei Misserfolg eines Spells im Spellbook aufgerufen und
   ruft die Lernfunktion Learn() nach einer Fehlermeldung.



   Kann ueberschrieben werden, um die Meldungen anzupassen.


BEISPIEL
========

   // Misserfolge im Klerus mit angepassten Meldungen
   void Misserfolg(object caster, string spell, mapping sinfo) {
     switch(spell) {
       case "begrabe":
         tell_object(caster, BS(
           "Du begraebst Deine Hoffnungen, dass Du diese Anrufung jemals "
           "perfekt beherrschen wirst."));
         tell_room(environment(caster),
           caster->Name(WER)+" tritt die Leiche lustlos.\n", ({caster}));
         break;
       case "blitz":
       [...]
     }



     int old_abil = sinfo[SI_SKILLABILITY];
     Learn(caster, spell, sinfo);
     int new_abil = caster->QuerySkillAbility(spell);
     if (old_abil < new_abil)
       tell_object(caster, "Die Goetter schenken Dir eine Erleuchtung.\n");
     else
       tell_object(caster, "Leider lernst Du nicht aus Deinem Fehler.\n");
   }


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

   Spellbook Lernen: Learn, SpellSuccess, Erfolg
   * Verwalten:      AddSpell, QuerySpell
   * Angriff:        TryAttackSpell, TryDefaultAttackSpell,
                     TryGlobalAttackSpell
   * Properties:     P_GLOBAL_SKILLPROPS, P_SB_SPELLS
   Skills Lernen:    LearnSkill, ModifySkill, LimitAbility
   * Nutzung:        UseSpell, UseSkill
   * sonstig:        spruchermuedung, skill_info_liste

5. Okt 2011 Gloinson
