diff --git a/doc/sphinx/lfun/SetAttackChats.rst b/doc/sphinx/lfun/SetAttackChats.rst
index dbfee76..82d795b 100644
--- a/doc/sphinx/lfun/SetAttackChats.rst
+++ b/doc/sphinx/lfun/SetAttackChats.rst
@@ -3,106 +3,103 @@
 
 FUNKTION
 --------
-::
 
-     void SetAttackChats(int chance, mixed strs);
+    void SetAttackChats(int chance, mixed strs);
 
 DEFINIERT IN
 ------------
-::
 
-     /std/npc/chat.c
+    /std/npc/chat.c
 
 ARGUMENTE
 ---------
-::
 
-     chance
-          Prozentuale Wahrscheinlichkeit einer Ausgabe
-     strs
-          Stringarray mit den Monsterchats
+    int chance
+      Prozentuale Wahrscheinlichkeit einer Ausgabe
+    mixed strs
+      Array mit den verschiedenen Moeglichkeiten der Monsterchats
+
 
 BESCHREIBUNG
 ------------
-::
 
-     Der NPC gibt mit der Wahrscheinlichkeit 'chance' einen zufaellig
-     gewaehlten Text aus 'strs' von sich. Die Arrayelemente koennen 
-     auch Funktionen ("@@func@@") oder Closures enthalten, die dann
-     aufgerufen werden und deren Rueckgabewerte das Monster dann ausgibt.
+    Der NPC gibt mit der Wahrscheinlichkeit <chance> waehrend des Kampfes
+    pro Heartbeat einen zufaellig gewaehlten Text aus dem Array <strs>
+    in den Raum aus. Dabei wird per Default send_room() ohne erneutes
+    Umbrechen mit den Messagetypen MT_LOOK|MT_LISTEN|MT_FEEL|MT_SMELL
+    verwendet.
 
-RUECKGABEWERT
--------------
-::
+    Die einzelnen Arrayelemente koennen:
+    
+      * Strings sein
+      * Closures sein, deren Rueckgabe ausgegeben wird und die zusaetzlich
+        einen aenderbaren und in send_room() verwendeten 'msg_typ' per
+        Referenz uebergeben bekommen
+      * Arrays mit der Struktur
+        `({<string|closure msg >, <int msg_typ>})` sein, fuer
+        die obige Regeln auf 'msg' angewendet werden und bei denen 'msg_typ'
+        im send_room() verwendet wird
 
-     keiner
-
-     
+    Fuer keine Ausgabe muss man einen Leerstring "" zurueckgeben oder
+    verwenden. In allen Funktionen ist this_player() das Monster selbst.
+    Normalerweise muss man die Nachrichten selbst umbrechen, ausser man
+    uebergibt die Message-Typen explizit und uebergibt kein MSG_DONT_WRAP.
 
 BEMERKUNGEN
 -----------
-::
 
-     AttackChats werden nur im Kampf ausgegeben. Ansonsten ist SetChats()
-     zu verwenden.
-
+    * ausserhalb des  Kampf werden keine AttackChats ausgegeben, man muss
+      dann SetChats() verwenden
+    * die strings werden (noch) durch process_string() geschickt, 
+      dieses sollte man aber nicht mehr verwenden
+    * 'chance' gilt sowohl fuer Attack- als auch normale Chats
+    * 'chance' wird in der Property P_CHAT_CHANCE abgelegt. Um einen NPC
+      voruebergehend 'stillzulegen', kann man P_CHAT_CHANCE auf 0 setzen
+    * Spieler koennen P_CHAT_CHANCE temporaer auf 0 setzen ('stillen')
+    * NPC haben bei Abwesenheit von Spielern in der Regel keinen Heartbeat,
+      weswegen dann auch die Chats ausgeschaltet sind
+    * send_room() bekommt immer MSG_DONT_STORE|MSG_DONT_BUFFER uebergeben
      
