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
