Lpc Manpages

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:

    1) 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)


    2) Sei OB ein Lebewesen, dem ich fuer 11s 2 Schlaege pro Kampfrunde
       zusaetzlich geben moechte:

    OB->ModifySkillAttribute(SA_SPEED,200,11);

    // wenn keine weitere Modifikatoren wirken, hat OB jetzt 3 Schlaege
    // pro Kampfrunde (Basiswert 100 + 200 == 300 -> 3).


    3) 

    Interne Berechnung:
    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, dann:

      - 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,
        sprich: in 10 Kampfrunden 18 Schlaege.

SIEHE AUCH:
    Skills Lernen:  LearnSkill, ModifySkill, LimitAbility
    * Nutzung:      UseSpell, UseSkill
    * Abfragen:     QuerySkill
    * Modifikation: ModifySkill, QuerySkillAttribute,
                    QuerySkillAttributeModifier, RemoveSkillAttributeModifier
      - Properties: P_SKILL_ATTRIBUTES, P_SKILL_ATTRIBUTE_OFFSETS
    * sonstig:      spruchermuedung, skill_info_liste
    * Properties:   P_SKILLS
    Spellbook:      Learn, SpellSuccess

----------------------------------------------------------------------------
01.11.17, Torin