diff --git a/doc/lfun/WearFunc b/doc/lfun/WearFunc
index 626fd64..d1d0121 100644
--- a/doc/lfun/WearFunc
+++ b/doc/lfun/WearFunc
@@ -1,80 +1,105 @@
+
 WearFunc()
+**********
 
-FUNKTION:
-     int WearFunc(object ruest, int silent, object user);
 
-DEFINIERT IN:
-     eigenen Objekten (fuer /std/clothing/wear)
+FUNKTION
+========
 
-ARGUMENTE:
-     ruest (object)
-          Die Ruestung/Kleidung, die angezogen werden soll.
-     silent (int)
-          Ob dabei eine Meldung ausgegeben wird.
-     user (object)
-          Das Lebewesen, welches die Ruestung/Kleidung anziehen will.
+   int WearFunc(object ruest, int silent, object user);
 
-BESCHREIBUNG:
-     Mit dieser Funktion kann man pruefen, ob sich das Kleidungsstueck bzw.
-     Ruestung <ruest> von this_player() anziehen laesst oder nicht.
-     Kann die Ruestung angezogen werden, so muss ein Wert ungleich 0
-     zurueckgegeben werden.
 
-RUeCKGABEWERT:
-     0, wenn sich die Ruestung nicht anziehen laesst, ansonsten ungleich 0.
+DEFINIERT IN
+============
 
-BEMERKUNGEN:
-     Bitte nicht darauf verlassen, dass der Spieler das Objekt auch wirklich
-     anzieht, wenn man hier 1 zurueckgibt.
-     Speziell bei Schilden kann das Anziehen trotz eines Rueckgabewertes 
-     != 0 immer noch schief gehen, wenn der Spieler keine Hand mehr frei hat.
-     Wenn ihr sicher sein wollt, dass der Spieler ein Objekt angezogen hat,
-     benutzt bitte InformWear().
-     Bitte nicht drauf verlassen, dass this_player() das ausziehende Lebewesen
-     ist.
-     Die Reihenfolge der Argumente ist etwas unschoen, aber leider wurde <user>
-     erheblich spaeter hinzugefuegt und es war unmoeglich, einige hundert
-     Objekte zu aendern.
+   eigenen Objekten (fuer /std/clothing/wear)
 
-BEISPIELE:
-     Ein Helm, der nur von Elfen getragen werden kann:
 
-     inherit "std/armour.c";
+ARGUMENTE
+=========
 
-     #include <properties.h>
+   ruest (object)
+        Die Ruestung/Kleidung, die angezogen werden soll.
+   silent (int)
+        Ob dabei eine Meldung ausgegeben wird.
+   user (object)
+        Das Lebewesen, welches die Ruestung/Kleidung anziehen will.
 
-     create()
-     {
-       ::create();
 
-       SetProp(P_ARMOUR_TYPE, AT_HELMET);
-       /* zig weitere SetProp's, um den Helm zu konfigurieren */
+BESCHREIBUNG
+============
 
-       /* WearFunc() ist im Helm selbst zu finden */
-       SetProp(P_WEAR_FUNC, this_object());
-     }
+   Mit dieser Funktion kann man pruefen, ob sich das Kleidungsstueck bzw.
+   Ruestung <ruest> von this_player() anziehen laesst oder nicht.
+   Kann die Ruestung angezogen werden, so muss ein Wert ungleich 0
+   zurueckgegeben werden.
 
-     int WearFunc(object me, int silent, object user)
-     {
-       if (user->QueryProp(P_RACE) == "Elf")
-         return 1;   /* Elfen duerfen den Helm tragen */
 
-       /* Die anderen Rassen sollten zumindest erfahren koennen, wieso
-          sie den Helm nicht tragen koennen... */
-       if (!silent)
-           write( "Der Helm rutscht Dir immer ueber Deine runden "
-                 +"Ohren.\n" );
-       return 0;
-     }
+RUeCKGABEWERT
+=============
 
-     Gibt jetzt ein Nicht-Elf "trage helm" ein, so bekommt er die Meldung
-     "Der Helm rutscht Dir immer ueber Deine runden Ohren.", Elfen dagegen
-     passt das Teil wie angegossen.
+   0, wenn sich die Ruestung nicht anziehen laesst, ansonsten ungleich 0.
 
-SIEHE AUCH:
-     P_WEAR_MSG, P_UNWEAR_MSG, P_WIELD_MSG, P_UNWIELD_MSG
-     DoWear(), DoUnwear(), InformUnwear(), InformWear()
-     /std/clothing/wear.c
 
-----------------------------------------------------------------------------
+BEMERKUNGEN
+===========
+
+   Bitte nicht darauf verlassen, dass der Spieler das Objekt auch wirklich
+   anzieht, wenn man hier 1 zurueckgibt.
+   Speziell bei Schilden kann das Anziehen trotz eines Rueckgabewertes
+   != 0 immer noch schief gehen, wenn der Spieler keine Hand mehr frei hat.
+   Wenn ihr sicher sein wollt, dass der Spieler ein Objekt angezogen hat,
+   benutzt bitte InformWear().
+   Bitte nicht drauf verlassen, dass this_player() das ausziehende Lebewesen
+   ist.
+   Die Reihenfolge der Argumente ist etwas unschoen, aber leider wurde <user>
+   erheblich spaeter hinzugefuegt und es war unmoeglich, einige hundert
+   Objekte zu aendern.
+
+
+BEISPIELE
+=========
+
+   Ein Helm, der nur von Elfen getragen werden kann:
+
+   inherit "std/armour.c";
+
+   #include <properties.h>
+
+   create()
+   {
+     ::create();
+
+     SetProp(P_ARMOUR_TYPE, AT_HELMET);
+     /* zig weitere SetProp's, um den Helm zu konfigurieren */
+
+     /* WearFunc() ist im Helm selbst zu finden */
+     SetProp(P_WEAR_FUNC, this_object());
+   }
+
+   int WearFunc(object me, int silent, object user)
+   {
+     if (user->QueryProp(P_RACE) == "Elf")
+       return 1;   /* Elfen duerfen den Helm tragen */
+
+     /* Die anderen Rassen sollten zumindest erfahren koennen, wieso
+        sie den Helm nicht tragen koennen... */
+     if (!silent)
+         write( "Der Helm rutscht Dir immer ueber Deine runden "
+               +"Ohren.\n" );
+     return 0;
+   }
+
+   Gibt jetzt ein Nicht-Elf "trage helm" ein, so bekommt er die Meldung
+   "Der Helm rutscht Dir immer ueber Deine runden Ohren.", Elfen dagegen
+   passt das Teil wie angegossen.
+
+
+SIEHE AUCH
+==========
+
+   P_WEAR_MSG, P_UNWEAR_MSG, P_WIELD_MSG, P_UNWIELD_MSG
+   DoWear(), DoUnwear(), InformUnwear(), InformWear()
+   /std/clothing/wear.c
+
 02.02.2009, Zesstra
