ModifySkill()
=============

FUNKTION
--------
::

    public varargs void ModifySkill(string sname, mixed val,
                                    int diff, string gilde)

DEFINIERT IN
------------
::

    /std/living/skills.c

ARGUMENTE
---------
::

    string sname     der zu aendernde Skill
    mixed val        Aenderungswert: int fuer SI_SKILLABILITY, sonst mapping
    int diff         Schwierigkeit (optional: default ist existierendes diff)
    string gilde     Gilde (optional: default ist eigene Gilde)

BESCHREIBUNG
------------
::

    Mit der Methode kann man die Werte eines Skills/Spells veraendern. Dabei
    wird ein Skill immer in ein Mapping umgewandelt (Skills/Spells koennen
    auch einfach nur ihren Skillwert enthalten, diese ist aequivalent zu
    einem Mapping mit ([SI_SKILLABILITY:<Skillwert>]).

    Ist 'val' ein int, wird dieses als SI_SKILLABILITY gesetzt. Falls der
    Skill nur ein int war, wird ein 'diff'!=0 als SI_DIFFICULTY gesetzt.

    Ist 'val' ein Mapping, wird dieses zum Skillmapping addiert.

    

    Etwaige SI_SKILLABILITY-Aenderungen laufen danach noch durch LimitAbility.

BEISPIELE
---------
::

    // #1a: Lerne einen Spell/Skill (einer Gilde)
    caster->ModifySkill("feuerball", MAX_ABILITY, 100, "abenteurer")
    // #1b: ... oder ...
    caster->ModifySkill("feuerball", ([SI_SKILLABILITY: MAX_ABILITY]), 100,
                        "abenteurer")
    // #1c: ... oder fuer einen Abenteurer ...
    caster->ModifySkill("feuerball", ([SI_SKILLABILITY: MAX_ABILITY]), 100);

    

    // #2: Setze eine Skill-Funktion fuer einen Kampfskill des Klerus
    this_player()->ModifySkill(FIGHT(WT_CLUB),
                               ([SI_SKILLFUNC: "Keulenkampf",
                                 SI_DIFFICULTY: 100]),
                               100, "klerus");

    // #3: Speichere im Skill (also Spieler) eine Option fuer diesen Skill
    // Vorteil: dieser Eintrag wird dem Spell immer uebergeben
    caster->ModifySkill("blitz", (["klerus_spell_option": 2]));

    (Code in /doc/beispiele/testobjekte/modifyskillspell_test)
    // #4: Lerne einen unabhaengigen Spell: ACHTUNG
    // dieser Spell funktioniert nur solange, wie die Closure existiert,
    // SI_SKILLABILITY und Spell bleiben jedoch im Spieler gespeichert (!)
    this_player()->ModifySkill("fnrx",
      ([SI_CLOSURE:
          function int (object caster, string skill, mapping sinf) {
            caster->LearnSkill("fnrx", 1);
            tell_object(caster, "Peng! Dein Skillwert steigt auf "+
                                caster->QuerySkillAbility("fnrx")+".\n");
            return ERFOLG;
          },
        SI_SKILLABILITY: 8432]),
      100,
      "ANY");

SIEHE AUCH
----------
::

    Skills Lernen:  LearnSkill, LimitAbility
    * Nutzung:      UseSpell, UseSkill
    * Abfragen:     QuerySkill, QuerySkillAbility
    * Modifikation: ModifySkillAttribute, QuerySkillAttribute,
                    QuerySkillAttributeModifier, RemoveSkillAttributeModifier
      * Properties: P_SKILL_ATTRIBUTES, P_SKILL_ATTRIBUTE_OFFSETS
    * sonstig:      spruchermuedung
    * Properties:   P_NEWSKILLS

3. Okt 2011 Gloinson

