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