blob: e9ff9921ab88e9cae960bd88918fab08354fffdf [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
heull00141a66062017-12-11 18:08:18 +010034 1. Generell
35 Wenn das Lebewesen angegriffen wird, wird geprueft, wie stark die
36 Ruestungen und koerpereigenen Abwehrkraefte sind und die Staerke des
37 Schadens dementsprechend vermindert.
38 Ggf. wird der Schaden zugefuegt und der Feind in die Liste der Feinde
39 aufgenommen. Der Schaden betraegt:
40 (dam-Summe(Ruestungsstaerken)-random(P_BODY+A_DEX))*CheckResistance/10
41 aber nicht unter 0.
Zesstra18626972017-01-31 10:38:27 +010042
heull00141a66062017-12-11 18:08:18 +010043 2. Der Parameter 'spell'
44 Ist 'spell' 0, dann gilt der Angriff als normale physische Attacke
45 Uebergibt man als 'spell'-Parameter ein Mapping, so gibt es dafuer
46 diverse Flags, die das Ergebnis manipulieren (in new_skills.h
47 enthalten). Nichtangabe eines Flags gilt als 0.
Zesstra18626972017-01-31 10:38:27 +010048
heull00141a66062017-12-11 18:08:18 +010049 - SP_PHYSICAL_ATTACK ---------- 0/1
50 1, wenn Ruestungen wirken sollen, 0 sonst
51 -> entspricht !spell, wenn dieses Int ist
52 - SP_NO_ENEMY ----------------- 0/1
53 1, falls der Angriff nicht toedlich ist, es also keinen echten Gegner
54 gibt
55 -> es wird dann reduce_hit_points() gerufen statt do_damage()
56 - SP_NO_ACTIVE_DEFENSE -------- 0/1
57 1, falls aktive Abwehren (wie zurueckschlagende Amulette,
58 Karateabwehren oder Ausweichmanoever) unterbleiben sollen
59 -> zB bei Kratzen durch Dornen oder Fall aus grosser Hoehe
60 ist aktive Abwehr oder Ausweichen unlogisch
61 - SP_RECURSIVE ---------------- 0/1
62 1, falls der Spell aus einem Defend gerufen wurde (oder einer DefendFunc)
63 -> verhindert Rekursionsprobleme
64 - SP_NAME --------------------- string
65 Name des Spells
66 - SP_GLOBAL_ATTACK ------------ 0/1
67 1 bei Flaechenspells
68 - SP_REDUCE_ARMOUR ------------ Mapping: keys AT_X/P_BODY, values int>=0
69 Die Schutzwirkung durch P_AC/Magie einer Ruestung wird typabhaengig
70 reduziert. Aufbau eines Mappings im Beispiel:
71 ([AT_BOOTS: 0, // Stiefel schuetzen gar nicht
72 P_BODY: 50, // Koerper zu 50%
73 AT_BELT: 600 // Guertel zu 600%
74 ])
75 -> alle 'fehlenden' Eintraege wirken normal
76 - SP_SHOW_DAMAGE -------------- 0/1 oder Array von Arrays
77 0, fuer keine Treffermeldung, 1 sonst
78 In einem Array koennen Ersatz-Treffermeldungen definiert werden. Format ist:
79 ({
80 ({ int lphit1, string mess_me, string mess_en, string mess_room }),
81 ({ lphit2, mess_me, mess_en, mess_room }),
82 ...
83 ({ lphitn, mess_me, mess_en, mess_room }),
84 })
85 wobei lphit1<lphit2<...<lphitn sein muss, d.h. das Array-Array
86 aufsteigend sortiert.
Zesstra18626972017-01-31 10:38:27 +010087
heull00141a66062017-12-11 18:08:18 +010088 Ist ein Treffer x LP hart, werden die Meldungen des lphit-Arrays
89 ausgegeben, dessen Wert am naehesten unter dem Schaden liegt.
Zesstra18626972017-01-31 10:38:27 +010090
heull00141a66062017-12-11 18:08:18 +010091 In den Meldungen mess_me (an den Getroffenen), mess_en (an den Feind),
92 mess_room (an die restlichen Umstehenden) koennen Ersatzstrings wie
93 folgt verwendet werden:
94 @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen (TO)
95 @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes (enemy)
96 - EINFO_DEFEND ------------ Mapping
97 Dieses Mapping liefert erweiterte Informationen zu dem
98 bisherigen Ablauf des aktiven Attacks.
99 Die verfuegbaren Informationen sind in der Manpage zu
100 DefendInfo festgehalten.
Zesstra18626972017-01-31 10:38:27 +0100101
heull00141a66062017-12-11 18:08:18 +0100102 3. Reihenfolgen in Defend
103 - das Living wird angegriffen, wenn
104 - P_NO_ATTACK != 0
105 - 'enemy' existiert und kein netztoter Spieler ist
106 - P_DEFENDERS werden durchgegangen (und eventuell benachrichtigt)
107 - P_TMP_ATTACK_HOOK wird abgefragt
108 - die Ruestungen werden vom Schaden gegebenenfalls abgezogen
109 - magischer Ausweichskill beruecksichtigt
110 - sensitive Objekte werden ggf. benachrichtigt
111 - InternalModifyDefend wird gerufen
112 - Koerperabwehr abgezogen
113 - der Schaden an do_damage()/reduce_hit_points() uebergeben
114 - Flucht ueberpruefen mit CheckWimpyAndFlee()
Zesstra18626972017-01-31 10:38:27 +0100115
116BEMERKUNGEN
117-----------
Zesstra18626972017-01-31 10:38:27 +0100118
heull00141a66062017-12-11 18:08:18 +0100119 Ruestungen wirken konventionell nur, wenn mindestens ein Schadensanteil
120 mechanisch ist und es kein Spell oder ein Spell mit SP_PHYSICAL_ATTACK
121 auf 1 ist.
Zesstra18626972017-01-31 10:38:27 +0100122
heull00141a66062017-12-11 18:08:18 +0100123 Defend() beruecksichtigt magische Verteidigungen, die der Spieler bei
124 sich hat, sollte also aus Fairness gegenueber den Objekten anderer
125 Magier immer dem direkten reduce_hit_points() oder do_damage()
126 vorgezogen werden. Mittels der Flags in 'spell' kann man sehr viel
127 aendern.
Zesstra18626972017-01-31 10:38:27 +0100128
129RUECKGABEWERT
130-------------
Zesstra18626972017-01-31 10:38:27 +0100131
heull00141a66062017-12-11 18:08:18 +0100132 Hoehe des tatsaechlichen Schadens. Dies kann mehr sein als die
133 Lebenspunkte des Lebewesens.
Zesstra18626972017-01-31 10:38:27 +0100134
135BEISPIELE (SIEHE AUCH Defend_bsp):
heull00141a66062017-12-11 18:08:18 +0100136 // ein simpler Angriff:
137 enem->Defend(100, ({DT_BLUDGEON}), ([SP_PHYSICAL_ATTACK:1]), this_object());
Zesstra18626972017-01-31 10:38:27 +0100138
heull00141a66062017-12-11 18:08:18 +0100139 // ein magischer Angriff (ohne Treffermeldung):
140 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_PHYSICAL_ATTACK:0]), this_object());
Zesstra18626972017-01-31 10:38:27 +0100141
heull00141a66062017-12-11 18:08:18 +0100142 // ein magischer Angriff mit Treffermeldung:
143 enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_SHOW_DAMAGE:1]),
144 this_object());
Zesstra18626972017-01-31 10:38:27 +0100145
146SIEHE AUCH
147----------
Zesstra18626972017-01-31 10:38:27 +0100148
heull00141a66062017-12-11 18:08:18 +0100149 Angriff: :doc:`Attack`, :doc:`../props/P_NO_ATTACK`, :doc:`InsertEnemy`
150 Schaden: :doc:`../props/P_ENABLE_IN_ATTACK_OUT`,
151 :doc:`../props/P_LAST_MOVE`, :doc:`do_damage`,
152 :doc:`reduce_hit_points`
153 Schutz: :doc:`../props/P_DEFENDERS`, :doc:`InformDefend`,
154 :doc:`DefendOther`, :doc:`../props/P_ARMOURS`,
155 :doc:`../props/P_AC`, :doc:`../props/P_DEFEND_FUNC`,
156 :doc:`QueryDefend`, :doc:`../props/P_BODY`
157 Daten: :doc:`../props/P_LAST_COMBAT_TIME`,
158 :doc:`../props/P_LAST_DAMTYPES`,
159 :doc:`../props/P_LAST_DAMTIME`, :doc:`../props/P_LAST_DAMAGE`,
160 :doc:`../props/P_DAMAGE_MSG`
161 Resistenz: :doc:`../props/P_RESISTANCE_STRENGTHS`,
162 :doc:`CheckResistance`
163 Sonstiges: :doc:`CheckSensitiveAttack`,
164 :doc:`InternalModifyDefend`,
165 :doc:`UseSkill`,
166 :doc:`DefendInfo`
Zesstra18626972017-01-31 10:38:27 +0100167
heull00141a66062017-12-11 18:08:18 +0100168Letzte Aenderung: 29.12.2017, Bugfix