blob: aa5394541aa0857a892fdf2cc5ae5671ef9b4c51 [file] [log] [blame]
Zesstra953f9972017-02-18 15:37:36 +01001
MG Mud User88f12472016-06-24 23:31:02 +02002Defend()
Zesstra953f9972017-02-18 15:37:36 +01003********
MG Mud User88f12472016-06-24 23:31:02 +02004
MG Mud User88f12472016-06-24 23:31:02 +02005
Zesstra953f9972017-02-18 15:37:36 +01006FUNKTION
7========
MG Mud User88f12472016-06-24 23:31:02 +02008
Zesstra953f9972017-02-18 15:37:36 +01009 public int Defend(int dam, string|string* dam_type, int|mapping spell,
10 object enemy)
MG Mud User88f12472016-06-24 23:31:02 +020011
MG Mud User88f12472016-06-24 23:31:02 +020012
Zesstra953f9972017-02-18 15:37:36 +010013DEFINIERT IN
14============
MG Mud User88f12472016-06-24 23:31:02 +020015
Zesstra953f9972017-02-18 15:37:36 +010016 /std/living/combat
MG Mud User88f12472016-06-24 23:31:02 +020017
MG Mud User88f12472016-06-24 23:31:02 +020018
Zesstra953f9972017-02-18 15:37:36 +010019ARGUMENTE
20=========
MG Mud User88f12472016-06-24 23:31:02 +020021
Zesstra953f9972017-02-18 15:37:36 +010022 int dam initiale Staerke des Angriffs (10 dam ~ 1 HP)
23 string* dam_type Art(en) des Schadens, der angerichtet werden
24 soll
25 Muss ein Array von Schadenstypen sein,
26 alte Objekte uebergeben hier manchmal strings.
27 int/mapping spell - 0 fuer normale Angriffe (keine Zauber)
28 - 1 fuer Zauber (Standardruestungen ignorieren)
29 - mapping fuer mehr Informationen
30 Heute bitte nach Moeglichkeit ein Mapping
31 uebergeben.
32 object enemy der Feind/Schadenverursacher
MG Mud User88f12472016-06-24 23:31:02 +020033
MG Mud User88f12472016-06-24 23:31:02 +020034
Zesstra953f9972017-02-18 15:37:36 +010035BESCHREIBUNG
36============
37
38 1. Generell
39 Wenn das Lebewesen angegriffen wird, wird geprueft, wie stark die
40 Ruestungen und koerpereigenen Abwehrkraefte sind und die Staerke des
41 Schadens dementsprechend vermindert.
42 Ggf. wird der Schaden zugefuegt und der Feind in die Liste der Feinde
43 aufgenommen. Der Schaden betraegt:
44 (dam-Summe(Ruestungsstaerken)-random(P_BODY+A_DEX))*CheckResistance/10
45 aber nicht unter 0.
46
47 2. Der Parameter 'spell'
48 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.
52
53 - 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
58 Gegner 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
67 DefendFunc)
68 -> verhindert Rekursionsprobleme
69 - SP_NAME --------------------- string
70 Name des Spells
71 - SP_REDUCE_ARMOUR ------------ Mapping: keys AT_X/P_BODY, values int>=0
72 Die Schutzwirkung durch P_AC/Magie einer Ruestung wird
73 typabhaengig reduziert. Aufbau eines Mappings im Beispiel:
74 ([AT_BOOTS: 0, // Stiefel schuetzen gar nicht
75 P_BODY: 50, // Koerper zu 50%
76 AT_BELT: 600 // Guertel zu 600%
77 ])
78 -> alle 'fehlenden' Eintraege wirken normal
79 - SP_SHOW_DAMAGE -------------- 0/1 oder Array von Arrays
80 0, fuer keine Treffermeldung, 1 sonst
81 In einem Array koennen Ersatz-Treffermeldungen definiert
82 werden. Format ist:
83 ({
84 ({ int lphit1, string mess_me,
85 string mess_en,
86 string mess_room }),
87 ({ lphit2, mess_me, mess_en, mess_room }),
88 ...
89 ({ lphitn, mess_me, mess_en, mess_room }),
90 })
91 wobei lphit1<lphit2<...<lphitn sein muss, d.h. das Array-
92 Array aufsteigend sortiert.
93
94 Ist ein Treffer x LP hart, werden die Meldungen des lphit-
95 Arrays ausgegeben, dessen Wert am naehesten unter dem Schaden
96 liegt.
97
98 In den Meldungen mess_me (an den Getroffenen), mess_en (an
99 den Feind), mess_room (an die restlichen Umstehenden) koennen
100 Ersatzstrings wie folgt verwendet werden:
101 @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen (TO)
102 @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes (enemy)
103 - EINFO_DEFEND ------------ Mapping
104 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.
108
109 3. Reihenfolgen in Defend
110 - das Living wird angegriffen, wenn
111 - P_NO_ATTACK != 0
112 - 'enemy' existiert und kein netztoter Spieler ist
113 - P_DEFENDERS werden durchgegangen (und eventuell benachrichtigt)
114 - P_TMP_ATTACK_HOOK wird abgefragt
115 - die Ruestungen werden vom Schaden gegebenenfalls abgezogen
116 - magischer Ausweichskill beruecksichtigt
117 - sensitive Objekte werden ggf. benachrichtigt
118 - InternalModifyDefend wird gerufen
119 - Koerperabwehr abgezogen
120 - der Schaden an do_damage()/reduce_hit_points() uebergeben
121 - Flucht ueberpruefen mit CheckWimpyAndFlee()
122
123
124BEMERKUNGEN
125===========
126
127 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.
130
131 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.
136
137
138RUECKGABEWERT
139=============
140
141 Hoehe des tatsaechlichen Schadens. Dies kann mehr sein als die
142 Lebenspunkte des Lebewesens.
MG Mud User88f12472016-06-24 23:31:02 +0200143
144BEISPIELE (SIEHE AUCH Defend_bsp):
Zesstra953f9972017-02-18 15:37:36 +0100145 // ein simpler Angriff: enem->Defend(100, ({DT_BLUDGEON}), 0,
146 this_object());
MG Mud User88f12472016-06-24 23:31:02 +0200147
Zesstra953f9972017-02-18 15:37:36 +0100148 // ein magischer Angriff (ohne Treffermeldung): enem->Defend(100,
149 ({DT_BLUDGEON, DT_FIRE}), 1, this_object());
MG Mud User88f12472016-06-24 23:31:02 +0200150
Zesstra953f9972017-02-18 15:37:36 +0100151 // ein magischer Angriff mit Treffermeldung: enem->Defend(100,
152 ({DT_BLUDGEON, DT_FIRE}), ([SP_SHOW_DAMAGE:1]),
MG Mud User88f12472016-06-24 23:31:02 +0200153
Zesstra953f9972017-02-18 15:37:36 +0100154 this_object());
155
156
157SIEHE AUCH
158==========
159
160 Angriff: Attack(L), P_NO_ATTACK, InsertEnemy(L)
161 Schaden: P_ENABLE_IN_ATTACK_OUT, P_LAST_MOVE,
162 do_damage(L), reduce_hit_points(L)
163 Schutz: P_DEFENDERS, InformDefend(L), DefendOther(L)
164 P_ARMOURS, P_AC, P_DEFEND_FUNC, QueryDefend(L)
165 P_BODY, A_DEX
166 Daten: P_LAST_COMBAT_TIME
167 P_LAST_DAMTYPES, P_LAST_DAMTIME, P_LAST_DAMAGE
168 P_DAMAGE_MSG
169 Resistenz: P_RESISTANCE_STRENGTHS, CheckResistance(L)
170 Sonstiges: CheckSensitiveAttack(L)
171 InternalModifyDefend(L)
172 UseSkill(L),
173 DefendInfo
MG Mud User88f12472016-06-24 23:31:02 +0200174
17515.09.2010, Zesstra