blob: 9431d319256c6aac84944dbc9c9ad973fed9a210 [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
Vanion50652322020-03-10 21:13:25 +01007#pragma strict_types
MG Mud User88f12472016-06-24 23:31:02 +02008#pragma save_types
MG Mud User88f12472016-06-24 23:31:02 +02009#pragma range_check
10#pragma no_clone
11
12inherit "/std/container/description";
13
14#define NEED_PROTOTYPES
15
16#include <properties.h>
17#include <defines.h>
18#include <wizlevels.h>
19#include <language.h>
20#include <doorroom.h>
Zesstra65f95a22020-01-31 15:30:37 +010021#include <room/description.h>
MG Mud User88f12472016-06-24 23:31:02 +020022
Zesstra65f95a22020-01-31 15:30:37 +010023protected void create()
MG Mud User88f12472016-06-24 23:31:02 +020024{
25 ::create();
26 SetProp(P_NAME, "Raum");
27 SetProp(P_INT_SHORT,"<namenloser Raum>");
28 SetProp(P_INT_LONG,0);
29 SetProp(P_ROOM_MSG, ({}) );
30 SetProp(P_FUNC_MSG, 0);
31 SetProp(P_MSG_PROB, 30);
32 AddId(({"raum", "hier"}));
33}
34
Zesstra5b71ebb2018-03-07 20:50:35 +010035public varargs void init(object origin)
MG Mud User88f12472016-06-24 23:31:02 +020036{
37 // Wenn P_ROOM_MSG gesetzt oder P_FUNC_MSG und kein Callout laeuft,
38 // Callout starten.
39 mixed roommsg = QueryProp(P_ROOM_MSG);
40 if( ( (roommsg && sizeof(roommsg)) ||
41 QueryProp(P_FUNC_MSG) ) &&
42 (find_call_out("WriteRoomMessage")==-1))
43 call_out("WriteRoomMessage", random(QueryProp(P_MSG_PROB)));
44}
45
46varargs void AddRoomMessage(string *mesg, int prob, mixed func)
47{
48 if (mesg && !pointerp(mesg))
49 raise_error(sprintf(
50 "AddRoomMessage(): wrong argument type, expected Array or 0, "
51 "got %.20O",mesg));
52
53 SetProp(P_ROOM_MSG, mesg);
54
55 if (prob>0)
56 SetProp(P_MSG_PROB, prob);
57
58 if (func)
59 SetProp(P_FUNC_MSG, func);
60}
61
62static void WriteRoomMessage()
63{
Zesstra0d1bd1d2019-11-23 10:19:15 +010064 int msgid;
MG Mud User88f12472016-06-24 23:31:02 +020065
Zesstra0d1bd1d2019-11-23 10:19:15 +010066 string *room_msg = QueryProp(P_ROOM_MSG);
67 <string|string*> func_msg = QueryProp(P_FUNC_MSG);
MG Mud User88f12472016-06-24 23:31:02 +020068 if ((!room_msg || !sizeof(room_msg)) && !func_msg)
69 return;
70
71 if (room_msg&&sizeof(room_msg))
72 {
73 msgid = random(sizeof(room_msg));
74 // Defaultwerte sind fuer Altcode schwierig
75 send_room(this_object(), room_msg[msgid],
76 MT_LOOK|MT_LISTEN|MT_FEEL|MT_SMELL|
77 MSG_DONT_STORE|MSG_DONT_BUFFER|MSG_DONT_WRAP);
78 }
79
80 if (func_msg)
81 {
Zesstra0d1bd1d2019-11-23 10:19:15 +010082 string func;
MG Mud User88f12472016-06-24 23:31:02 +020083 if (stringp(func_msg))
84 func=(string)func_msg;
85 else
86 func=func_msg[random(sizeof(func_msg))];
87 if (func && function_exists(func))
88 call_other (this_object(), func, msgid);
89 }
90
91 while (remove_call_out("WriteRoomMessage")!=-1);
MG Mud User88f12472016-06-24 23:31:02 +020092 if(this_object() && sizeof(filter(
93 deep_inventory(this_object()), #'interactive))) //')))
Zesstra0d1bd1d2019-11-23 10:19:15 +010094 call_out("WriteRoomMessage", max(15, QueryProp(P_MSG_PROB)));
MG Mud User88f12472016-06-24 23:31:02 +020095}
96
97varargs string int_long(mixed viewer,mixed viewpoint,int flags)
98{
99 string descr, inv_descr;
Zesstraacd38ab2019-11-25 22:24:30 +0100100 string|int transparency;
MG Mud User88f12472016-06-24 23:31:02 +0200101
102 flags &= 3;
103 if( IS_LEARNER(viewer) && viewer->QueryProp( P_WANTS_TO_LEARN ) )
104 descr = "[" + object_name(ME) + "]\n";
105 else
106 descr = "";
107
108 descr += process_string(QueryProp(P_INT_LONG)||"");
109
110 // ggf. Tueren hinzufuegen.
111 if (QueryProp(P_DOOR_INFOS)) {
Vanion50652322020-03-10 21:13:25 +0100112 string tmp=(({string})call_other(DOOR_MASTER,"look_doors"));
MG Mud User88f12472016-06-24 23:31:02 +0200113 if (stringp(tmp) && sizeof(tmp))
114 descr += tmp;
115 }
116
117 // ggf. Ausgaenge hinzufuegen.
118 if ( viewer->QueryProp(P_SHOW_EXITS) && (!QueryProp(P_HIDE_EXITS)
119 || pointerp(QueryProp(P_HIDE_EXITS))) )
120 descr += GetExits(viewer) || "";
121
122 // Viewpoint (Objekt oder Objektarray) sind nicht sichtbar
Vanion50652322020-03-10 21:13:25 +0100123 inv_descr = ({string}) make_invlist(viewer, all_inventory(ME)
MG Mud User88f12472016-06-24 23:31:02 +0200124 - (pointerp(viewpoint)?viewpoint:({viewpoint})) ,flags);
125
126 if ( inv_descr != "" )
127 descr += inv_descr;
128
Zesstraacd38ab2019-11-25 22:24:30 +0100129 if(environment() && (transparency=QueryProp(P_TRANSPARENT)))
MG Mud User88f12472016-06-24 23:31:02 +0200130 {
Zesstraacd38ab2019-11-25 22:24:30 +0100131 if(stringp(transparency)) descr += transparency;
MG Mud User88f12472016-06-24 23:31:02 +0200132 else descr += "Ausserhalb siehst Du:\n";
Zesstraacd38ab2019-11-25 22:24:30 +0100133
MG Mud User88f12472016-06-24 23:31:02 +0200134 descr += environment()->int_short(viewer,ME);
135 }
Zesstraacd38ab2019-11-25 22:24:30 +0100136
MG Mud User88f12472016-06-24 23:31:02 +0200137 return descr;
138}
139
140string int_short(mixed viewer,mixed viewpoint)
141{
142 string descr, inv_descr;
143
144 descr = process_string( QueryProp(P_INT_SHORT)||"");
Bugfixd6cd2e52017-02-27 18:23:42 +0100145
146 // Ist das letzte Zeichen kein Satzzeichen einen Punkt anhaengen, sonst nur
147 // den \n.
Arathorn05d41282020-01-08 22:05:02 +0100148 int i;
149 if (sizeof(descr))
150 i = descr[<1];
151
Bugfixd6cd2e52017-02-27 18:23:42 +0100152 if(i!='.' && i!='!' && i!='?')
153 descr+=".\n";
MG Mud User88f12472016-06-24 23:31:02 +0200154 else
Bugfixd6cd2e52017-02-27 18:23:42 +0100155 descr+="\n";
156
157 // Aber ggf. den Pfad fuer Magier vor dem \n einfuegen.
158 if(IS_LEARNING(viewer))
159 descr[<1..<2]=" [" + object_name(ME) + "]";
MG Mud User88f12472016-06-24 23:31:02 +0200160
161 if ( ( viewer->QueryProp(P_SHOW_EXITS)
162 || ( environment(viewer) == ME && !viewer->QueryProp(P_BRIEF) ) )
163 && (!QueryProp(P_HIDE_EXITS) || pointerp(QueryProp(P_HIDE_EXITS))) )
164 descr += GetExits(viewer) || "";
Bugfixd6cd2e52017-02-27 18:23:42 +0100165
MG Mud User88f12472016-06-24 23:31:02 +0200166 // Viewpoint (Objekt oder Objektarray) sind nicht sichtbar
Vanion50652322020-03-10 21:13:25 +0100167 inv_descr = ({string}) make_invlist( viewer, all_inventory(ME)
MG Mud User88f12472016-06-24 23:31:02 +0200168 - (pointerp(viewpoint)?viewpoint:({viewpoint})) );
169
170 if ( inv_descr != "" )
171 descr += inv_descr;
172
173 return descr;
174}
175
176/** Roommessages abschalten, wenn keine Interactives mehr da sind.
177 */
178// TODO: Irgendwann das varargs loswerden, wenn in der restlichen Mudlib
179// TODO::exit() 'richtig' ueberschrieben wird.
180varargs void exit(object liv, object dest) {
181 // fall erbende Objekte das liv nicht uebergeben. Pruefung nur auf
182 // previous_object(). Wenn Magier da noch irgendwelche Spielchen mit
183 // call_other() & Co treiben, haben wir Pech gehabt, macht aber nicht viel,
184 // weil die Raummeldungen dann im naechsten callout abgeschaltet werden.
185 if (!living(liv=previous_object())) return;
186
187 object *interactives = filter(all_inventory(), #'interactive);
188 // liv wurde noch nicht bewegt, ggf. beruecksichtigen.
189 if ( !sizeof(interactives) ||
190 (interactive(liv) && sizeof(interactives) < 2) )
191 while (remove_call_out("WriteRoomMessage")!=-1);
192}
193
194static string _query_int_long() {return Query(P_INT_LONG, F_VALUE);}
195
196
Zesstra65f95a22020-01-31 15:30:37 +0100197// Querymethode fuer P_DOMAIN - gibt die Region an, in der Raum liegt.
198// Automatisch ermittelt, sofern er unter /d/ liegt...
MG Mud User88f12472016-06-24 23:31:02 +0200199static string _query_lib_p_domain()
200{
Zesstra65f95a22020-01-31 15:30:37 +0100201 // Manuell gesetztes P_DOMAIN hat Prioritaet.
202 string domain = Query(P_DOMAIN, F_VALUE);
203 if (sizeof(domain))
204 return domain;
205
MG Mud User88f12472016-06-24 23:31:02 +0200206 string fn = object_name();
207 if (strstr(fn, "/d/") == 0)
208 {
209 return capitalize(explode(fn, "/")[2]);
210 }
211
212 return "unbekannt";
213}
214
215<string|string*>* _set_harbour_name( <string|string*>* desc)
216{
217 if ( sizeof(desc)!=2 )
218 {
219 raise_error(sprintf("Unacceptable data in P_HARBOUR, sizeof() was %d, "
220 "expected 2.", sizeof(desc)));
221 }
222 else if ( !stringp(desc[0]) )
223 {
224 raise_error("Wrong data type in P_HARBOUR[0]: expected 'string'.");
225 }
226 else if ( pointerp(desc[1]) && sizeof(desc[1])<1 )
227 {
228 raise_error("Insufficient data in P_HARBOUR[1]: expected 'string*', "
229 "got '({})'.");
230 }
231 else if ( stringp(desc[1]) )
232 {
233 desc[1] = ({desc[1]});
234 }
235 return Set(P_HARBOUR, desc, F_VALUE);
236}
237