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(0, 0, 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
=========

   // 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
   }

   // 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(0, 0, 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(), send_room(), ReceiveMsg()

   Props:
      P_MSG_PROB, P_FUNC_MSG, P_ROOM_MSG

28. Mar 2016 Gloinson
