blob: 189e6b5ca26acdc7396c48fe1b48338a1180a423 [file] [log] [blame]
Zesstra953f9972017-02-18 15:37:36 +01001
MG Mud User88f12472016-06-24 23:31:02 +02002Defend()
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
Zesstrae9a1ad42019-09-11 21:29:10 +02009 public int Defend(int dam, string|string* dam_types,
10 int|mapping si_spell, object enemy)
MG Mud User88f12472016-06-24 23:31:02 +020011
MG Mud User88f12472016-06-24 23:31:02 +020012
Zesstra953f9972017-02-18 15:37:36 +010013DEFINIERT IN
14============
MG Mud User88f12472016-06-24 23:31:02 +020015
Zesstra953f9972017-02-18 15:37:36 +010016 /std/living/combat
MG Mud User88f12472016-06-24 23:31:02 +020017
MG Mud User88f12472016-06-24 23:31:02 +020018
Zesstra953f9972017-02-18 15:37:36 +010019ARGUMENTE
20=========
MG Mud User88f12472016-06-24 23:31:02 +020021
Zesstra0c1a85a2018-02-07 23:46:50 +010022 int dam
23 Initiale Staerke des Angriffs (10 dam ~ 1 HP)
24
Zesstra5bf48ac2019-02-04 20:33:36 +010025 string* dam_types
Zesstra0c1a85a2018-02-07 23:46:50 +010026 Art des Schadens, der angerichtet werden soll Muss ein Array von
27 Schadenstypen sein, alte Objekte uebergeben hier manchmal
28 strings.
29
Zesstra5bf48ac2019-02-04 20:33:36 +010030 mapping si_spell
Zesstra0c1a85a2018-02-07 23:46:50 +010031 Mapping mit zusaetzlichen Informationen zum Angriff(Siehe unten)
32 Alte Objekte uebergeben manchmal einen Integer (0 fuer
33 Physikalischen Angriff, 1 fuer Zauber.
34
35 object enemy
36 Der Feind/Schadenverursacher
MG Mud User88f12472016-06-24 23:31:02 +020037
MG Mud User88f12472016-06-24 23:31:02 +020038
Zesstra953f9972017-02-18 15:37:36 +010039BESCHREIBUNG
40============
41
Zesstra0c1a85a2018-02-07 23:46:50 +010042
Zesstrabfab6ac2018-08-29 22:36:57 +020043Generell
44--------
Zesstra953f9972017-02-18 15:37:36 +010045
Zesstrabfab6ac2018-08-29 22:36:57 +020046 Wenn das Lebewesen angegriffen wird, wird geprueft, wie stark die
47 Ruestungen und koerpereigenen Abwehrkraefte sind und die Staerke
48 des Schadens dementsprechend vermindert. Ggf. wird der Schaden
49 zugefuegt und der Feind in die Liste der Feinde aufgenommen. Der
50 Schaden betraegt: (dam-
51 Summe(Ruestungsstaerken)-random(P_BODY+A_DEX))*CheckResistance/10
52 aber nicht unter 0.
Zesstra953f9972017-02-18 15:37:36 +010053
Zesstra0c1a85a2018-02-07 23:46:50 +010054
Zesstrae9a1ad42019-09-11 21:29:10 +020055Der Parameter 'si_spell'
56------------------------
Zesstra0c1a85a2018-02-07 23:46:50 +010057
Zesstrae9a1ad42019-09-11 21:29:10 +020058 Ist 'si_spell' 0, dann gilt der Angriff als normale physische
59 Attacke Uebergibt man als 'si_spell'-Parameter ein Mapping, so gibt
60 es dafuer diverse Flags, die das Ergebnis manipulieren (in
61 new_skills.h enthalten). Nichtangabe eines Flags gilt als 0.
Zesstra0c1a85a2018-02-07 23:46:50 +010062
Zesstra5bf48ac2019-02-04 20:33:36 +010063 * SP_PHYSICAL_ATTACK (int)
Zesstra0c1a85a2018-02-07 23:46:50 +010064
Zesstra5bf48ac2019-02-04 20:33:36 +010065 1, wenn es ein physischer Angriff ist, d.h. Ruestungen wirken
66 sollen, 0 sonst. Dies entspricht dem alten !spell (wenn Spell
67 kein Mapping ist).
Zesstra0c1a85a2018-02-07 23:46:50 +010068
Zesstra5bf48ac2019-02-04 20:33:36 +010069 * SP_NO_ENEMY (int)
Zesstra0c1a85a2018-02-07 23:46:50 +010070
Zesstra5bf48ac2019-02-04 20:33:36 +010071 1, falls der Angriff nicht toedlich ist, es also keinen echten
72 Gegner gibt. Es wird dann reduce_hit_points() gerufen statt
73 do_damage()
Zesstra0c1a85a2018-02-07 23:46:50 +010074
Zesstra5bf48ac2019-02-04 20:33:36 +010075 * SP_NO_ACTIVE_DEFENSE (int)
Zesstra0c1a85a2018-02-07 23:46:50 +010076
Zesstra5bf48ac2019-02-04 20:33:36 +010077 1, falls aktive Abwehren (wie zurueckschlagende Amulette,
78 Karateabwehren oder Ausweichmanoever) unterbleiben sollen, zB
79 bei Kratzen durch Dornen oder Fall aus grosser Hoehe ist
80 aktive Abwehr oder Ausweichen unlogisch
Zesstra0c1a85a2018-02-07 23:46:50 +010081
Zesstra5bf48ac2019-02-04 20:33:36 +010082 * SP_RECURSIVE (int)
Zesstra0c1a85a2018-02-07 23:46:50 +010083
Zesstra5bf48ac2019-02-04 20:33:36 +010084 1, falls der Spell aus einem Defend gerufen wurde (oder einer
85 DefendFunc). Dies ist sehr wichtig, um unendliche Rekursionen
86 zu vermeiden, wenn zwei zurueckschlagende Verteidigungen
87 zusammentreffen.
Zesstra0c1a85a2018-02-07 23:46:50 +010088
Zesstra5bf48ac2019-02-04 20:33:36 +010089 * SP_NAME (string)
Zesstra953f9972017-02-18 15:37:36 +010090
Zesstra5bf48ac2019-02-04 20:33:36 +010091 Name des Spells
Zesstra953f9972017-02-18 15:37:36 +010092
Zesstra5bf48ac2019-02-04 20:33:36 +010093 * SP_GLOBAL_ATTACK (int)
Zesstra0c1a85a2018-02-07 23:46:50 +010094
Zesstra5bf48ac2019-02-04 20:33:36 +010095 1 bei Flaechenspells (die mehrere Ziele treffen koennen)
Zesstra0c1a85a2018-02-07 23:46:50 +010096
Zesstrae9a1ad42019-09-11 21:29:10 +020097 * SP_REDUCE_ARMOUR (mapping) ------------
Zesstra0c1a85a2018-02-07 23:46:50 +010098
Zesstrae9a1ad42019-09-11 21:29:10 +020099 Mapping: keys AT_X/P_BODY, values int>=0 Die Schutzwirkung
100 durch P_AC/Magie einer Ruestung wird typabhaengig reduziert.
101 Als Keys sind P_BODY und die AT_* erlaubt, die Werte muessen
102 ints > 0 sein. Aufbau eines Mappings im Beispiel:
Zesstra5bf48ac2019-02-04 20:33:36 +0100103
104 ([AT_BOOTS: 0, // Stiefel schuetzen gar nicht
105 P_BODY: 50, // Koerper zu 50%
106 AT_BELT: 600 // Guertel zu 600%
107 ])
108 -> alle 'fehlenden' Eintraege wirken normal
109
110 * SP_SHOW_DAMAGE (int or Array von Array)
111
112 0 fuer keine Treffermeldung, 1 fuer Standardtreffermeldungen.
113 Falls individuelle Treffermeldungen geschwuenscht sind,
114 koennen aber auch in einem Array Ersatz-Treffermeldungen
115 definiert werden. Das Format ist:
116
117 ({
118 ({ int lphit1, string mess_me, string mess_en, string mess_room }),
119 ({ lphit2, mess_me, mess_en, mess_room }),
120 ...
121 ({ lphitn, mess_me, mess_en, mess_room }),
122 })
123 wobei lphit1<lphit2<...<lphitn sein muss, d.h. das Array-Array
124 aufsteigend sortiert.
125
126 Ist ein Treffer x LP hart, werden die Meldungen des lphit-
127 Arrays ausgegeben, dessen Wert am naehesten unter dem Schaden
128 liegt.
129
130 In den Meldungen mess_me (an den Getroffenen), mess_en (an den
131 Feind), mess_room (an die restlichen Umstehenden) koennen
132 Ersatzstrings wie folgt verwendet werden:
133
134 @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen (TO)
135 @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes (enemy)
136
137 * EINFO_DEFEND (mapping)
138
139 Dieses Mapping liefert erweiterte Informationen zu dem
140 bisherigen Ablauf des aktiven Attacks. Die verfuegbaren
141 Informationen sind in der Manpage zu DefendInfo festgehalten.
Zesstra953f9972017-02-18 15:37:36 +0100142
Zesstra0c1a85a2018-02-07 23:46:50 +0100143
Zesstrabfab6ac2018-08-29 22:36:57 +0200144Reihenfolgen in Defend
145----------------------
Zesstra0c1a85a2018-02-07 23:46:50 +0100146
Zesstrabfab6ac2018-08-29 22:36:57 +0200147 * das Living wird angegriffen, wenn * P_NO_ATTACK != 0 * 'enemy'
148 existiert und kein netztoter Spieler ist
Zesstra0c1a85a2018-02-07 23:46:50 +0100149
Zesstrabfab6ac2018-08-29 22:36:57 +0200150 * P_DEFENDERS werden durchgegangen (und eventuell benachrichtigt)
Zesstra0c1a85a2018-02-07 23:46:50 +0100151
Zesstrabfab6ac2018-08-29 22:36:57 +0200152 * P_TMP_ATTACK_HOOK wird abgefragt
Zesstra0c1a85a2018-02-07 23:46:50 +0100153
Zesstrabfab6ac2018-08-29 22:36:57 +0200154 * die Ruestungen werden vom Schaden gegebenenfalls abgezogen
Zesstra0c1a85a2018-02-07 23:46:50 +0100155
Zesstrabfab6ac2018-08-29 22:36:57 +0200156 * magischer Ausweichskill beruecksichtigt
Zesstra0c1a85a2018-02-07 23:46:50 +0100157
Zesstrabfab6ac2018-08-29 22:36:57 +0200158 * sensitive Objekte werden ggf. benachrichtigt
Zesstra0c1a85a2018-02-07 23:46:50 +0100159
Zesstrabfab6ac2018-08-29 22:36:57 +0200160 * InternalModifyDefend wird gerufen
Zesstra0c1a85a2018-02-07 23:46:50 +0100161
Zesstrabfab6ac2018-08-29 22:36:57 +0200162 * Koerperabwehr abgezogen
Zesstra0c1a85a2018-02-07 23:46:50 +0100163
Zesstrabfab6ac2018-08-29 22:36:57 +0200164 * der Schaden an do_damage()/reduce_hit_points() uebergeben
165
166 * Flucht ueberpruefen mit CheckWimpyAndFlee()
Zesstra953f9972017-02-18 15:37:36 +0100167
168
169BEMERKUNGEN
170===========
171
Zesstra0c1a85a2018-02-07 23:46:50 +0100172 Ruestungen wirken konventionell nur, wenn mindestens ein
173 Schadensanteil mechanisch ist und es kein Spell oder ein Spell mit
174 SP_PHYSICAL_ATTACK auf 1 ist.
Zesstra953f9972017-02-18 15:37:36 +0100175
Zesstra0c1a85a2018-02-07 23:46:50 +0100176 Defend() beruecksichtigt magische Verteidigungen, die der Spieler
177 bei sich hat, sollte also aus Fairness gegenueber den Objekten
178 anderer Magier immer dem direkten reduce_hit_points() oder
179 do_damage() vorgezogen werden. Mittels der Flags in 'spell' kann
180 man sehr viel aendern.
Zesstra953f9972017-02-18 15:37:36 +0100181
182
183RUECKGABEWERT
184=============
185
186 Hoehe des tatsaechlichen Schadens. Dies kann mehr sein als die
187 Lebenspunkte des Lebewesens.
MG Mud User88f12472016-06-24 23:31:02 +0200188
MG Mud User88f12472016-06-24 23:31:02 +0200189
Zesstrabfab6ac2018-08-29 22:36:57 +0200190BEISPIELE (SIEHE AUCH Defend_bsp)
191=================================
MG Mud User88f12472016-06-24 23:31:02 +0200192
Zesstrabfab6ac2018-08-29 22:36:57 +0200193 // ein simpler Angriff:
194 enem->Defend(100, ({DT_BLUDGEON}), ([SP_PHYSICAL_ATTACK:1]), this_object());
MG Mud User88f12472016-06-24 23:31:02 +0200195
Zesstrabfab6ac2018-08-29 22:36:57 +0200196 // ein magischer Angriff (ohne Treffermeldung):
Zesstrae9a1ad42019-09-11 21:29:10 +0200197 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_PHYSICAL_ATTACK:0]),
198 this_object());
Zesstrabfab6ac2018-08-29 22:36:57 +0200199
200 // ein magischer Angriff mit Treffermeldung:
201 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_SHOW_DAMAGE:1]),
Zesstrae9a1ad42019-09-11 21:29:10 +0200202 this_object());
Zesstra953f9972017-02-18 15:37:36 +0100203
204
205SIEHE AUCH
206==========
207
Zesstrae9a1ad42019-09-11 21:29:10 +0200208 Angriff:
209 Attack(), P_NO_ATTACK, InsertEnemy()
MG Mud User88f12472016-06-24 23:31:02 +0200210
Zesstrae9a1ad42019-09-11 21:29:10 +0200211 Schaden:
212 P_ENABLE_IN_ATTACK_OUT, P_LAST_MOVE, do_damage(),
213 reduce_hit_points()
Zesstra0c1a85a2018-02-07 23:46:50 +0100214
Zesstrae9a1ad42019-09-11 21:29:10 +0200215 Schutz:
216 P_DEFENDERS, InformDefend(), DefendOther(), P_ARMOURS, P_AC,
217 P_DEFEND_FUNC, QueryDefend(), P_BODY
Zesstra0c1a85a2018-02-07 23:46:50 +0100218
Zesstrae9a1ad42019-09-11 21:29:10 +0200219 Daten:
220 P_LAST_COMBAT_TIME, P_LAST_DAMTYPES, P_LAST_DAMTIME,
221 P_LAST_DAMAGE, P_DAMAGE_MSG
Zesstra0c1a85a2018-02-07 23:46:50 +0100222
Zesstrae9a1ad42019-09-11 21:29:10 +0200223 Resistenz:
224 P_RESISTANCE_STRENGTHS, CheckResistance()
Zesstra0c1a85a2018-02-07 23:46:50 +0100225
Zesstrae9a1ad42019-09-11 21:29:10 +0200226 Sonstiges:
227 CheckSensitiveAttack(), InternalModifyDefend(),
228 normalize_defend_args(), UseSkill(), DefendInfo()
Zesstra0c1a85a2018-02-07 23:46:50 +0100229
Zesstra5bf48ac2019-02-04 20:33:36 +0100230Letzte Aenderung: 20.01.2019, Zesstra