diff --git a/doc/lfun/QuerySkillAttributeModifier b/doc/lfun/QuerySkillAttributeModifier
index 507c51b..055815e 100644
--- a/doc/lfun/QuerySkillAttributeModifier
+++ b/doc/lfun/QuerySkillAttributeModifier
@@ -1,90 +1,118 @@
+
 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
+FUNKTION
+========
 
-    <atrnames>  string*
-                Array von Skill-Attributen, welche durchsucht werden sollen.
+   public varargs mapping QuerySkillAttributeModifier(object caster,
+                                                   string *atrnames)
 
-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.).
+DEFINIERT IN
+============
 
-BEMERKUNGEN:
+   /std/living/skill_attributes.c
 
-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
+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
