
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
