blob: f0d80cfa58addc89b8bfae834adaa6806db15d30 [file] [log] [blame]
Zesstra18626972017-01-31 10:38:27 +01001Defend()
2========
3
4FUNKTION
5--------
Zesstrac57634a2017-12-21 00:15:24 +02006
Zesstrad1912252019-01-16 21:44:27 +01007 public int Defend(int dam, string|string* dam_types, int|mapping si_spell,
heull00141a66062017-12-11 18:08:18 +01008 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
Zesstraa6948ba2018-02-12 21:02:46 +010045Der Parameter 'spell'
46+++++++++++++++++++++
heull00130d94aa2018-02-02 19:13:09 +010047
heull00141a66062017-12-11 18:08:18 +010048 Ist 'spell' 0, dann gilt der Angriff als normale physische Attacke
49 Uebergibt man als 'spell'-Parameter ein Mapping, so gibt es dafuer
50 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)
73 - SP_REDUCE_ARMOUR (mapping) ------------ Mapping: keys AT_X/P_BODY, values int>=0
74 Die Schutzwirkung durch P_AC/Magie einer Ruestung wird typabhaengig
75 reduziert. Als Keys sind P_BODY und die AT_* erlaubt, die Werte
76 muessen ints > 0 sein.
77 Aufbau eines Mappings im Beispiel::
Zesstra3bd43df2019-01-19 10:46:41 +010078
Zesstracad98412019-01-19 14:41:02 +010079 ([AT_BOOTS: 0, // Stiefel schuetzen gar nicht
80 P_BODY: 50, // Koerper zu 50%
81 AT_BELT: 600 // Guertel zu 600%
82 ])
83 -> alle 'fehlenden' Eintraege wirken normal
heull00130d94aa2018-02-02 19:13:09 +010084
Zesstracad98412019-01-19 14:41:02 +010085 - SP_SHOW_DAMAGE (int or Array von Array)
86 0 fuer keine Treffermeldung, 1 fuer Standardtreffermeldungen. Falls
87 individuelle Treffermeldungen geschwuenscht sind, koennen aber auch in
88 einem Array Ersatz-Treffermeldungen definiert werden. Das Format
89 ist::
heull00130d94aa2018-02-02 19:13:09 +010090
Zesstracad98412019-01-19 14:41:02 +010091 ({
92 ({ int lphit1, string mess_me, string mess_en, string mess_room }),
93 ({ lphit2, mess_me, mess_en, mess_room }),
94 ...
95 ({ lphitn, mess_me, mess_en, mess_room }),
96 })
97 wobei lphit1<lphit2<...<lphitn sein muss, d.h. das Array-Array
98 aufsteigend sortiert.
Zesstra18626972017-01-31 10:38:27 +010099
Zesstracad98412019-01-19 14:41:02 +0100100 Ist ein Treffer x LP hart, werden die Meldungen des lphit-Arrays
101 ausgegeben, dessen Wert am naehesten unter dem Schaden liegt.
Zesstra18626972017-01-31 10:38:27 +0100102
Zesstracad98412019-01-19 14:41:02 +0100103 In den Meldungen mess_me (an den Getroffenen), mess_en (an den Feind),
104 mess_room (an die restlichen Umstehenden) koennen Ersatzstrings wie
105 folgt verwendet werden::
heull00130d94aa2018-02-02 19:13:09 +0100106
Zesstracad98412019-01-19 14:41:02 +0100107 @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen (TO)
108 @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes (enemy)
heull00130d94aa2018-02-02 19:13:09 +0100109
Zesstracad98412019-01-19 14:41:02 +0100110 - EINFO_DEFEND (mapping)
111 Dieses Mapping liefert erweiterte Informationen zu dem
112 bisherigen Ablauf des aktiven Attacks.
113 Die verfuegbaren Informationen sind in der Manpage zu
114 DefendInfo festgehalten.
Zesstra18626972017-01-31 10:38:27 +0100115
Zesstraa6948ba2018-02-12 21:02:46 +0100116Reihenfolgen in Defend
117++++++++++++++++++++++
heull00130d94aa2018-02-02 19:13:09 +0100118
Zesstraa6948ba2018-02-12 21:02:46 +0100119 * das Living wird angegriffen, wenn
120 * P_NO_ATTACK != 0
121 * 'enemy' existiert und kein netztoter Spieler ist
122 * P_DEFENDERS werden durchgegangen (und eventuell benachrichtigt)
123 * P_TMP_ATTACK_HOOK wird abgefragt
124 * die Ruestungen werden vom Schaden gegebenenfalls abgezogen
125 * magischer Ausweichskill beruecksichtigt
126 * sensitive Objekte werden ggf. benachrichtigt
127 * InternalModifyDefend wird gerufen
128 * Koerperabwehr abgezogen
129 * der Schaden an do_damage()/reduce_hit_points() uebergeben
130 * Flucht ueberpruefen mit CheckWimpyAndFlee()
Zesstra18626972017-01-31 10:38:27 +0100131
132BEMERKUNGEN
133-----------
Zesstra18626972017-01-31 10:38:27 +0100134
heull00141a66062017-12-11 18:08:18 +0100135 Ruestungen wirken konventionell nur, wenn mindestens ein Schadensanteil
136 mechanisch ist und es kein Spell oder ein Spell mit SP_PHYSICAL_ATTACK
137 auf 1 ist.
Zesstra18626972017-01-31 10:38:27 +0100138
heull00141a66062017-12-11 18:08:18 +0100139 Defend() beruecksichtigt magische Verteidigungen, die der Spieler bei
140 sich hat, sollte also aus Fairness gegenueber den Objekten anderer
141 Magier immer dem direkten reduce_hit_points() oder do_damage()
142 vorgezogen werden. Mittels der Flags in 'spell' kann man sehr viel
143 aendern.
Zesstra18626972017-01-31 10:38:27 +0100144
145RUECKGABEWERT
146-------------
Zesstra18626972017-01-31 10:38:27 +0100147
heull00141a66062017-12-11 18:08:18 +0100148 Hoehe des tatsaechlichen Schadens. Dies kann mehr sein als die
149 Lebenspunkte des Lebewesens.
Zesstra18626972017-01-31 10:38:27 +0100150
heull00130d94aa2018-02-02 19:13:09 +0100151BEISPIELE (SIEHE AUCH Defend_bsp)
152---------------------------------
Zesstraa6948ba2018-02-12 21:02:46 +0100153
154.. code-block:: pike
heull00130d94aa2018-02-02 19:13:09 +0100155
heull00141a66062017-12-11 18:08:18 +0100156 // ein simpler Angriff:
157 enem->Defend(100, ({DT_BLUDGEON}), ([SP_PHYSICAL_ATTACK:1]), this_object());
Zesstra18626972017-01-31 10:38:27 +0100158
heull00141a66062017-12-11 18:08:18 +0100159 // ein magischer Angriff (ohne Treffermeldung):
160 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_PHYSICAL_ATTACK:0]), this_object());
Zesstra18626972017-01-31 10:38:27 +0100161
heull00141a66062017-12-11 18:08:18 +0100162 // ein magischer Angriff mit Treffermeldung:
163 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_SHOW_DAMAGE:1]),
164 this_object());
Zesstra18626972017-01-31 10:38:27 +0100165
166SIEHE AUCH
167----------
Zesstra18626972017-01-31 10:38:27 +0100168
heull00141a66062017-12-11 18:08:18 +0100169 Angriff: :doc:`Attack`, :doc:`../props/P_NO_ATTACK`, :doc:`InsertEnemy`
heull00130d94aa2018-02-02 19:13:09 +0100170
heull00141a66062017-12-11 18:08:18 +0100171 Schaden: :doc:`../props/P_ENABLE_IN_ATTACK_OUT`,
heull00130d94aa2018-02-02 19:13:09 +0100172 :doc:`../props/P_LAST_MOVE`, :doc:`do_damage`,
173 :doc:`reduce_hit_points`
174
heull00141a66062017-12-11 18:08:18 +0100175 Schutz: :doc:`../props/P_DEFENDERS`, :doc:`InformDefend`,
heull00130d94aa2018-02-02 19:13:09 +0100176 :doc:`DefendOther`, :doc:`../props/P_ARMOURS`,
177 :doc:`../props/P_AC`, :doc:`../props/P_DEFEND_FUNC`,
178 :doc:`QueryDefend`, :doc:`../props/P_BODY`
179
heull00141a66062017-12-11 18:08:18 +0100180 Daten: :doc:`../props/P_LAST_COMBAT_TIME`,
heull00130d94aa2018-02-02 19:13:09 +0100181 :doc:`../props/P_LAST_DAMTYPES`,
182 :doc:`../props/P_LAST_DAMTIME`, :doc:`../props/P_LAST_DAMAGE`,
183 :doc:`../props/P_DAMAGE_MSG`
184
heull00141a66062017-12-11 18:08:18 +0100185 Resistenz: :doc:`../props/P_RESISTANCE_STRENGTHS`,
heull00130d94aa2018-02-02 19:13:09 +0100186 :doc:`CheckResistance`
187
heull00141a66062017-12-11 18:08:18 +0100188 Sonstiges: :doc:`CheckSensitiveAttack`,
Zesstra3bd43df2019-01-19 10:46:41 +0100189 :doc:`InternalModifyDefend`, :doc:`normalize_defend_args`
heull00130d94aa2018-02-02 19:13:09 +0100190 :doc:`UseSkill`,
191 :doc:`DefendInfo`
Zesstra18626972017-01-31 10:38:27 +0100192
Zesstra3bd43df2019-01-19 10:46:41 +0100193Letzte Aenderung: 20.01.2019, Zesstra