AddRoomMessage()
================

FUNKTION
--------

     void AddRoomMessage(string* msg, int time, mixed* func);

DEFINIERT IN
------------

     /std/room/description.c

ARGUMENTE
---------

     string* msg
          Array von Strings mit den Meldungen.
     int time
          Der Abstand zwischen zwei Meldungen in Sekunden.
     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 (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 (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
     * der Praefix Add... taeuscht hier. Ein Aufruf von AddRoomMessage()
       ueberschreibt alle vorherigen Werte
     * 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, da die call_out()-Kette den
     ersten ausloesenden Spieler speichert. Anwesende Spieler also bitte
     ggf mit
     ``filter(all_inventory(this_object()), #'interactive)``
     suchen.

BEISPIELE
---------

.. 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"}) );
     }

     void sound(int msg) {
       if (msg == 2)         // Es hat geknackt...
         if (random(10) < 3) // Schreck lass nach! ;-)
           tell_room(this_object(), "Erschrocken faehrst Du zusammen!\n" );
     }

     // Extra-Beispiel: wir setzen die Wartedauer (Parameter tim) neu
     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 verstummen "
         "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(), :doc:`../sefun/send_room`, :doc:`../lfun/ReceiveMsg`
     Props:
       :doc:`../props/P_MSG_PROB`, :doc:`../props/P_FUNC_MSG`, :doc:`../props/P_ROOM_MSG`

28. Mar 2016 Gloinson

