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
