AddSpell()

FUNKTION:
    varargs int AddSpell(int rate, int damage, string TextForEnemy,
                         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
    TextForOthers - Text, den andere im Raum erhalten sollen
    dam_type      - Schadenstyp(en) fuer Defend(),
                    (Default: ({DT_MAGIC}) )
    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 koennen. 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:
    // #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%)

    // 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");
      }
    }

    // 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:  SpellAttack, SpellDefend, Defend, QueryDefend, SelectEnemy
                 replace_personal
     Properties: P_DISABLE_ATTACK, P_SPELLRATE, P_AGGRESSIVE
     Abwehr:     Defend, Defend_bsp, SpellDefend
     Methoden:   modifiers

Zuletzt geaendert: 20.11.2016, Bugfix
