blob: e5b3669fe9fe55bc0ea0200e3a7eeb47bcefc23d [file] [log] [blame]
ModifySkillAttribute()
FUNKTION:
public int ModifySkillAttribute(string atrname, mixed value,
int duration)
DEFINIERT IN:
/std/living/skill_attributes.c
ARGUMENTE:
<atrname> string
Name des zu veraendernden Attributes
(Definiert in /sys/living/skill_attributes.h)
<value> int oder closure
Wert des Modifikators
oder
eine Closure, welche bei Abfrage des betreffenden SAs
abgefragt um den Modifikator zu bestimmen.
<duration> int
Dauer in Sekunden
BESCHREIBUNG:
Aendert temporaer, d.h. fuer eine bestimmte Zeit, ein Skill-Attribut
eines Lebewesen, indem ein Modifikator hinzugefuegt wird.
Der Standardwert eines SA wird von P_SKILL_ATTRIBUTE_OFFSETS festgelegt
oder ist 100, wenn besagte Property leer ist.
Alle Modifikatoren (negativ wie positiv) werden addiert und bilden
zusammen mit dem Standardwert eine Gesamtsumme.
Bei allen SAs ausser SA_QUALITY wird diese Gesamtsumme noch mit
SA_QUALITY (welches sich damit auf alle anderen Skill-Attribute
auswirkt) multipliziert und das Ergebnis stellt den Endwert des SA dar.
(Beispiel s.u.)
Der Wert eines Modifikators muss zwischen -1000 und 1000 liegen. Der
Gesamtwert eines SA kann 10 nicht unter- und 1000 nicht ueberschreiten.
Falle <value> eine Closure ist, wird diese Closure jedesmal
ausgefuehrt, wenn das entsprechende SA abgefragt wird. Der
Rueckgabewert dieser Closure stellt dann den Wert des Modifikators
dar. Auch dieser muss zwischen -1000 und 1000 liegen. Gibt die
Closure keinen int zurueck, wird der Modifikator geloescht.
Gueltige Skill-Attribute sind momentan:
* SA_QUALITY: Allgemeine Qualitaet: wirkt sich auf alle anderen
Attribute auch aus (multplikativ auf Basis 100)
* SA_DAMAGE: Schaden, den das Lebewesen macht
* SA_SPEED: Geschwindigkeit des Lebewesens (zB Angriffe/Runde)
* SA_DURATION: Spell-/Skilldauer
* SA_ENEMY_SAVE: identisch zu SA_SPELL_PENETRATION (OBSOLET!)
* SA_SPELL_PENETRATION: Chance des _Casters_, einen Spell durch ein
P_NOMAGIC durchzukriegen.
* SA_RANGE: Reichweite des Lebewesens (eher unbenutzt)
* SA_EXTENSION: "Ausdehnung" bei Gruppen-/Flaechenspells: FindGroupN/P
RUECKGABEWERT:
SA_MOD_OK wenn der Modifikator gesetzt wurde
SA_TOO_MANY_MODS wenn die max. Anzahl an Mods schon erreicht ist.
SA_MOD_TOO_SMALL wenn der Modifikator zu klein ist
SA_MOD_TOO_BIG wenn der Modifikator zu gross ist
SA_MOD_INVALID_ATTR wenn das gewuenschte SA gar nicht existiert
SA_MOD_INVALID_OBJECT wenn das setzende Objekt ungueltig ist
SA_MOD_INVALID_VALUE wenn der Modifikator ungueltig ist
Wenn man nur wissen will, ob die Operation erfolgreich war, empfiehlt
es sich, auf == SA_MOD_OK zu pruefen.
BEMERKUNGEN:
Nachdem ein Objekt, welches Modifikatoren setzte, zerstoert wurde,
werden die Modifikatoren spaetestens ungueltig, sobald in dem
manipulierten Lebewesen erneut ModifySkillAttribute() gerufen wird!
Bei Closures ist der Mod sofort weg.
BEISPIELE:
// sei PL ein Spieler, den mein NPC schwaechen will:
PL->ModifySkillAttribute(SA_QUALITY, -75, 13);
// Fuer 13s wird SA_QUALITY um 75 reduziert. Dies wirkt sich auf alle
// anderen SAs aus! (s. drittes Beispiel)
// sei PL ein Lebewesen, welchem ich fuer 11s 2 Schlaege pro Kampfrunde
// zusaetzlich geben moechte:
PL->ModifySkillAttribute(SA_SPEED, 200, 11);
// wenn keine weiteres Modifikatoren wirken, hat PL jetzt 3 Schlaege
// pro Kampfrunde (Basiswert 100 + 200 == 300 => 3).
Angenommen, ein Lebewesen hat einen Basiswert von 130 auf SA_SPEED und
100 auf SA_QUALITY (P_SKILL_ATTRIBUTE_OFFSETS) und nun 3 Modifikatoren
gesetzt: SA_SPEED +100, SA_SPEED -30 und SA_QUALITY von -10:
Zunaechst wird SA_QUALITY bestimmt: 100 - 10 = 90 => 0.9
Anschliessend wird SA_SPEED bestimmt: 130 + 100 - 30 = 200 => 2
Nun wird SA_SPEED noch mit SA_QUALITY multipliziert: 2 * 0.9 = 1.8
Das Lebewesen hat nun also im Endeffekt 1.8 Schlaege pro Kampfrunde.
SIEHE AUCH:
Skills Lernen: LearnSkill, ModifySkill, LimitAbility
* Nutzung: UseSpell, UseSkill
* Abfragen: QuerySkill
* Modifikation: QuerySkillAttribute,
QuerySkillAttributeModifier, RemoveSkillAttributeModifier
* Properties: P_SKILL_ATTRIBUTES, P_SKILL_ATTRIBUTE_OFFSETS
* sonstig: spruchermuedung, skill_info_liste
* Properties: P_NEWSKILLS
5. Okt 2011 Gloinson