AddSpell()
==========

FUNKTION
--------

  varargs int AddSpell(int rate, int damage,
    string|<int|spell>* TextForEnemy, string|<int|string>* TextForOthers,
    string|string* dam_type, string|closure func, int|mapping spellarg)

DEFINIERT IN
------------

  /std/npc/combat.c

ARGUMENTE
---------

  rate          - Relative Haeufigkeit der Anwendung (*),
                  muss >= 0 sein

  damage        - Der Schadenswert fuer Defend(),
                  muss > 0 sein

  TextForEnemy  - Text, den der Feind erhalten soll
                  String <text> oder
                  Array der Form ({<text>,<messagetype>})
                  (Siehe ReceiveMsg())

  TextForOthers - Text, den andere im Raum erhalten sollen
                  String <text> oder
                  Array der Form ({<text>,<messagetype>})
                  (Siehe ReceiveMsg())

  dam_type      - Schadenstyp(en) fuer Defend(),
                  (Default: ({DT_MAGIC}) fuer Magische und ({DT_BLUDGEON})
                  fuer physikalische Angriffe)

  func          - Funktionsname oder Closure, die nach Anwendung
                  aufgerufen werden soll
                  (Optional, bekommt als Argumente object enemy, 
                  int real_damage, string* dam_type)

  spellarg      - Spell-Argument fuer Defend(), Default ist "1"

BESCHREIBUNG
------------

  Ermoeglicht einfache Angriffs-Zaubersprueche fuer NPCs. Das Ausfuehren von
  Spells verursacht bei dem NPC keine KP-Kosten.

  Mit P_SPELLRATE wird die generelle Wahrscheinlichkeit der Ausfuehrung
  solcher Spells im Heartbeat angegeben, mit 'rate' kann man die relative
  Wahrscheinlichkeit der Spells untereinander steuern.

  (*) Relative Haeufigkeit heisst, dass sich alle 'rate' der Spells
  aufaddieren und ein einzelnes 'rate' dann in Relation zur Gesamtsumme
  steht. D.h. drei Spells mit 80, 10, 10 (Summe 100) haben die selben
  Aufruf-Wahrscheinlichkeiten wie drei Spells mit 120, 15, 15 oder drei
  Spells mit 160, 20, 20.

  Ein Spell wird immer in folgender Reihenfolge abgearbeitet:

  1. Die Texte werden an die Beteiligten ausgegeben.
  2. Es wird ggf. SpellDefend gerufen (wenn kein SP_PHYSICAL_ATTACK).
     Abbruch bei Schutz.
  3. Im Opfer wird Defend() mit den angegebenen Werten aufgerufen.
     Abbruch bei Tod/Zerstoerung des Opfers.
  4. Eine Funktion, so definiert, wird ausgefuehrt.

BEMERKUNGEN
-----------

  TextForOthers wird vor der Ausgabe der Meldung durch replace_personal()
  geschickt, d.h. es koennen Platzhalter wie @WER1, @WEMQP1 und aehnliche
  verwendet werden (siehe auch die Manpage von replace_personal()).
  Da Ersetzungen nur fuer das Gegnerobjekt beruecksichtigt werden, koennen
  nur Platzhalter mit Endziffer 1 verwendet werden. Die Ersetzungen werden
  so gesteuert, dass die eingefuegten Namen nach Satzanfaengen automatisch
  gross geschrieben werden.
  Frueher wurden statt replace_personal() die Platzhalter @WER, @WESSEN, 
  @WEM, @WEN verwendet. Diese funktionieren weiterhin, sollten aber nicht 
  mehr in neuem Code benutzt werden.

  In der von AddSpell gerufenen Methode "func" koennen speziellere
  Sachen mit dem aktuellen Feind angestellt werden. Die Methode
  muss im selben Objekt definiert sein, sofern der Funktionsname und
  keine Closure uebergeben wird.

  Will man einen physischen Angriff ausloesen, MUSS <spellarg> ein Mapping
  mit ([SP_PHYSICAL_ATTACK: 1]) sein. Bei Uebergeben einer 0 oder Weglassen
  des Werts wird an Defend das Default '1' (da es Spells sind) uebergeben.

  Wenn damage<=0 oder rate<0 oder keine Meldungen uebergeben werden, wird
  der Spell NICHT eingetragen, sondern die Funktion bricht mit Rueckgabe
  von 0 ab.

