blob: 3e40cfc7f328c448baccffdf354cb9c1b59ba3b0 [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
Zesstra0c1a85a2018-02-07 23:46:50 +01009 public int Defend(int dam, string|string* dam_type, int|mapping
10 spell,
11 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
26 string* dam_type
27 Art des Schadens, der angerichtet werden soll Muss ein Array von
28 Schadenstypen sein, alte Objekte uebergeben hier manchmal
29 strings.
30
31 mapping spell
32 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
43 1. Generell
Zesstra0c1a85a2018-02-07 23:46:50 +010044
45 Wenn das Lebewesen angegriffen wird, wird geprueft, wie stark
46 die Ruestungen und koerpereigenen Abwehrkraefte sind und die
47 Staerke des Schadens dementsprechend vermindert. Ggf. wird der
48 Schaden zugefuegt und der Feind in die Liste der Feinde
49 aufgenommen. Der Schaden betraegt: (dam-Summe(Ruestungsstaerken
50 )-random(P_BODY+A_DEX))*CheckResistance/10 aber nicht unter 0.
Zesstra953f9972017-02-18 15:37:36 +010051
52 2. Der Parameter 'spell'
Zesstra953f9972017-02-18 15:37:36 +010053
Zesstra0c1a85a2018-02-07 23:46:50 +010054 Ist 'spell' 0, dann gilt der Angriff als normale physische
55 Attacke Uebergibt man als 'spell'-Parameter ein Mapping, so gibt
56 es dafuer diverse Flags, die das Ergebnis manipulieren (in
57 new_skills.h enthalten). Nichtangabe eines Flags gilt als 0.
58
59 * SP_PHYSICAL_ATTACK ---------- 0/1 1, wenn Ruestungen wirken
60 sollen, 0 sonst -> entspricht !spell, wenn dieses Int ist
61
62 * SP_NO_ENEMY ----------------- 0/1 1, falls der Angriff nicht
63 toedlich ist, es also keinen echten Gegner gibt -> es wird
64 dann reduce_hit_points() gerufen statt do_damage()
65
66 * SP_NO_ACTIVE_DEFENSE -------- 0/1 1, falls aktive Abwehren
67 (wie zurueckschlagende Amulette, Karateabwehren oder
68 Ausweichmanoever) unterbleiben sollen -> zB bei Kratzen durch
69 Dornen oder Fall aus grosser Hoehe ist aktive Abwehr oder
70 Ausweichen unlogisch
71
72 * SP_RECURSIVE ---------------- 0/1 1, falls der Spell aus
73 einem Defend gerufen wurde (oder einer DefendFunc) ->
74 verhindert Rekursionsprobleme
75
76 * SP_NAME --------------------- string Name des Spells
77
78 * SP_GLOBAL_ATTACK ------------ 0/1 1 bei Flaechenspells
79
80 * SP_REDUCE_ARMOUR ------------ Mapping: keys AT_X/P_BODY,
81 values int>=0 Die Schutzwirkung durch P_AC/Magie einer
82 Ruestung wird typabhaengig reduziert. Aufbau eines Mappings im
83 Beispiel:
84
85 ([AT_BOOTS: 0, // Stiefel schuetzen gar nicht P_BODY: 50,
86 // Koerper zu 50% AT_BELT: 600 // Guertel zu 600% ])
87
88 -> alle 'fehlenden' Eintraege wirken normal
89
90 * SP_SHOW_DAMAGE -------------- 0/1 oder Array von Arrays 0,
91 fuer keine Treffermeldung, 1 sonst In einem Array koennen
92 Ersatz-Treffermeldungen definiert werden. Format ist:
93
Zesstra953f9972017-02-18 15:37:36 +010094 ({
Zesstra953f9972017-02-18 15:37:36 +010095
Zesstra0c1a85a2018-02-07 23:46:50 +010096 ({ int lphit1, string mess_me, string mess_en, string
97 mess_room }), ({ lphit2, mess_me, mess_en, mess_room }),
98 ... ({ lphitn, mess_me, mess_en, mess_room }), }) wobei
99 lphit1<lphit2<...<lphitn sein muss, d.h. das Array-Array
100 aufsteigend sortiert.
Zesstra953f9972017-02-18 15:37:36 +0100101
Zesstra0c1a85a2018-02-07 23:46:50 +0100102 Ist ein Treffer x LP hart, werden die Meldungen des lphit-
103 Arrays ausgegeben, dessen Wert am naehesten unter dem Schaden
104 liegt.
105
106 In den Meldungen mess_me (an den Getroffenen), mess_en (an den
107 Feind), mess_room (an die restlichen Umstehenden) koennen
108 Ersatzstrings wie folgt verwendet werden:
109
110 @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen
111 (TO) @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes
112 (enemy)
113
114 * EINFO_DEFEND ------------ Mapping Dieses Mapping liefert
115 erweiterte Informationen zu dem bisherigen Ablauf des aktiven
116 Attacks. Die verfuegbaren Informationen sind in der Manpage zu
117 DefendInfo festgehalten.
Zesstra953f9972017-02-18 15:37:36 +0100118
119 3. Reihenfolgen in Defend
Zesstra0c1a85a2018-02-07 23:46:50 +0100120
121 * das Living wird angegriffen, wenn - P_NO_ATTACK != 0 -
122 'enemy' existiert und kein netztoter Spieler ist
123
124 * P_DEFENDERS werden durchgegangen (und eventuell
125 benachrichtigt)
126
127 * P_TMP_ATTACK_HOOK wird abgefragt
128
129 * die Ruestungen werden vom Schaden gegebenenfalls abgezogen
130
131 * magischer Ausweichskill beruecksichtigt
132
133 * sensitive Objekte werden ggf. benachrichtigt
134
135 * InternalModifyDefend wird gerufen
136
137 * Koerperabwehr abgezogen
138
139 * der Schaden an do_damage()/reduce_hit_points() uebergeben
140
141 * Flucht ueberpruefen mit CheckWimpyAndFlee()
Zesstra953f9972017-02-18 15:37:36 +0100142
143
144BEMERKUNGEN
145===========
146
Zesstra0c1a85a2018-02-07 23:46:50 +0100147 Ruestungen wirken konventionell nur, wenn mindestens ein
148 Schadensanteil mechanisch ist und es kein Spell oder ein Spell mit
149 SP_PHYSICAL_ATTACK auf 1 ist.
Zesstra953f9972017-02-18 15:37:36 +0100150
Zesstra0c1a85a2018-02-07 23:46:50 +0100151 Defend() beruecksichtigt magische Verteidigungen, die der Spieler
152 bei sich hat, sollte also aus Fairness gegenueber den Objekten
153 anderer Magier immer dem direkten reduce_hit_points() oder
154 do_damage() vorgezogen werden. Mittels der Flags in 'spell' kann
155 man sehr viel aendern.
Zesstra953f9972017-02-18 15:37:36 +0100156
157
158RUECKGABEWERT
159=============
160
161 Hoehe des tatsaechlichen Schadens. Dies kann mehr sein als die
162 Lebenspunkte des Lebewesens.
MG Mud User88f12472016-06-24 23:31:02 +0200163
164BEISPIELE (SIEHE AUCH Defend_bsp):
Zesstra0c1a85a2018-02-07 23:46:50 +0100165 // ein simpler Angriff: enem->Defend(100, ({DT_BLUDGEON}),
166 ([SP_PHYSICAL_ATTACK:1]), this_object());
MG Mud User88f12472016-06-24 23:31:02 +0200167
Zesstra953f9972017-02-18 15:37:36 +0100168 // ein magischer Angriff (ohne Treffermeldung): enem->Defend(100,
Zesstra0c1a85a2018-02-07 23:46:50 +0100169 ({DT_BLUDGEON, DT_FIRE}), ([SP_PHYSICAL_ATTACK:0]), this_object());
MG Mud User88f12472016-06-24 23:31:02 +0200170
Zesstra953f9972017-02-18 15:37:36 +0100171 // ein magischer Angriff mit Treffermeldung: enem->Defend(100,
172 ({DT_BLUDGEON, DT_FIRE}), ([SP_SHOW_DAMAGE:1]),
MG Mud User88f12472016-06-24 23:31:02 +0200173
Zesstra953f9972017-02-18 15:37:36 +0100174 this_object());
175
176
177SIEHE AUCH
178==========
179
Zesstra0c1a85a2018-02-07 23:46:50 +0100180 Angriff: *Attack()*, *P_NO_ATTACK*, *InsertEnemy()* Schaden:
181 *P_ENABLE_IN_ATTACK_OUT*,
MG Mud User88f12472016-06-24 23:31:02 +0200182
Zesstra0c1a85a2018-02-07 23:46:50 +0100183 *P_LAST_MOVE*, *do_damage()*, *reduce_hit_points()*
184
185 Schutz: *P_DEFENDERS*, *InformDefend()*,
186 *DefendOther()*, *P_ARMOURS*, *P_AC*, *P_DEFEND_FUNC*,
187 *QueryDefend()*, *P_BODY*
188
189 Daten: *P_LAST_COMBAT_TIME*,
190 *P_LAST_DAMTYPES*, *P_LAST_DAMTIME*, *P_LAST_DAMAGE*,
191 *P_DAMAGE_MSG*
192
193 Resistenz: *P_RESISTANCE_STRENGTHS*,
194 *CheckResistance()*
195
196 Sonstiges: *CheckSensitiveAttack()*,
197 *InternalModifyDefend()*, *UseSkill()*, *DefendInfo()*
198
199Letzte Aenderung: 29.12.2017, Bugfix