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