BEISPIELE
---------
code-block::

  // #1 Einfacher NPC mit drei Spells, Gesamtrate = 100, also sind die
  //    Raten direkt als Prozent Aufrufwahrscheinlichkeit lesbar.
  AddSpell(80, 400,
           "Der Hexer greift Dich mit einem kleinen Feuerball an.\n",
           "Der Hexer greift @WEN mit einem kleinen Feuerball an.\n",
             ({DT_FIRE, DT_MAGIC}));
  AddSpell(10, 800,
           "Der Hexer greift Dich mit einem riesigen Feuerball an.\n",
             "Der Hexer greift @WEN mit einem riesigen Feuerball an.\n",
           ({DT_FIRE, DT_MAGIC}));
  AddSpell(8, 100,
           "Der Hexer piekst Dir in die Augen!",
           "Der Hexer piekst @WEM in die Augen!", ({DT_PIERCE}),
           "augen_stechen");
  AddSpell(2, 5, (string)0, (string)0, (string*)0, "salto_mortalis");

  (Kleiner Feuerball mit 80% Wahrscheinlichkeit, riesiger mit 10%,
  "augen_stechen" mit 8%, "salto_mortalis" mit 2%)

code-block::

  // Die Funktion "augen_stechen" kann dann so aussehen:
  void augen_stechen(object enemy, int damage, mixed dam_types )
  {
    if (damage>10 && !enemy->QueryProp(P_BLIND))
    {
      enemy->SetProp(P_BLIND, 1);
      if(enemy->QueryProp(P_BLIND))
        tell_object(enemy, "Du bist nun blind!\n");
    }
  }

code-block::

  // Zur Funktion "salto_mortalis" gibt es keine Meldungen, dennoch
  // wird Defend mit: enemy->Defend(5, ({DT_MAGIC}), 1, this_object())
  // gerufen!
  void salto_mortalis(object enemy, int damage, mixed dam_types )
  {
    // dem geneigten Leser ueberlassen, den Gegner zu toeten
  }

  // #2 Physische Angriffe: die Ruestungen sollen beruecksichtigt werden!
  //    SP_PHYSICAL_ATTACK muss in einem Mapping auf 1 gesetzt werden,
  //    damit Ruestungen physisch wirken (ansonsten werden nur ihre
  //    DefendFuncs() ausgewertet). Es muss auch eine physische Schadensart
  //    enthalten sein!
  //    SpellDefend() wird bei diesem Flag nicht mehr am Gegner gerufen.

  AddSpell(100, 200+random(200),
    "Die kleine Ratte beisst Dich!\n",
    "@WER wird von einer kleinen Ratte gebissen!\n",
    ({DT_PIERCE, DT_POISON}), (string)0,
    ([SP_PHYSICAL_ATTACK:1]));

  // #3 Selektive physische Angriffe (siehe auch man Defend_bsp):
  //    Will man erreichen, dass einige Ruestungen wirken, andere aber
  //    nicht oder nur teilweise, kann man das ueber die Spellparameter
  //    ausfuehrlich steuern:

  // erstmal fuer alle Ruestungsarten einen Schutz von 0% einstellen:
  mapping armours = map_indices(VALID_ARMOUR_CLASS, #'!);
  armours[AT_TROUSERS] = 120;  // 120% Schutz durch Hosen
  armours[AT_BOOT] = 30;       //  30% Schutz durch Stiefel

  AddSpell(20,200+random(200),
    "Die kleine Ratte beisst Dir blitzschnell in die Wade!\n",
    "@WER wird von einer kleinen Ratte in die Wade gebissen!\n",
    ({DT_PIERCE, DT_POISON}), (string)0,
    ([SP_PHYSICAL_ATTACK:1, SP_NO_ACTIVE_DEFENSE:1,
    SP_REDUCE_ARMOUR: armours]));

  // SP_NO_ACTIVE_DEFENSE = 1 schaltet aktive Abwehr (Karate/Klerus) ab
  // SP_REDUCE_ARMOUR enthaelt eine Liste von Ruestungstypen mit ihren
  // neuen Wirkungsgraden in Prozent. Nicht enthaltene Ruestungen haben
  // weiterhin 100% Schutzwirkung.

SIEHE AUCH
----------

  Sonstiges: :doc:`SpellAttack`, :doc:`SpellDefend`, :doc:`Defend`, 
  :doc:`QueryDefend`, :doc:`SelectEnemy`, :doc:`ReceiveMsg`, 
  :doc:`../sefun/replace_personal`

  Properties: :doc:`../props/P_DISABLE_ATTACK`, :doc:`../props/P_SPELLRATE`, :doc:`../props/P_AGGRESSIVE`


Letzte Aenderung: 15.02.2018, Bugfix
