blob: e5ee6ea6550e96a62d1709f0364ec499913c9793 [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
Zesstra5bf48ac2019-02-04 20:33:36 +01009 public int Defend(int dam, string|string* dam_types, int|mapping
10 si_spell,
Zesstra0c1a85a2018-02-07 23:46:50 +010011 object enemy)
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/living/combat
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
Zesstra0c1a85a2018-02-07 23:46:50 +010023 int dam
24 Initiale Staerke des Angriffs (10 dam ~ 1 HP)
25
Zesstra5bf48ac2019-02-04 20:33:36 +010026 string* dam_types
Zesstra0c1a85a2018-02-07 23:46:50 +010027 Art des Schadens, der angerichtet werden soll Muss ein Array von
28 Schadenstypen sein, alte Objekte uebergeben hier manchmal
29 strings.
30
Zesstra5bf48ac2019-02-04 20:33:36 +010031 mapping si_spell
Zesstra0c1a85a2018-02-07 23:46:50 +010032 Mapping mit zusaetzlichen Informationen zum Angriff(Siehe unten)
33 Alte Objekte uebergeben manchmal einen Integer (0 fuer
34 Physikalischen Angriff, 1 fuer Zauber.
35
36 object enemy
37 Der Feind/Schadenverursacher
MG Mud User88f12472016-06-24 23:31:02 +020038
MG Mud User88f12472016-06-24 23:31:02 +020039
Zesstra953f9972017-02-18 15:37:36 +010040BESCHREIBUNG
41============
42
Zesstra0c1a85a2018-02-07 23:46:50 +010043
Zesstrabfab6ac2018-08-29 22:36:57 +020044Generell
45--------
Zesstra953f9972017-02-18 15:37:36 +010046
Zesstrabfab6ac2018-08-29 22:36:57 +020047 Wenn das Lebewesen angegriffen wird, wird geprueft, wie stark die
48 Ruestungen und koerpereigenen Abwehrkraefte sind und die Staerke
49 des Schadens dementsprechend vermindert. Ggf. wird der Schaden
50 zugefuegt und der Feind in die Liste der Feinde aufgenommen. Der
51 Schaden betraegt: (dam-
52 Summe(Ruestungsstaerken)-random(P_BODY+A_DEX))*CheckResistance/10
53 aber nicht unter 0.
Zesstra953f9972017-02-18 15:37:36 +010054
Zesstra0c1a85a2018-02-07 23:46:50 +010055
Zesstrabfab6ac2018-08-29 22:36:57 +020056Der Parameter 'spell'
57---------------------
Zesstra0c1a85a2018-02-07 23:46:50 +010058
Zesstrabfab6ac2018-08-29 22:36:57 +020059 Ist 'spell' 0, dann gilt der Angriff als normale physische Attacke
60 Uebergibt man als 'spell'-Parameter ein Mapping, so gibt es dafuer
61 diverse Flags, die das Ergebnis manipulieren (in new_skills.h
62 enthalten). Nichtangabe eines Flags gilt als 0.
Zesstra0c1a85a2018-02-07 23:46:50 +010063
Zesstra5bf48ac2019-02-04 20:33:36 +010064 * SP_PHYSICAL_ATTACK (int)
Zesstra0c1a85a2018-02-07 23:46:50 +010065
Zesstra5bf48ac2019-02-04 20:33:36 +010066 1, wenn es ein physischer Angriff ist, d.h. Ruestungen wirken
67 sollen, 0 sonst. Dies entspricht dem alten !spell (wenn Spell
68 kein Mapping ist).
Zesstra0c1a85a2018-02-07 23:46:50 +010069
Zesstra5bf48ac2019-02-04 20:33:36 +010070 * SP_NO_ENEMY (int)
Zesstra0c1a85a2018-02-07 23:46:50 +010071
Zesstra5bf48ac2019-02-04 20:33:36 +010072 1, falls der Angriff nicht toedlich ist, es also keinen echten
73 Gegner gibt. Es wird dann reduce_hit_points() gerufen statt
74 do_damage()
Zesstra0c1a85a2018-02-07 23:46:50 +010075
Zesstra5bf48ac2019-02-04 20:33:36 +010076 * SP_NO_ACTIVE_DEFENSE (int)
Zesstra0c1a85a2018-02-07 23:46:50 +010077
Zesstra5bf48ac2019-02-04 20:33:36 +010078 1, falls aktive Abwehren (wie zurueckschlagende Amulette,
79 Karateabwehren oder Ausweichmanoever) unterbleiben sollen, zB
80 bei Kratzen durch Dornen oder Fall aus grosser Hoehe ist
81 aktive Abwehr oder Ausweichen unlogisch
Zesstra0c1a85a2018-02-07 23:46:50 +010082
Zesstra5bf48ac2019-02-04 20:33:36 +010083 * SP_RECURSIVE (int)
Zesstra0c1a85a2018-02-07 23:46:50 +010084
Zesstra5bf48ac2019-02-04 20:33:36 +010085 1, falls der Spell aus einem Defend gerufen wurde (oder einer
86 DefendFunc). Dies ist sehr wichtig, um unendliche Rekursionen
87 zu vermeiden, wenn zwei zurueckschlagende Verteidigungen
88 zusammentreffen.
Zesstra0c1a85a2018-02-07 23:46:50 +010089
Zesstra5bf48ac2019-02-04 20:33:36 +010090 * SP_NAME (string)
Zesstra953f9972017-02-18 15:37:36 +010091
Zesstra5bf48ac2019-02-04 20:33:36 +010092 Name des Spells
Zesstra953f9972017-02-18 15:37:36 +010093
Zesstra5bf48ac2019-02-04 20:33:36 +010094 * SP_GLOBAL_ATTACK (int)
Zesstra0c1a85a2018-02-07 23:46:50 +010095
Zesstra5bf48ac2019-02-04 20:33:36 +010096 1 bei Flaechenspells (die mehrere Ziele treffen koennen)
Zesstra0c1a85a2018-02-07 23:46:50 +010097
Zesstra5bf48ac2019-02-04 20:33:36 +010098 * SP_REDUCE_ARMOUR (mapping) ------------ Mapping: keys
99 AT_X/P_BODY, values int>=0
Zesstra0c1a85a2018-02-07 23:46:50 +0100100
Zesstra5bf48ac2019-02-04 20:33:36 +0100101 Die Schutzwirkung durch P_AC/Magie einer Ruestung wird
102 typabhaengig reduziert. Als Keys sind P_BODY und die AT_*
103 erlaubt, die Werte muessen ints > 0 sein. Aufbau eines
104 Mappings im Beispiel:
105
106 ([AT_BOOTS: 0, // Stiefel schuetzen gar nicht
107 P_BODY: 50, // Koerper zu 50%
108 AT_BELT: 600 // Guertel zu 600%
109 ])
110 -> alle 'fehlenden' Eintraege wirken normal
111
112 * SP_SHOW_DAMAGE (int or Array von Array)
113
114 0 fuer keine Treffermeldung, 1 fuer Standardtreffermeldungen.
115 Falls individuelle Treffermeldungen geschwuenscht sind,
116 koennen aber auch in einem Array Ersatz-Treffermeldungen
117 definiert werden. Das Format ist:
118
119 ({
120 ({ int lphit1, string mess_me, string mess_en, string mess_room }),
121 ({ lphit2, mess_me, mess_en, mess_room }),
122 ...
123 ({ lphitn, mess_me, mess_en, mess_room }),
124 })
125 wobei lphit1<lphit2<...<lphitn sein muss, d.h. das Array-Array
126 aufsteigend sortiert.
127
128 Ist ein Treffer x LP hart, werden die Meldungen des lphit-
129 Arrays ausgegeben, dessen Wert am naehesten unter dem Schaden
130 liegt.
131
132 In den Meldungen mess_me (an den Getroffenen), mess_en (an den
133 Feind), mess_room (an die restlichen Umstehenden) koennen
134 Ersatzstrings wie folgt verwendet werden:
135
136 @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen (TO)
137 @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes (enemy)
138
139 * EINFO_DEFEND (mapping)
140
141 Dieses Mapping liefert erweiterte Informationen zu dem
142 bisherigen Ablauf des aktiven Attacks. Die verfuegbaren
143 Informationen sind in der Manpage zu DefendInfo festgehalten.
Zesstra953f9972017-02-18 15:37:36 +0100144
Zesstra0c1a85a2018-02-07 23:46:50 +0100145
Zesstrabfab6ac2018-08-29 22:36:57 +0200146Reihenfolgen in Defend
147----------------------
Zesstra0c1a85a2018-02-07 23:46:50 +0100148
Zesstrabfab6ac2018-08-29 22:36:57 +0200149 * das Living wird angegriffen, wenn * P_NO_ATTACK != 0 * 'enemy'
150 existiert und kein netztoter Spieler ist
Zesstra0c1a85a2018-02-07 23:46:50 +0100151
Zesstrabfab6ac2018-08-29 22:36:57 +0200152 * P_DEFENDERS werden durchgegangen (und eventuell benachrichtigt)
Zesstra0c1a85a2018-02-07 23:46:50 +0100153
Zesstrabfab6ac2018-08-29 22:36:57 +0200154 * P_TMP_ATTACK_HOOK wird abgefragt
Zesstra0c1a85a2018-02-07 23:46:50 +0100155
Zesstrabfab6ac2018-08-29 22:36:57 +0200156 * die Ruestungen werden vom Schaden gegebenenfalls abgezogen
Zesstra0c1a85a2018-02-07 23:46:50 +0100157
Zesstrabfab6ac2018-08-29 22:36:57 +0200158 * magischer Ausweichskill beruecksichtigt
Zesstra0c1a85a2018-02-07 23:46:50 +0100159
Zesstrabfab6ac2018-08-29 22:36:57 +0200160 * sensitive Objekte werden ggf. benachrichtigt
Zesstra0c1a85a2018-02-07 23:46:50 +0100161
Zesstrabfab6ac2018-08-29 22:36:57 +0200162 * InternalModifyDefend wird gerufen
Zesstra0c1a85a2018-02-07 23:46:50 +0100163
Zesstrabfab6ac2018-08-29 22:36:57 +0200164 * Koerperabwehr abgezogen
Zesstra0c1a85a2018-02-07 23:46:50 +0100165
Zesstrabfab6ac2018-08-29 22:36:57 +0200166 * der Schaden an do_damage()/reduce_hit_points() uebergeben
167
168 * Flucht ueberpruefen mit CheckWimpyAndFlee()
Zesstra953f9972017-02-18 15:37:36 +0100169
170
171BEMERKUNGEN
172===========
173
Zesstra0c1a85a2018-02-07 23:46:50 +0100174 Ruestungen wirken konventionell nur, wenn mindestens ein
175 Schadensanteil mechanisch ist und es kein Spell oder ein Spell mit
176 SP_PHYSICAL_ATTACK auf 1 ist.
Zesstra953f9972017-02-18 15:37:36 +0100177
Zesstra0c1a85a2018-02-07 23:46:50 +0100178 Defend() beruecksichtigt magische Verteidigungen, die der Spieler
179 bei sich hat, sollte also aus Fairness gegenueber den Objekten
180 anderer Magier immer dem direkten reduce_hit_points() oder
181 do_damage() vorgezogen werden. Mittels der Flags in 'spell' kann
182 man sehr viel aendern.
Zesstra953f9972017-02-18 15:37:36 +0100183
184
185RUECKGABEWERT
186=============
187
188 Hoehe des tatsaechlichen Schadens. Dies kann mehr sein als die
189 Lebenspunkte des Lebewesens.
MG Mud User88f12472016-06-24 23:31:02 +0200190
MG Mud User88f12472016-06-24 23:31:02 +0200191
Zesstrabfab6ac2018-08-29 22:36:57 +0200192BEISPIELE (SIEHE AUCH Defend_bsp)
193=================================
MG Mud User88f12472016-06-24 23:31:02 +0200194
Zesstrabfab6ac2018-08-29 22:36:57 +0200195 // ein simpler Angriff:
196 enem->Defend(100, ({DT_BLUDGEON}), ([SP_PHYSICAL_ATTACK:1]), this_object());
MG Mud User88f12472016-06-24 23:31:02 +0200197
Zesstrabfab6ac2018-08-29 22:36:57 +0200198 // ein magischer Angriff (ohne Treffermeldung):
199 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_PHYSICAL_ATTACK:0]), this_object());
200
201 // ein magischer Angriff mit Treffermeldung:
202 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_SHOW_DAMAGE:1]),
203 this_object());
Zesstra953f9972017-02-18 15:37:36 +0100204
205
206SIEHE AUCH
207==========
208
Zesstra6cadc1b2018-11-15 22:27:32 +0100209 Angriff: Attack(), P_NO_ATTACK, InsertEnemy()
MG Mud User88f12472016-06-24 23:31:02 +0200210
Zesstra6cadc1b2018-11-15 22:27:32 +0100211 Schaden: P_ENABLE_IN_ATTACK_OUT, P_LAST_MOVE, do_damage(),
212 reduce_hit_points()
Zesstra0c1a85a2018-02-07 23:46:50 +0100213
Zesstra6cadc1b2018-11-15 22:27:32 +0100214 Schutz: P_DEFENDERS, InformDefend(), DefendOther(), P_ARMOURS,
215 P_AC, P_DEFEND_FUNC, QueryDefend(), P_BODY
Zesstra0c1a85a2018-02-07 23:46:50 +0100216
Zesstra6cadc1b2018-11-15 22:27:32 +0100217 Daten: P_LAST_COMBAT_TIME, P_LAST_DAMTYPES, P_LAST_DAMTIME,
218 P_LAST_DAMAGE, P_DAMAGE_MSG
Zesstra0c1a85a2018-02-07 23:46:50 +0100219
Zesstra6cadc1b2018-11-15 22:27:32 +0100220 Resistenz: P_RESISTANCE_STRENGTHS, CheckResistance()
Zesstra0c1a85a2018-02-07 23:46:50 +0100221
Zesstra6cadc1b2018-11-15 22:27:32 +0100222 Sonstiges: CheckSensitiveAttack(), InternalModifyDefend(),
Zesstra5bf48ac2019-02-04 20:33:36 +0100223 normalize_defend_args() UseSkill(), DefendInfo()
Zesstra0c1a85a2018-02-07 23:46:50 +0100224
Zesstra5bf48ac2019-02-04 20:33:36 +0100225Letzte Aenderung: 20.01.2019, Zesstra