
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
