
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
=========

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

   Props:
      P_MSG_PROB, P_FUNC_MSG, P_ROOM_MSG

28. Mar 2016 Gloinson
