blob: e0727918412ee38bdd400b360eb1e323c767ecbb [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001ModifySkillAttribute()
2
3FUNKTION:
4 public int ModifySkillAttribute(string atrname, mixed value,
5 int duration)
6
7DEFINIERT IN:
8 /std/living/skill_attributes.c
9
10ARGUMENTE:
11 <atrname> string
12 Name des zu veraendernden Attributes
13 (Definiert in /sys/living/skill_attributes.h)
14
15 <value> int oder closure
16 Wert des Modifikators
17 oder
18 eine Closure, welche bei Abfrage des betreffenden SAs
19 abgefragt um den Modifikator zu bestimmen.
20
21 <duration> int
22 Dauer in Sekunden
23
24BESCHREIBUNG:
25 Aendert temporaer, d.h. fuer eine bestimmte Zeit, ein Skill-Attribut eines
26 Lebewesen, indem ein Modifikator hinzugefuegt wird.
27
28 Der Standardwert eines SA wird von P_SKILL_ATTRIBUTE_OFFSETS festgelegt
29 oder ist 100, wenn besagte Property leer ist.
30 Alle Modifikatoren (negativ wie positiv) werden addiert und bilden
31 zusammen mit dem Standardwert eine Gesamtsumme.
32 Bei allen SAs ausser SA_QUALITY wird diese Gesamtsumme noch mit
33 SA_QUALITY (welches sich damit auf alle anderen Skill-Attribute auswirkt)
34 multipliziert und das Ergebnis stellt den Endwert des SA dar.
35 (Beispiel s.u.)
36
37 Der Wert eines Modifikators muss zwischen -1000 und 1000 liegen. Der
38 Gesamtwert eines SA kann 10 nicht unter- und 1000 nicht ueberschreiten.
39
40 Falle <value> eine Closure ist, wird diese Closure jedesmal ausgefuehrt,
41 wenn das entsprechende SA abgefragt wird. Der Rueckgabewert dieser Closure
42 stellt dann den Wert des Modifikators dar. Auch dieser muss zwischen -1000
43 und 1000 liegen. Gibt die Closure keinen int zurueck, wird der Modifikator
44 geloescht.
45
46 Gueltige Skill-Attribute sind momentan:
47 * SA_QUALITY: Allgemeine Qualitaet
48 * SA_DAMAGE: Schaden, den das Lebewesen macht
49 * SA_SPEED: Geschwindigkeit des Lebewesens
50 * SA_DURATION: Spell-/Skilldauer
51 * SA_ENEMY_SAVE: identisch zu SA_SPELL_PENETRATION (OBSOLET!)
52 * SA_SPELL_PENETRATION: Chance des _Casters_, einen Spell durch ein
53 P_NOMAGIC durchzukriegen.
54 * SA_RANGE: Reichweite des Lebewesens (eher unbenutzt)
55 * SA_EXTENSION: "Ausdehnung" (unbenutzt)
56
57RUECKGABEWERT:
58 SA_MOD_OK wenn der Modifikator gesetzt wurde
59 SA_TOO_MANY_MODS wenn die max. Anzahl an Mods schon erreicht ist.
60 SA_MOD_TOO_SMALL wenn der Mod zu klein ist
61 SA_MOD_TOO_BIG wenn der Mod zu gross ist
62 SA_MOD_INVALID_ATTR wenn das gewuenschte SA gar nicht existiert
63 SA_MOD_INVALID_OBJECT wenn das setzende Objekt ungueltig ist
64 Wenn man nur wissen will, ob die Operation erfolgreich war, empfiehlt es
65 sich, auf == SA_MOD_OK zu pruefen.
66
67BEMERKUNGEN:
68 Nachdem ein Objekt, welches Modifikatoren setzte, zerstoert wurde, werden
69 die Modifikatoren spaetestens ungueltig, sobald in dem manipulierten
70 Lebewesen erneut ModifySkillAttribute() gerufen wird! Bei Closures ist der
71 Mod sofort weg.
72
73BEISPIELE:
74 // sei PL ein Spieler, den mein NPC schwaechen will:
75 PL->ModifySkillAttribute(SA_QUALITY, -75, 13);
76 // Fuer 13s wird SA_QUALITY um 75 reduziert. Dies wirkt sich auf alle
77 // anderen SAs aus! (s. drittes Beispiel)
78
79 // sei PL ein Lebewesen, welchem ich fuer 11s 2 Schlaege pro Kampfrunde
80 // zusaetzlich geben moechte:
81 PL->ModifySkillAttribute(SA_SPEED, 200, 11);
82 // wenn keine weiteres Modifikatoren wirken, hat PL jetzt 3 Schlaege pro
83 // Kampfrunde (Basiswert 100 + 200 == 300 => 3).
84
85 Angenommen, ein Lebewesen hat einen Basiswert von 130 auf SA_SPEED und 100
86 auf SA_QUALITY (P_SKILL_ATTRIBUTE_OFFSETS) und nun 3 Modifikatoren
87 gesetzt: SA_SPEED +100, SA_SPEED -30 und SA_QUALITY von -10:
88 Zunaechst wird SA_QUALITY bestimmt: 100 - 10 = 90 => 0.9
89 Anschliessend wird SA_SPEED bestimmt: 130 + 100 - 30 = 200 => 2
90 Nun wird SA_SPEED noch mit SA_QUALITY multipliziert: 2 * 0.9 = 1.8
91 Das Lebewesen hat nun also im Endeffekt 1.8 Schlaege pro Kampfrunde.
92
93
94SIEHE AUCH:
95 P_SKILL_ATTRIBUTES, P_SKILL_ATTRIBUTE_OFFSETS,
96 QuerySkillAttribute(), QuerySkillAttributeModifier(),
97 RemoveSkillAttributeModifier()
98
99-----------------------------------------------------------------------------
10007.08.2008, Zesstra