diff --git a/doc/lfun/WieldFunc b/doc/lfun/WieldFunc
index 23e299f..7c607e4 100644
--- a/doc/lfun/WieldFunc
+++ b/doc/lfun/WieldFunc
@@ -1,77 +1,102 @@
+
 WieldFunc()
+***********
 
-FUNKTION:
-     int WieldFunc(object weapon, int silent, object user);
 
-DEFINIERT IN:
-     eigenen Objekten (fuer /std/weapon/combat)
+FUNKTION
+========
 
-ARGUMENTE:
-     weapon (object)
-          Die Waffe, die gezueckt werden soll.
-     silent (int)
-          Ob dabei eine Meldung ausgegeben werden soll.
-     user (object)
-          Das Lebewesen, welches die Waffe zuecken will.
+   int WieldFunc(object weapon, int silent, object user);
 
-BESCHREIBUNG:
-     In dieser Funktion kann man zusaetzliche Abfragen vornehmen, ob sich
-     die Waffe <weapon> von <user> zuecken laesst oder nicht.
 
-RUeCKGABEWERT:
-     0, wenn die Waffe nicht gezueckt werden kann, sonst ungleich 0.
+DEFINIERT IN
+============
 
-BEMERKUNGEN:
-     Selbst wenn man einen Wert ungleich Null zurueckgibt, ist das noch
-     keine Garantie, dass sich die Waffe auch wirklich zuecken laesst! Der
-     Spieler koennte zum Beispiel noch eine Waffe gezueckt haben, die sich
-     nicht wegstecken laesst, etc.
-     Wenn ihr sicher sein wollt, dass der Spieler ein Objekt gezueckt hat,
-     benutzt bitte InformWield().
-     Bitte nicht drauf verlassen, dass this_player() das Lebewesen ist,
-     welches die Waffe zuecke will.
-     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/weapon/combat)
 
-BEISPIELE:
-     Eine Waffe, die sich nicht von Zwergen zuecken laesst:
 
-     inherit "std/weapon";
+ARGUMENTE
+=========
 
-     #include <properties.h>
-     #include <combat.h>
+   weapon (object)
+        Die Waffe, die gezueckt werden soll.
+   silent (int)
+        Ob dabei eine Meldung ausgegeben werden soll.
+   user (object)
+        Das Lebewesen, welches die Waffe zuecken will.
 
-     create()
-     {
-       ::create();
 
-       ... /* zig SetProp's, um die Waffe zu konfigurieren */
+BESCHREIBUNG
+============
 
-       /* WieldFunc() ist in der Waffe selbst zu finden */
-       SetProp(P_WIELD_FUNC, this_object());
-     }
+   In dieser Funktion kann man zusaetzliche Abfragen vornehmen, ob sich
+   die Waffe <weapon> von <user> zuecken laesst oder nicht.
 
-     int WieldFunc(object weapon, int silent, object user)
-     {
-       /* Nicht-Zwerge duerfen die Waffe zuecken */
-       if (user->QueryProp(P_RACE) != "Zwerg")
-         return 1;
 
-       /* Ansonsten sagen wir evtl., warum das Zuecken nicht klappt... */
-       if (!silent)
-         write( "Deine kleinen Haendchen koennen den Griff nicht "+
-                "umklammern.\n");
+RUeCKGABEWERT
+=============
 
-       /* ...und brechen das Zuecken ab. */
-       return 0;
-     }
+   0, wenn die Waffe nicht gezueckt werden kann, sonst ungleich 0.
 
-SIEHE AUCH:
-     P_WIELD_MSG, P_UNWIELD_MSG, P_WEAR_MSG, P_UNWEAR_MSG
-     DoWield(), DoUnwield(), InformUnwield(), InformWield() 
-     UnwieldFunc, WieldFunc 
-     /std/weapon/combat.c
 
----------------------------------------------------------------------------
+BEMERKUNGEN
+===========
+
+   Selbst wenn man einen Wert ungleich Null zurueckgibt, ist das noch
+   keine Garantie, dass sich die Waffe auch wirklich zuecken laesst! Der
+   Spieler koennte zum Beispiel noch eine Waffe gezueckt haben, die sich
+   nicht wegstecken laesst, etc.
+   Wenn ihr sicher sein wollt, dass der Spieler ein Objekt gezueckt hat,
+   benutzt bitte InformWield().
+   Bitte nicht drauf verlassen, dass this_player() das Lebewesen ist,
+   welches die Waffe zuecke will.
+   Die Reihenfolge der Argumente ist etwas unschoen, aber leider wurde <user>
+   erheblich spaeter hinzugefuegt und es war unmoeglich, einige hundert
+   Objekte zu aendern.
+
+
+BEISPIELE
+=========
+
+   Eine Waffe, die sich nicht von Zwergen zuecken laesst:
+
+   inherit "std/weapon";
+
+   #include <properties.h>
+   #include <combat.h>
+
+   create()
+   {
+     ::create();
+
+     ... /* zig SetProp's, um die Waffe zu konfigurieren */
+
+     /* WieldFunc() ist in der Waffe selbst zu finden */
+     SetProp(P_WIELD_FUNC, this_object());
+   }
+
+   int WieldFunc(object weapon, int silent, object user)
+   {
+     /* Nicht-Zwerge duerfen die Waffe zuecken */
+     if (user->QueryProp(P_RACE) != "Zwerg")
+       return 1;
+
+     /* Ansonsten sagen wir evtl., warum das Zuecken nicht klappt... */
+     if (!silent)
+       write( "Deine kleinen Haendchen koennen den Griff nicht "+
+              "umklammern.\n");
+
+     /* ...und brechen das Zuecken ab. */
+     return 0;
+   }
+
+
+SIEHE AUCH
+==========
+
+   P_WIELD_MSG, P_UNWIELD_MSG, P_WEAR_MSG, P_UNWEAR_MSG
+   DoWield(), DoUnwield(), InformUnwield(), InformWield()
+   UnwieldFunc, WieldFunc
+   /std/weapon/combat.c
+
 02.02.2009, Zesstra
