diff --git a/doc/lfun/reset b/doc/lfun/reset
index 07a22ee..5959b3f 100644
--- a/doc/lfun/reset
+++ b/doc/lfun/reset
@@ -1,88 +1,106 @@
+
 reset()
-FUNKTION:
-     void reset();
-     protected void reset();
+*******
 
-BESCHREIBUNG:
-     reset() wird vom GameDriver in jedem Objekt aufgerufen, um dem Objekt
-     die Gelegenheit zu geben, sich wieder in einen definierten Zustand zu
-     versetzen: Raeume und Monster erzeugen per AddItem() eingefuegte und
-     zwischenzeitlich entfernte Objekte neu, Tueren schliessen sich ...
 
-     Solange das Objekt "benutzt" wird, wird reset() regelmaessig alle
-     45 Minuten (+/-15 Minuten) mit einer Aufloesung von 2s aufgerufen
-     (d.h. der Driver prueft und ruft nur alle 2 Sekunden reset() auf
-     allen Objekten).
+FUNKTION
+========
 
-     Wird eine Objekt nicht mehr "benutzt", d.h. wird an einem Objekt nicht
-     von aussen (durch call_other etc.) _nach_ einem reset() eine Methode
-     bzw. LFun gerufen, so bekommt dieses Objekt keinen weiteren reset().
+   void reset();
+   protected void reset();
 
-     Ein Funktionsaufruf am Objekt schaltet den reset() wieder ein.
-     Bei einem Objekt in einem Container waere das zB das Benutzen des
-     Containers (Hineinlegen/Herausnehmen/Hineinsehen). Das kann
-     sehr lange dauern.
 
-     Die Abschaltung kann man verhindern, indem man im reset() per call_out()
-     eine Funktion im Objekt ruft. Dies aber bitte _nur_ machen, wenn das
-     Objekt _unbedingt_ auf einen staendigen Reset angewiesen ist, auch wenn
-     es nicht "benutzt" wird.
+BESCHREIBUNG
+============
 
-     Aendern laesst sich die Zeit zwischen den Aufrufen von reset() mit
-     set_next_reset(). Die Aufloesung von 2s kann man nicht aendern.
+   reset() wird vom GameDriver in jedem Objekt aufgerufen, um dem Objekt
+   die Gelegenheit zu geben, sich wieder in einen definierten Zustand zu
+   versetzen: Raeume und Monster erzeugen per AddItem() eingefuegte und
+   zwischenzeitlich entfernte Objekte neu, Tueren schliessen sich ...
 
