diff --git a/doc/lfun/trigger_sensitive_attack b/doc/lfun/trigger_sensitive_attack
index 129b38c..f290fc8 100644
--- a/doc/lfun/trigger_sensitive_attack
+++ b/doc/lfun/trigger_sensitive_attack
@@ -1,75 +1,97 @@
+
 trigger_sensitive_attack()
+**************************
 
-FUNKTION:
-     varargs void trigger_sensitive_attack(object enemy, string key, int
-     dam, mixed spell, mixed *options);
 
-DEFINIERT IN:
-     eigenen sensitiven Objekten, wird aufgerufen von
-     /std/living/inventory.c
+FUNKTION
+========
 
-ARGUMENTE:
-     enemy
-          Der Gegner, der die Aktion ausgeloest hat.
-     key
-          Der ausloesende Schadenstyp.
-     dam
-          Der angerichtete Schaden.
-     spell
-          Wie bei Defend().
-     options
-          Array mit den in P_SENSITIVE angegebenen Optionen fuer diese
-          Aktion.
+   varargs void trigger_sensitive_attack(object enemy, string key, int
+   dam, mixed spell, mixed *options);
 
-BESCHREIBUNG:
-     Wenn der bei einem Angriff zugefuegte Schaden den in P_SENSITIVE
-     angegebenen Grenzwert uebersteigt sowie der als Schluessel angegebene
-     Schadenstyp in den Schaedenstypen des Angriffes vorkommt, wird diese
-     Funktion aufgerufen und kann entsprechend reagieren.
 
-RUeCKGABEWERT:
-     keiner
+DEFINIERT IN
+============
 
-BEISPIELE:
-     Eine Fackel, die sich bei Feuerattacken selbst entzuendet und bei
-     Wasserattacken verloescht, koennte man wie folgt implementieren:
+   eigenen sensitiven Objekten, wird aufgerufen von
+   /std/living/inventory.c
 
-     inherit "/std/lightsource.c"
 
-     #include <properties.h>
-     #include <sensitive.h>
-     #include <combat.h>
+ARGUMENTE
+=========
 
-     create()
-     {
-       ::create();
+   enemy
+        Der Gegner, der die Aktion ausgeloest hat.
+   key
+        Der ausloesende Schadenstyp.
+   dam
+        Der angerichtete Schaden.
+   spell
+        Wie bei Defend().
+   options
+        Array mit den in P_SENSITIVE angegebenen Optionen fuer diese
+        Aktion.
 
-       SetProp(...); // die ueblichen Eigenschaften definieren
 
-       SetProp(P_SENSITIVE,
-           //  Ereignis          Key       Grenze (keine Optionen)
-         ({ ({ SENSITIVE_ATTACK, DT_FIRE,  100 }),
-            ({ SENSITIVE_ATTACK, DT_WATER, 100 }) }) );
+BESCHREIBUNG
+============
+
+   Wenn der bei einem Angriff zugefuegte Schaden den in P_SENSITIVE
+   angegebenen Grenzwert uebersteigt sowie der als Schluessel angegebene
+   Schadenstyp in den Schaedenstypen des Angriffes vorkommt, wird diese
+   Funktion aufgerufen und kann entsprechend reagieren.
+
+
+RUeCKGABEWERT
+=============
+
+   keiner
+
+
+BEISPIELE
+=========
+
+   Eine Fackel, die sich bei Feuerattacken selbst entzuendet und bei
+   Wasserattacken verloescht, koennte man wie folgt implementieren:
+
+   inherit "/std/lightsource.c"
+
+   #include <properties.h>
+   #include <sensitive.h>
+   #include <combat.h>
+
+   create()
+   {
+     ::create();
+
+     SetProp(...); // die ueblichen Eigenschaften definieren
+
+     SetProp(P_SENSITIVE,
+         //  Ereignis          Key       Grenze (keine Optionen)
+       ({ ({ SENSITIVE_ATTACK, DT_FIRE,  100 }),
+          ({ SENSITIVE_ATTACK, DT_WATER, 100 }) }) );
+   }
+
+   varargs void
+   trigger_sensitive_attack(object enemy, string key,
+                            int dam, mixed spell)
+   {
+     // Es soll nicht verschwiegen werden, dass das Entzuenden und
+     // Loeschen einer Lichtquelle so leider nicht funktioniert...
+     if (key == DT_FIRE && !QueryProp(P_LIGHTED)) {
+       SetProp(P_LIGHTED, 1);
+       tell_object(environment(), "Die Fackel faengt Feuer.\n");
      }
-
-     varargs void
-     trigger_sensitive_attack(object enemy, string key,
-                              int dam, mixed spell)
-     {
-       // Es soll nicht verschwiegen werden, dass das Entzuenden und
-       // Loeschen einer Lichtquelle so leider nicht funktioniert...
-       if (key == DT_FIRE && !QueryProp(P_LIGHTED)) {
-         SetProp(P_LIGHTED, 1);
-         tell_object(environment(), "Die Fackel faengt Feuer.\n");
-       }
-       else if (key == DT_WATER && QueryProp(P_LIGHTED)) {
-         SetProp(P_LIGHTED, 0);
-         tell_object(environment(), "Die Fackel verlischt.\n");
-       }
+     else if (key == DT_WATER && QueryProp(P_LIGHTED)) {
+       SetProp(P_LIGHTED, 0);
+       tell_object(environment(), "Die Fackel verlischt.\n");
      }
+   }
 
-SIEHE AUCH:
-     trigger_sensitive_inv(), sensitive Objekte
 
-----------------------------------------------------------------------------
+SIEHE AUCH
+==========
+
+   trigger_sensitive_inv(), sensitive Objekte
+
 Last modified: Sun May 19 15:56:25 1996 by Wargon
