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