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
