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