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