-
-     'chance' wird in der Property P_ACHAT_CHANCE abgelegt. Um einen NPC
-     voruebergehend 'stillzulegen', kann man P_ACHAT_CHANCE auf 0 setzen.
-
-     
-
-     Man kann AttackChats nutzen, um Monsterspells zu realisieren. Besser
-     ist es aber, dafuer 'AddSpell' zu verwenden.
-
-     
+    Man kann AttackChats nutzen, um Monsterspells zu realisieren. Besser
+    ist es aber, dafuer 'AddSpell' zu benutzen, ausser man moechte zB
+    die Spielerfaehigkeit des Abschaltens der Chats verwenden.
 
 BEISPIELE
 ---------
-::
 
-     SetAttackChats( 20,
-       ({ "Der Ork tritt Dir in den Hintern.\n",
-          "Der Ork bruellt: Lebend kommst Du hier nicht raus!\n",
-          "Der Ork blutet schon aus mehreren Wunden.\n",
-          "@@knirsch@@" }) );
+.. code-block:: pike
 
-          
+    protected string knirschschrei(int msg_typ);
 
-     string knirsch()
-     {
-       object *ruestung, *tmp, helm;
+    SetAttackChats( 20,
+     ({"Der Ork tritt Dir in den Hintern.\n",
+       ({"Der Ork bruellt: Lebend kommst Du hier nicht raus!\n", MT_LISTEN}),
+       ({"Der Ork blutet schon aus mehreren Wunden.\n", MT_LOOK}),
+       #'knirschschrei}));
 
-       
-
-       ruestung = this_player()->QueryProp(P_ARMOURS); // getragene Ruestung
-       tmp = filter_objects(ruestung, "id", AT_HELMET);
-       // Wenn der Spieler einen Helm traegt, enthaelt 'tmp' jetzt
-       // ein Array mit dem Helmobjekt als einzigem Element
-       if (sizeof(tmp)) helm = tmp[0];
-	 if (objectp(helm))
-	 {
-	   // AC nur dann senken, wenn sie nicht schon 0 ist.
-	   if (helm->QueryProp(P_AC)>0) {
-	     helm->Damage(1);
-	     return "Der Ork beschaedigt Deinen Helm!\n";
-	   }
-	   return "";
-	 }
-	 else
-	   return ""; // keine Meldung
-     }
+    protected string knirsch(int msg_typ) {
+      object helm = this_player()->QueryArmourByType(AT_HELMET);
+      if (objectp(helm)) {
+        // AC nur dann senken, wenn sie nicht schon 0 ist.
+        if (helm->QueryProp(P_AC)>0) {
+          helm->Damage(1);
+          msg_typ = MT_LISTEN|MT_FEEL;
+          return ("Der Ork schreit dich so laut an, dass dabei "+
+                  helm->QueryOwn(WER)+" "+
+                  helm->name(RAW)+" beschaedigt wird.");
+        }
+      }
+      return ""; // keine Meldung
+    }
 
 SIEHE AUCH
 ----------
-::
 
-     P_ACHAT_CHANCE, SetChats(), /std/npc/chat.c, AddSpell()
+     Verwandt:
+       :doc:`SetChats`, :doc:`AddSpell`
+     Props:
+       :doc:`../props/P_CHAT_CHANCE`
+     Sonstiges:
+       :doc:`../sefun/send_room`, :doc:`../sefun/process_string`
 
-LETZTE AENDERUNG
-----------------
-::
-
-	Don, 27.12.2007, 16:35:00 von Arathorn
-
+03. April 2017 Gloinson
\ No newline at end of file
diff --git a/doc/sphinx/lfun/SetChats.rst b/doc/sphinx/lfun/SetChats.rst
index e14669c..ca750fb 100644
--- a/doc/sphinx/lfun/SetChats.rst
+++ b/doc/sphinx/lfun/SetChats.rst
@@ -3,93 +3,139 @@
 
 FUNKTION
 --------
-::
 
-	void SetChats(int chance,mixed strs);
+    void SetChats(int chance, mixed strs);
 
 DEFINIERT IN
 ------------
-::
 
-	/std/npc/chat.c
+    /std/npc/chat.c
 
 ARGUMENTE
 ---------
-::
 
-	chance
-	  Prozentuale Wahrscheinlichkeit einer Ausgabe
-	strs
-	  Stringarray mit den Monsterchats
+    int chance
+      Prozentuale Wahrscheinlichkeit einer Ausgabe
+    mixed strs
+      Array mit den verschiedenen Moeglichkeiten der Monsterchats
 
 BESCHREIBUNG
 ------------
-::
 
-	Der NPC gibt mit der Wahrscheinlichkeit <chance> pro Heartbeat einen
-	zufaellig gewaehlten Text aus dem Array <strs> von sich.
-	Die Arrayelemente koennen auch Closures oder
-	process_string()-Funktionen ("@@func@@") enthalten, die dann
-	aufgerufen werden und deren Rueckgabewerte das Monster dann ausgibt.
-	 (Fuer keine Ausgabe dann Leerstring "" zurueckgeben!)
-	In diesen Funktionen ist this_player() das Monster selbst!
-	Fuer Zeilenumbrueche ist immer selbst zu sorgen.
+    Der NPC gibt mit der Wahrscheinlichkeit <chance> pro Heartbeat einen
+    zufaellig gewaehlten Text aus dem Array <strs> in den Raum aus. Dabei
+    wird per Default send_room() ohne erneutes Umbrechen mit den Messagetypen
+    MT_LOOK|MT_LISTEN|MT_FEEL|MT_SMELL verwendet.
 
-RUECKGABEWERT
--------------
-::
+    Die einzelnen Arrayelemente koennen:
+    
+      * Strings sein
+      * Closures sein, deren Rueckgabe ausgegeben wird und die zusaetzlich
+        einen aenderbaren und in send_room() verwendeten 'msg_typ' per
+        Referenz uebergeben bekommen
+      * Arrays mit der Struktur
+        `({<string|closure msg >, <int msg_typ>})` sein, fuer
+        die obige Regeln auf 'msg' angewendet werden und bei denen 'msg_typ'
+        im send_room() verwendet wird
 
-	keiner
-
-BEISPIELE
----------
-::
-
-	Ein einfaches Beispiel:
-	  // Prototype fuer Closure.
-	  static string info1();
-	  void create()
-	  { ...
-	    SetChats(20,
-	   ({"Der Ork sagt: Hau ab, bevor ich Dich fresse.\n",
-	     "Der Ork grinst Dich unverschaemt an.\n",
-	     "Der Ork wedelt mit seinem Saebel vor Deinem Gesicht herum.\n",
-	     "Der Ork droht Dir mit der Faust.\n",
-             #'info1,
-	     "@@info2@@"}));
-          }
-	  // Funktion als Closure. Prototype notwendig!
-	  static string info1()
-	  { if(QueryProp(P_HP)<QueryProp(P_ALIGN))
-	      return"Gleich werde ich von hier fliehen!\n";
-	    return"";
-	  }
-	  // Funktion als process_string().
-	  string info2()
-	  { return QueryProp(P_HP)==QueryProp(P_MAX_HP)?
-	 "Der Ork grinst: Mir geht es fantastisch!\n":
-	 "Der Ork seufzt: Mir ging es wirklich schon mal besser.\n";
-	  }
+    Fuer keine Ausgabe muss man einen Leerstring "" zurueckgeben oder
+    verwenden. In allen Funktionen ist this_player() das Monster selbst.
+    Normalerweise muss man die Nachrichten selbst umbrechen, ausser man
+    uebergibt die Message-Typen explizit und uebergibt kein MSG_DONT_WRAP.
 
 BEMERKUNGEN
 -----------
-::
 
-	Im Kampf werden keine Chats ausgegeben. Es ist dann SetAttackChats()
-	zu verwenden.
-	Funktionen als process_string() sollte man nicht mehr verwenden.
-	<chance> wird in der Property P_CHAT_CHANCE abgelegt. Um einen NPC
-	voruebergehend 'stillzulegen', kann man P_CHAT_CHANCE auf 0 setzen.
-  Wenn kein Spieler anwesend ist, haben NPC in der Regel keinen Heartbeat,
-  weswegen dann auch die Chats ausgeschaltet sind.
-  Spieler koennen NPC 'stillen', d.h. Chats und AttackChats abschalten.
+    * im Kampf werden keine Chats ausgegeben, man muss dann SetAttackChats()
+      verwenden
+    * die strings werden (noch) durch process_string() geschickt, 
+      dieses sollte man aber nicht mehr verwenden
+    * 'chance' gilt sowohl fuer Attack- als auch normale Chats
+    * 'chance' wird in der Property P_CHAT_CHANCE abgelegt. Um einen NPC
+      voruebergehend 'stillzulegen', kann man P_CHAT_CHANCE auf 0 setzen
+    * Spieler koennen P_CHAT_CHANCE temporaer auf 0 setzen ('stillen')
+    * NPC haben bei Abwesenheit von Spielern in der Regel keinen Heartbeat,
+      weswegen dann auch die Chats ausgeschaltet sind
+    * send_room() bekommt immer MSG_DONT_STORE|MSG_DONT_BUFFER uebergeben
+
+BEISPIELE
+---------
+
+.. code-block:: pike
+
+    // Ein einfaches Beispiel:
+    SetChats(20,
+     ({"Der Ork sagt: Hau ab, bevor ich Dich fresse.\n",
+       "Der Ork grinst Dich unverschaemt an.\n",
+       "Der Ork wedelt mit seinem Saebel vor dir herum.\n",
+       "Der Ork stupst Dich mit dem Finger hart.\n"}));
+
+.. code-block:: pike
+
+    // Ein Beispiel mit send_room-Typen ohne MSG_DONT_WRAP
+    SetChats(20,
+     ({({"Der Ork sagt: Hau ab, bevor ich Dich fresse.", MT_LISTEN}),
+       ({"Der Ork grinst Dich unverschaemt an.", MT_LOOK}),
+       ({"Der Ork wedelt mit seinem Saebel vor dir herum.", MT_LOOK}),
+       ({"Der Ork stupst Dich mit dem Finger hart.", MT_LOOK|MT_FEEL})}));
+
+.. code-block:: pike
+
+    // Laengeres Beispiel mit Closures
+    protected string chat_flightinfo(int msg_typ);
+    protected string chat_trysteal(int msg_typ);
+
+    void create() {
+      SetChats(20,
+       ({({"Der Ork sagt: Hau ab, bevor ich Dich fresse.\n", MT_LISTEN}),
+         #'chat_flightinfo,
+         #'chat_trysteal}));
+      // [...]
+    }
+
+    protected string chat_flightinfo(int msg_typ) {
+      msg_typ = MT_LISTEN;
+      return ("Der Ork sagt: "+
+              (QueryProp(P_HP)<QueryProp(P_WIMPY)?
+                "Ich hab Angst!":
+                "Guck mich nicht so an, Schwaechling!"));
+    }
+
+    protected string chat_trysteal(int msg_typ) {
+      object *pls = filter(all_inventory(environment()), #'interactive);
+      if(sizeof(pls)) {
+        object pl = pls[random(sizeof(pls))];
+        if(!IS_LEARNER(pl)) {
+          object *objs = all_inventory(pl);
+          if(sizeof(objs)) {
+            object ob = objs[random(sizeof(objs))];
+            if(ob->move(this_object(),
+                        M_NO_SHOW|M_GIVE|M_MOVE_ALL)==MOVE_OK) {
+              if(pl->ReceiveMsg(Name(WER)+" stiehlt dir "+ob->name(WEN, 0)+".",
+                                MT_FEEL|MT_LOOK)<0)
+                pl->ReceiveMsg("Irgendwie scheint dir jetzt etwas zu fehlen.",
+                               MT_FEEL|MT_LOOK|MSG_DONT_IGNORE);
+              send_room(environment(),
+                Name(WER, 1)+" bestiehlt "+pl->name(WEN)+".",
+                MT_LOOK, 0, 0, ({pl}));
+              return "";
+            }
+          }
+        }
+      }
+      msg_typ = MT_LOOK;
+      return Name(WER, 1)+" schaut sich verstohlen um.";
+    }
+
 
 SIEHE AUCH
 ----------
-::
 
-	P_CHAT_CHANCE, SetAttackChats(), process_string()
+     Verwandt:
+       :doc:`SetAttackChats`
+     Props:
+       :doc:`../props/P_CHAT_CHANCE`
+     Sonstiges:
+       :doc:`../sefun/send_room`, :doc:`../sefun/process_string`
 
-
-Last modified: Sat Jan 18 18:48:06 2003 by Patryn
-
+03. April 2017 Gloinson
\ No newline at end of file
