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