blob: 156806a190f9fd7f9894930e2120ffcff6cee6e4 [file] [log] [blame]
Zesstra18626972017-01-31 10:38:27 +01001Defend()
2========
3
4FUNKTION
5--------
Zesstrac57634a2017-12-21 00:15:24 +02006
Zesstrad1b564b2019-09-11 21:27:59 +02007 public int Defend(int dam, string|string* dam_types,
8 int|mapping si_spell, object enemy)
Zesstra18626972017-01-31 10:38:27 +01009
10DEFINIERT IN
11------------
Zesstra18626972017-01-31 10:38:27 +010012
heull00141a66062017-12-11 18:08:18 +010013 /std/living/combat
Zesstra18626972017-01-31 10:38:27 +010014
15ARGUMENTE
16---------
Zesstra18626972017-01-31 10:38:27 +010017
heull00141a66062017-12-11 18:08:18 +010018 int dam
19 Initiale Staerke des Angriffs (10 dam ~ 1 HP)
Zesstrad1912252019-01-16 21:44:27 +010020 string* dam_types
heull00141a66062017-12-11 18:08:18 +010021 Art des Schadens, der angerichtet werden soll
22 Muss ein Array von Schadenstypen sein, alte Objekte uebergeben hier
23 manchmal strings.
Zesstrad1912252019-01-16 21:44:27 +010024 mapping si_spell
heull00141a66062017-12-11 18:08:18 +010025 Mapping mit zusaetzlichen Informationen zum Angriff(Siehe unten)
26 Alte Objekte uebergeben manchmal einen Integer (0 fuer Physikalischen
27 Angriff, 1 fuer Zauber.
28 object enemy
29 Der Feind/Schadenverursacher
Zesstra18626972017-01-31 10:38:27 +010030
31BESCHREIBUNG
32------------
Zesstra18626972017-01-31 10:38:27 +010033
Zesstraa6948ba2018-02-12 21:02:46 +010034Generell
35++++++++
heull00130d94aa2018-02-02 19:13:09 +010036
heull00141a66062017-12-11 18:08:18 +010037 Wenn das Lebewesen angegriffen wird, wird geprueft, wie stark die
38 Ruestungen und koerpereigenen Abwehrkraefte sind und die Staerke des
39 Schadens dementsprechend vermindert.
40 Ggf. wird der Schaden zugefuegt und der Feind in die Liste der Feinde
41 aufgenommen. Der Schaden betraegt:
42 (dam-Summe(Ruestungsstaerken)-random(P_BODY+A_DEX))*CheckResistance/10
43 aber nicht unter 0.
Zesstra18626972017-01-31 10:38:27 +010044
Zesstrad1b564b2019-09-11 21:27:59 +020045Der Parameter 'si_spell'
46++++++++++++++++++++++++
heull00130d94aa2018-02-02 19:13:09 +010047
Zesstrad1b564b2019-09-11 21:27:59 +020048 Ist 'si_spell' 0, dann gilt der Angriff als normale physische Attacke
49 Uebergibt man als 'si_spell'-Parameter ein Mapping, so gibt es dafuer
heull00141a66062017-12-11 18:08:18 +010050 diverse Flags, die das Ergebnis manipulieren (in new_skills.h
51 enthalten). Nichtangabe eines Flags gilt als 0.
Zesstra18626972017-01-31 10:38:27 +010052
Zesstracad98412019-01-19 14:41:02 +010053 - SP_PHYSICAL_ATTACK (int)
54 1, wenn es ein physischer Angriff ist, d.h. Ruestungen wirken sollen,
55 0 sonst. Dies entspricht dem alten !spell (wenn Spell kein Mapping
56 ist).
57 - SP_NO_ENEMY (int)
58 1, falls der Angriff nicht toedlich ist, es also keinen echten Gegner
59 gibt. Es wird dann reduce_hit_points() gerufen statt do_damage()
60 - SP_NO_ACTIVE_DEFENSE (int)
61 1, falls aktive Abwehren (wie zurueckschlagende Amulette,
62 Karateabwehren oder Ausweichmanoever) unterbleiben sollen, zB bei
63 Kratzen durch Dornen oder Fall aus grosser Hoehe ist aktive Abwehr
64 oder Ausweichen unlogisch
65 - SP_RECURSIVE (int)
66 1, falls der Spell aus einem Defend gerufen wurde (oder einer
67 DefendFunc). Dies ist sehr wichtig, um unendliche Rekursionen zu
68 vermeiden, wenn zwei zurueckschlagende Verteidigungen zusammentreffen.
69 - SP_NAME (string)
70 Name des Spells
71 - SP_GLOBAL_ATTACK (int)
72 1 bei Flaechenspells (die mehrere Ziele treffen koennen)
Zesstrad1b564b2019-09-11 21:27:59 +020073 - SP_REDUCE_ARMOUR (mapping) ------------
Bugfix16764ca2025-07-08 12:29:10 +020074 Mapping: keys AT_X/P_BODY/P_PARRY_WEAPON, values int>=0
Zesstracad98412019-01-19 14:41:02 +010075 Die Schutzwirkung durch P_AC/Magie einer Ruestung wird typabhaengig
Bugfix16764ca2025-07-08 12:29:10 +020076 reduziert. Als Keys sind P_BODY, P_PARRY_WEAPON und die AT_* erlaubt,
77 die Werte muessen ints >= 0 sein.
Bugfix95168752024-01-06 19:11:46 +010078 Mit AT_DEFAULT_REDUCE laesst sich ein Standardwert fuer alle nicht
79 gesetzten Eintraege setzen. Diese wirken dann nicht normal, sondern mit
80 der hier angegebenen Staerke.
Zesstracad98412019-01-19 14:41:02 +010081 Aufbau eines Mappings im Beispiel::
Zesstra3bd43df2019-01-19 10:46:41 +010082
Zesstracad98412019-01-19 14:41:02 +010083 ([AT_BOOTS: 0, // Stiefel schuetzen gar nicht
84 P_BODY: 50, // Koerper zu 50%
85 AT_BELT: 600 // Guertel zu 600%
86 ])
87 -> alle 'fehlenden' Eintraege wirken normal
heull00130d94aa2018-02-02 19:13:09 +010088
Zesstracad98412019-01-19 14:41:02 +010089 - SP_SHOW_DAMAGE (int or Array von Array)
90 0 fuer keine Treffermeldung, 1 fuer Standardtreffermeldungen. Falls
91 individuelle Treffermeldungen geschwuenscht sind, koennen aber auch in
92 einem Array Ersatz-Treffermeldungen definiert werden. Das Format
93 ist::
heull00130d94aa2018-02-02 19:13:09 +010094
Zesstracad98412019-01-19 14:41:02 +010095 ({
96 ({ int lphit1, string mess_me, string mess_en, string mess_room }),
97 ({ lphit2, mess_me, mess_en, mess_room }),
98 ...
99 ({ lphitn, mess_me, mess_en, mess_room }),
100 })
101 wobei lphit1<lphit2<...<lphitn sein muss, d.h. das Array-Array
102 aufsteigend sortiert.
Zesstra18626972017-01-31 10:38:27 +0100103
Zesstracad98412019-01-19 14:41:02 +0100104 Ist ein Treffer x LP hart, werden die Meldungen des lphit-Arrays
105 ausgegeben, dessen Wert am naehesten unter dem Schaden liegt.
Zesstra18626972017-01-31 10:38:27 +0100106
Zesstracad98412019-01-19 14:41:02 +0100107 In den Meldungen mess_me (an den Getroffenen), mess_en (an den Feind),
108 mess_room (an die restlichen Umstehenden) koennen Ersatzstrings wie
109 folgt verwendet werden::
heull00130d94aa2018-02-02 19:13:09 +0100110
Zesstracad98412019-01-19 14:41:02 +0100111 @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen (TO)
112 @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes (enemy)
heull00130d94aa2018-02-02 19:13:09 +0100113
Zesstracad98412019-01-19 14:41:02 +0100114 - EINFO_DEFEND (mapping)
115 Dieses Mapping liefert erweiterte Informationen zu dem
116 bisherigen Ablauf des aktiven Attacks.
117 Die verfuegbaren Informationen sind in der Manpage zu
118 DefendInfo festgehalten.
Zesstra18626972017-01-31 10:38:27 +0100119
Zesstraa6948ba2018-02-12 21:02:46 +0100120Reihenfolgen in Defend
121++++++++++++++++++++++
heull00130d94aa2018-02-02 19:13:09 +0100122
Zesstraa6948ba2018-02-12 21:02:46 +0100123 * das Living wird angegriffen, wenn
124 * P_NO_ATTACK != 0
125 * 'enemy' existiert und kein netztoter Spieler ist
126 * P_DEFENDERS werden durchgegangen (und eventuell benachrichtigt)
127 * P_TMP_ATTACK_HOOK wird abgefragt
128 * die Ruestungen werden vom Schaden gegebenenfalls abgezogen
129 * magischer Ausweichskill beruecksichtigt
130 * sensitive Objekte werden ggf. benachrichtigt
131 * InternalModifyDefend wird gerufen
132 * Koerperabwehr abgezogen
133 * der Schaden an do_damage()/reduce_hit_points() uebergeben
134 * Flucht ueberpruefen mit CheckWimpyAndFlee()
Zesstra18626972017-01-31 10:38:27 +0100135
136BEMERKUNGEN
137-----------
Zesstra18626972017-01-31 10:38:27 +0100138
heull00141a66062017-12-11 18:08:18 +0100139 Ruestungen wirken konventionell nur, wenn mindestens ein Schadensanteil
140 mechanisch ist und es kein Spell oder ein Spell mit SP_PHYSICAL_ATTACK
141 auf 1 ist.
Zesstra18626972017-01-31 10:38:27 +0100142
heull00141a66062017-12-11 18:08:18 +0100143 Defend() beruecksichtigt magische Verteidigungen, die der Spieler bei
144 sich hat, sollte also aus Fairness gegenueber den Objekten anderer
145 Magier immer dem direkten reduce_hit_points() oder do_damage()
146 vorgezogen werden. Mittels der Flags in 'spell' kann man sehr viel
147 aendern.
Zesstra18626972017-01-31 10:38:27 +0100148
149RUECKGABEWERT
150-------------
Zesstra18626972017-01-31 10:38:27 +0100151
heull00141a66062017-12-11 18:08:18 +0100152 Hoehe des tatsaechlichen Schadens. Dies kann mehr sein als die
153 Lebenspunkte des Lebewesens.
Zesstra18626972017-01-31 10:38:27 +0100154
heull00130d94aa2018-02-02 19:13:09 +0100155BEISPIELE (SIEHE AUCH Defend_bsp)
156---------------------------------
Zesstraa6948ba2018-02-12 21:02:46 +0100157
158.. code-block:: pike
heull00130d94aa2018-02-02 19:13:09 +0100159
heull00141a66062017-12-11 18:08:18 +0100160 // ein simpler Angriff:
161 enem->Defend(100, ({DT_BLUDGEON}), ([SP_PHYSICAL_ATTACK:1]), this_object());
Zesstra18626972017-01-31 10:38:27 +0100162
heull00141a66062017-12-11 18:08:18 +0100163 // ein magischer Angriff (ohne Treffermeldung):
Arathorn3f92d242020-01-22 21:43:46 +0100164 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}),
165 ([SP_PHYSICAL_ATTACK:0, SP_SHOW_DAMAGE:0 ]),this_object());
Zesstra18626972017-01-31 10:38:27 +0100166
heull00141a66062017-12-11 18:08:18 +0100167 // ein magischer Angriff mit Treffermeldung:
Arathorn3f92d242020-01-22 21:43:46 +0100168 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}),
169 ([SP_PHYSICAL_ATTACK:0, SP_SHOW_DAMAGE:1]), this_object());
Zesstra18626972017-01-31 10:38:27 +0100170
171SIEHE AUCH
172----------
Zesstra18626972017-01-31 10:38:27 +0100173
Zesstrad1b564b2019-09-11 21:27:59 +0200174 Angriff:
175 :doc:`Attack`, :doc:`../props/P_NO_ATTACK`, :doc:`InsertEnemy`
heull00130d94aa2018-02-02 19:13:09 +0100176
Zesstrad1b564b2019-09-11 21:27:59 +0200177 Schaden:
178 :doc:`../props/P_ENABLE_IN_ATTACK_OUT`, :doc:`../props/P_LAST_MOVE`, :doc:`do_damage`, :doc:`reduce_hit_points`
heull00130d94aa2018-02-02 19:13:09 +0100179
Zesstrad1b564b2019-09-11 21:27:59 +0200180 Schutz:
181 :doc:`../props/P_DEFENDERS`, :doc:`InformDefend`, :doc:`DefendOther`, :doc:`../props/P_ARMOURS`, :doc:`../props/P_AC`, :doc:`../props/P_DEFEND_FUNC`, :doc:`QueryDefend`, :doc:`../props/P_BODY`
heull00130d94aa2018-02-02 19:13:09 +0100182
Zesstrad1b564b2019-09-11 21:27:59 +0200183 Daten:
184 :doc:`../props/P_LAST_COMBAT_TIME`, :doc:`../props/P_LAST_DAMTYPES`, :doc:`../props/P_LAST_DAMTIME`, :doc:`../props/P_LAST_DAMAGE`, :doc:`../props/P_DAMAGE_MSG`
185 Resistenz:
186 :doc:`../props/P_RESISTANCE_STRENGTHS`, :doc:`CheckResistance`
heull00130d94aa2018-02-02 19:13:09 +0100187
Zesstrad1b564b2019-09-11 21:27:59 +0200188 Sonstiges:
189 :doc:`CheckSensitiveAttack`, :doc:`InternalModifyDefend`, :doc:`normalize_defend_args`, :doc:`UseSkill`, :doc:`DefendInfo`
Zesstra18626972017-01-31 10:38:27 +0100190
Bugfix95168752024-01-06 19:11:46 +0100191Letzte Aenderung: 08.07.2025, Bugfix