diff --git a/doc/lfun/PresentEnemies b/doc/lfun/PresentEnemies
index 9c31efe..12ac650 100644
--- a/doc/lfun/PresentEnemies
+++ b/doc/lfun/PresentEnemies
@@ -1,71 +1,95 @@
-FUNKTION:
-	object *PresentEnemies();
 
-DEFINIERT IN:
-	/std/living/combat.c
+PresentEnemies()
+****************
 
-ARGUMENTE:
-	keine
 
-RUeCKGABEWERT:
-	anwesende Feinde
+FUNKTION
+========
 
-BESCHREIBUNG:
-	Diese Funktion liefert genau die Feinde zurueck, die sich derzeit im
-	selben Raum befinden. Die Feinde unterliegen hierbei noch gewissen
-	Einschraenkungen:
-	  (1) Sie duerfen als NPC nicht gestorben sein, das heisst, sie
-	      muessen als Objekt noch existieren.
-	  (2) Sie duerfen als Spieler nicht gestorben sein, das heisst, sie
-	      duerfen keine Geister sein (Property P_GHOST nicht gesetzt).
-	  (3) Sie muessen angreifbar sein, das heisst, die Property
-	      P_NO_ATTACK darf nicht gesetzt sein.
-	Wird eine dieser Bedingungen verletzt, so wird der Gegner aus der
-	internen Gegnerliste entfernt. Zusaetzlich gilt:
-	  Netztote werden nur als Gegner erkannt, wenn keine anderen Gegner
-	  zur Verfuegung stehen.
+   object *PresentEnemies();
 
-BEISPIEL:
-	Im Folgenden erblinden alle Gegner im Raum:
-	  string blindThemAll()
-	  { ob*livList;
-	    if(!livList=PresentEnemies())
-	      return break_string(
-	 "Mist...keiner da, der blind werden moechte.",77,
-	 Name(WER)+" grummelt: ");
-	    for(i=sizeof(livList);i--;)
-	    { if(livList[i]->QueryProp(P_BLIND))
-	      { tell_object(this_object(),break_string(
-	 livList[i]->Name(WER)+" ist schon blind.",77));
-	        continue;
-	      }
-	      tell_object(this_object(),break_string(
-	 "Du kratzt "+livList[i]->name(WEM)+" die Augen aus.",77));
-	      tell_object(livList[i],break_string(
-	 Name(WER)+" kratzt Dir die Augen aus!",77));
-	      tell_room(environment(this_object()),break_string(
-	 Name(WER)+" kratzt "+livList[i]->name(WEM)
-	+" die Augen aus.",77),({this_object(),livList[i]}));
-	      livList[i]->SetProp(P_BLIND,1);
-	    }
-	    return"";
-	  }
-	Aufgerufen wird das ganze am Besten in einem Chat:
-	  void create()
-	  { ::create();
-	    ...
-	    SetProp(P_CHAT_CHANCE,10);
-	    SetChats(20,({break_string(
-	 "Nicht angreifen, sonst wirst Du noch blind!",77,
-	 Name(WER)+" bruellt: "),
-	                  "@@blindThemAll@@"}));
-	  }
-	Natuerlich sind auch noch mehr Funktionen und Meldungen als Chats
-	moeglich: Die zwei im Beispiel sind im Normalfall etwas wenig.
 
-SIEHE AUCH:
-	SelectEnemy(), QueryEnemies(), IsEnemy(), P_GHOST, P_NO_ATTACK,
-	SetChats, P_CHAT_CHANCE
+DEFINIERT IN
+============
 
-----------------------------------------------------------------------------
+   /std/living/combat.c
+
+
+ARGUMENTE
+=========
+
+   keine
+
+
+RUeCKGABEWERT
+=============
+
+   anwesende Feinde
+
+
+BESCHREIBUNG
+============
+
+   Diese Funktion liefert genau die Feinde zurueck, die sich derzeit im
+   selben Raum befinden. Die Feinde unterliegen hierbei noch gewissen
+   Einschraenkungen:
+     (1) Sie duerfen als NPC nicht gestorben sein, das heisst, sie
+         muessen als Objekt noch existieren.
+     (2) Sie duerfen als Spieler nicht gestorben sein, das heisst, sie
+         duerfen keine Geister sein (Property P_GHOST nicht gesetzt).
+     (3) Sie muessen angreifbar sein, das heisst, die Property
+         P_NO_ATTACK darf nicht gesetzt sein.
+   Wird eine dieser Bedingungen verletzt, so wird der Gegner aus der
+   internen Gegnerliste entfernt. Zusaetzlich gilt:
+     Netztote werden nur als Gegner erkannt, wenn keine anderen Gegner
+     zur Verfuegung stehen.
+
+
+BEISPIEL
+========
+
+   Im Folgenden erblinden alle Gegner im Raum:
+     string blindThemAll()
+     { ob*livList;
+       if(!livList=PresentEnemies())
+         return break_string(
+    "Mist...keiner da, der blind werden moechte.",77,
+    Name(WER)+" grummelt: ");
+       for(i=sizeof(livList);i--;)
+       { if(livList[i]->QueryProp(P_BLIND))
+         { tell_object(this_object(),break_string(
+    livList[i]->Name(WER)+" ist schon blind.",77));
+           continue;
+         }
+         tell_object(this_object(),break_string(
+    "Du kratzt "+livList[i]->name(WEM)+" die Augen aus.",77));
+         tell_object(livList[i],break_string(
+    Name(WER)+" kratzt Dir die Augen aus!",77));
+         tell_room(environment(this_object()),break_string(
+    Name(WER)+" kratzt "+livList[i]->name(WEM)
+   +" die Augen aus.",77),({this_object(),livList[i]}));
+         livList[i]->SetProp(P_BLIND,1);
+       }
+       return"";
+     }
+   Aufgerufen wird das ganze am Besten in einem Chat:
+     void create()
+     { ::create();
+       ...
+       SetProp(P_CHAT_CHANCE,10);
+       SetChats(20,({break_string(
+    "Nicht angreifen, sonst wirst Du noch blind!",77,
+    Name(WER)+" bruellt: "),
+                     "@@blindThemAll@@"}));
+     }
+   Natuerlich sind auch noch mehr Funktionen und Meldungen als Chats
+   moeglich: Die zwei im Beispiel sind im Normalfall etwas wenig.
+
+
+SIEHE AUCH
+==========
+
+   SelectEnemy(), QueryEnemies(), IsEnemy(), P_GHOST, P_NO_ATTACK,
+   SetChats, P_CHAT_CHANCE
+
 Last modified: Thu May 27 15:01:48 1999 by Patryn
