Typen fuer Chats ergaenzt

Statt mixed die konkreten Typen fuer die Datenstruktur verwenden.

SetChats() + SetAChats() erlauben nun auch, die Chats zu loeschen
(Uebergabe von 0) und die Chats sind ein optionales Argument,
falls man nur die Chance aendern und den Inhalt beibehalten will.

Change-Id: I4cb6f5942220848da6b0f2a6789870b6ae44cba4
diff --git a/doc/sphinx/lfun/SetChats.rst b/doc/sphinx/lfun/SetChats.rst
index fd99a3d..78f1485 100644
--- a/doc/sphinx/lfun/SetChats.rst
+++ b/doc/sphinx/lfun/SetChats.rst
@@ -16,25 +16,29 @@
 
     int chance
       Prozentuale Wahrscheinlichkeit einer Ausgabe
-    mixed strs
+    <string|closure|<string|closure|int>* >* strs
       Array mit den verschiedenen Moeglichkeiten der Monsterchats
+      (optional)
 
 BESCHREIBUNG
 ------------
 
     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.
-
-    Die einzelnen Arrayelemente koennen:
+    zufaellig gewaehlten Text aus dem Array <strs> in den Raum aus. Wird
+    kein <strs> uebergeben, wird nur die Chat-Chance geaendert und die
+    bisherigen Chats werden beibehalten.
     
-      * Strings sein
-      * Closures sein, deren Rueckgabe ausgegeben wird und die zusaetzlich
+    Per Default wird send_room() ohne erneutes Umbrechen mit den Messagetypen
+    MT_LOOK|MT_LISTEN|MT_FEEL|MT_SMELL zur Ausgabe verwendet.
+
+    Die einzelnen Arrayelemente koennen sein:
+
+      * Strings
+      * Closures, 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
+        `({<string|closure msg >, <int msg_typ>})`, fuer
         die obige Regeln auf 'msg' angewendet werden und bei denen 'msg_typ'
         im send_room() verwendet wird
 
diff --git a/std/npc/chat.c b/std/npc/chat.c
index 4c70823..9eb9184 100644
--- a/std/npc/chat.c
+++ b/std/npc/chat.c
@@ -23,29 +23,30 @@
 /*
  * heart_beat is called so the monster may chat.
  */
-void SetChats(int chance, mixed strs) {
-  if (!pointerp(strs))
-    return;
-  SetProp(P_CHAT_CHANCE,chance);
-  SetProp(P_CHATS,strs);
+void SetChats(int chance,
+        <string|closure|<string|closure|int>* >* strs = QueryProp(P_CHATS))
+{
+  SetProp(P_CHAT_CHANCE, chance);
+  SetProp(P_CHATS, strs);
 }
 
-void SetAttackChats(int chance, mixed strs) {
-  if (!pointerp(strs))
-    return;
-  SetProp(P_ACHAT_CHANCE,chance);
-  SetProp(P_ACHATS,strs);
+void SetAttackChats(int chance,
+        <string|closure|<string|closure|int>* >* strs = QueryProp(P_ACHATS))
+{
+  SetProp(P_ACHAT_CHANCE, chance);
+  SetProp(P_ACHATS, strs);
 }
 
 #define SR_CHAT_MSG 0
 #define SR_CHAT_TYP 1
 
-protected void process_chat(mixed strs) {
-  if (!pointerp(strs) || !sizeof(strs))
+protected void process_chat(<string|closure|<string|closure|int>* >* strs)
+{
+  if (!sizeof(strs))
     return;
 
   int msg_typ;
-  mixed entry = strs[random(sizeof(strs))];
+  <string|closure|<string|closure|int>*> entry = strs[random(sizeof(strs))];
 
   if(pointerp(entry) && sizeof(entry)>=2 && intp(entry[SR_CHAT_TYP])) {
     msg_typ = entry[SR_CHAT_TYP];