blob: 205718268603460baccba3ca7322b2a3bf86e3bf [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.
Zesstracad98412019-01-19 14:41:02 +010078 Aufbau eines Mappings im Beispiel::
Zesstra3bd43df2019-01-19 10:46:41 +010079
Zesstracad98412019-01-19 14:41:02 +010080 ([AT_BOOTS: 0, // Stiefel schuetzen gar nicht
81 P_BODY: 50, // Koerper zu 50%
82 AT_BELT: 600 // Guertel zu 600%
83 ])
84 -> alle 'fehlenden' Eintraege wirken normal
heull00130d94aa2018-02-02 19:13:09 +010085
Zesstracad98412019-01-19 14:41:02 +010086 - SP_SHOW_DAMAGE (int or Array von Array)
87 0 fuer keine Treffermeldung, 1 fuer Standardtreffermeldungen. Falls
88 individuelle Treffermeldungen geschwuenscht sind, koennen aber auch in
89 einem Array Ersatz-Treffermeldungen definiert werden. Das Format
90 ist::
heull00130d94aa2018-02-02 19:13:09 +010091
Zesstracad98412019-01-19 14:41:02 +010092 ({
93 ({ int lphit1, string mess_me, string mess_en, string mess_room }),
94 ({ lphit2, mess_me, mess_en, mess_room }),
95 ...
96 ({ lphitn, mess_me, mess_en, mess_room }),
97 })
98 wobei lphit1<lphit2<...<lphitn sein muss, d.h. das Array-Array
99 aufsteigend sortiert.
Zesstra18626972017-01-31 10:38:27 +0100100
Zesstracad98412019-01-19 14:41:02 +0100101 Ist ein Treffer x LP hart, werden die Meldungen des lphit-Arrays
102 ausgegeben, dessen Wert am naehesten unter dem Schaden liegt.
Zesstra18626972017-01-31 10:38:27 +0100103
Zesstracad98412019-01-19 14:41:02 +0100104 In den Meldungen mess_me (an den Getroffenen), mess_en (an den Feind),
105 mess_room (an die restlichen Umstehenden) koennen Ersatzstrings wie
106 folgt verwendet werden::
heull00130d94aa2018-02-02 19:13:09 +0100107
Zesstracad98412019-01-19 14:41:02 +0100108 @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen (TO)
109 @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes (enemy)
heull00130d94aa2018-02-02 19:13:09 +0100110
Zesstracad98412019-01-19 14:41:02 +0100111 - EINFO_DEFEND (mapping)
112 Dieses Mapping liefert erweiterte Informationen zu dem
113 bisherigen Ablauf des aktiven Attacks.
114 Die verfuegbaren Informationen sind in der Manpage zu
115 DefendInfo festgehalten.
Zesstra18626972017-01-31 10:38:27 +0100116
Zesstraa6948ba2018-02-12 21:02:46 +0100117Reihenfolgen in Defend
118++++++++++++++++++++++
heull00130d94aa2018-02-02 19:13:09 +0100119
Zesstraa6948ba2018-02-12 21:02:46 +0100120 * das Living wird angegriffen, wenn
121 * P_NO_ATTACK != 0
122 * 'enemy' existiert und kein netztoter Spieler ist
123 * P_DEFENDERS werden durchgegangen (und eventuell benachrichtigt)
124 * P_TMP_ATTACK_HOOK wird abgefragt
125 * die Ruestungen werden vom Schaden gegebenenfalls abgezogen
126 * magischer Ausweichskill beruecksichtigt
127 * sensitive Objekte werden ggf. benachrichtigt
128 * InternalModifyDefend wird gerufen
129 * Koerperabwehr abgezogen
130 * der Schaden an do_damage()/reduce_hit_points() uebergeben
131 * Flucht ueberpruefen mit CheckWimpyAndFlee()
Zesstra18626972017-01-31 10:38:27 +0100132
133BEMERKUNGEN
134-----------
Zesstra18626972017-01-31 10:38:27 +0100135
heull00141a66062017-12-11 18:08:18 +0100136 Ruestungen wirken konventionell nur, wenn mindestens ein Schadensanteil
137 mechanisch ist und es kein Spell oder ein Spell mit SP_PHYSICAL_ATTACK
138 auf 1 ist.
Zesstra18626972017-01-31 10:38:27 +0100139
heull00141a66062017-12-11 18:08:18 +0100140 Defend() beruecksichtigt magische Verteidigungen, die der Spieler bei
141 sich hat, sollte also aus Fairness gegenueber den Objekten anderer
142 Magier immer dem direkten reduce_hit_points() oder do_damage()
143 vorgezogen werden. Mittels der Flags in 'spell' kann man sehr viel
144 aendern.
Zesstra18626972017-01-31 10:38:27 +0100145
146RUECKGABEWERT
147-------------
Zesstra18626972017-01-31 10:38:27 +0100148
heull00141a66062017-12-11 18:08:18 +0100149 Hoehe des tatsaechlichen Schadens. Dies kann mehr sein als die
150 Lebenspunkte des Lebewesens.
Zesstra18626972017-01-31 10:38:27 +0100151
heull00130d94aa2018-02-02 19:13:09 +0100152BEISPIELE (SIEHE AUCH Defend_bsp)
153---------------------------------
Zesstraa6948ba2018-02-12 21:02:46 +0100154
155.. code-block:: pike
heull00130d94aa2018-02-02 19:13:09 +0100156
heull00141a66062017-12-11 18:08:18 +0100157 // ein simpler Angriff:
158 enem->Defend(100, ({DT_BLUDGEON}), ([SP_PHYSICAL_ATTACK:1]), this_object());
Zesstra18626972017-01-31 10:38:27 +0100159
heull00141a66062017-12-11 18:08:18 +0100160 // ein magischer Angriff (ohne Treffermeldung):
Arathorn3f92d242020-01-22 21:43:46 +0100161 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}),
162 ([SP_PHYSICAL_ATTACK:0, SP_SHOW_DAMAGE:0 ]),this_object());
Zesstra18626972017-01-31 10:38:27 +0100163
heull00141a66062017-12-11 18:08:18 +0100164 // ein magischer Angriff mit Treffermeldung:
Arathorn3f92d242020-01-22 21:43:46 +0100165 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}),
166 ([SP_PHYSICAL_ATTACK:0, SP_SHOW_DAMAGE:1]), this_object());
Zesstra18626972017-01-31 10:38:27 +0100167
168SIEHE AUCH
169----------
Zesstra18626972017-01-31 10:38:27 +0100170
Zesstrad1b564b2019-09-11 21:27:59 +0200171 Angriff:
172 :doc:`Attack`, :doc:`../props/P_NO_ATTACK`, :doc:`InsertEnemy`
heull00130d94aa2018-02-02 19:13:09 +0100173
Zesstrad1b564b2019-09-11 21:27:59 +0200174 Schaden:
175 :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 +0100176
Zesstrad1b564b2019-09-11 21:27:59 +0200177 Schutz:
178 :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 +0100179
Zesstrad1b564b2019-09-11 21:27:59 +0200180 Daten:
181 :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`
182 Resistenz:
183 :doc:`../props/P_RESISTANCE_STRENGTHS`, :doc:`CheckResistance`
heull00130d94aa2018-02-02 19:13:09 +0100184
Zesstrad1b564b2019-09-11 21:27:59 +0200185 Sonstiges:
186 :doc:`CheckSensitiveAttack`, :doc:`InternalModifyDefend`, :doc:`normalize_defend_args`, :doc:`UseSkill`, :doc:`DefendInfo`
Zesstra18626972017-01-31 10:38:27 +0100187
Zesstra3bd43df2019-01-19 10:46:41 +0100188Letzte Aenderung: 20.01.2019, Zesstra