blob: edd3fc4208d35cf091933f229cc8b18d1f06dc2f [file] [log] [blame]
Zesstra18626972017-01-31 10:38:27 +01001Defend()
2========
3
4FUNKTION
5--------
Zesstrac57634a2017-12-21 00:15:24 +02006
heull00141a66062017-12-11 18:08:18 +01007 public int Defend(int dam, string|string* dam_type, int|mapping spell,
8 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)
20 string* dam_type
21 Art des Schadens, der angerichtet werden soll
22 Muss ein Array von Schadenstypen sein, alte Objekte uebergeben hier
23 manchmal strings.
24 mapping spell
25 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
74 reduziert. Aufbau eines Mappings im Beispiel:
heull00130d94aa2018-02-02 19:13:09 +010075
76 ([AT_BOOTS: 0, // Stiefel schuetzen gar nicht
77 P_BODY: 50, // Koerper zu 50%
78 AT_BELT: 600 // Guertel zu 600%
79 ])
heull00141a66062017-12-11 18:08:18 +010080 -> 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
84 In einem Array koennen Ersatz-Treffermeldungen definiert werden. Format ist:
heull00130d94aa2018-02-02 19:13:09 +010085
86 ({
heull00141a66062017-12-11 18:08:18 +010087 ({ int lphit1, string mess_me, string mess_en, string mess_room }),
88 ({ lphit2, mess_me, mess_en, mess_room }),
89 ...
90 ({ lphitn, mess_me, mess_en, mess_room }),
91 })
92 wobei lphit1<lphit2<...<lphitn sein muss, d.h. das Array-Array
93 aufsteigend sortiert.
Zesstra18626972017-01-31 10:38:27 +010094
heull00141a66062017-12-11 18:08:18 +010095 Ist ein Treffer x LP hart, werden die Meldungen des lphit-Arrays
96 ausgegeben, dessen Wert am naehesten unter dem Schaden liegt.
Zesstra18626972017-01-31 10:38:27 +010097
heull00141a66062017-12-11 18:08:18 +010098 In den Meldungen mess_me (an den Getroffenen), mess_en (an den Feind),
99 mess_room (an die restlichen Umstehenden) koennen Ersatzstrings wie
100 folgt verwendet werden:
heull00130d94aa2018-02-02 19:13:09 +0100101
102 @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen (TO)
103 @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes (enemy)
104
105 EINFO_DEFEND ------------ Mapping
heull00141a66062017-12-11 18:08:18 +0100106 Dieses Mapping liefert erweiterte Informationen zu dem
107 bisherigen Ablauf des aktiven Attacks.
108 Die verfuegbaren Informationen sind in der Manpage zu
109 DefendInfo festgehalten.
Zesstra18626972017-01-31 10:38:27 +0100110
Zesstraa6948ba2018-02-12 21:02:46 +0100111Reihenfolgen in Defend
112++++++++++++++++++++++
heull00130d94aa2018-02-02 19:13:09 +0100113
Zesstraa6948ba2018-02-12 21:02:46 +0100114 * das Living wird angegriffen, wenn
115 * P_NO_ATTACK != 0
116 * 'enemy' existiert und kein netztoter Spieler ist
117 * P_DEFENDERS werden durchgegangen (und eventuell benachrichtigt)
118 * P_TMP_ATTACK_HOOK wird abgefragt
119 * die Ruestungen werden vom Schaden gegebenenfalls abgezogen
120 * magischer Ausweichskill beruecksichtigt
121 * sensitive Objekte werden ggf. benachrichtigt
122 * InternalModifyDefend wird gerufen
123 * Koerperabwehr abgezogen
124 * der Schaden an do_damage()/reduce_hit_points() uebergeben
125 * Flucht ueberpruefen mit CheckWimpyAndFlee()
Zesstra18626972017-01-31 10:38:27 +0100126
127BEMERKUNGEN
128-----------
Zesstra18626972017-01-31 10:38:27 +0100129
heull00141a66062017-12-11 18:08:18 +0100130 Ruestungen wirken konventionell nur, wenn mindestens ein Schadensanteil
131 mechanisch ist und es kein Spell oder ein Spell mit SP_PHYSICAL_ATTACK
132 auf 1 ist.
Zesstra18626972017-01-31 10:38:27 +0100133
heull00141a66062017-12-11 18:08:18 +0100134 Defend() beruecksichtigt magische Verteidigungen, die der Spieler bei
135 sich hat, sollte also aus Fairness gegenueber den Objekten anderer
136 Magier immer dem direkten reduce_hit_points() oder do_damage()
137 vorgezogen werden. Mittels der Flags in 'spell' kann man sehr viel
138 aendern.
Zesstra18626972017-01-31 10:38:27 +0100139
140RUECKGABEWERT
141-------------
Zesstra18626972017-01-31 10:38:27 +0100142
heull00141a66062017-12-11 18:08:18 +0100143 Hoehe des tatsaechlichen Schadens. Dies kann mehr sein als die
144 Lebenspunkte des Lebewesens.
Zesstra18626972017-01-31 10:38:27 +0100145
heull00130d94aa2018-02-02 19:13:09 +0100146BEISPIELE (SIEHE AUCH Defend_bsp)
147---------------------------------
Zesstraa6948ba2018-02-12 21:02:46 +0100148
149.. code-block:: pike
heull00130d94aa2018-02-02 19:13:09 +0100150
heull00141a66062017-12-11 18:08:18 +0100151 // ein simpler Angriff:
152 enem->Defend(100, ({DT_BLUDGEON}), ([SP_PHYSICAL_ATTACK:1]), this_object());
Zesstra18626972017-01-31 10:38:27 +0100153
heull00141a66062017-12-11 18:08:18 +0100154 // ein magischer Angriff (ohne Treffermeldung):
155 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_PHYSICAL_ATTACK:0]), this_object());
Zesstra18626972017-01-31 10:38:27 +0100156
heull00141a66062017-12-11 18:08:18 +0100157 // ein magischer Angriff mit Treffermeldung:
158 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_SHOW_DAMAGE:1]),
159 this_object());
Zesstra18626972017-01-31 10:38:27 +0100160
161SIEHE AUCH
162----------
Zesstra18626972017-01-31 10:38:27 +0100163
heull00141a66062017-12-11 18:08:18 +0100164 Angriff: :doc:`Attack`, :doc:`../props/P_NO_ATTACK`, :doc:`InsertEnemy`
heull00130d94aa2018-02-02 19:13:09 +0100165
heull00141a66062017-12-11 18:08:18 +0100166 Schaden: :doc:`../props/P_ENABLE_IN_ATTACK_OUT`,
heull00130d94aa2018-02-02 19:13:09 +0100167 :doc:`../props/P_LAST_MOVE`, :doc:`do_damage`,
168 :doc:`reduce_hit_points`
169
heull00141a66062017-12-11 18:08:18 +0100170 Schutz: :doc:`../props/P_DEFENDERS`, :doc:`InformDefend`,
heull00130d94aa2018-02-02 19:13:09 +0100171 :doc:`DefendOther`, :doc:`../props/P_ARMOURS`,
172 :doc:`../props/P_AC`, :doc:`../props/P_DEFEND_FUNC`,
173 :doc:`QueryDefend`, :doc:`../props/P_BODY`
174
heull00141a66062017-12-11 18:08:18 +0100175 Daten: :doc:`../props/P_LAST_COMBAT_TIME`,
heull00130d94aa2018-02-02 19:13:09 +0100176 :doc:`../props/P_LAST_DAMTYPES`,
177 :doc:`../props/P_LAST_DAMTIME`, :doc:`../props/P_LAST_DAMAGE`,
178 :doc:`../props/P_DAMAGE_MSG`
179
heull00141a66062017-12-11 18:08:18 +0100180 Resistenz: :doc:`../props/P_RESISTANCE_STRENGTHS`,
heull00130d94aa2018-02-02 19:13:09 +0100181 :doc:`CheckResistance`
182
heull00141a66062017-12-11 18:08:18 +0100183 Sonstiges: :doc:`CheckSensitiveAttack`,
heull00130d94aa2018-02-02 19:13:09 +0100184 :doc:`InternalModifyDefend`,
185 :doc:`UseSkill`,
186 :doc:`DefendInfo`
Zesstra18626972017-01-31 10:38:27 +0100187
heull00141a66062017-12-11 18:08:18 +0100188Letzte Aenderung: 29.12.2017, Bugfix