blob: ec19054a3405432c4b773c4f62824018bc695174 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001ModifySkillAttribute()
Zesstra953f9972017-02-18 15:37:36 +01002**********************
MG Mud User88f12472016-06-24 23:31:02 +02003
MG Mud User88f12472016-06-24 23:31:02 +02004
Zesstra953f9972017-02-18 15:37:36 +01005FUNKTION
6========
MG Mud User88f12472016-06-24 23:31:02 +02007
Zesstra953f9972017-02-18 15:37:36 +01008 public int ModifySkillAttribute(string atrname, mixed value,
9 int duration)
MG Mud User88f12472016-06-24 23:31:02 +020010
MG Mud User88f12472016-06-24 23:31:02 +020011
Zesstra953f9972017-02-18 15:37:36 +010012DEFINIERT IN
13============
MG Mud User88f12472016-06-24 23:31:02 +020014
Zesstra953f9972017-02-18 15:37:36 +010015 /std/living/skill_attributes.c
MG Mud User88f12472016-06-24 23:31:02 +020016
MG Mud User88f12472016-06-24 23:31:02 +020017
Zesstra953f9972017-02-18 15:37:36 +010018ARGUMENTE
19=========
MG Mud User88f12472016-06-24 23:31:02 +020020
Zesstra953f9972017-02-18 15:37:36 +010021 <atrname> string
22 Name des zu veraendernden Attributes
23 (Definiert in /sys/living/skill_attributes.h)
MG Mud User88f12472016-06-24 23:31:02 +020024
Zesstra953f9972017-02-18 15:37:36 +010025 <value> int oder closure
26 Wert des Modifikators
27 oder
28 eine Closure, welche bei Abfrage des betreffenden SAs
29 abgefragt um den Modifikator zu bestimmen.
MG Mud User88f12472016-06-24 23:31:02 +020030
Zesstra953f9972017-02-18 15:37:36 +010031 <duration> int
32 Dauer in Sekunden
MG Mud User88f12472016-06-24 23:31:02 +020033
MG Mud User88f12472016-06-24 23:31:02 +020034
Zesstra953f9972017-02-18 15:37:36 +010035BESCHREIBUNG
36============
MG Mud User88f12472016-06-24 23:31:02 +020037
Zesstra953f9972017-02-18 15:37:36 +010038 Aendert temporaer, d.h. fuer eine bestimmte Zeit, ein Skill-Attribut
39 eines Lebewesen, indem ein Modifikator hinzugefuegt wird.
40
41
42
43 Der Standardwert eines SA wird von P_SKILL_ATTRIBUTE_OFFSETS festgelegt
44 oder ist 100, wenn besagte Property leer ist.
45 Alle Modifikatoren (negativ wie positiv) werden addiert und bilden
46 zusammen mit dem Standardwert eine Gesamtsumme.
47 Bei allen SAs ausser SA_QUALITY wird diese Gesamtsumme noch mit
48 SA_QUALITY (welches sich damit auf alle anderen Skill-Attribute
49 auswirkt) multipliziert und das Ergebnis stellt den Endwert des SA dar.
50 (Beispiel s.u.)
51
52 Der Wert eines Modifikators muss zwischen -1000 und 1000 liegen. Der
53 Gesamtwert eines SA kann 10 nicht unter- und 1000 nicht ueberschreiten.
54
55 Falle <value> eine Closure ist, wird diese Closure jedesmal
56 ausgefuehrt, wenn das entsprechende SA abgefragt wird. Der
57 Rueckgabewert dieser Closure stellt dann den Wert des Modifikators
58 dar. Auch dieser muss zwischen -1000 und 1000 liegen. Gibt die
59 Closure keinen int zurueck, wird der Modifikator geloescht.
60
61 Gueltige Skill-Attribute sind momentan:
62 * SA_QUALITY: Allgemeine Qualitaet: wirkt sich auf alle anderen
63 Attribute auch aus (multplikativ auf Basis 100)
64 * SA_DAMAGE: Schaden, den das Lebewesen macht
65 * SA_SPEED: Geschwindigkeit des Lebewesens (zB Angriffe/Runde)
66 * SA_DURATION: Spell-/Skilldauer
67 * SA_ENEMY_SAVE: identisch zu SA_SPELL_PENETRATION (OBSOLET!)
68 * SA_SPELL_PENETRATION: Chance des _Casters_, einen Spell durch ein
69 P_NOMAGIC durchzukriegen.
70 * SA_RANGE: Reichweite des Lebewesens (eher unbenutzt)
71 * SA_EXTENSION: "Ausdehnung" bei Gruppen-/Flaechenspells: FindGroupN/P
72
73
74RUECKGABEWERT
75=============
76
77 SA_MOD_OK wenn der Modifikator gesetzt wurde
78 SA_TOO_MANY_MODS wenn die max. Anzahl an Mods schon erreicht ist.
79 SA_MOD_TOO_SMALL wenn der Modifikator zu klein ist
80 SA_MOD_TOO_BIG wenn der Modifikator zu gross ist
81 SA_MOD_INVALID_ATTR wenn das gewuenschte SA gar nicht existiert
82 SA_MOD_INVALID_OBJECT wenn das setzende Objekt ungueltig ist
83 SA_MOD_INVALID_VALUE wenn der Modifikator ungueltig ist
84 Wenn man nur wissen will, ob die Operation erfolgreich war, empfiehlt
85 es sich, auf == SA_MOD_OK zu pruefen.
86
87
88BEMERKUNGEN
89===========
90
91 Nachdem ein Objekt, welches Modifikatoren setzte, zerstoert wurde,
92 werden die Modifikatoren spaetestens ungueltig, sobald in dem
93 manipulierten Lebewesen erneut ModifySkillAttribute() gerufen wird!
94 Bei Closures ist der Mod sofort weg.
95
96
97BEISPIELE
98=========
99
100 // sei PL ein Spieler, den mein NPC schwaechen will:
101 PL->ModifySkillAttribute(SA_QUALITY, -75, 13);
102 // Fuer 13s wird SA_QUALITY um 75 reduziert. Dies wirkt sich auf alle
103 // anderen SAs aus! (s. drittes Beispiel)
104
105 // sei PL ein Lebewesen, welchem ich fuer 11s 2 Schlaege pro Kampfrunde
106 // zusaetzlich geben moechte:
107 PL->ModifySkillAttribute(SA_SPEED, 200, 11);
108 // wenn keine weiteres Modifikatoren wirken, hat PL jetzt 3 Schlaege
109 // pro Kampfrunde (Basiswert 100 + 200 == 300 => 3).
110
111 Angenommen, ein Lebewesen hat einen Basiswert von 130 auf SA_SPEED und
112 100 auf SA_QUALITY (P_SKILL_ATTRIBUTE_OFFSETS) und nun 3 Modifikatoren
113 gesetzt: SA_SPEED +100, SA_SPEED -30 und SA_QUALITY von -10:
114 Zunaechst wird SA_QUALITY bestimmt: 100 - 10 = 90 => 0.9
115 Anschliessend wird SA_SPEED bestimmt: 130 + 100 - 30 = 200 => 2
116 Nun wird SA_SPEED noch mit SA_QUALITY multipliziert: 2 * 0.9 = 1.8
117 Das Lebewesen hat nun also im Endeffekt 1.8 Schlaege pro Kampfrunde.
118
119
120SIEHE AUCH
121==========
122
123 Skills Lernen: LearnSkill, ModifySkill, LimitAbility
124 * Nutzung: UseSpell, UseSkill
125 * Abfragen: QuerySkill
126 * Modifikation: QuerySkillAttribute,
127 QuerySkillAttributeModifier, RemoveSkillAttributeModifier
128 * Properties: P_SKILL_ATTRIBUTES, P_SKILL_ATTRIBUTE_OFFSETS
129 * sonstig: spruchermuedung, skill_info_liste
130 * Properties: P_NEWSKILLS
MG Mud User88f12472016-06-24 23:31:02 +0200131
1325. Okt 2011 Gloinson