diff --git a/doc/lfun/NotifyPlayerDeath b/doc/lfun/NotifyPlayerDeath
index 9166150..96678ea 100644
--- a/doc/lfun/NotifyPlayerDeath
+++ b/doc/lfun/NotifyPlayerDeath
@@ -1,74 +1,99 @@
+
 NotifyPlayerDeath()
+*******************
 
-FUNKTION:
-  void NotifyPlayerDeath(object victim,object killer,int lost_exp);
 
-DEFINIERT IN:
-  /std/player/life.c
+FUNKTION
+========
 
-ARGUMENTE:
-  victim
-    Getoeteter Spieler.
-  killer
-    Objekt, welches den Spieler getoetet hat.
-  lost_exp
-    Erfahrungspunkte, die der Spieler durch den Tod verloren hat.
+   void NotifyPlayerDeath(object victim,object killer,int lost_exp);
 
-BESCHREIBUNG:
-  Diese Funktion wird aus dem Spielerobjekt heraus immer dann
-  aufgerufen, wenn der Spieler stirbt und zwar:
-    1) im Gegner, der den Spieler getoetet hat,
-    2) im Environment des getoeteten Spielers,
-    3) in der Gilde des Spielers,
-    4) in allen Objekten in diesem Environment und
-    5) in allen Objekten (auch innerhalb Containern) im Spieler.
-  Der Gegner wird hierbei nur einmal informiert, also bei letzteren
-  Faellen herausgefiltert, falls noetig!
-  Hauptaufgabe dieser Funktion ist es somit, auf Tode von Spielern zu
-  reagieren oder selbige einfach nur mitzuloggen.
 
-  Zu dem Zeitpunkt des Aufrufs dieser Funktion ist der Spieler noch _nicht_
-  Geist und noch _nicht_ im Todesraum - dies wird im Anschluss an den Aufruf
-  der NotifyPlayerDeath() durchgefuehrt.
-  
-  Aufgerufen wird die Funktion aus '/std/player/life.c' mittels catch() und
-  werden mit limited() auf max. 150k (Gegner, Environment, Gilde) bzw. 80k 
-  (alle anderen Objekte) Ticks beschraenkt.
-  Fehler in dieser Funktion haben somit keine negativen Auswirkungen
-  auf das Sterben des Spielers.
+DEFINIERT IN
+============
 
-RUeCKGABEWERT:
-  keiner
+   /std/player/life.c
 
-BEISPIELE:
-  Folgendes Beispiel demonstriert beispielsweise, wie man Tode von
-  Spielern mitloggen kann (das Beispiel ist hierbei auf den am
-  haeufigsten auftretenden Fall bezogen, dass nur das toetende Objekt
-  den Tod protokollieren soll):
 
-    void NotifyPlayerDeath(object dead, object killer, int lost_exp) 
-    { 
-      if ( intp(lost_exp) && objectp(dead) && objectp(killer) && 
-           killer==this_object() )
-        write_file( "/log/patryn/dead", sprintf(
-          "%s - %s von %s getoetet. XP: -%d", ctime(), getuid(dead),
-           killer->name(WEM), lost_exp) );
-    }
+ARGUMENTE
+=========
 
-  Bitte beachten: write_file() schreibt ohne Groessenbegrenzung in das
-  Logfile. Da dies auf Dauer bzw. in Gebieten mit hoher Log-Aktivitaet
-  zu Logfiles von enormer Groesse fuehren kann, ist die Verwendung
-  von write_file() nicht empfehlenswert. Ausnahmen koennen natuerlich
-  mit dem zustaendigen Regionsmagier abgesprochen werden, z.B. fuer
-  begrenzte Anwendung etwa bei sehr starken, selten besiegten Gegnern.
+   victim
+     Getoeteter Spieler.
+   killer
+     Objekt, welches den Spieler getoetet hat.
+   lost_exp
+     Erfahrungspunkte, die der Spieler durch den Tod verloren hat.
 
