diff --git a/doc/lfun/AddAction b/doc/lfun/AddAction
index 23183ca..29c83c1 100644
--- a/doc/lfun/AddAction
+++ b/doc/lfun/AddAction
@@ -1,76 +1,104 @@
+
+AddAction()
+***********
+
+
 AddAction(L)
-FUNKTION:
-     varargs void AddAction(mixed fun, mixed cmd, int flag, int lvl);
+============
 
-DEFINIERT IN:
-     /std/player/command.c
 
-ARGUMENTE:
-     fun	zu rufende Methode im Spieler oder eine Closure
-     cmd	ausloesendes Kommandoverb
-     flag	unscharf ausfuehren
-     lvl	ab welchem (Magierlevel) funktioniert das Kommando
+FUNKTION
+========
 
-BESCHREIBUNG:
-     Dem Spieler wird ein neues Kommando definiert. Dieses kann eine Methode
-     in ihm sein, so wie bei allen Spielerkommandos ueblich, kann aber auch
-     eine Closure (Lfun-Closure oder Lambda) enthalten.
+   varargs void AddAction(mixed fun, mixed cmd, int flag, int lvl);
 
-     Mittels "flag" kann man die Kommandoerkennung unscharf halten, d.h. wie
-     bei AddCmd(L) und add_action(E) wird ein 'cmd' bei 'flag = 1' auch
-     schon von Praefix-Strings (hier ohne Leerzeichen) getriggert:
-     AddAction([...], "muh", 1, 0) wird zB auch von 'muhtens' oder 'muh4'
-     ausgeloest.
 
-     Mit "lvl" begrenzt man die Ausfuehrbarkeit. Spieler haben ein
-     Magierlevel von 0, Seher von 1.
+DEFINIERT IN
+============
 
-     Das Kommando wird in P_LOCALCMDS eingetragen. Diese Property wird
-     nicht gespeichert! Effektiv kann man mit AddAction() ein kommando-
-     gebendes Objekt im Spieler einsparen.
+   /std/player/command.c
 
-BEMERKUNGEN:
-     - es gibt _noch_ kein RemoveAction! Per Hand in P_LOCALCMDS editieren
-       kann zu ernsten Fehlern fuehren.
-     - echte Spielerkommandos kann man damit _nicht_ ueberschreiben,
-       ein AddAction(...,"sag",1,0); funktioniert nicht
-     - ein generelles AddAction(...,"",1,0); geht nicht
 
-BEISPIELE:
-     ...
-     this_player()->AddAction(symbol_function("zeige_mysterium",
-                                              find_object(".../mystzeiger")),
-			      "knorfula",0,0);
-     write(break_string("Wann immer du jetzt das Kommando \"knorfula\" "
-			"eingibst, werden dir Mysterien enthuellt!",78));
-     ...
+ARGUMENTE
+=========
 
-     // im Objekt "knorfula" ...
-     int zeige_mysterium(string str) {
-       string myst;
-       myst=environment(TP)->QueryMysterium(str);
-       if(myst) {
-         write("Du hast ein Mysterium entdeckt!\n");
-	 write(break_string(myst,78));
-	 say(break_string(
-		TP->Name(WER)+" scheint nach kurzer Konzentration etwas "
-		"entdeckt zu haben!",78));
-       } else {
-         write(break_string(
-		"Leider entdeckst du trotz deiner magischen Faehigkeit "
-		"kein Mysterium in deiner Umgebung.",78));
-	 say(break_string(
-		TP->Name(WER)+" konzentriert sich sichtbar, sieht dann "
-		"jedoch etwas enttaeuscht aus.",78));
-       }
-       return 1;
+   fun        zu rufende Methode im Spieler oder eine Closure
+   cmd        ausloesendes Kommandoverb
+   flag       unscharf ausfuehren
+   lvl        ab welchem (Magierlevel) funktioniert das Kommando
+
+
+BESCHREIBUNG
+============
+
+   Dem Spieler wird ein neues Kommando definiert. Dieses kann eine Methode
+   in ihm sein, so wie bei allen Spielerkommandos ueblich, kann aber auch
+   eine Closure (Lfun-Closure oder Lambda) enthalten.
+
+   Mittels "flag" kann man die Kommandoerkennung unscharf halten, d.h. wie
+   bei AddCmd(L) und add_action(E) wird ein 'cmd' bei 'flag = 1' auch
+   schon von Praefix-Strings (hier ohne Leerzeichen) getriggert:
+   AddAction([...], "muh", 1, 0) wird zB auch von 'muhtens' oder 'muh4'
+   ausgeloest.
+
+   Mit "lvl" begrenzt man die Ausfuehrbarkeit. Spieler haben ein
+   Magierlevel von 0, Seher von 1.
+
+   Das Kommando wird in P_LOCALCMDS eingetragen. Diese Property wird
+   nicht gespeichert! Effektiv kann man mit AddAction() ein kommando-
+   gebendes Objekt im Spieler einsparen.
+
+
+BEMERKUNGEN
+===========
+
+   - es gibt _noch_ kein RemoveAction! Per Hand in P_LOCALCMDS editieren
+     kann zu ernsten Fehlern fuehren.
+   - echte Spielerkommandos kann man damit _nicht_ ueberschreiben,
+     ein AddAction(...,"sag",1,0); funktioniert nicht
+   - ein generelles AddAction(...,"",1,0); geht nicht
+
+
+BEISPIELE
+=========
+
+   ...
+   this_player()->AddAction(symbol_function("zeige_mysterium",
+                                            find_object(".../mystzeiger")),
+                            "knorfula",0,0);
+   write(break_string("Wann immer du jetzt das Kommando \"knorfula\" "
+                      "eingibst, werden dir Mysterien enthuellt!",78));
+   ...
+
+   // im Objekt "knorfula" ...
+   int zeige_mysterium(string str) {
+     string myst;
+     myst=environment(TP)->QueryMysterium(str);
+     if(myst) {
+       write("Du hast ein Mysterium entdeckt!\n");
+       write(break_string(myst,78));
+       say(break_string(
+              TP->Name(WER)+" scheint nach kurzer Konzentration etwas "
+              "entdeckt zu haben!",78));
+     } else {
+       write(break_string(
+              "Leider entdeckst du trotz deiner magischen Faehigkeit "
+              "kein Mysterium in deiner Umgebung.",78));
+       say(break_string(
+              TP->Name(WER)+" konzentriert sich sichtbar, sieht dann "
+              "jedoch etwas enttaeuscht aus.",78));
      }
+     return 1;
+   }
 
-SIEHE AUCH:
-			P_LOCALCMDS
-     Fehlermeldungen:	notify_fail(E), _notify_fail(E)
-     Argumentstring:	query_verb(E), _unparsed_args(L)
-     Sonstiges:		replace_personal(E), enable_commands(E)
-     Alternativen:	AddCmd(L), add_action(E)
+
+SIEHE AUCH
+==========
+
+                      P_LOCALCMDS
+   Fehlermeldungen:   notify_fail(E), _notify_fail(E)
+   Argumentstring:    query_verb(E), _unparsed_args(L)
+   Sonstiges:         replace_personal(E), enable_commands(E)
+   Alternativen:      AddCmd(L), add_action(E)
 
 24. Maerz 2004 Gloinson
