Doku: P_MSG_PROB, AddRoomMessage und Props angepasst

* P_MSG_PROB nochmal naeher erklaert, da Name fehlleitet

Change-Id: I5a8b76420c1072caee7f3b0e14f73287e88bf594
diff --git a/doc/sphinx/lfun/AddRoomMessage.rst b/doc/sphinx/lfun/AddRoomMessage.rst
index 150a9cd..53c7b4d 100644
--- a/doc/sphinx/lfun/AddRoomMessage.rst
+++ b/doc/sphinx/lfun/AddRoomMessage.rst
@@ -3,81 +3,84 @@
 
 FUNKTION
 --------
-::
 
      void AddRoomMessage(string *msg, int time, mixed *func);
 
 DEFINIERT IN
 ------------
-::
 
      /std/room/description.c
 
 ARGUMENTE
 ---------
-::
 
-     msg
+     string* msg
           Array von Strings mit den Meldungen.
-     time
+     int time
           Der Abstand zwischen zwei Meldungen in Sekunden.
-     func (optional)
+     string|string* func (optional)
           String oder Array von Strings mit Funktionsnamen
 
 BESCHREIBUNG
 ------------
-::
 
      Mit dieser Funktion legt man fest, dass in bestimmten Zeitabstaenden
      Meldungen an den Raum geschickt werden sollen.
 
-     Es wird alle time Sekunden zufaellig eine der in msg angegebenen
-     Meldungen ausgegeben. Hat man auch noch func angegeben, so wird
-     zusaetzlich diese Funktion (bei einem Array: eine zufaellig ausgesuchte
-     Funktion) im Raum aufgerufen. Als Parameter bekommt die Funktion die
-     Nummer der ausgegebenen Meldung.
+     Es wird alle 'time' Sekunden (beim ersten Betreten durch einen Spieler
+     ein random() des Wertes) zufaellig eine der in msg angegebenen
+     Meldungen ausgegeben.
+     Hat man func angegeben, so wird diese Funktion (bei einem Array:
+     eine zufaellig ausgesuchte Funktion) im Raum aufgerufen. Als
+     Parameter bekommt die Funktion die Nummer der ggf zuvor ausgegebenen
+     Meldung (Default also 0).
 
      Bevor man allerdings jeden Raum mit AddRoomMessage() pflastert, sollte
-     man folgendes bedenken:
-        o Viele Meldungen in vielen Raeumen tendieren dazu, den Spielern auf
-          die Nerven zu gehen!
-        o Da das Timing ueber einen call_out() gesteuert wird, ist das Ganze
-          aus Sicht des GameDrivers auch noch relativ teuer!
-     Fazit: weniger ist mehr!
+     man folgendes bedenken (Fazit: weniger ist mehr):
+
+     * Viele Meldungen in vielen Raeumen tendieren dazu, den Spielern auf
+       die Nerven zu gehen.
+     * Die das Timing steuernden call_out() sind nicht umsonst.
 
 BEMERKUNGEN
 -----------
-::
 
-     * Falls time < 15 Sekunden ist, wird auf 15 Sekunden aufgerundet.
+     * falls time < 15 Sekunden ist, wird auf 15 Sekunden aufgerundet
      * der Praefix Add... taeuscht hier. Ein Aufruf von AddRoomMessage()
        ueberschreibt alle vorherigen Werte
-     * THIS_PLAYER() NICHT VERWENDEN!
+     * this_player() NICHT VERWENDEN!
+     * Abschalten der Raumnachrichten:
+
+       * passiert automatisch nur, wenn alle Spieler den Raum verlassen haben
+       * ist manuell nur ueber Loeschen der Nachrichten umsetzbar, also mit
+         ``AddRoomMessage((string)0, 0, (string)0);``
+
      In Funktionen, die durch AddRoomMessage() ausgeloest werden, darf
