blob: d4033e7d641a657d33c773d173d11f8db50d5bbd [file] [log] [blame]
Zesstra18626972017-01-31 10:38:27 +01001Defend()
2========
3
4FUNKTION
5--------
Zesstra18626972017-01-31 10:38:27 +01006 public int Defend(int dam, string|string* dam_type, int|mapping spell,
7 object enemy)
8
9DEFINIERT IN
10------------
Zesstra18626972017-01-31 10:38:27 +010011
12 /std/living/combat
13
14ARGUMENTE
15---------
Zesstra18626972017-01-31 10:38:27 +010016
17 int dam initiale Staerke des Angriffs (10 dam ~ 1 HP)
18 string* dam_type Art(en) des Schadens, der angerichtet werden
19 soll
20 Muss ein Array von Schadenstypen sein,
21 alte Objekte uebergeben hier manchmal strings.
heull001f2ad7fc2017-12-11 18:08:18 +010022 mapping spell Mapping mit zusaetzlichen Informationen zum
23 Angriff(Siehe unten)
24 Alte Objekte uebergeben manchmal einen
25 Integer (0 fuer Physikalischen Angriff, 1
26 fuer Zauber.
Zesstra18626972017-01-31 10:38:27 +010027 object enemy der Feind/Schadenverursacher
28
29BESCHREIBUNG
30------------
Zesstra18626972017-01-31 10:38:27 +010031
32 1. Generell
33 Wenn das Lebewesen angegriffen wird, wird geprueft, wie stark die
34 Ruestungen und koerpereigenen Abwehrkraefte sind und die Staerke des
35 Schadens dementsprechend vermindert.
36 Ggf. wird der Schaden zugefuegt und der Feind in die Liste der Feinde
37 aufgenommen. Der Schaden betraegt:
38 (dam-Summe(Ruestungsstaerken)-random(P_BODY+A_DEX))*CheckResistance/10
39 aber nicht unter 0.
40
41 2. Der Parameter 'spell'
42 Ist 'spell' 0, dann gilt der Angriff als normale physische Attacke
43 Uebergibt man als 'spell'-Parameter ein Mapping, so gibt es dafuer
44 diverse Flags, die das Ergebnis manipulieren (in new_skills.h
45 enthalten). Nichtangabe eines Flags gilt als 0.
46
47 - SP_PHYSICAL_ATTACK ---------- 0/1
48 1, wenn Ruestungen wirken sollen, 0 sonst
49 -> entspricht !spell, wenn dieses Int ist
50 - SP_NO_ENEMY ----------------- 0/1
51 1, falls der Angriff nicht toedlich ist, es also keinen echten
52 Gegner gibt
53 -> es wird dann reduce_hit_points() gerufen statt do_damage()
54 - SP_NO_ACTIVE_DEFENSE -------- 0/1
55 1, falls aktive Abwehren (wie zurueckschlagende Amulette,
56 Karateabwehren oder Ausweichmanoever) unterbleiben sollen
57 -> zB bei Kratzen durch Dornen oder Fall aus grosser Hoehe
58 ist aktive Abwehr oder Ausweichen unlogisch
59 - SP_RECURSIVE ---------------- 0/1
60 1, falls der Spell aus einem Defend gerufen wurde (oder einer
61 DefendFunc)
62 -> verhindert Rekursionsprobleme
63 - SP_NAME --------------------- string
64 Name des Spells
heull001f2ad7fc2017-12-11 18:08:18 +010065 - SP_GLOBAL_ATTACK ------------ 0/1
66 1 bei Flaechenspells
Zesstra18626972017-01-31 10:38:27 +010067 - SP_REDUCE_ARMOUR ------------ Mapping: keys AT_X/P_BODY, values int>=0
68 Die Schutzwirkung durch P_AC/Magie einer Ruestung wird
69 typabhaengig reduziert. Aufbau eines Mappings im Beispiel:
70 ([AT_BOOTS: 0, // Stiefel schuetzen gar nicht
71 P_BODY: 50, // Koerper zu 50%
72 AT_BELT: 600 // Guertel zu 600%
73 ])
74 -> alle 'fehlenden' Eintraege wirken normal
75 - SP_SHOW_DAMAGE -------------- 0/1 oder Array von Arrays
76 0, fuer keine Treffermeldung, 1 sonst
77 In einem Array koennen Ersatz-Treffermeldungen definiert
78 werden. Format ist:
79 ({
80 ({ int lphit1, string mess_me,
81 string mess_en,
82 string mess_room }),
83 ({ lphit2, mess_me, mess_en, mess_room }),
84 ...
85 ({ lphitn, mess_me, mess_en, mess_room }),
86 })
87 wobei lphit1<lphit2<...<lphitn sein muss, d.h. das Array-
88 Array aufsteigend sortiert.
89
90 Ist ein Treffer x LP hart, werden die Meldungen des lphit-
91 Arrays ausgegeben, dessen Wert am naehesten unter dem Schaden
92 liegt.
93
94 In den Meldungen mess_me (an den Getroffenen), mess_en (an
95 den Feind), mess_room (an die restlichen Umstehenden) koennen
96 Ersatzstrings wie folgt verwendet werden:
97 @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen (TO)
98 @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes (enemy)
99 - EINFO_DEFEND ------------ Mapping
100 Dieses Mapping liefert erweiterte Informationen zu dem
101 bisherigen Ablauf des aktiven Attacks.
102 Die verfuegbaren Informationen sind in der Manpage zu
103 DefendInfo festgehalten.
104
105 3. Reihenfolgen in Defend
106 - das Living wird angegriffen, wenn
107 - P_NO_ATTACK != 0
108 - 'enemy' existiert und kein netztoter Spieler ist
109 - P_DEFENDERS werden durchgegangen (und eventuell benachrichtigt)
110 - P_TMP_ATTACK_HOOK wird abgefragt
111 - die Ruestungen werden vom Schaden gegebenenfalls abgezogen
112 - magischer Ausweichskill beruecksichtigt
113 - sensitive Objekte werden ggf. benachrichtigt
114 - InternalModifyDefend wird gerufen
115 - Koerperabwehr abgezogen
116 - der Schaden an do_damage()/reduce_hit_points() uebergeben
117 - Flucht ueberpruefen mit CheckWimpyAndFlee()
118
119BEMERKUNGEN
120-----------
Zesstra18626972017-01-31 10:38:27 +0100121
122 Ruestungen wirken konventionell nur, wenn mindestens ein Schadensanteil
123 mechanisch ist und es kein Spell oder ein Spell mit SP_PHYSICAL_ATTACK
124 auf 1 ist.
125
126 Defend() beruecksichtigt magische Verteidigungen, die der Spieler bei
127 sich hat, sollte also aus Fairness gegenueber den Objekten anderer
128 Magier immer dem direkten reduce_hit_points() oder do_damage()
129 vorgezogen werden. Mittels der Flags in 'spell' kann man sehr viel
130 aendern.
131
132RUECKGABEWERT
133-------------
Zesstra18626972017-01-31 10:38:27 +0100134
135 Hoehe des tatsaechlichen Schadens. Dies kann mehr sein als die
136 Lebenspunkte des Lebewesens.
137
138BEISPIELE (SIEHE AUCH Defend_bsp):
139 // ein simpler Angriff:
140 enem->Defend(100, ({DT_BLUDGEON}), 0, this_object());
141
142 // ein magischer Angriff (ohne Treffermeldung):
143 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), 1, this_object());
144
145 // ein magischer Angriff mit Treffermeldung:
146 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_SHOW_DAMAGE:1]),
147 this_object());
148
149SIEHE AUCH
150----------
Zesstra18626972017-01-31 10:38:27 +0100151
heull001f2ad7fc2017-12-11 18:08:18 +0100152 Angriff: :doc:`Attack`, :doc:`../props/P_NO_ATTACK`, :doc:`InsertEnemy`
153 Schaden: :doc:`../props/P_ENABLE_IN_ATTACK_OUT`,
154 :doc:`../props/P_LAST_MOVE`, :doc:`do_damage`,
155 :doc:`reduce_hit_points`
156 Schutz: :doc:`../props/P_DEFENDERS`, :doc:`InformDefend`,
157 :doc:`DefendOther`, :doc:`../props/P_ARMOURS`,
158 :doc:`../props/P_AC`, :doc:`../props/P_DEFEND_FUNC`,
159 :doc:`QueryDefend`, :doc:`../props/P_BODY`
160 Daten: :doc:`../props/P_LAST_COMBAT_TIME`,
161 :doc:`../props/P_LAST_DAMTYPES`,
162 :doc:`../props/P_LAST_DAMTIME`, :doc:`../props/P_LAST_DAMAGE`,
163 :doc:`../props/P_DAMAGE_MSG`
164 Resistenz: :doc:`../props/P_RESISTANCE_STRENGTHS`,
165 :doc:`CheckResistance`
166 Sonstiges: :doc:`CheckSensitiveAttack`,
167 :doc:`InternalModifyDefend`,
168 :doc:`UseSkill`,
169 :doc:`DefendInfo`
Zesstra18626972017-01-31 10:38:27 +0100170
heull001f2ad7fc2017-12-11 18:08:18 +0100171Letzte Aenderung: 11.12.2017, Bugfix