-  Weiterhin ist es empfehlenswert, das toetende Objekt (killer) nicht
-  im NotifyPlayerDeath() zu zestoeren, sondern etwas zeitversetzt,
-  damit nicht etwa im nachfolgenden NotifyPlayerDeath() eines anderen
-  Objektes (s.o. Reihenfolge) killer==0 ist.
 
-SIEHE AUCH:
-  Defend(), do_damage(), NotifyHpChange(), catch(), write_file(), log_file()
-  P_LAST_DEATH_PROPS
-----------------------------------------------------------------------------
+BESCHREIBUNG
+============
+
+   Diese Funktion wird aus dem Spielerobjekt heraus immer dann
+   aufgerufen, wenn der Spieler stirbt und zwar:
+     1) im Gegner, der den Spieler getoetet hat,
+     2) im Environment des getoeteten Spielers,
+     3) in der Gilde des Spielers,
+     4) in allen Objekten in diesem Environment und
+     5) in allen Objekten (auch innerhalb Containern) im Spieler.
+   Der Gegner wird hierbei nur einmal informiert, also bei letzteren
+   Faellen herausgefiltert, falls noetig!
+   Hauptaufgabe dieser Funktion ist es somit, auf Tode von Spielern zu
+   reagieren oder selbige einfach nur mitzuloggen.
+
+   Zu dem Zeitpunkt des Aufrufs dieser Funktion ist der Spieler noch _nicht_
+   Geist und noch _nicht_ im Todesraum - dies wird im Anschluss an den Aufruf
+   der NotifyPlayerDeath() durchgefuehrt.
+
+
+
+   Aufgerufen wird die Funktion aus '/std/player/life.c' mittels catch() und
+   werden mit limited() auf max. 150k (Gegner, Environment, Gilde) bzw. 80k
+   (alle anderen Objekte) Ticks beschraenkt.
+   Fehler in dieser Funktion haben somit keine negativen Auswirkungen
+   auf das Sterben des Spielers.
+
+
+RUeCKGABEWERT
+=============
+
+   keiner
+
+
+BEISPIELE
+=========
+
+   Folgendes Beispiel demonstriert beispielsweise, wie man Tode von
+   Spielern mitloggen kann (das Beispiel ist hierbei auf den am
+   haeufigsten auftretenden Fall bezogen, dass nur das toetende Objekt
+   den Tod protokollieren soll):
+
+     void NotifyPlayerDeath(object dead, object killer, int lost_exp)
+     {
+       if ( intp(lost_exp) && objectp(dead) && objectp(killer) &&
+            killer==this_object() )
+         write_file( "/log/patryn/dead", sprintf(
+           "%s - %s von %s getoetet. XP: -%d", ctime(), getuid(dead),
+            killer->name(WEM), lost_exp) );
+     }
+
+   Bitte beachten: write_file() schreibt ohne Groessenbegrenzung in das
+   Logfile. Da dies auf Dauer bzw. in Gebieten mit hoher Log-Aktivitaet
+   zu Logfiles von enormer Groesse fuehren kann, ist die Verwendung
+   von write_file() nicht empfehlenswert. Ausnahmen koennen natuerlich
+   mit dem zustaendigen Regionsmagier abgesprochen werden, z.B. fuer
+   begrenzte Anwendung etwa bei sehr starken, selten besiegten Gegnern.
+
+   Weiterhin ist es empfehlenswert, das toetende Objekt (killer) nicht
+   im NotifyPlayerDeath() zu zestoeren, sondern etwas zeitversetzt,
+   damit nicht etwa im nachfolgenden NotifyPlayerDeath() eines anderen
+   Objektes (s.o. Reihenfolge) killer==0 ist.
+
+
+SIEHE AUCH
+==========
+
+   Defend(), do_damage(), NotifyHpChange(), catch(), write_file(), log_file()
+   P_LAST_DEATH_PROPS
+
 24.03.2012, Zesstra
