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