-BEMERKUNGEN:
-     - man kann reset() nutzen, um Ereignisse auszuloesen:
-       - es ist billiger als lange call_out()
-       - siehe Warnung bezueglich Abschalten des reset
-     - man kann reset() als protected oder static definieren, wenn man nicht
-       moechte, dass die Funktion von aussen gerufen werden kann. Dies
-       verhindert Einflussnahme von aussen, kann aber auch Debugmassnahmen
-       erschweren. Es ist aber dennoch fuer einige Objekte sinnvoll.
-     - der Driver ruft reset() unabhaengig von zusaetzlichen, "manuellen"
-       Rufen von reset()
-       - keine Rufe von reset() mit call_out() aus reset() (Callout-Ketten-
-         bildung droht), fuer solche Faelle ist set_next_reset(E) da!
-     - bei Blueprints sollte der reset() in der Regel abgeschaltet werden,
-       sofern er nicht auf wichtige Aufgaben in der BP zu tun hat:
-       protected void create() {
-         if(!clonep(ME)) {
-             set_next_reset(-1);
-             return;
-         }
-         ::create();
-         ...
+   Solange das Objekt "benutzt" wird, wird reset() regelmaessig alle
+   45 Minuten (+/-15 Minuten) mit einer Aufloesung von 2s aufgerufen
+   (d.h. der Driver prueft und ruft nur alle 2 Sekunden reset() auf
+   allen Objekten).
+
+   Wird eine Objekt nicht mehr "benutzt", d.h. wird an einem Objekt nicht
+   von aussen (durch call_other etc.) _nach_ einem reset() eine Methode
+   bzw. LFun gerufen, so bekommt dieses Objekt keinen weiteren reset().
+
+   Ein Funktionsaufruf am Objekt schaltet den reset() wieder ein.
+   Bei einem Objekt in einem Container waere das zB das Benutzen des
+   Containers (Hineinlegen/Herausnehmen/Hineinsehen). Das kann
+   sehr lange dauern.
+
+   Die Abschaltung kann man verhindern, indem man im reset() per call_out()
+   eine Funktion im Objekt ruft. Dies aber bitte _nur_ machen, wenn das
+   Objekt _unbedingt_ auf einen staendigen Reset angewiesen ist, auch wenn
+   es nicht "benutzt" wird.
+
+   Aendern laesst sich die Zeit zwischen den Aufrufen von reset() mit
+   set_next_reset(). Die Aufloesung von 2s kann man nicht aendern.
+
+
+BEMERKUNGEN
+===========
+
+   - man kann reset() nutzen, um Ereignisse auszuloesen:
+     - es ist billiger als lange call_out()
+     - siehe Warnung bezueglich Abschalten des reset
+   - man kann reset() als protected oder static definieren, wenn man nicht
+     moechte, dass die Funktion von aussen gerufen werden kann. Dies
+     verhindert Einflussnahme von aussen, kann aber auch Debugmassnahmen
+     erschweren. Es ist aber dennoch fuer einige Objekte sinnvoll.
+   - der Driver ruft reset() unabhaengig von zusaetzlichen, "manuellen"
+     Rufen von reset()
+     - keine Rufe von reset() mit call_out() aus reset() (Callout-Ketten-
+       bildung droht), fuer solche Faelle ist set_next_reset(E) da!
+   - bei Blueprints sollte der reset() in der Regel abgeschaltet werden,
+     sofern er nicht auf wichtige Aufgaben in der BP zu tun hat:
+     protected void create() {
+       if(!clonep(ME)) {
+           set_next_reset(-1);
+           return;
        }
-
-BEISPIELE:
-     // ein NPC, der bei jedem reset() schaut, ob um ihn herum bessere
-     // Ausruestung liegt als die, die er selbst gerade traegt:
-
-     ...
-     void reset() {
-       ::reset();
-
-       if(clonep(this_object()) && environment()) {
-         object o;
-         o=first_inventory(environment());
-         while(o) {
-             look_for_good_weapons_and_use_them_if_better(o);
-             o=next_inventory(o);
-         }
-       }
+       ::create();
+       ...
      }
 
-     // ein reset fuer einen Gegenstand, der vielleicht in
-     // in einem Container landet und dann weiter einen reset
-     // bekommen muss/soll
 
-     void reset() {
-       // irgend ein Code hier
-       call_other(this_object(), "???"); // einfach nur was aufrufen
+BEISPIELE
+=========
+
+   // ein NPC, der bei jedem reset() schaut, ob um ihn herum bessere
+   // Ausruestung liegt als die, die er selbst gerade traegt:
+
+   ...
+   void reset() {
+     ::reset();
+
+     if(clonep(this_object()) && environment()) {
+       object o;
+       o=first_inventory(environment());
+       while(o) {
+           look_for_good_weapons_and_use_them_if_better(o);
+           o=next_inventory(o);
+       }
      }
+   }
 
-SIEHE AUCH:
-     clean_up(), set_next_reset(E), query_next_reset(E)
-     memory
+   // ein reset fuer einen Gegenstand, der vielleicht in
+   // in einem Container landet und dann weiter einen reset
+   // bekommen muss/soll
+
+   void reset() {
+     // irgend ein Code hier
+     call_other(this_object(), "???"); // einfach nur was aufrufen
+   }
+
+
+SIEHE AUCH
+==========
+
+   clean_up(), set_next_reset(E), query_next_reset(E)
+   memory
 
 letzte Aenderung: 2009-01-14 Rumata
