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