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
  1. Okt 2011 Gloinson