blob: 1de1f78544d19ff7847cc8b6d43865f6cf033642 [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
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
Zesstrabfab6ac2018-08-29 22:36:57 +020064 * SP_PHYSICAL_ATTACK ---------- 0/1 1, wenn Ruestungen wirken
65 sollen, 0 sonst -> entspricht !spell, wenn dieses Int ist
Zesstra0c1a85a2018-02-07 23:46:50 +010066
Zesstrabfab6ac2018-08-29 22:36:57 +020067 * SP_NO_ENEMY ----------------- 0/1 1, falls der Angriff nicht
68 toedlich ist, es also keinen echten Gegner gibt -> es wird dann
69 reduce_hit_points() gerufen statt do_damage()
Zesstra0c1a85a2018-02-07 23:46:50 +010070
Zesstrabfab6ac2018-08-29 22:36:57 +020071 * SP_NO_ACTIVE_DEFENSE -------- 0/1 1, falls aktive Abwehren (wie
72 zurueckschlagende Amulette, Karateabwehren oder Ausweichmanoever)
73 unterbleiben sollen -> zB bei Kratzen durch Dornen oder Fall aus
74 grosser Hoehe ist aktive Abwehr oder Ausweichen unlogisch
Zesstra0c1a85a2018-02-07 23:46:50 +010075
Zesstrabfab6ac2018-08-29 22:36:57 +020076 * SP_RECURSIVE ---------------- 0/1 1, falls der Spell aus einem
77 Defend gerufen wurde (oder einer DefendFunc) -> verhindert
78 Rekursionsprobleme
Zesstra0c1a85a2018-02-07 23:46:50 +010079
Zesstrabfab6ac2018-08-29 22:36:57 +020080 * SP_NAME --------------------- string Name des Spells
Zesstra0c1a85a2018-02-07 23:46:50 +010081
Zesstrabfab6ac2018-08-29 22:36:57 +020082 * SP_GLOBAL_ATTACK ------------ 0/1 1 bei Flaechenspells
Zesstra0c1a85a2018-02-07 23:46:50 +010083
Zesstrabfab6ac2018-08-29 22:36:57 +020084 * SP_REDUCE_ARMOUR ------------ Mapping: keys AT_X/P_BODY, values
85 int>=0 Die Schutzwirkung durch P_AC/Magie einer Ruestung wird
86 typabhaengig reduziert. Aufbau eines Mappings im Beispiel:
Zesstra0c1a85a2018-02-07 23:46:50 +010087
Zesstrabfab6ac2018-08-29 22:36:57 +020088 ([AT_BOOTS: 0, // Stiefel schuetzen gar nicht P_BODY: 50, //
89 Koerper zu 50% AT_BELT: 600 // Guertel zu 600% ]) -> alle
90 'fehlenden' Eintraege wirken normal
Zesstra0c1a85a2018-02-07 23:46:50 +010091
Zesstrabfab6ac2018-08-29 22:36:57 +020092 * SP_SHOW_DAMAGE -------------- 0/1 oder Array von Arrays 0, fuer
93 keine Treffermeldung, 1 sonst In einem Array koennen Ersatz-
94 Treffermeldungen definiert werden. Format ist:
Zesstra953f9972017-02-18 15:37:36 +010095
Zesstrabfab6ac2018-08-29 22:36:57 +020096 ({ ({ 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
Zesstrabfab6ac2018-08-29 22:36:57 +0200102 Ist ein Treffer x LP hart, werden die Meldungen des lphit-Arrays
103 ausgegeben, dessen Wert am naehesten unter dem Schaden liegt.
Zesstra0c1a85a2018-02-07 23:46:50 +0100104
Zesstrabfab6ac2018-08-29 22:36:57 +0200105 In den Meldungen mess_me (an den Getroffenen), mess_en (an den
106 Feind), mess_room (an die restlichen Umstehenden) koennen
107 Ersatzstrings wie folgt verwendet werden:
Zesstra0c1a85a2018-02-07 23:46:50 +0100108
Zesstrabfab6ac2018-08-29 22:36:57 +0200109 @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen (TO)
110 @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes (enemy)
Zesstra0c1a85a2018-02-07 23:46:50 +0100111
Zesstrabfab6ac2018-08-29 22:36:57 +0200112 EINFO_DEFEND ------------ Mapping Dieses Mapping liefert
113 erweiterte Informationen zu dem bisherigen Ablauf des aktiven
114 Attacks. Die verfuegbaren Informationen sind in der Manpage zu
115 DefendInfo festgehalten.
Zesstra953f9972017-02-18 15:37:36 +0100116
Zesstra0c1a85a2018-02-07 23:46:50 +0100117
Zesstrabfab6ac2018-08-29 22:36:57 +0200118Reihenfolgen in Defend
119----------------------
Zesstra0c1a85a2018-02-07 23:46:50 +0100120
Zesstrabfab6ac2018-08-29 22:36:57 +0200121 * das Living wird angegriffen, wenn * P_NO_ATTACK != 0 * 'enemy'
122 existiert und kein netztoter Spieler ist
Zesstra0c1a85a2018-02-07 23:46:50 +0100123
Zesstrabfab6ac2018-08-29 22:36:57 +0200124 * P_DEFENDERS werden durchgegangen (und eventuell benachrichtigt)
Zesstra0c1a85a2018-02-07 23:46:50 +0100125
Zesstrabfab6ac2018-08-29 22:36:57 +0200126 * P_TMP_ATTACK_HOOK wird abgefragt
Zesstra0c1a85a2018-02-07 23:46:50 +0100127
Zesstrabfab6ac2018-08-29 22:36:57 +0200128 * die Ruestungen werden vom Schaden gegebenenfalls abgezogen
Zesstra0c1a85a2018-02-07 23:46:50 +0100129
Zesstrabfab6ac2018-08-29 22:36:57 +0200130 * magischer Ausweichskill beruecksichtigt
Zesstra0c1a85a2018-02-07 23:46:50 +0100131
Zesstrabfab6ac2018-08-29 22:36:57 +0200132 * sensitive Objekte werden ggf. benachrichtigt
Zesstra0c1a85a2018-02-07 23:46:50 +0100133
Zesstrabfab6ac2018-08-29 22:36:57 +0200134 * InternalModifyDefend wird gerufen
Zesstra0c1a85a2018-02-07 23:46:50 +0100135
Zesstrabfab6ac2018-08-29 22:36:57 +0200136 * Koerperabwehr abgezogen
Zesstra0c1a85a2018-02-07 23:46:50 +0100137
Zesstrabfab6ac2018-08-29 22:36:57 +0200138 * der Schaden an do_damage()/reduce_hit_points() uebergeben
139
140 * Flucht ueberpruefen mit CheckWimpyAndFlee()
Zesstra953f9972017-02-18 15:37:36 +0100141
142
143BEMERKUNGEN
144===========
145
Zesstra0c1a85a2018-02-07 23:46:50 +0100146 Ruestungen wirken konventionell nur, wenn mindestens ein
147 Schadensanteil mechanisch ist und es kein Spell oder ein Spell mit
148 SP_PHYSICAL_ATTACK auf 1 ist.
Zesstra953f9972017-02-18 15:37:36 +0100149
Zesstra0c1a85a2018-02-07 23:46:50 +0100150 Defend() beruecksichtigt magische Verteidigungen, die der Spieler
151 bei sich hat, sollte also aus Fairness gegenueber den Objekten
152 anderer Magier immer dem direkten reduce_hit_points() oder
153 do_damage() vorgezogen werden. Mittels der Flags in 'spell' kann
154 man sehr viel aendern.
Zesstra953f9972017-02-18 15:37:36 +0100155
156
157RUECKGABEWERT
158=============
159
160 Hoehe des tatsaechlichen Schadens. Dies kann mehr sein als die
161 Lebenspunkte des Lebewesens.
MG Mud User88f12472016-06-24 23:31:02 +0200162
MG Mud User88f12472016-06-24 23:31:02 +0200163
Zesstrabfab6ac2018-08-29 22:36:57 +0200164BEISPIELE (SIEHE AUCH Defend_bsp)
165=================================
MG Mud User88f12472016-06-24 23:31:02 +0200166
Zesstrabfab6ac2018-08-29 22:36:57 +0200167 // ein simpler Angriff:
168 enem->Defend(100, ({DT_BLUDGEON}), ([SP_PHYSICAL_ATTACK:1]), this_object());
MG Mud User88f12472016-06-24 23:31:02 +0200169
Zesstrabfab6ac2018-08-29 22:36:57 +0200170 // ein magischer Angriff (ohne Treffermeldung):
171 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_PHYSICAL_ATTACK:0]), this_object());
172
173 // ein magischer Angriff mit Treffermeldung:
174 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_SHOW_DAMAGE:1]),
175 this_object());
Zesstra953f9972017-02-18 15:37:36 +0100176
177
178SIEHE AUCH
179==========
180
Zesstra6cadc1b2018-11-15 22:27:32 +0100181 Angriff: Attack(), P_NO_ATTACK, InsertEnemy()
MG Mud User88f12472016-06-24 23:31:02 +0200182
Zesstra6cadc1b2018-11-15 22:27:32 +0100183 Schaden: P_ENABLE_IN_ATTACK_OUT, P_LAST_MOVE, do_damage(),
184 reduce_hit_points()
Zesstra0c1a85a2018-02-07 23:46:50 +0100185
Zesstra6cadc1b2018-11-15 22:27:32 +0100186 Schutz: P_DEFENDERS, InformDefend(), DefendOther(), P_ARMOURS,
187 P_AC, P_DEFEND_FUNC, QueryDefend(), P_BODY
Zesstra0c1a85a2018-02-07 23:46:50 +0100188
Zesstra6cadc1b2018-11-15 22:27:32 +0100189 Daten: P_LAST_COMBAT_TIME, P_LAST_DAMTYPES, P_LAST_DAMTIME,
190 P_LAST_DAMAGE, P_DAMAGE_MSG
Zesstra0c1a85a2018-02-07 23:46:50 +0100191
Zesstra6cadc1b2018-11-15 22:27:32 +0100192 Resistenz: P_RESISTANCE_STRENGTHS, CheckResistance()
Zesstra0c1a85a2018-02-07 23:46:50 +0100193
Zesstra6cadc1b2018-11-15 22:27:32 +0100194 Sonstiges: CheckSensitiveAttack(), InternalModifyDefend(),
195 UseSkill(), DefendInfo()
Zesstra0c1a85a2018-02-07 23:46:50 +0100196
197Letzte Aenderung: 29.12.2017, Bugfix