Man-Page AddSpell() an RST angepasst.
Und Kleinigkeiten ergaenzt.
Change-Id: I10a66a263dc1b00b6deb1b06d252e59476793a3d
diff --git a/doc/sphinx/lfun/AddSpell.rst b/doc/sphinx/lfun/AddSpell.rst
index c4f8dbb..e7eeb42 100644
--- a/doc/sphinx/lfun/AddSpell.rst
+++ b/doc/sphinx/lfun/AddSpell.rst
@@ -3,7 +3,6 @@
FUNKTION
--------
-::
varargs int AddSpell(int rate, int damage,
string|<int|spell>* TextForEnemy, string|<int|string>* TextForOthers,
@@ -11,169 +10,180 @@
DEFINIERT IN
------------
-::
- /std/npc/combat.c
+ /std/npc/combat.c
ARGUMENTE
---------
-::
- rate - Relative Haeufigkeit der Anwendung (*),
- muss >= 0 sein
- damage - Der Schadenswert fuer Defend(),
- muss >= 0 sein. Bei Schaden von 0 MUSS eine Funktion
- eingetragen werden.
- 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}) )
- 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"
+ 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.
+ 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.
+ 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.
+ (*) 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.
+ 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.
+ 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.
+ 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.
+ 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.
+ 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",
+ // #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",
+ 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");
+ ({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%)
+ (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");
- }
+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");
}
+ }
- // 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
- }
+code-block::
- // #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]));
+ // 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
+ }
- // #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:
+ // #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.
- // 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(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]));
- 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]));
+ // #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:
- // 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.
+ // 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
+ 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