blob: b404e9d55160ac1c3212f6e460774dcb757bf99c [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
heull00141a66062017-12-11 18:08:18 +010053 - SP_PHYSICAL_ATTACK ---------- 0/1
54 1, wenn Ruestungen wirken sollen, 0 sonst
55 -> entspricht !spell, wenn dieses Int ist
56 - SP_NO_ENEMY ----------------- 0/1
57 1, falls der Angriff nicht toedlich ist, es also keinen echten Gegner
58 gibt
59 -> es wird dann reduce_hit_points() gerufen statt do_damage()
60 - SP_NO_ACTIVE_DEFENSE -------- 0/1
61 1, falls aktive Abwehren (wie zurueckschlagende Amulette,
62 Karateabwehren oder Ausweichmanoever) unterbleiben sollen
63 -> zB bei Kratzen durch Dornen oder Fall aus grosser Hoehe
64 ist aktive Abwehr oder Ausweichen unlogisch
65 - SP_RECURSIVE ---------------- 0/1
66 1, falls der Spell aus einem Defend gerufen wurde (oder einer DefendFunc)
67 -> verhindert Rekursionsprobleme
68 - SP_NAME --------------------- string
69 Name des Spells
70 - SP_GLOBAL_ATTACK ------------ 0/1
71 1 bei Flaechenspells
72 - SP_REDUCE_ARMOUR ------------ Mapping: keys AT_X/P_BODY, values int>=0
73 Die Schutzwirkung durch P_AC/Magie einer Ruestung wird typabhaengig
Zesstra3bd43df2019-01-19 10:46:41 +010074 reduziert. Aufbau eines Mappings im Beispiel::
75
76 ([AT_BOOTS: 0, // Stiefel schuetzen gar nicht
77 P_BODY: 50, // Koerper zu 50%
78 AT_BELT: 600 // Guertel zu 600%
79 ])
80 -> alle 'fehlenden' Eintraege wirken normal
heull00130d94aa2018-02-02 19:13:09 +010081
heull00141a66062017-12-11 18:08:18 +010082 - SP_SHOW_DAMAGE -------------- 0/1 oder Array von Arrays
83 0, fuer keine Treffermeldung, 1 sonst
Zesstra3bd43df2019-01-19 10:46:41 +010084 In einem Array koennen Ersatz-Treffermeldungen definiert werden. Format
85 ist::
heull00130d94aa2018-02-02 19:13:09 +010086
87 ({
heull00141a66062017-12-11 18:08:18 +010088 ({ int lphit1, string mess_me, string mess_en, string mess_room }),
89 ({ lphit2, mess_me, mess_en, mess_room }),
90 ...
91 ({ lphitn, mess_me, mess_en, mess_room }),
92 })
93 wobei lphit1<lphit2<...<lphitn sein muss, d.h. das Array-Array
94 aufsteigend sortiert.
Zesstra18626972017-01-31 10:38:27 +010095
heull00141a66062017-12-11 18:08:18 +010096 Ist ein Treffer x LP hart, werden die Meldungen des lphit-Arrays
97 ausgegeben, dessen Wert am naehesten unter dem Schaden liegt.
Zesstra18626972017-01-31 10:38:27 +010098
heull00141a66062017-12-11 18:08:18 +010099 In den Meldungen mess_me (an den Getroffenen), mess_en (an den Feind),
100 mess_room (an die restlichen Umstehenden) koennen Ersatzstrings wie
Zesstra3bd43df2019-01-19 10:46:41 +0100101 folgt verwendet werden::
heull00130d94aa2018-02-02 19:13:09 +0100102
Zesstra3bd43df2019-01-19 10:46:41 +0100103 @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen (TO)
104 @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes (enemy)
heull00130d94aa2018-02-02 19:13:09 +0100105
Zesstra3bd43df2019-01-19 10:46:41 +0100106 - EINFO_DEFEND ------------ Mapping
heull00141a66062017-12-11 18:08:18 +0100107 Dieses Mapping liefert erweiterte Informationen zu dem
108 bisherigen Ablauf des aktiven Attacks.
109 Die verfuegbaren Informationen sind in der Manpage zu
110 DefendInfo festgehalten.
Zesstra18626972017-01-31 10:38:27 +0100111
Zesstraa6948ba2018-02-12 21:02:46 +0100112Reihenfolgen in Defend
113++++++++++++++++++++++
heull00130d94aa2018-02-02 19:13:09 +0100114
Zesstraa6948ba2018-02-12 21:02:46 +0100115 * das Living wird angegriffen, wenn
116 * P_NO_ATTACK != 0
117 * 'enemy' existiert und kein netztoter Spieler ist
118 * P_DEFENDERS werden durchgegangen (und eventuell benachrichtigt)
119 * P_TMP_ATTACK_HOOK wird abgefragt
120 * die Ruestungen werden vom Schaden gegebenenfalls abgezogen
121 * magischer Ausweichskill beruecksichtigt
122 * sensitive Objekte werden ggf. benachrichtigt
123 * InternalModifyDefend wird gerufen
124 * Koerperabwehr abgezogen
125 * der Schaden an do_damage()/reduce_hit_points() uebergeben
126 * Flucht ueberpruefen mit CheckWimpyAndFlee()
Zesstra18626972017-01-31 10:38:27 +0100127
128BEMERKUNGEN
129-----------
Zesstra18626972017-01-31 10:38:27 +0100130
heull00141a66062017-12-11 18:08:18 +0100131 Ruestungen wirken konventionell nur, wenn mindestens ein Schadensanteil
132 mechanisch ist und es kein Spell oder ein Spell mit SP_PHYSICAL_ATTACK
133 auf 1 ist.
Zesstra18626972017-01-31 10:38:27 +0100134
heull00141a66062017-12-11 18:08:18 +0100135 Defend() beruecksichtigt magische Verteidigungen, die der Spieler bei
136 sich hat, sollte also aus Fairness gegenueber den Objekten anderer
137 Magier immer dem direkten reduce_hit_points() oder do_damage()
138 vorgezogen werden. Mittels der Flags in 'spell' kann man sehr viel
139 aendern.
Zesstra18626972017-01-31 10:38:27 +0100140
141RUECKGABEWERT
142-------------
Zesstra18626972017-01-31 10:38:27 +0100143
heull00141a66062017-12-11 18:08:18 +0100144 Hoehe des tatsaechlichen Schadens. Dies kann mehr sein als die
145 Lebenspunkte des Lebewesens.
Zesstra18626972017-01-31 10:38:27 +0100146
heull00130d94aa2018-02-02 19:13:09 +0100147BEISPIELE (SIEHE AUCH Defend_bsp)
148---------------------------------
Zesstraa6948ba2018-02-12 21:02:46 +0100149
150.. code-block:: pike
heull00130d94aa2018-02-02 19:13:09 +0100151
heull00141a66062017-12-11 18:08:18 +0100152 // ein simpler Angriff:
153 enem->Defend(100, ({DT_BLUDGEON}), ([SP_PHYSICAL_ATTACK:1]), this_object());
Zesstra18626972017-01-31 10:38:27 +0100154
heull00141a66062017-12-11 18:08:18 +0100155 // ein magischer Angriff (ohne Treffermeldung):
156 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_PHYSICAL_ATTACK:0]), this_object());
Zesstra18626972017-01-31 10:38:27 +0100157
heull00141a66062017-12-11 18:08:18 +0100158 // ein magischer Angriff mit Treffermeldung:
159 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_SHOW_DAMAGE:1]),
160 this_object());
Zesstra18626972017-01-31 10:38:27 +0100161
162SIEHE AUCH
163----------
Zesstra18626972017-01-31 10:38:27 +0100164
heull00141a66062017-12-11 18:08:18 +0100165 Angriff: :doc:`Attack`, :doc:`../props/P_NO_ATTACK`, :doc:`InsertEnemy`
heull00130d94aa2018-02-02 19:13:09 +0100166
heull00141a66062017-12-11 18:08:18 +0100167 Schaden: :doc:`../props/P_ENABLE_IN_ATTACK_OUT`,
heull00130d94aa2018-02-02 19:13:09 +0100168 :doc:`../props/P_LAST_MOVE`, :doc:`do_damage`,
169 :doc:`reduce_hit_points`
170
heull00141a66062017-12-11 18:08:18 +0100171 Schutz: :doc:`../props/P_DEFENDERS`, :doc:`InformDefend`,
heull00130d94aa2018-02-02 19:13:09 +0100172 :doc:`DefendOther`, :doc:`../props/P_ARMOURS`,
173 :doc:`../props/P_AC`, :doc:`../props/P_DEFEND_FUNC`,
174 :doc:`QueryDefend`, :doc:`../props/P_BODY`
175
heull00141a66062017-12-11 18:08:18 +0100176 Daten: :doc:`../props/P_LAST_COMBAT_TIME`,
heull00130d94aa2018-02-02 19:13:09 +0100177 :doc:`../props/P_LAST_DAMTYPES`,
178 :doc:`../props/P_LAST_DAMTIME`, :doc:`../props/P_LAST_DAMAGE`,
179 :doc:`../props/P_DAMAGE_MSG`
180
heull00141a66062017-12-11 18:08:18 +0100181 Resistenz: :doc:`../props/P_RESISTANCE_STRENGTHS`,
heull00130d94aa2018-02-02 19:13:09 +0100182 :doc:`CheckResistance`
183
heull00141a66062017-12-11 18:08:18 +0100184 Sonstiges: :doc:`CheckSensitiveAttack`,
Zesstra3bd43df2019-01-19 10:46:41 +0100185 :doc:`InternalModifyDefend`, :doc:`normalize_defend_args`
heull00130d94aa2018-02-02 19:13:09 +0100186 :doc:`UseSkill`,
187 :doc:`DefendInfo`
Zesstra18626972017-01-31 10:38:27 +0100188
Zesstra3bd43df2019-01-19 10:46:41 +0100189Letzte Aenderung: 20.01.2019, Zesstra