blob: 6738e29fdf563488139ef32df978ef25171f0be1 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// room/description.c -- room description handling
4//
5// $Id: description.c 9468 2016-02-19 21:07:04Z Gloinson $
6
7#pragma strong_types
8#pragma save_types
9#pragma pedantic
10#pragma range_check
11#pragma no_clone
12
13inherit "/std/container/description";
14
15#define NEED_PROTOTYPES
16
17#include <properties.h>
18#include <defines.h>
19#include <wizlevels.h>
20#include <language.h>
21#include <doorroom.h>
Zesstra65f95a22020-01-31 15:30:37 +010022#include <room/description.h>
MG Mud User88f12472016-06-24 23:31:02 +020023
Zesstra65f95a22020-01-31 15:30:37 +010024protected void create()
MG Mud User88f12472016-06-24 23:31:02 +020025{
26 ::create();
27 SetProp(P_NAME, "Raum");
28 SetProp(P_INT_SHORT,"<namenloser Raum>");
29 SetProp(P_INT_LONG,0);
30 SetProp(P_ROOM_MSG, ({}) );
31 SetProp(P_FUNC_MSG, 0);
32 SetProp(P_MSG_PROB, 30);
33 AddId(({"raum", "hier"}));
34}
35
Zesstra5b71ebb2018-03-07 20:50:35 +010036public varargs void init(object origin)
MG Mud User88f12472016-06-24 23:31:02 +020037{
38 // Wenn P_ROOM_MSG gesetzt oder P_FUNC_MSG und kein Callout laeuft,
39 // Callout starten.
40 mixed roommsg = QueryProp(P_ROOM_MSG);
41 if( ( (roommsg && sizeof(roommsg)) ||
42 QueryProp(P_FUNC_MSG) ) &&
43 (find_call_out("WriteRoomMessage")==-1))
44 call_out("WriteRoomMessage", random(QueryProp(P_MSG_PROB)));
45}
46
47varargs void AddRoomMessage(string *mesg, int prob, mixed func)
48{
49 if (mesg && !pointerp(mesg))
50 raise_error(sprintf(
51 "AddRoomMessage(): wrong argument type, expected Array or 0, "
52 "got %.20O",mesg));
53
54 SetProp(P_ROOM_MSG, mesg);
55
56 if (prob>0)
57 SetProp(P_MSG_PROB, prob);
58
59 if (func)
60 SetProp(P_FUNC_MSG, func);
61}
62
63static void WriteRoomMessage()
64{
Zesstra0d1bd1d2019-11-23 10:19:15 +010065 int msgid;
MG Mud User88f12472016-06-24 23:31:02 +020066
Zesstra0d1bd1d2019-11-23 10:19:15 +010067 string *room_msg = QueryProp(P_ROOM_MSG);
68 <string|string*> func_msg = QueryProp(P_FUNC_MSG);
MG Mud User88f12472016-06-24 23:31:02 +020069 if ((!room_msg || !sizeof(room_msg)) && !func_msg)
70 return;
71
72 if (room_msg&&sizeof(room_msg))
73 {
74 msgid = random(sizeof(room_msg));
75 // Defaultwerte sind fuer Altcode schwierig
76 send_room(this_object(), room_msg[msgid],
77 MT_LOOK|MT_LISTEN|MT_FEEL|MT_SMELL|
78 MSG_DONT_STORE|MSG_DONT_BUFFER|MSG_DONT_WRAP);
79 }
80
81 if (func_msg)
82 {
Zesstra0d1bd1d2019-11-23 10:19:15 +010083 string func;
MG Mud User88f12472016-06-24 23:31:02 +020084 if (stringp(func_msg))
85 func=(string)func_msg;
86 else
87 func=func_msg[random(sizeof(func_msg))];
88 if (func && function_exists(func))
89 call_other (this_object(), func, msgid);
90 }
91
92 while (remove_call_out("WriteRoomMessage")!=-1);
MG Mud User88f12472016-06-24 23:31:02 +020093 if(this_object() && sizeof(filter(
94 deep_inventory(this_object()), #'interactive))) //')))
Zesstra0d1bd1d2019-11-23 10:19:15 +010095 call_out("WriteRoomMessage", max(15, QueryProp(P_MSG_PROB)));
MG Mud User88f12472016-06-24 23:31:02 +020096}
97
98varargs string int_long(mixed viewer,mixed viewpoint,int flags)
99{
100 string descr, inv_descr;
Zesstraacd38ab2019-11-25 22:24:30 +0100101 string|int transparency;
MG Mud User88f12472016-06-24 23:31:02 +0200102
103 flags &= 3;
104 if( IS_LEARNER(viewer) && viewer->QueryProp( P_WANTS_TO_LEARN ) )
105 descr = "[" + object_name(ME) + "]\n";
106 else
107 descr = "";
108
109 descr += process_string(QueryProp(P_INT_LONG)||"");
110
111 // ggf. Tueren hinzufuegen.
112 if (QueryProp(P_DOOR_INFOS)) {
113 string tmp=((string)call_other(DOOR_MASTER,"look_doors"));
114 if (stringp(tmp) && sizeof(tmp))
115 descr += tmp;
116 }
117
118 // ggf. Ausgaenge hinzufuegen.
119 if ( viewer->QueryProp(P_SHOW_EXITS) && (!QueryProp(P_HIDE_EXITS)
120 || pointerp(QueryProp(P_HIDE_EXITS))) )
121 descr += GetExits(viewer) || "";
122
123 // Viewpoint (Objekt oder Objektarray) sind nicht sichtbar
124 inv_descr = (string) make_invlist(viewer, all_inventory(ME)
125 - (pointerp(viewpoint)?viewpoint:({viewpoint})) ,flags);
126
127 if ( inv_descr != "" )
128 descr += inv_descr;
129
Zesstraacd38ab2019-11-25 22:24:30 +0100130 if(environment() && (transparency=QueryProp(P_TRANSPARENT)))
MG Mud User88f12472016-06-24 23:31:02 +0200131 {
Zesstraacd38ab2019-11-25 22:24:30 +0100132 if(stringp(transparency)) descr += transparency;
MG Mud User88f12472016-06-24 23:31:02 +0200133 else descr += "Ausserhalb siehst Du:\n";
Zesstraacd38ab2019-11-25 22:24:30 +0100134
MG Mud User88f12472016-06-24 23:31:02 +0200135 descr += environment()->int_short(viewer,ME);
136 }
Zesstraacd38ab2019-11-25 22:24:30 +0100137
MG Mud User88f12472016-06-24 23:31:02 +0200138 return descr;
139}
140
141string int_short(mixed viewer,mixed viewpoint)
142{
143 string descr, inv_descr;
144
145 descr = process_string( QueryProp(P_INT_SHORT)||"");
Bugfixd6cd2e52017-02-27 18:23:42 +0100146
147 // Ist das letzte Zeichen kein Satzzeichen einen Punkt anhaengen, sonst nur
148 // den \n.
Arathorn05d41282020-01-08 22:05:02 +0100149 int i;
150 if (sizeof(descr))
151 i = descr[<1];
152
Bugfixd6cd2e52017-02-27 18:23:42 +0100153 if(i!='.' && i!='!' && i!='?')
154 descr+=".\n";
MG Mud User88f12472016-06-24 23:31:02 +0200155 else
Bugfixd6cd2e52017-02-27 18:23:42 +0100156 descr+="\n";
157
158 // Aber ggf. den Pfad fuer Magier vor dem \n einfuegen.
159 if(IS_LEARNING(viewer))
160 descr[<1..<2]=" [" + object_name(ME) + "]";
MG Mud User88f12472016-06-24 23:31:02 +0200161
162 if ( ( viewer->QueryProp(P_SHOW_EXITS)
163 || ( environment(viewer) == ME && !viewer->QueryProp(P_BRIEF) ) )
164 && (!QueryProp(P_HIDE_EXITS) || pointerp(QueryProp(P_HIDE_EXITS))) )
165 descr += GetExits(viewer) || "";
Bugfixd6cd2e52017-02-27 18:23:42 +0100166
MG Mud User88f12472016-06-24 23:31:02 +0200167 // Viewpoint (Objekt oder Objektarray) sind nicht sichtbar
168 inv_descr = (string) make_invlist( viewer, all_inventory(ME)
169 - (pointerp(viewpoint)?viewpoint:({viewpoint})) );
170
171 if ( inv_descr != "" )
172 descr += inv_descr;
173
174 return descr;
175}
176
177/** Roommessages abschalten, wenn keine Interactives mehr da sind.
178 */
179// TODO: Irgendwann das varargs loswerden, wenn in der restlichen Mudlib
180// TODO::exit() 'richtig' ueberschrieben wird.
181varargs void exit(object liv, object dest) {
182 // fall erbende Objekte das liv nicht uebergeben. Pruefung nur auf
183 // previous_object(). Wenn Magier da noch irgendwelche Spielchen mit
184 // call_other() & Co treiben, haben wir Pech gehabt, macht aber nicht viel,
185 // weil die Raummeldungen dann im naechsten callout abgeschaltet werden.
186 if (!living(liv=previous_object())) return;
187
188 object *interactives = filter(all_inventory(), #'interactive);
189 // liv wurde noch nicht bewegt, ggf. beruecksichtigen.
190 if ( !sizeof(interactives) ||
191 (interactive(liv) && sizeof(interactives) < 2) )
192 while (remove_call_out("WriteRoomMessage")!=-1);
193}
194
195static string _query_int_long() {return Query(P_INT_LONG, F_VALUE);}
196
197
Zesstra65f95a22020-01-31 15:30:37 +0100198// Querymethode fuer P_DOMAIN - gibt die Region an, in der Raum liegt.
199// Automatisch ermittelt, sofern er unter /d/ liegt...
MG Mud User88f12472016-06-24 23:31:02 +0200200static string _query_lib_p_domain()
201{
Zesstra65f95a22020-01-31 15:30:37 +0100202 // Manuell gesetztes P_DOMAIN hat Prioritaet.
203 string domain = Query(P_DOMAIN, F_VALUE);
204 if (sizeof(domain))
205 return domain;
206
MG Mud User88f12472016-06-24 23:31:02 +0200207 string fn = object_name();
208 if (strstr(fn, "/d/") == 0)
209 {
210 return capitalize(explode(fn, "/")[2]);
211 }
212
213 return "unbekannt";
214}
215
216<string|string*>* _set_harbour_name( <string|string*>* desc)
217{
218 if ( sizeof(desc)!=2 )
219 {
220 raise_error(sprintf("Unacceptable data in P_HARBOUR, sizeof() was %d, "
221 "expected 2.", sizeof(desc)));
222 }
223 else if ( !stringp(desc[0]) )
224 {
225 raise_error("Wrong data type in P_HARBOUR[0]: expected 'string'.");
226 }
227 else if ( pointerp(desc[1]) && sizeof(desc[1])<1 )
228 {
229 raise_error("Insufficient data in P_HARBOUR[1]: expected 'string*', "
230 "got '({})'.");
231 }
232 else if ( stringp(desc[1]) )
233 {
234 desc[1] = ({desc[1]});
235 }
236 return Set(P_HARBOUR, desc, F_VALUE);
237}
238