diff --git a/doc/lfun/DefendFunc b/doc/lfun/DefendFunc
index 7043e04..1683b3f 100644
--- a/doc/lfun/DefendFunc
+++ b/doc/lfun/DefendFunc
@@ -1,78 +1,107 @@
+
+DefendFunc()
+************
+
+
 DefendFunc(L)
+=============
 
-FUNKTION:
-     int DefendFunc(string|string *dtyp, int|mappingspell, object enemy);
 
-DEFINIERT IN:
-     eigenen Objekten; fuer /std/armour/combat.c
+FUNKTION
+========
 
-ARGUMENTE:
-     dtyp
-          Schadenstypen der Angriffsart.
-          Sollte heute ein string* sein.
-     spell
-          0 bei veralteten konventionellen Angriffen im Regelfall jedoch
-          ein Mapping mit weiteren Infos.
-          Bei einem konventionellen Angriff ist spell[SP_PHYSICAL_ATTACK] gleich
-          1.
-     enemy
-          Der angreifende Gegner
+   int DefendFunc(string|string *dtyp, int|mappingspell, object enemy);
 
-BESCHREIBUNG:
-     Anhand der uebergebenen Parameter kann hier ein Ruestungsbonus (oder
-     auch ein Ruestungsmalus) errechnet werden, der zu dem normalen
-     Ruestungswert (abhaengig von der Angriffsart) hinzuaddiert wird.
 
-RUeCKGABEWERT:
-     Der Ruestungsbonus, der zur Ruestungsklasse addiert werden soll.
+DEFINIERT IN
+============
 
-BEMERKUNGEN:
-     Auch wenn man eine DefendFunc() benutzt, darf der Rueckgabewert
-     zusammen mit der P_AC insgesamt nur in sehr seltenen, wohldurch-
-     dachten Ausnahmefaellen die maximal zulaessige P_AC fuer diesen
-     Ruestungstyp ueberschreiten. In solchen Ausnahmefaellen duerfen
-     die DefendFuncs nicht konstant wirken.
+   eigenen Objekten; fuer /std/armour/combat.c
 
-     Bei aktivem Zurueckschlagen IMMER auf Flags wie SP_RECURSIVE und
-     SP_NO_ACTIVE_DEFENSE pruefen und ggf. abbrechen.
 
-BEISPIELE:
-     Eine Ruestung, die bei Angriffen mit Feuer ihre volle Staerke entfaltet
-     und bei Angriffen durch Geister geschwaecht wird:
+ARGUMENTE
+=========
 
-     void create()
-     {
-       ::create();
+   dtyp
+        Schadenstypen der Angriffsart.
+        Sollte heute ein string* sein.
+   spell
+        0 bei veralteten konventionellen Angriffen im Regelfall jedoch
+        ein Mapping mit weiteren Infos.
+        Bei einem konventionellen Angriff ist spell[SP_PHYSICAL_ATTACK] gleich
+        1.
+   enemy
+        Der angreifende Gegner
 
-       SetProp(P_ARMOUR_TYPE, AT_ARMOUR);
-       SetProp(P_AC, 20);
-       ...
-       // Die DefendFunc() ist in der Ruestung selbst definiert
-       SetProp(P_DEFEND_FUNC, this_object());
-     }
 
-     int DefendFunc(string *dtyp, mixed spell, object enemy)
-     {
-       int prot;
+BESCHREIBUNG
+============
 
-       // Zuerst fragen wir den Angriff durch Feuer ab:
-       if (member(dtyp, DT_FIRE) >= 0)  // Feuer gehoert zu den Schadenstypen
-         prot = 5 + random(10); // Das ergibt maximal 14. Zusammen mit P_AC
-                                // kommt man also maximal auf 14+20 = 34,
-                                // liegt also unter der fuer AT_ARMOUR
-                                // geltenden Obergrenze
+   Anhand der uebergebenen Parameter kann hier ein Ruestungsbonus (oder
+   auch ein Ruestungsmalus) errechnet werden, der zu dem normalen
+   Ruestungswert (abhaengig von der Angriffsart) hinzuaddiert wird.
 
-       // Und jetzt der Geistertest
-       if (enemy->QueryProp(P_RACE) == "Geist" ||
-           enemy->is_class_member(CL_GHOST))
-         prot -= random(10);
 
-       // Der Rueckgabewert wird auf den aus P_AC errechneten Wert draufgeschlagen
-       return prot;
-     }
+RUeCKGABEWERT
+=============
 
-SIEHE AUCH:
-     P_DEFEND_FUNC, QueryDefend(), /std/armour/combat.c
+   Der Ruestungsbonus, der zur Ruestungsklasse addiert werden soll.
 
-----------------------------------------------------------------------------
+
+BEMERKUNGEN
+===========
+
+   Auch wenn man eine DefendFunc() benutzt, darf der Rueckgabewert
+   zusammen mit der P_AC insgesamt nur in sehr seltenen, wohldurch-
+   dachten Ausnahmefaellen die maximal zulaessige P_AC fuer diesen
+   Ruestungstyp ueberschreiten. In solchen Ausnahmefaellen duerfen
+   die DefendFuncs nicht konstant wirken.
+
+   Bei aktivem Zurueckschlagen IMMER auf Flags wie SP_RECURSIVE und
+   SP_NO_ACTIVE_DEFENSE pruefen und ggf. abbrechen.
+
+
+BEISPIELE
+=========
+
+   Eine Ruestung, die bei Angriffen mit Feuer ihre volle Staerke entfaltet
+   und bei Angriffen durch Geister geschwaecht wird:
+
+   void create()
+   {
+     ::create();
+
+     SetProp(P_ARMOUR_TYPE, AT_ARMOUR);
+     SetProp(P_AC, 20);
+     ...
+     // Die DefendFunc() ist in der Ruestung selbst definiert
+     SetProp(P_DEFEND_FUNC, this_object());
+   }
+
+   int DefendFunc(string *dtyp, mixed spell, object enemy)
+   {
+     int prot;
+
+     // Zuerst fragen wir den Angriff durch Feuer ab:
+     if (member(dtyp, DT_FIRE) >= 0)  // Feuer gehoert zu den Schadenstypen
+       prot = 5 + random(10); // Das ergibt maximal 14. Zusammen mit P_AC
+                              // kommt man also maximal auf 14+20 = 34,
+                              // liegt also unter der fuer AT_ARMOUR
+                              // geltenden Obergrenze
+
+     // Und jetzt der Geistertest
+     if (enemy->QueryProp(P_RACE) == "Geist" ||
+         enemy->is_class_member(CL_GHOST))
+       prot -= random(10);
+
+     // Der Rueckgabewert wird auf den aus P_AC errechneten Wert draufgeschlagen
+     return prot;
+   }
+
+
+SIEHE AUCH
+==========
+
+   P_DEFEND_FUNC, QueryDefend(), /std/armour/combat.c
+
 Last modified: 18.Jul 2006 Muadib
