Lpc Manpages

AddSpell()

FUNKTION:
     varargs void AddSpell(int rate, int damage,
                           string TextForEnemy, string TextForOthers,
                           mixed dam_type, mixed sp_info, mixed sp_extra)

DEFINIERT IN:
     /std/npc/combat.c

ARGUMENTE:
     rate
          relative Spellhaeufigkeit, bezogen auf die Gesamtzahl der Spells
     damage
          Spellschaden in 'Defend-Einheiten'
     TextForEnemy
          Meldung an das Spellopfer
     TextForOthers
          Meldung an alle anderen im Raum
     dam_type
          Schadenstyp (optional, default ist DT_MAGIC)
     sp_info
          Spellinfo-Mapping oder Spellfunktion (optional)
     sp_extra
          Spellfunktion, wenn sp_info ein Spellinfo-Mapping ist (optional)

BESCHREIBUNG:
     Es wird ein Monsterspell definiert, der von der 'Attack'-Funktion des
     Monsters aufgerufen wird, und zwar *vor* dem normalen Angriff.
     Die Wahrscheinlichkeit 'rate' fuer einen Spell ergibt sich relativ
     zu der Summe der 'rate' Werte aller definierten Spells. Die absolute
     Spellrate wird mit der Property P_SPELLRATE gesetzt.
     Der Spellschaden wird in 'Defend-Einheiten' angegeben; 10 'Defend-
     Einheiten' entsprechen (bei direkter, ungeschuetzter Einwirkung) einem
     Lebenspunkt. 
     In den 'TextForOthers' kann man den Name des Opfers mit @WER, @WESSEN,
     @WEM oder @WEN im Nominativ, Genetiv, Dativ oder Akkusativ einsetzen.
     Mit 'sp_info' kann der vom Spell aufgerufenen Funktion 'Defend' der
     3. Parameter ('Spellinfo') gesetzt werden.
     Nach dem eigentlichen Spell kann man noch eine Spellfunktion aufrufen
     lassen (nur wenn das Opfer noch lebt); dieser Funktion werden das Opfer,
     der *tatsaechliche* Schaden und der Schadenstyp uebergeben.
     Wenn kein Spellinfo gesetzt ist wird die Funktion in 'sp_info' ueber-
     geben, sonst in 'sp_extra'.

RUECKGABEWERT:
     keiner
     
BEMERKUNGEN:
     Wenn die Spellwirkung sichtbar sein soll, sollte man 'sp_info' auf
     ([SP_SHOW_DAMAGE:1]) setzen.
     
BEISPIELE:
     Ein ganz einfacher Spell:
     
     SetProp(P_SPELLRATE, 20);  // Wahrscheinlichkeit 20 %
     
     AddSpell( 1, 100,
               "Der Zauberer spricht einen boesen Zauber ueber Dich!\n",
               "Der Zauberer spricht einen boesen Zauber ueber @WEN!\n" );
     
     Ein Spell mit Feuerschaden und Schadensanzeige:
     
     AddSpell( 1, 300,
               "Der Drache spuckt Feuer nach Dir.\n",
               "Der Drache spuckt Feuer nach @WEM.\n",
               DT_FIRE, ([ SP_SHOW_DAMAGE : 1 ]) );
               
     Ein Spell mit Spellfunktion:
     
     AddSpell( 1, 1,  // Auf den Schaden kommt's hier nicht an
               "Die Schlange spuckt Dir in die Augen.\n",
               "Die Schlange spuckt @WEM in die Augen.\n",
               DT_ACID, "spell_blind" );
               
     Die dazugehoerige Spellfunktion wird *nach* dem Spell aufgerufen:
     
     void spell_blind(object enemy, int damage, mixed dam_type)
     {
       // Mit einer gewissen, intelligenzabhaengigen Wahrscheinlichkeit
       // entgeht man dem Erblinden:
       if (random(100) < enemy->QueryAttribute(A_INT)*2)
         return;

       // Wenn der Gegner nicht schon blind war:
       if (!enemy->QueryProp(P_BLIND))
       {
         tell_object(enemy, "Du erblindest.\n");
         tell_room(environment(), enemy->name()+" erblindet.\n");
         enemy->SetProp(P_BLIND, 1);
       }
     }
     
     Ein Spell mit Schadensanzeige und Spellfunktion:
  
     AddSpell( 1, 700,
               "Der Zitteraal versetzt Dir einen starken Stromschlag.\n",
               "Der Zitteraal versetzt @WEM einen starken Stromschlag.\n",
               DT_ELECTRIC, ([ SP_SHOW_DAMAGE : 1 ]), "spell_paralyse" );
               
     Die dazugehoerige Spellfunktion wird *nach* dem Spell aufgerufen:
     
     void spell_paralyse(object enemy, int damage, mixed dam_type)
     {
       // Mit einer gewissen, intelligenzabhaengigen Wahrscheinlichkeit
       // entgeht man der Paralyse:
       if (random(100) < enemy->QueryAttribute(A_INT)*2)
         return;

       if (damage > 400)
       {
         tell_object(enemy, "Der Stromschlag laehmt Dich!\n");
         tell_room(environment(),
           "Der Stromschlag laehmt "+enemy->name(WEN)+".\n", ({enemy}));
         enemy->SetProp(P_DISABLE_ATTACK,
                        enemy->QueryProp(P_DISABLE_ATTACK)+5+random(5));
       }
     }

SIEHE AUCH:
     Attack(), P_SPELLRATE, P_DAM_TYPE, /std/npc/combat.c, /sys/new_skills.h