blob: d145605e0cd588f82064edafa6c0aea8b9394aaf [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001Defend()
Zesstra953f9972017-02-18 15:37:36 +01002********
MG Mud User88f12472016-06-24 23:31:02 +02003
MG Mud User88f12472016-06-24 23:31:02 +02004
Zesstra953f9972017-02-18 15:37:36 +01005FUNKTION
6========
MG Mud User88f12472016-06-24 23:31:02 +02007
Zesstrae9a1ad42019-09-11 21:29:10 +02008 public int Defend(int dam, string|string* dam_types,
9 int|mapping si_spell, object enemy)
MG Mud User88f12472016-06-24 23:31:02 +020010
MG Mud User88f12472016-06-24 23:31:02 +020011
Zesstra953f9972017-02-18 15:37:36 +010012DEFINIERT IN
13============
MG Mud User88f12472016-06-24 23:31:02 +020014
Zesstra953f9972017-02-18 15:37:36 +010015 /std/living/combat
MG Mud User88f12472016-06-24 23:31:02 +020016
MG Mud User88f12472016-06-24 23:31:02 +020017
Zesstra953f9972017-02-18 15:37:36 +010018ARGUMENTE
19=========
MG Mud User88f12472016-06-24 23:31:02 +020020
Zesstra0c1a85a2018-02-07 23:46:50 +010021 int dam
22 Initiale Staerke des Angriffs (10 dam ~ 1 HP)
23
Zesstra5bf48ac2019-02-04 20:33:36 +010024 string* dam_types
Zesstra0c1a85a2018-02-07 23:46:50 +010025 Art des Schadens, der angerichtet werden soll Muss ein Array von
26 Schadenstypen sein, alte Objekte uebergeben hier manchmal
27 strings.
28
Zesstra5bf48ac2019-02-04 20:33:36 +010029 mapping si_spell
Zesstra0c1a85a2018-02-07 23:46:50 +010030 Mapping mit zusaetzlichen Informationen zum Angriff(Siehe unten)
31 Alte Objekte uebergeben manchmal einen Integer (0 fuer
32 Physikalischen Angriff, 1 fuer Zauber.
33
34 object enemy
35 Der Feind/Schadenverursacher
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============
40
Zesstra0c1a85a2018-02-07 23:46:50 +010041
Zesstrabfab6ac2018-08-29 22:36:57 +020042Generell
43--------
Zesstra953f9972017-02-18 15:37:36 +010044
Zesstrabfab6ac2018-08-29 22:36:57 +020045 Wenn das Lebewesen angegriffen wird, wird geprueft, wie stark die
46 Ruestungen und koerpereigenen Abwehrkraefte sind und die Staerke
47 des Schadens dementsprechend vermindert. Ggf. wird der Schaden
48 zugefuegt und der Feind in die Liste der Feinde aufgenommen. Der
49 Schaden betraegt: (dam-
50 Summe(Ruestungsstaerken)-random(P_BODY+A_DEX))*CheckResistance/10
51 aber nicht unter 0.
Zesstra953f9972017-02-18 15:37:36 +010052
Zesstra0c1a85a2018-02-07 23:46:50 +010053
Zesstrae9a1ad42019-09-11 21:29:10 +020054Der Parameter 'si_spell'
55------------------------
Zesstra0c1a85a2018-02-07 23:46:50 +010056
Zesstrae9a1ad42019-09-11 21:29:10 +020057 Ist 'si_spell' 0, dann gilt der Angriff als normale physische
58 Attacke Uebergibt man als 'si_spell'-Parameter ein Mapping, so gibt
59 es dafuer diverse Flags, die das Ergebnis manipulieren (in
60 new_skills.h enthalten). Nichtangabe eines Flags gilt als 0.
Zesstra0c1a85a2018-02-07 23:46:50 +010061
Zesstra5bf48ac2019-02-04 20:33:36 +010062 * SP_PHYSICAL_ATTACK (int)
Zesstra5bf48ac2019-02-04 20:33:36 +010063 1, wenn es ein physischer Angriff ist, d.h. Ruestungen wirken
64 sollen, 0 sonst. Dies entspricht dem alten !spell (wenn Spell
65 kein Mapping ist).
Zesstra0c1a85a2018-02-07 23:46:50 +010066
Zesstra5bf48ac2019-02-04 20:33:36 +010067 * SP_NO_ENEMY (int)
Zesstra5bf48ac2019-02-04 20:33:36 +010068 1, falls der Angriff nicht toedlich ist, es also keinen echten
69 Gegner gibt. Es wird dann reduce_hit_points() gerufen statt
70 do_damage()
Zesstra0c1a85a2018-02-07 23:46:50 +010071
Zesstra5bf48ac2019-02-04 20:33:36 +010072 * SP_NO_ACTIVE_DEFENSE (int)
Zesstra5bf48ac2019-02-04 20:33:36 +010073 1, falls aktive Abwehren (wie zurueckschlagende Amulette,
74 Karateabwehren oder Ausweichmanoever) unterbleiben sollen, zB
75 bei Kratzen durch Dornen oder Fall aus grosser Hoehe ist
76 aktive Abwehr oder Ausweichen unlogisch
Zesstra0c1a85a2018-02-07 23:46:50 +010077
Zesstra5bf48ac2019-02-04 20:33:36 +010078 * SP_RECURSIVE (int)
Zesstra5bf48ac2019-02-04 20:33:36 +010079 1, falls der Spell aus einem Defend gerufen wurde (oder einer
80 DefendFunc). Dies ist sehr wichtig, um unendliche Rekursionen
81 zu vermeiden, wenn zwei zurueckschlagende Verteidigungen
82 zusammentreffen.
Zesstra0c1a85a2018-02-07 23:46:50 +010083
Zesstra5bf48ac2019-02-04 20:33:36 +010084 * SP_NAME (string)
Zesstra5bf48ac2019-02-04 20:33:36 +010085 Name des Spells
Zesstra953f9972017-02-18 15:37:36 +010086
Zesstra5bf48ac2019-02-04 20:33:36 +010087 * SP_GLOBAL_ATTACK (int)
Zesstra5bf48ac2019-02-04 20:33:36 +010088 1 bei Flaechenspells (die mehrere Ziele treffen koennen)
Zesstra0c1a85a2018-02-07 23:46:50 +010089
Zesstrae9a1ad42019-09-11 21:29:10 +020090 * SP_REDUCE_ARMOUR (mapping) ------------
Zesstrae959e722025-07-09 22:11:16 +020091 Mapping: keys AT_X/P_BODY/P_PARRY_WEAPON, values int>=0 Die
92 Schutzwirkung durch P_AC/Magie einer Ruestung wird
93 typabhaengig reduziert. Als Keys sind P_BODY, P_PARRY_WEAPON
94 und die AT_* erlaubt, die Werte muessen ints >= 0 sein. Mit
95 AT_DEFAULT_REDUCE laesst sich ein Standardwert fuer alle nicht
96 gesetzten Eintraege setzen. Diese wirken dann nicht normal,
97 sondern mit der hier angegebenen Staerke. Aufbau eines
98 Mappings im Beispiel:
Zesstra5bf48ac2019-02-04 20:33:36 +010099
100 ([AT_BOOTS: 0, // Stiefel schuetzen gar nicht
101 P_BODY: 50, // Koerper zu 50%
102 AT_BELT: 600 // Guertel zu 600%
103 ])
104 -> alle 'fehlenden' Eintraege wirken normal
105
106 * SP_SHOW_DAMAGE (int or Array von Array)
Zesstra5bf48ac2019-02-04 20:33:36 +0100107 0 fuer keine Treffermeldung, 1 fuer Standardtreffermeldungen.
108 Falls individuelle Treffermeldungen geschwuenscht sind,
109 koennen aber auch in einem Array Ersatz-Treffermeldungen
110 definiert werden. Das Format ist:
111
112 ({
113 ({ int lphit1, string mess_me, string mess_en, string mess_room }),
114 ({ lphit2, mess_me, mess_en, mess_room }),
115 ...
116 ({ lphitn, mess_me, mess_en, mess_room }),
117 })
118 wobei lphit1<lphit2<...<lphitn sein muss, d.h. das Array-Array
119 aufsteigend sortiert.
120
121 Ist ein Treffer x LP hart, werden die Meldungen des lphit-
122 Arrays ausgegeben, dessen Wert am naehesten unter dem Schaden
123 liegt.
124
125 In den Meldungen mess_me (an den Getroffenen), mess_en (an den
126 Feind), mess_room (an die restlichen Umstehenden) koennen
127 Ersatzstrings wie folgt verwendet werden:
128
129 @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen (TO)
130 @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes (enemy)
131
132 * EINFO_DEFEND (mapping)
Zesstra5bf48ac2019-02-04 20:33:36 +0100133 Dieses Mapping liefert erweiterte Informationen zu dem
134 bisherigen Ablauf des aktiven Attacks. Die verfuegbaren
135 Informationen sind in der Manpage zu DefendInfo festgehalten.
Zesstra953f9972017-02-18 15:37:36 +0100136
Zesstra0c1a85a2018-02-07 23:46:50 +0100137
Zesstrabfab6ac2018-08-29 22:36:57 +0200138Reihenfolgen in Defend
139----------------------
Zesstra0c1a85a2018-02-07 23:46:50 +0100140
Zesstrabfab6ac2018-08-29 22:36:57 +0200141 * das Living wird angegriffen, wenn * P_NO_ATTACK != 0 * 'enemy'
142 existiert und kein netztoter Spieler ist
Zesstra0c1a85a2018-02-07 23:46:50 +0100143
Zesstrabfab6ac2018-08-29 22:36:57 +0200144 * P_DEFENDERS werden durchgegangen (und eventuell benachrichtigt)
Zesstra0c1a85a2018-02-07 23:46:50 +0100145
Zesstrabfab6ac2018-08-29 22:36:57 +0200146 * P_TMP_ATTACK_HOOK wird abgefragt
Zesstra0c1a85a2018-02-07 23:46:50 +0100147
Zesstrabfab6ac2018-08-29 22:36:57 +0200148 * die Ruestungen werden vom Schaden gegebenenfalls abgezogen
Zesstra0c1a85a2018-02-07 23:46:50 +0100149
Zesstrabfab6ac2018-08-29 22:36:57 +0200150 * magischer Ausweichskill beruecksichtigt
Zesstra0c1a85a2018-02-07 23:46:50 +0100151
Zesstrabfab6ac2018-08-29 22:36:57 +0200152 * sensitive Objekte werden ggf. benachrichtigt
Zesstra0c1a85a2018-02-07 23:46:50 +0100153
Zesstrabfab6ac2018-08-29 22:36:57 +0200154 * InternalModifyDefend wird gerufen
Zesstra0c1a85a2018-02-07 23:46:50 +0100155
Zesstrabfab6ac2018-08-29 22:36:57 +0200156 * Koerperabwehr abgezogen
Zesstra0c1a85a2018-02-07 23:46:50 +0100157
Zesstrabfab6ac2018-08-29 22:36:57 +0200158 * der Schaden an do_damage()/reduce_hit_points() uebergeben
159
160 * Flucht ueberpruefen mit CheckWimpyAndFlee()
Zesstra953f9972017-02-18 15:37:36 +0100161
162
163BEMERKUNGEN
164===========
165
Zesstra0c1a85a2018-02-07 23:46:50 +0100166 Ruestungen wirken konventionell nur, wenn mindestens ein
167 Schadensanteil mechanisch ist und es kein Spell oder ein Spell mit
168 SP_PHYSICAL_ATTACK auf 1 ist.
Zesstra953f9972017-02-18 15:37:36 +0100169
Zesstra0c1a85a2018-02-07 23:46:50 +0100170 Defend() beruecksichtigt magische Verteidigungen, die der Spieler
171 bei sich hat, sollte also aus Fairness gegenueber den Objekten
172 anderer Magier immer dem direkten reduce_hit_points() oder
173 do_damage() vorgezogen werden. Mittels der Flags in 'spell' kann
174 man sehr viel aendern.
Zesstra953f9972017-02-18 15:37:36 +0100175
176
177RUECKGABEWERT
178=============
179
180 Hoehe des tatsaechlichen Schadens. Dies kann mehr sein als die
181 Lebenspunkte des Lebewesens.
MG Mud User88f12472016-06-24 23:31:02 +0200182
MG Mud User88f12472016-06-24 23:31:02 +0200183
Zesstrabfab6ac2018-08-29 22:36:57 +0200184BEISPIELE (SIEHE AUCH Defend_bsp)
185=================================
MG Mud User88f12472016-06-24 23:31:02 +0200186
Zesstrabfab6ac2018-08-29 22:36:57 +0200187 // ein simpler Angriff:
188 enem->Defend(100, ({DT_BLUDGEON}), ([SP_PHYSICAL_ATTACK:1]), this_object());
MG Mud User88f12472016-06-24 23:31:02 +0200189
Zesstrabfab6ac2018-08-29 22:36:57 +0200190 // ein magischer Angriff (ohne Treffermeldung):
Arathorn3f92d242020-01-22 21:43:46 +0100191 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}),
192 ([SP_PHYSICAL_ATTACK:0, SP_SHOW_DAMAGE:0 ]),this_object());
Zesstrabfab6ac2018-08-29 22:36:57 +0200193
194 // ein magischer Angriff mit Treffermeldung:
Arathorn3f92d242020-01-22 21:43:46 +0100195 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}),
196 ([SP_PHYSICAL_ATTACK:0, SP_SHOW_DAMAGE:1]), this_object());
Zesstra953f9972017-02-18 15:37:36 +0100197
198
199SIEHE AUCH
200==========
201
Zesstrae9a1ad42019-09-11 21:29:10 +0200202 Angriff:
203 Attack(), P_NO_ATTACK, InsertEnemy()
MG Mud User88f12472016-06-24 23:31:02 +0200204
Zesstrae9a1ad42019-09-11 21:29:10 +0200205 Schaden:
206 P_ENABLE_IN_ATTACK_OUT, P_LAST_MOVE, do_damage(),
207 reduce_hit_points()
Zesstra0c1a85a2018-02-07 23:46:50 +0100208
Zesstrae9a1ad42019-09-11 21:29:10 +0200209 Schutz:
210 P_DEFENDERS, InformDefend(), DefendOther(), P_ARMOURS, P_AC,
211 P_DEFEND_FUNC, QueryDefend(), P_BODY
Zesstra0c1a85a2018-02-07 23:46:50 +0100212
Zesstrae9a1ad42019-09-11 21:29:10 +0200213 Daten:
214 P_LAST_COMBAT_TIME, P_LAST_DAMTYPES, P_LAST_DAMTIME,
215 P_LAST_DAMAGE, P_DAMAGE_MSG
Zesstra0c1a85a2018-02-07 23:46:50 +0100216
Zesstrae9a1ad42019-09-11 21:29:10 +0200217 Resistenz:
218 P_RESISTANCE_STRENGTHS, CheckResistance()
Zesstra0c1a85a2018-02-07 23:46:50 +0100219
Zesstrae9a1ad42019-09-11 21:29:10 +0200220 Sonstiges:
221 CheckSensitiveAttack(), InternalModifyDefend(),
222 normalize_defend_args(), UseSkill(), DefendInfo()
Zesstra0c1a85a2018-02-07 23:46:50 +0100223
Zesstrae959e722025-07-09 22:11:16 +0200224Letzte Aenderung: 08.07.2025, Bugfix