QuerySkillAttribute()
=====================

FUNKTION
--------
::

    public int QuerySkillAttribute(string atrname)

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

    /std/living/skill_attributes.c

    

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

    string atrname            Name des abzufragenden Attributs

    

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

    Mit dieser Funktion kann man den Wert bestimmter Attribute
    abfragen, dabei werden das abgefragte Attribut, Todesfolgen,
    SA_QUALITY und Werte in P_SKILL_ATTRIBUTE_OFFSETS
    beruecksichtigt.

    

    Momentane Skills siehe ModifySkillAttribute.

RUECKGABEWERT
-------------
::

    Der Wert des Attributs. Ist nichts bestimmtes gesetzt, wird
    der Standardwert 100 zurueckgegeben.
    Der Rueckgabewert liegt zwischen 10 bis 1000 (Prozent).

    

BEMERKUNG
---------
::

    Die Funktion ist zwar als 'varargs' definiert, gibt man allerdings
    keinen Attributnamen an, wird immer 100 zurueckgegeben.

    

BEISPIEL
--------
::

    // ein Spieler kann ein Stueck Kaese stibitzen, wenn er schnell
    // genug ist ... (15% ueber normal)
    if(this_player()->QuerySkillAttribute(SA_SPEED)>=115) {
      tell_object(this_player(),
        "Du schnappst das Stueck Kaese aus der Falle.\n");
      obj kaese = clone_object(...);
      [...]
    } else {
      mapping amap=map_indices(VALID_ARMOUR_CLASS,#'!);
      amap[AT_GLOVE]=100;
      tell_object(this_player(),
        "Du bist zu langsam und die Falle schnappt hungrig zu.\n");
      this_player()->Defend(random(100),
                           ({DT_PIERCE, DT_SQUEEZE}),
                           ([SP_PHYSICAL_ATTACK: 1,
                             SP_REDUCE_ARMOUR: amap,
                             SP_SHOW_DAMAGE: 0]));
    }

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

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

5. Okt 2011 Gloinson