-     this_player() nicht verwendet werden. AddRoomMessage ist call_out-
-     gesteuert und speichert somit das this_player(). Damit ist this_player()
-     immer der Spieler, der den Raum geladen, also den Raum als erster
-     betreten hat. 
-     Spieler also bitte selbst ueber filter(all_inventory(this_object()),
-                                            #'interactive) suchen.
+     this_player() nicht verwendet werden, da die call_out()-Kette den
+     ersten ausloesenden Spieler speichert. Anwesende Spieler also bitte
+     ggf mit
+     ``filter(all_inventory(this_object()), #'interactive)``
+     suchen.
 
 BEISPIELE
 ---------
-::
 
-     Es soll alle halbe Minute eine Meldung ausgegeben werden. Falls es
-     unter den Fuessen knackt, soll man zudem mit 30%-iger
-     Wahrscheinlichkeit zusammenzucken:
+  .. code-block:: pike
+
+     // Beispiel 1:
+     // Es soll alle halbe Minute eine Meldung ausgegeben werden. Falls es
+     // unter den Fuessen knackt, soll man zudem mit 30%-iger
+     // Wahrscheinlichkeit zusammenzucken:
 
      inherit "/std/room";
 
      void create() {
        ::create();
-       AddRoomMessage( ({ "In der Ferne schreit ein Kaeuzchen.\n",
-                          "Es raschelt im Gebuesch.\n",
-                          "Etwas knackt unter Deinen Fuessen.\n" }),
-                        30, ({"sound", "sound_more_rnd"}) );
-       ...
+       AddRoomMessage(({"In der Ferne schreit ein Kaeuzchen.\n",
+                         "Es raschelt im Gebuesch.\n",
+                         "Etwas knackt unter Deinen Fuessen.\n"}),
+                      30,
+                      ({"sound", "sound_more_rnd"}) );
      }
 
      void sound(int msg) {
@@ -87,17 +90,62 @@
      }
 
      // Extra-Beispiel: wir setzen die Wartedauer (Parameter tim) neu
-     void sound_more_rnd() {
-       sound(0);   // die Message-Nummer ist hier unwichtig
+     void sound_more_rnd(int msg) {
+       sound(msg);
        SetProp(P_MSG_PROB, 25+random(20));  // neue Wartedauer
      }
 
+
+  .. code-block:: pike
+
+     // Beispiel 2: Abschalten der Raumnachrichten
+     public int action_laerm(string str);
+     protected void reset_room_messages();
+
+     void create() {
+       ::create();
+       reset_room_messages();
+
+       AddCmd("mach|mache&laerm|krach",
+              "action_laerm",
+              "Was willst du machen?");
+       AddCmd("schlag|schlage&laerm|krach",
+              "action_laerm",
+              "Was willst du schlagen?");
+     }
+
+     protected void reset_room_messages() {
+       AddRoomMessage(({"Das Reh quakt leise.\n",
+                        "Der Frosch grunzt.\n",
+                        "Gelbe Schnorpfel pupsen im Takt.\n"}),
+                      45);
+     }
+
+     public int action_laerm(string str) {
+       AddRoomMessage((string)0, 0, (string)0);
+
+       this_player()->ReceiveMsg(
+         "Du schreist dir kurz die Seele aus dem Leib. Alle Tiere "
+         "verstummen sofort.", MT_NOTIFICATION);
+       send_room(this_object(),
+         this_player()->Name()+" schreit laut. Alle Tiere verstimmen "
+         "sofort.", MT_LISTEN, 0, 0, ({this_player()}));
+       return 1;
+     }
+
+     void reset() {
+       :reset();
+       if(!QueryProp(P_ROOM_MSG))
+         reset_room_messages();
+     }
+
 SIEHE AUCH
 ----------
-::
 
-     Verwandt: tell_room(), ReceiveMsg()
-     Props:    P_ROOM_MSG, P_FUNC_MSG, P_MSG_PROB
+     Verwandt:
+       tell_room(), :doc:`../sefun/send_room`, :doc:`../lfun/ReceiveMsg`
+     Props:
+       :doc:`../props/P_MSG_PROB`, :doc:`../props/P_FUNC_MSG`, :doc:`../props/P_ROOM_MSG`
 
-2.Feb 2016 Gloinson
+28. Mar 2016 Gloinson