diff --git a/doc/lfun/SpellAttack b/doc/lfun/SpellAttack
index 0e24fd9..ba00347 100644
--- a/doc/lfun/SpellAttack
+++ b/doc/lfun/SpellAttack
@@ -1,71 +1,97 @@
+
 SpellAttack()
+*************
 
-FUNKTION:
-        void SpellAttack(object enemy)
 
-ARGUMENTE:
-        enemy: Der Feind.
+FUNKTION
+========
 
-BESCHREIBUNG:
-        Diese Funktion wird in jedem Heartbeat eines NPCs ausgefuehrt,
-        falls nicht P_DISABLE_ATTACK gesetzt ist (Paralyse).
-        Standardmaessig tut diese Funktion nichts, aber man kann sie
-        ueberschreiben, damit in jedem Heartbeat Angriffe mit Spells
-        ausgefuehrt werden.
+   void SpellAttack(object enemy)
 
-        Man sollte hierbei ein random() einbauen, damit der NPC nicht
-        in jedem Heartbeat auch wirklich einen Angriff ausfuehrt.
-        Ausserdem sollte man auch fuer eventuelle Ausgaben sorgen.
 
-RUECKGABEWERT:
-        Keiner.
+ARGUMENTE
+=========
 
-BEMERKUNG:
-        Die AttackChats, die mittels SetAttackChats gesetzt werden
-        koennen, macht im Grunde nichts anderes, aber Chats sind halt
-        keine Angriffe. :-)
+   enemy: Der Feind.
 
-BEISPIELE:
-        Im Grunde ist dieses simple Beispiel eine Nachbildung von
-        Attack-Chats und soll dementsprechend nur der Anschauung dienen.
 
-        void SpellAttack(object enemy) 
-        {
-          // mit 80% Wahrscheinlichkeit wird nichts gemacht.
-          switch(random(5))
-          {
-            case 0: 
-              write("Der Ork tritt Dir in den Hintern.\n");
-              return;
-            case 1: 
-              write("Der Ork bruellt: Lebend kommst Du hier nicht raus!\n");
-              return;
-            case 2:
-              write("Der Ork blutet schon aus mehreren Wunden.\n");
-              return;
-            case 3:
-              write(knirsch(enemy));
-              return;
-            default:
-              return;
-          }
-        }
+BESCHREIBUNG
+============
 
-        string knirsch(object enemy)
-        {
-           if (objectp(enemy))
-             helm = enemy->QueryArmourByType(AT_HELMET);
-           if (objectp(helm))
-           {
-             helm->Damage(1);
-             return "Der Ork beschaedigt Deinen Helm!\n";
-           }
-           else
-             return ""; // keine Meldung
-        }
+   Diese Funktion wird in jedem Heartbeat eines NPCs ausgefuehrt,
+   falls nicht P_DISABLE_ATTACK gesetzt ist (Paralyse).
+   Standardmaessig tut diese Funktion nichts, aber man kann sie
+   ueberschreiben, damit in jedem Heartbeat Angriffe mit Spells
+   ausgefuehrt werden.
 
-SIEHE AUCH:
-        "Attack", "SetAttackChats", /std/npc/combat.c
+   Man sollte hierbei ein random() einbauen, damit der NPC nicht
+   in jedem Heartbeat auch wirklich einen Angriff ausfuehrt.
+   Ausserdem sollte man auch fuer eventuelle Ausgaben sorgen.
 
-LETZTE AENDERUNG:
- Don, 27.02.2003, 12:50:00 von Hirudo
+
+RUECKGABEWERT
+=============
+
+   Keiner.
+
+
+BEMERKUNG
+=========
+
+   Die AttackChats, die mittels SetAttackChats gesetzt werden
+   koennen, macht im Grunde nichts anderes, aber Chats sind halt
+   keine Angriffe. :-)
+
+
+BEISPIELE
+=========
+
+   Im Grunde ist dieses simple Beispiel eine Nachbildung von
+   Attack-Chats und soll dementsprechend nur der Anschauung dienen.
+
+   void SpellAttack(object enemy)
+   {
+     // mit 80% Wahrscheinlichkeit wird nichts gemacht.
+     switch(random(5))
+     {
+       case 0:
+         write("Der Ork tritt Dir in den Hintern.\n");
+         return;
+       case 1:
+         write("Der Ork bruellt: Lebend kommst Du hier nicht raus!\n");
+         return;
+       case 2:
+         write("Der Ork blutet schon aus mehreren Wunden.\n");
+         return;
+       case 3:
+         write(knirsch(enemy));
+         return;
+       default:
+         return;
+     }
+   }
+
+   string knirsch(object enemy)
+   {
+      if (objectp(enemy))
+        helm = enemy->QueryArmourByType(AT_HELMET);
+      if (objectp(helm))
+      {
+        helm->Damage(1);
+        return "Der Ork beschaedigt Deinen Helm!\n";
+      }
+      else
+        return ""; // keine Meldung
+   }
+
+
+SIEHE AUCH
+==========
+
+   "Attack", "SetAttackChats", /std/npc/combat.c
+
+
+LETZTE AENDERUNG
+================
+
+   Don, 27.02.2003, 12:50:00 von Hirudo
