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
    * SA_DAMAGE:   Schaden, den das Lebewesen macht
    * SA_SPEED:    Geschwindigkeit des Lebewesens
    * 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" (unbenutzt)

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 Mod zu klein ist
    SA_MOD_TOO_BIG         wenn der Mod zu gross ist
    SA_MOD_INVALID_ATTR    wenn das gewuenschte SA gar nicht existiert
    SA_MOD_INVALID_OBJECT  wenn das setzende Objekt 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:
    P_SKILL_ATTRIBUTES, P_SKILL_ATTRIBUTE_OFFSETS,
    QuerySkillAttribute(), QuerySkillAttributeModifier(),
    RemoveSkillAttributeModifier()

-----------------------------------------------------------------------------
07.08.2008, Zesstra
