blob: f663010348e3677ecaec8a5ebb4e7b282a773430 [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
heull00130d94aa2018-02-02 19:13:09 +010034 Generell
35
heull00141a66062017-12-11 18:08:18 +010036 Wenn das Lebewesen angegriffen wird, wird geprueft, wie stark die
37 Ruestungen und koerpereigenen Abwehrkraefte sind und die Staerke des
38 Schadens dementsprechend vermindert.
39 Ggf. wird der Schaden zugefuegt und der Feind in die Liste der Feinde
40 aufgenommen. Der Schaden betraegt:
41 (dam-Summe(Ruestungsstaerken)-random(P_BODY+A_DEX))*CheckResistance/10
42 aber nicht unter 0.
Zesstra18626972017-01-31 10:38:27 +010043
heull00130d94aa2018-02-02 19:13:09 +010044 Der Parameter 'spell'
45
heull00141a66062017-12-11 18:08:18 +010046 Ist 'spell' 0, dann gilt der Angriff als normale physische Attacke
47 Uebergibt man als 'spell'-Parameter ein Mapping, so gibt es dafuer
48 diverse Flags, die das Ergebnis manipulieren (in new_skills.h
49 enthalten). Nichtangabe eines Flags gilt als 0.
Zesstra18626972017-01-31 10:38:27 +010050
heull00141a66062017-12-11 18:08:18 +010051 - SP_PHYSICAL_ATTACK ---------- 0/1
52 1, wenn Ruestungen wirken sollen, 0 sonst
53 -> entspricht !spell, wenn dieses Int ist
54 - SP_NO_ENEMY ----------------- 0/1
55 1, falls der Angriff nicht toedlich ist, es also keinen echten Gegner
56 gibt
57 -> es wird dann reduce_hit_points() gerufen statt do_damage()
58 - SP_NO_ACTIVE_DEFENSE -------- 0/1
59 1, falls aktive Abwehren (wie zurueckschlagende Amulette,
60 Karateabwehren oder Ausweichmanoever) unterbleiben sollen
61 -> zB bei Kratzen durch Dornen oder Fall aus grosser Hoehe
62 ist aktive Abwehr oder Ausweichen unlogisch
63 - SP_RECURSIVE ---------------- 0/1
64 1, falls der Spell aus einem Defend gerufen wurde (oder einer DefendFunc)
65 -> verhindert Rekursionsprobleme
66 - SP_NAME --------------------- string
67 Name des Spells
68 - SP_GLOBAL_ATTACK ------------ 0/1
69 1 bei Flaechenspells
70 - SP_REDUCE_ARMOUR ------------ Mapping: keys AT_X/P_BODY, values int>=0
71 Die Schutzwirkung durch P_AC/Magie einer Ruestung wird typabhaengig
72 reduziert. Aufbau eines Mappings im Beispiel:
heull00130d94aa2018-02-02 19:13:09 +010073
74 ([AT_BOOTS: 0, // Stiefel schuetzen gar nicht
75 P_BODY: 50, // Koerper zu 50%
76 AT_BELT: 600 // Guertel zu 600%
77 ])
heull00141a66062017-12-11 18:08:18 +010078 -> alle 'fehlenden' Eintraege wirken normal
heull00130d94aa2018-02-02 19:13:09 +010079
heull00141a66062017-12-11 18:08:18 +010080 - SP_SHOW_DAMAGE -------------- 0/1 oder Array von Arrays
81 0, fuer keine Treffermeldung, 1 sonst
82 In einem Array koennen Ersatz-Treffermeldungen definiert werden. Format ist:
heull00130d94aa2018-02-02 19:13:09 +010083
84 ({
heull00141a66062017-12-11 18:08:18 +010085 ({ int lphit1, string mess_me, string mess_en, 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-Array
91 aufsteigend sortiert.
Zesstra18626972017-01-31 10:38:27 +010092
heull00141a66062017-12-11 18:08:18 +010093 Ist ein Treffer x LP hart, werden die Meldungen des lphit-Arrays
94 ausgegeben, dessen Wert am naehesten unter dem Schaden liegt.
Zesstra18626972017-01-31 10:38:27 +010095
heull00141a66062017-12-11 18:08:18 +010096 In den Meldungen mess_me (an den Getroffenen), mess_en (an den Feind),
97 mess_room (an die restlichen Umstehenden) koennen Ersatzstrings wie
98 folgt verwendet werden:
heull00130d94aa2018-02-02 19:13:09 +010099
100 @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen (TO)
101 @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes (enemy)
102
103 EINFO_DEFEND ------------ Mapping
heull00141a66062017-12-11 18:08:18 +0100104 Dieses Mapping liefert erweiterte Informationen zu dem
105 bisherigen Ablauf des aktiven Attacks.
106 Die verfuegbaren Informationen sind in der Manpage zu
107 DefendInfo festgehalten.
Zesstra18626972017-01-31 10:38:27 +0100108
heull00130d94aa2018-02-02 19:13:09 +0100109 Reihenfolgen in Defend
110
111 * das Living wird angegriffen, wenn
112 * P_NO_ATTACK != 0
113 * 'enemy' existiert und kein netztoter Spieler ist
114 * P_DEFENDERS werden durchgegangen (und eventuell benachrichtigt)
115 * P_TMP_ATTACK_HOOK wird abgefragt
116 * die Ruestungen werden vom Schaden gegebenenfalls abgezogen
117 * magischer Ausweichskill beruecksichtigt
118 * sensitive Objekte werden ggf. benachrichtigt
119 * InternalModifyDefend wird gerufen
120 * Koerperabwehr abgezogen
121 * der Schaden an do_damage()/reduce_hit_points() uebergeben
122 * Flucht ueberpruefen mit CheckWimpyAndFlee()
Zesstra18626972017-01-31 10:38:27 +0100123
124BEMERKUNGEN
125-----------
Zesstra18626972017-01-31 10:38:27 +0100126
heull00141a66062017-12-11 18:08:18 +0100127 Ruestungen wirken konventionell nur, wenn mindestens ein Schadensanteil
128 mechanisch ist und es kein Spell oder ein Spell mit SP_PHYSICAL_ATTACK
129 auf 1 ist.
Zesstra18626972017-01-31 10:38:27 +0100130
heull00141a66062017-12-11 18:08:18 +0100131 Defend() beruecksichtigt magische Verteidigungen, die der Spieler bei
132 sich hat, sollte also aus Fairness gegenueber den Objekten anderer
133 Magier immer dem direkten reduce_hit_points() oder do_damage()
134 vorgezogen werden. Mittels der Flags in 'spell' kann man sehr viel
135 aendern.
Zesstra18626972017-01-31 10:38:27 +0100136
137RUECKGABEWERT
138-------------
Zesstra18626972017-01-31 10:38:27 +0100139
heull00141a66062017-12-11 18:08:18 +0100140 Hoehe des tatsaechlichen Schadens. Dies kann mehr sein als die
141 Lebenspunkte des Lebewesens.
Zesstra18626972017-01-31 10:38:27 +0100142
heull00130d94aa2018-02-02 19:13:09 +0100143BEISPIELE (SIEHE AUCH Defend_bsp)
144---------------------------------
145::
146
heull00141a66062017-12-11 18:08:18 +0100147 // ein simpler Angriff:
148 enem->Defend(100, ({DT_BLUDGEON}), ([SP_PHYSICAL_ATTACK:1]), this_object());
Zesstra18626972017-01-31 10:38:27 +0100149
heull00141a66062017-12-11 18:08:18 +0100150 // ein magischer Angriff (ohne Treffermeldung):
151 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_PHYSICAL_ATTACK:0]), this_object());
Zesstra18626972017-01-31 10:38:27 +0100152
heull00141a66062017-12-11 18:08:18 +0100153 // ein magischer Angriff mit Treffermeldung:
154 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_SHOW_DAMAGE:1]),
155 this_object());
Zesstra18626972017-01-31 10:38:27 +0100156
157SIEHE AUCH
158----------
Zesstra18626972017-01-31 10:38:27 +0100159
heull00141a66062017-12-11 18:08:18 +0100160 Angriff: :doc:`Attack`, :doc:`../props/P_NO_ATTACK`, :doc:`InsertEnemy`
heull00130d94aa2018-02-02 19:13:09 +0100161
heull00141a66062017-12-11 18:08:18 +0100162 Schaden: :doc:`../props/P_ENABLE_IN_ATTACK_OUT`,
heull00130d94aa2018-02-02 19:13:09 +0100163 :doc:`../props/P_LAST_MOVE`, :doc:`do_damage`,
164 :doc:`reduce_hit_points`
165
heull00141a66062017-12-11 18:08:18 +0100166 Schutz: :doc:`../props/P_DEFENDERS`, :doc:`InformDefend`,
heull00130d94aa2018-02-02 19:13:09 +0100167 :doc:`DefendOther`, :doc:`../props/P_ARMOURS`,
168 :doc:`../props/P_AC`, :doc:`../props/P_DEFEND_FUNC`,
169 :doc:`QueryDefend`, :doc:`../props/P_BODY`
170
heull00141a66062017-12-11 18:08:18 +0100171 Daten: :doc:`../props/P_LAST_COMBAT_TIME`,
heull00130d94aa2018-02-02 19:13:09 +0100172 :doc:`../props/P_LAST_DAMTYPES`,
173 :doc:`../props/P_LAST_DAMTIME`, :doc:`../props/P_LAST_DAMAGE`,
174 :doc:`../props/P_DAMAGE_MSG`
175
heull00141a66062017-12-11 18:08:18 +0100176 Resistenz: :doc:`../props/P_RESISTANCE_STRENGTHS`,
heull00130d94aa2018-02-02 19:13:09 +0100177 :doc:`CheckResistance`
178
heull00141a66062017-12-11 18:08:18 +0100179 Sonstiges: :doc:`CheckSensitiveAttack`,
heull00130d94aa2018-02-02 19:13:09 +0100180 :doc:`InternalModifyDefend`,
181 :doc:`UseSkill`,
182 :doc:`DefendInfo`
Zesstra18626972017-01-31 10:38:27 +0100183
heull00141a66062017-12-11 18:08:18 +0100184Letzte Aenderung: 29.12.2017, Bugfix