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
  1. Mar 2016 Gloinson