blob: dbc68691a7ad4c2e155e94e6decd618a2ecabcde [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001AddSpell()
2
3FUNKTION:
4 varargs int AddSpell(int rate, int damage, string TextForEnemy,
5 string TextForOthers, string|string* dam_type,
6 string func, int|mapping spellarg)
7
8DEFINIERT IN:
9 /std/npc/combat.c
10
11ARGUMENTE:
12 rate - Relative Haeufigkeit der Anwendung (*),
13 muss >= 0 sein
14 damage - Der Schadenswert fuer Defend(),
15 muss > 0 sein
16 TextForEnemy - Text, den der Feind erhalten soll
17 TextForOthers - Text, den andere im Raum erhalten sollen
18 dam_type - Schadenstyp(en) fuer Defend(),
19 (Default: ({DT_MAGIC}) )
20 func - Funktionsname, die nach Anwendung aufgerufen werden soll
21 (Optional, gerufen an this_object(), bekommt als Argumente
22 object enemy, int real_damage, string* dam_type)
23 spellarg - Spell-Argument fuer Defend(), Default ist "1"
24
25BESCHREIBUNG:
26 Ermoeglicht einfache Angriffs-Zaubersprueche fuer NPCs. Das Ausfuehren von
27 Spells verursacht bei dem NPC keine KP-Kosten.
28
29 Mit P_SPELLRATE wird die generelle Wahrscheinlichkeit der Ausfuehrung
30 solcher Spells im Heartbeat angegeben, mit 'rate' kann man die relative
31 Wahrscheinlichkeit der Spells untereinander steuern.
32
33 (*) Relative Haeufigkeit heisst, dass sich alle 'rate' der Spells
34 aufaddieren und ein einzelnes 'rate' dann in Relation zur Gesamtsumme
35 steht. D.h. drei Spells mit 80, 10, 10 (Summe 100) haben die selben
36 Aufruf-Wahrscheinlichkeiten wie drei Spells mit 120, 15, 15 oder drei
37 Spells mit 160, 20, 20.
38
39 Ein Spell wird immer in folgender Reihenfolge abgearbeitet:
40 1. Die Texte werden an die Beteiligten ausgegeben.
41 2. Es wird ggf. SpellDefend gerufen (wenn kein SP_PHYSICAL_ATTACK).
42 Abbruch bei Schutz.
43 3. Im Opfer wird Defend() mit den angegebenen Werten aufgerufen.
44 Abbruch bei Tod/Zerstoerung des Opfers.
45 4. Eine Funktion, so definiert, wird ausgefuehrt.
46
47BEMERKUNGEN:
48 TextForOthers wird vor der Ausgabe der Meldung durch replace_personal()
49 geschickt, d.h. es koennen Platzhalter wie @WER1, @WEMQP1 und aehnliche
50 verwendet werden (siehe auch die Manpage von replace_personal()).
51 Da Ersetzungen nur fuer das Gegnerobjekt beruecksichtigt werden, koennen
52 nur Platzhalter mit Endziffer 1 verwendet werden. Die Ersetzungen werden
53 so gesteuert, dass die eingefuegten Namen nach Satzanfaengen automatisch
54 gross geschrieben werden.
55 Frueher wurden statt replace_personal() die Platzhalter @WER, @WESSEN,
56 @WEM, @WEN verwendet. Diese funktionieren weiterhin, sollten aber nicht
57 mehr in neuem Code benutzt werden.
58
59 In der von AddSpell gerufenen Methode "func" koennen speziellere
60 Sachen mit dem aktuellen Feind angestellt werden koennen. Die Methode
61 darf als Sichtbarkeitsmodifikator maximal "", "public" oder "static"
62 (obsolet) haben und muss im selben Objekt definiert sein.
63
64 Will man einen physischen Angriff ausloesen, MUSS <spellarg> ein Mapping
65 mit ([SP_PHYSICAL_ATTACK: 1]) sein. Bei Uebergeben einer 0 oder Weglassen
66 des Werts wird an Defend das Default '1' (da es Spells sind) uebergeben.
67
68 Wenn damage<=0 oder rate<0 oder keine Meldungen uebergeben werden, wird
69 der Spell NICHT eingetragen, sondern die Funktion bricht mit Rueckgabe
70 von 0 ab.
71
72BEISPIELE:
73 // #1 Einfacher NPC mit drei Spells, Gesamtrate = 100, also sind die
74 // Raten direkt als Prozent Aufrufwahrscheinlichkeit lesbar.
75 AddSpell(80, 400,
76 "Der Hexer greift Dich mit einem kleinen Feuerball an.\n",
77 "Der Hexer greift @WEN mit einem kleinen Feuerball an.\n",
78 ({DT_FIRE, DT_MAGIC}));
79 AddSpell(10, 800,
80 "Der Hexer greift Dich mit einem riesigen Feuerball an.\n",
81 "Der Hexer greift @WEN mit einem riesigen Feuerball an.\n",
82 ({DT_FIRE, DT_MAGIC}));
83 AddSpell(8, 100,
84 "Der Hexer piekst Dir in die Augen!",
85 "Der Hexer piekst @WEM in die Augen!", ({DT_PIERCE}),
86 "augen_stechen");
87 AddSpell(2, 5, (string)0, (string)0, (string*)0, "salto_mortalis");
88
89 (Kleiner Feuerball mit 80% Wahrscheinlichkeit, riesiger mit 10%,
90 "augen_stechen" mit 8%, "salto_mortalis" mit 2%)
91
92 // Die Funktion "augen_stechen" kann dann so aussehen:
93 void augen_stechen(object enemy, int damage, mixed dam_types ) {
94 if (damage>10 && !enemy->QueryProp(P_BLIND)) {
95 enemy->SetProp(P_BLIND, 1);
96 if(enemy->QueryProp(P_BLIND))
97 tell_object(enemy, "Du bist nun blind!\n");
98 }
99 }
100
101 // Zur Funktion "salto_mortalis" gibt es keine Meldungen, dennoch
102 // wird Defend mit: enemy->Defend(5, ({DT_MAGIC}), 1, this_object())
103 // gerufen!
104 void salto_mortalis(object enemy, int damage, mixed dam_types ) {
105 // dem geneigten Leser ueberlassen, den Gegner zu toeten
106 }
107
108 // #2 Physische Angriffe: die Ruestungen sollen beruecksichtigt werden!
109 // SP_PHYSICAL_ATTACK muss in einem Mapping auf 1 gesetzt werden,
110 // damit Ruestungen physisch wirken (ansonsten werden nur ihre
111 // DefendFuncs() ausgewertet). Es muss auch eine physische Schadensart
112 // enthalten sein!
113 // SpellDefend() wird bei diesem Flag nicht mehr am Gegner gerufen.
114 AddSpell(100, 200+random(200),
115 "Die kleine Ratte beisst Dich!\n",
116 "@WER wird von einer kleinen Ratte gebissen!\n",
117 ({DT_PIERCE, DT_POISON}), (string)0,
118 ([SP_PHYSICAL_ATTACK:1]));
119
120 // #3 Selektive physische Angriffe (siehe auch man Defend_bsp):
121 // Will man erreichen, dass einige Ruestungen wirken, andere aber
122 // nicht oder nur teilweise, kann man das ueber die Spellparameter
123 // ausfuehrlich steuern:
124
125 // erstmal fuer alle Ruestungsarten einen Schutz von 0% einstellen:
126 mapping armours = map_indices(VALID_ARMOUR_CLASS, #'!);
127 armours[AT_TROUSERS] = 120; // 120% Schutz durch Hosen
128 armours[AT_BOOT] = 30; // 30% Schutz durch Stiefel
129
130 AddSpell(20,200+random(200),
131 "Die kleine Ratte beisst Dir blitzschnell in die Wade!\n",
132 "@WER wird von einer kleinen Ratte in die Wade gebissen!\n",
133 ({DT_PIERCE, DT_POISON}), (string)0,
134 ([SP_PHYSICAL_ATTACK:1, SP_NO_ACTIVE_DEFENSE:1,
135 SP_REDUCE_ARMOUR: armours]));
136
137 // SP_NO_ACTIVE_DEFENSE = 1 schaltet aktive Abwehr (Karate/Klerus) ab
138 // SP_REDUCE_ARMOUR enthaelt eine Liste von Ruestungstypen mit ihren
139 // neuen Wirkungsgraden in Prozent. Nicht enthaltene Ruestungen haben
140 // weiterhin 100% Schutzwirkung.
141
142SIEHE AUCH:
143 Sonstiges: SpellAttack, SpellDefend, Defend, QueryDefend, SelectEnemy
144 replace_personal
145 Properties: P_DISABLE_ATTACK, P_SPELLRATE, P_AGGRESSIVE
146 Abwehr: Defend, Defend_bsp, SpellDefend
147 Methoden: modifiers
148
14911.12.2015 Arathorn