AddSpell bekommt ein Skillinfomapping
AddSpell bekam bislang in spellarg das Infomapping fuer Defend()
angegeben (Argument spell in Defend).
Intern hat AddSpell dann aber die Daten von sinfo fuer
SpellDefend() in dieses mapping geschrieben (wo sie nicht
hingehoeren) und SpellDefend() konnte so die Daten von
SI_SPELL nicht finden.
Damit die Sprueche von AddSpell() aber von SpellDefend()
im Ziel korrekt verarbeitet werden koennen, muss es ein
sinnvolles Skillinfomapping (sinfo) geben. Ohne Erweiterung
der Semantik von AddSpell, dass das mapping spellarg nun
sinfo ist, koennen Nutzer von AddSpell() aber keine der
SI_* angeben.
Zum Zwecke der Abwaertskompatibilitaet wird das an AddSpell()
uebergebene Mappoing auf die Praesenz von SI_SPELL geprueft.
Ist dieses nicht vorhanden, wird das Mapping als SI_SPELL
interpretiert und in einem neu erzeugten sinfo unter dem
Schluessel SI_SPELL abgelegt.
Als weitere Aenderungen werden die Daten des Spells jetzt
soweit passend unter die geeigneten SI-*-Schluessel
einsortiert und so in P_SPELLS abgelegt.
Change-Id: I10eb464a46b6754640173f7915cea33354c143ed
diff --git a/doc/sphinx/lfun/AddSpell.rst b/doc/sphinx/lfun/AddSpell.rst
index e7eeb42..b16a0e3 100644
--- a/doc/sphinx/lfun/AddSpell.rst
+++ b/doc/sphinx/lfun/AddSpell.rst
@@ -41,7 +41,10 @@
(Optional, bekommt als Argumente object enemy,
int real_damage, string* dam_type)
- spellarg - Spell-Argument fuer Defend(), Default ist "1"
+ sinfo - Skillinfomapping, muss SI_SPELL mit den SP_* fuer
+ den Aufruf von Defend() enthalten
+ Default ist ([SI_SPELL: ([SP_PHYSICAL_ATTACK: 0]),
+ SI_MAGIC_TYPE: ({ MT_ANGRIFF }) ])
BESCHREIBUNG
------------
@@ -87,13 +90,29 @@
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.
+ Das Mapping <sinfo> beschreibt den Spell fuer das im Gegner aufgerufene
+ SpellDefend() und Defend(). Es muss ein SI_SPELL fuer das Defend() im
+ Gegner enthalten. Etwaige SI_SKILLDAMAGE, SI_SKILLDAMAGE_TYPE, und
+ SI_CLOSURE werden im Mapping durch die Argumente <damage>, <dam_type> und
+ <func> ueberschrieben.
+ Es wird empfohlen, SI_MAGIC_TYPE zu nutzen, denn dann werden etwaige
+ magische Resistenzen des Ziels beruecksichtigt.
- 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.
+ Frueher war das Argument <sinfo> nur das Mapping, was an Defend() uebergeben
+ wird unter in Skillinfomapping unter dem Key SI_SPELL liegt. Wenn <sinfo>
+ kein SI_SPELL enthaelt, wird aus Gruenden der Kompatibilitaet ein
+ Skillinfomapping konstruiert, welches das hier uebergebene <sinfo> unterhalb
+ des Schluessels SI_SPELL enthaelt: ([ SI_SPELL: sinfo])
+
+ Will man einen physischen Angriff ausloesen, MUSS in sinfo ein Mapping sein
+ und unter SI_SPELL ein Mapping mit dem Key SP_PHYSICAL_ATTACK (Wert != 0)
+ sein.
+ Bei Uebergeben einer 0 oder Weglassen von <sinfo> wird an Defend der Default
+ ([SP_PHYSICAL_ATTACK: 0]) (da es Spells sind) uebergeben.
+
+ Wenn damage < 0 oder rate <= 0, wird der Spell NICHT eingetragen, sondern
+ die Funktion bricht mit Rueckgabe von 0 ab. Ist damage==0, muss eine <func>
+ angegeben werden.
BEISPIELE
---------
@@ -113,7 +132,7 @@
"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");
+ AddSpell(2, 5, 0, 0, 0, "salto_mortalis");
(Kleiner Feuerball mit 80% Wahrscheinlichkeit, riesiger mit 10%,
"augen_stechen" mit 8%, "salto_mortalis" mit 2%)
@@ -151,8 +170,8 @@
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]));
+ ({DT_PIERCE, DT_POISON}), 0,
+ ([ SI_SPELL: ([SP_PHYSICAL_ATTACK:1]) ]) );
// #3 Selektive physische Angriffe (siehe auch man Defend_bsp):
// Will man erreichen, dass einige Ruestungen wirken, andere aber
@@ -167,9 +186,10 @@
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]));
+ ({DT_PIERCE, DT_POISON}), 0,
+ ([ SI_SPELL: ([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