blob: 790505a3e86f8001ee4260134c96984fbb33e23d [file] [log] [blame]
Zesstra18626972017-01-31 10:38:27 +01001DefendFunc()
2============
3
4DefendFunc(L)
5-------------
6::
7
8FUNKTION
9--------
10::
11
12 int DefendFunc(string|string *dtyp, int|mappingspell, object enemy);
13
14DEFINIERT IN
15------------
16::
17
18 eigenen Objekten; fuer /std/armour/combat.c
19
20ARGUMENTE
21---------
22::
23
24 dtyp
25 Schadenstypen der Angriffsart.
26 Sollte heute ein string* sein.
27 spell
28 0 bei veralteten konventionellen Angriffen im Regelfall jedoch
29 ein Mapping mit weiteren Infos.
30 Bei einem konventionellen Angriff ist spell[SP_PHYSICAL_ATTACK] gleich
31 1.
32 enemy
33 Der angreifende Gegner
34
35BESCHREIBUNG
36------------
37::
38
39 Anhand der uebergebenen Parameter kann hier ein Ruestungsbonus (oder
40 auch ein Ruestungsmalus) errechnet werden, der zu dem normalen
41 Ruestungswert (abhaengig von der Angriffsart) hinzuaddiert wird.
42
43RUeCKGABEWERT
44-------------
45::
46
47 Der Ruestungsbonus, der zur Ruestungsklasse addiert werden soll.
48
49BEMERKUNGEN
50-----------
51::
52
53 Auch wenn man eine DefendFunc() benutzt, darf der Rueckgabewert
54 zusammen mit der P_AC insgesamt nur in sehr seltenen, wohldurch-
55 dachten Ausnahmefaellen die maximal zulaessige P_AC fuer diesen
56 Ruestungstyp ueberschreiten. In solchen Ausnahmefaellen duerfen
57 die DefendFuncs nicht konstant wirken.
58
59 Bei aktivem Zurueckschlagen IMMER auf Flags wie SP_RECURSIVE und
60 SP_NO_ACTIVE_DEFENSE pruefen und ggf. abbrechen.
61
62BEISPIELE
63---------
64::
65
66 Eine Ruestung, die bei Angriffen mit Feuer ihre volle Staerke entfaltet
67 und bei Angriffen durch Geister geschwaecht wird:
68
69 void create()
70 {
71 ::create();
72
73 SetProp(P_ARMOUR_TYPE, AT_ARMOUR);
74 SetProp(P_AC, 20);
75 ...
76 // Die DefendFunc() ist in der Ruestung selbst definiert
77 SetProp(P_DEFEND_FUNC, this_object());
78 }
79
80 int DefendFunc(string *dtyp, mixed spell, object enemy)
81 {
82 int prot;
83
84 // Zuerst fragen wir den Angriff durch Feuer ab:
85 if (member(dtyp, DT_FIRE) >= 0) // Feuer gehoert zu den Schadenstypen
86 prot = 5 + random(10); // Das ergibt maximal 14. Zusammen mit P_AC
87 // kommt man also maximal auf 14+20 = 34,
88 // liegt also unter der fuer AT_ARMOUR
89 // geltenden Obergrenze
90
91 // Und jetzt der Geistertest
92 if (enemy->QueryProp(P_RACE) == "Geist" ||
93 enemy->is_class_member(CL_GHOST))
94 prot -= random(10);
95
96 // Der Rueckgabewert wird auf den aus P_AC errechneten Wert draufgeschlagen
97 return prot;
98 }
99
100SIEHE AUCH
101----------
102::
103
104 P_DEFEND_FUNC, QueryDefend(), /std/armour/combat.c
105
106
107Last modified: 18.Jul 2006 Muadib
108