blob: 53c7b4d56323a5f4c336ddcc7545627878b72dfc [file] [log] [blame]
Zesstra18626972017-01-31 10:38:27 +01001AddRoomMessage()
2================
3
4FUNKTION
5--------
Zesstra18626972017-01-31 10:38:27 +01006
7 void AddRoomMessage(string *msg, int time, mixed *func);
8
9DEFINIERT IN
10------------
Zesstra18626972017-01-31 10:38:27 +010011
12 /std/room/description.c
13
14ARGUMENTE
15---------
Zesstra18626972017-01-31 10:38:27 +010016
Christian Georg Beckerf94ad122017-03-28 18:11:25 +020017 string* msg
Zesstra18626972017-01-31 10:38:27 +010018 Array von Strings mit den Meldungen.
Christian Georg Beckerf94ad122017-03-28 18:11:25 +020019 int time
Zesstra18626972017-01-31 10:38:27 +010020 Der Abstand zwischen zwei Meldungen in Sekunden.
Christian Georg Beckerf94ad122017-03-28 18:11:25 +020021 string|string* func (optional)
Zesstra18626972017-01-31 10:38:27 +010022 String oder Array von Strings mit Funktionsnamen
23
24BESCHREIBUNG
25------------
Zesstra18626972017-01-31 10:38:27 +010026
27 Mit dieser Funktion legt man fest, dass in bestimmten Zeitabstaenden
28 Meldungen an den Raum geschickt werden sollen.
29
Christian Georg Beckerf94ad122017-03-28 18:11:25 +020030 Es wird alle 'time' Sekunden (beim ersten Betreten durch einen Spieler
31 ein random() des Wertes) zufaellig eine der in msg angegebenen
32 Meldungen ausgegeben.
33 Hat man func angegeben, so wird diese Funktion (bei einem Array:
34 eine zufaellig ausgesuchte Funktion) im Raum aufgerufen. Als
35 Parameter bekommt die Funktion die Nummer der ggf zuvor ausgegebenen
36 Meldung (Default also 0).
Zesstra18626972017-01-31 10:38:27 +010037
38 Bevor man allerdings jeden Raum mit AddRoomMessage() pflastert, sollte
Christian Georg Beckerf94ad122017-03-28 18:11:25 +020039 man folgendes bedenken (Fazit: weniger ist mehr):
40
41 * Viele Meldungen in vielen Raeumen tendieren dazu, den Spielern auf
42 die Nerven zu gehen.
43 * Die das Timing steuernden call_out() sind nicht umsonst.
Zesstra18626972017-01-31 10:38:27 +010044
45BEMERKUNGEN
46-----------
Zesstra18626972017-01-31 10:38:27 +010047
Christian Georg Beckerf94ad122017-03-28 18:11:25 +020048 * falls time < 15 Sekunden ist, wird auf 15 Sekunden aufgerundet
Zesstra18626972017-01-31 10:38:27 +010049 * der Praefix Add... taeuscht hier. Ein Aufruf von AddRoomMessage()
50 ueberschreibt alle vorherigen Werte
Christian Georg Beckerf94ad122017-03-28 18:11:25 +020051 * this_player() NICHT VERWENDEN!
52 * Abschalten der Raumnachrichten:
53
54 * passiert automatisch nur, wenn alle Spieler den Raum verlassen haben
55 * ist manuell nur ueber Loeschen der Nachrichten umsetzbar, also mit
56 ``AddRoomMessage((string)0, 0, (string)0);``
57
Zesstra18626972017-01-31 10:38:27 +010058 In Funktionen, die durch AddRoomMessage() ausgeloest werden, darf
Christian Georg Beckerf94ad122017-03-28 18:11:25 +020059 this_player() nicht verwendet werden, da die call_out()-Kette den
60 ersten ausloesenden Spieler speichert. Anwesende Spieler also bitte
61 ggf mit
62 ``filter(all_inventory(this_object()), #'interactive)``
63 suchen.
Zesstra18626972017-01-31 10:38:27 +010064
65BEISPIELE
66---------
Zesstra18626972017-01-31 10:38:27 +010067
Christian Georg Beckerf94ad122017-03-28 18:11:25 +020068 .. code-block:: pike
69
70 // Beispiel 1:
71 // Es soll alle halbe Minute eine Meldung ausgegeben werden. Falls es
72 // unter den Fuessen knackt, soll man zudem mit 30%-iger
73 // Wahrscheinlichkeit zusammenzucken:
Zesstra18626972017-01-31 10:38:27 +010074
75 inherit "/std/room";
76
77 void create() {
78 ::create();
Christian Georg Beckerf94ad122017-03-28 18:11:25 +020079 AddRoomMessage(({"In der Ferne schreit ein Kaeuzchen.\n",
80 "Es raschelt im Gebuesch.\n",
81 "Etwas knackt unter Deinen Fuessen.\n"}),
82 30,
83 ({"sound", "sound_more_rnd"}) );
Zesstra18626972017-01-31 10:38:27 +010084 }
85
86 void sound(int msg) {
87 if (msg == 2) // Es hat geknackt...
88 if (random(10) < 3) // Schreck lass nach! ;-)
89 tell_room(this_object(), "Erschrocken faehrst Du zusammen!\n" );
90 }
91
92 // Extra-Beispiel: wir setzen die Wartedauer (Parameter tim) neu
Christian Georg Beckerf94ad122017-03-28 18:11:25 +020093 void sound_more_rnd(int msg) {
94 sound(msg);
Zesstra18626972017-01-31 10:38:27 +010095 SetProp(P_MSG_PROB, 25+random(20)); // neue Wartedauer
96 }
97
Christian Georg Beckerf94ad122017-03-28 18:11:25 +020098
99 .. code-block:: pike
100
101 // Beispiel 2: Abschalten der Raumnachrichten
102 public int action_laerm(string str);
103 protected void reset_room_messages();
104
105 void create() {
106 ::create();
107 reset_room_messages();
108
109 AddCmd("mach|mache&laerm|krach",
110 "action_laerm",
111 "Was willst du machen?");
112 AddCmd("schlag|schlage&laerm|krach",
113 "action_laerm",
114 "Was willst du schlagen?");
115 }
116
117 protected void reset_room_messages() {
118 AddRoomMessage(({"Das Reh quakt leise.\n",
119 "Der Frosch grunzt.\n",
120 "Gelbe Schnorpfel pupsen im Takt.\n"}),
121 45);
122 }
123
124 public int action_laerm(string str) {
125 AddRoomMessage((string)0, 0, (string)0);
126
127 this_player()->ReceiveMsg(
128 "Du schreist dir kurz die Seele aus dem Leib. Alle Tiere "
129 "verstummen sofort.", MT_NOTIFICATION);
130 send_room(this_object(),
131 this_player()->Name()+" schreit laut. Alle Tiere verstimmen "
132 "sofort.", MT_LISTEN, 0, 0, ({this_player()}));
133 return 1;
134 }
135
136 void reset() {
137 :reset();
138 if(!QueryProp(P_ROOM_MSG))
139 reset_room_messages();
140 }
141
Zesstra18626972017-01-31 10:38:27 +0100142SIEHE AUCH
143----------
Zesstra18626972017-01-31 10:38:27 +0100144
Christian Georg Beckerf94ad122017-03-28 18:11:25 +0200145 Verwandt:
146 tell_room(), :doc:`../sefun/send_room`, :doc:`../lfun/ReceiveMsg`
147 Props:
148 :doc:`../props/P_MSG_PROB`, :doc:`../props/P_FUNC_MSG`, :doc:`../props/P_ROOM_MSG`
Zesstra18626972017-01-31 10:38:27 +0100149
Christian Georg Beckerf94ad122017-03-28 18:11:25 +020015028. Mar 2016 Gloinson
Zesstra18626972017-01-31 10:38:27 +0100151