QuerySkillAttributeModifier()
*****************************


FUNKTION
========

   public varargs mapping QuerySkillAttributeModifier(object caster,
                                                   string *atrnames)


DEFINIERT IN
============

   /std/living/skill_attributes.c


ARGUMENTE
=========

   <caster>    object
               Objekt, welches die gesuchten Mods gesetzt hat

   <atrnames>  string*
               Array von Skill-Attributen, welche durchsucht werden sollen.


BESCHREIBUNG
============

   Diese Funktion liefert alle Mods von <caster> auf den Skill-
   Attributen <atrnames> in einem Mapping zurueck.
   Wird <atrnames> nicht angegeben oder ist ein leeres Array, werden alle
   Skill-Attribute nach Mods abgesucht.
   Wird <caster> nicht angeben oder ist 0, so werden alle Mods der
   gewuenschten Skill-Attribute geliefert.
   Dementsprechend bekommt man alle Mods aller Skill-Attribute, wenn keins
   von beidem angegeben wird.


RUECKGABEWERT
=============

   ([]), falls keine Modifikatoren gefunden wurden.
   In anderen Faellen ist die Datenstruktur des Mappings wie folgt:
   ([ atrname1: ([ <caster>: <value>; <duration> ]),
      atrname2: ([ <caster>: <value>; <duration> ]) ])
   Die Schluessel im Mapping sind die jeweiligen Skill-Attribute, die Werte
   des Mappings sind erneut Mappings, welche als Schluessel die Objekte
   haben, welche die Mods gesetzt haben. In diesem Mapping gehoeren zu jedem
   Schluessel zwei Werte, den Wert des Modifikators und die Ablaufzeit.
   <value> kann hierbei ein int oder eine closure sein, <duration> ist ein
   int, <caster> ist ein Objekt.
   Ggf. kann das innere Mapping natuerlich auch mehrere Modifikatoren
   enthalten (also caster1, caster2, usw.).


BEMERKUNGEN
===========


BEISPIELE
=========

   Ein Objekt moechte seinen bestehenden Modifikator um 20 und die
   Gueltigkeit um 13 erhoehen.
   mapping res = ob->QuerySkillAttributeModifier(this_object(),
                                                ({SA_DAMAGE}) );
   if (member(res, SA_DAMAGE) && member(res[SA_DAMAGE], this_object())) {
        // alten Mod ueberschreiben und Werte dabei anheben.
        ob->ModifySkillAttributeModifier(SA_DAMAGE,
            res[SA_DAMAGE][this_object(),0] + 20,
            res[SA_DAMAGE][this_object(),1] + 13 );
   }
   else
        // neuen Mod setzen.
        ob->ModifySkilAttributeModifier(SA_DAMAGE, 20, 13);



   Ein Objekt hat den Fluch der unpraezisen Schnelligkeit, welcher SA_DAMAGE
   reduziert, sofern das Lebewesen einen positiven Modifikator auf SA_SPEED
   hat:
   mapping res = ob->QuerySkillAttributeModifier(0, ({SA_SPEED}) );
   if (member(res, SA_SPEED) {
       int val, int dur;
       foreach(object caster, int v, int d: res[SA_SPEED]) {
           // groessten Mod rausfinden, dabei keine closures
           // beruecksichtigen.
           if (intp(v) && v>val) {
               val=v;
               dur=d;
           }
       }
       if (val > 0) {
           // pos. Mod auf SA_SPEED gefunden, entsprechenden neg. Mod auf
           // SA_DAMAGE setzen, der zum gleichen Zeitpunkt ungueltig wird
           // wie der Mod auf SA_SPEED.
           if (ob->ModifySkillAttribute(SA_DAMAGE, -val, dur) == SA_MOD_OK)
              tell_object(ob, "tolle Fluchmeldung.");
       }
   }


SIEHE AUCH
==========

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

14.08.2008, Zesstra
