blob: c34d279da1e6320252f2d33061b1084d9d0283e3 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001//
2// haus.c -- Das Rohgeruest eines Seherhauses.
3//
4// Grundobjekt (c) 1994 Boing@MorgenGrauen
5// Abschliessen und Rauswerfen von Jof
6// Fuer Aenderungen ab dem 06.10.94 verantwortlich: Wargon
7//
8// $Date: 1996/02/21 18:09:55 $
9// $Revision: 2.8 $
10/* $Log: haus.c,v $
11 * Revision 2.8 1996/02/21 18:09:55 Wargon
12 * SmartLog() fuer Rueckmeldungen eingebaut.
13 *
14 * Revision 2.7 1995/07/06 11:18:07 Wargon
15 * Langbeschreibung aenderbar.
16 *
17 * Revision 2.6 1995/04/21 10:48:20 Wargon
18 * Bugfix in "beschreibe tuerstatus".
19 *
20 * Revision 2.5 1995/04/21 08:56:55 Wargon
21 * Haustuer ausgelagert.
22 * 'beschreibe tuerzustand' ist dazugekommen.
23 *
24 * Revision 2.4 1995/02/27 20:47:32 Wargon
25 * Diverse Bugs gefixed...
26 *
27 * Revision 2.2 1995/02/15 11:19:17 Wargon
28 * Die Haustuer kann jetzt auch beschrieben werden (H_DOOR).
29 *
30 * Revision 2.1 1995/02/04 14:51:14 Wargon
31 * Statt "Haus" wird weitestgehend name() verwendet.
32 *
33 * Revision 2.0 1995/02/01 20:40:26 Wargon
34 * Das Haus ist jetzt nur noch ein Objekt in einem Raum, nicht
35 * mehr ein Raum im Raum.
36 *
37 */
38#include "haus.h"
39#include <properties.h>
40#include <moving.h>
41#include <wizlevels.h>
42
43inherit "/std/thing";
44inherit HAUSTUER;
45
46private nosave string text;
47private nosave string owner;
48
49void create()
50{
51 if (!clonep(this_object())) return;
52
53 thing::create();
54 haustuer::create();
55
56 SetProp(P_NAME, ({ "Haus", "Hauses", "Haus", "Haus" }));
57 SetProp(P_IDS, ({"haus","sehe\rhaus"}));
58 SetProp(P_GENDER, NEUTER);
59 SetProp(P_NOGET,1);
60
61 Set(P_LONG, SAVE, F_MODE);
62 Set(P_SHORT, SAVE, F_MODE);
63 Set(P_IDS, SAVE, F_MODE);
64 Set(P_GENDER, SAVE, F_MODE);
65 Set(P_NAME, SAVE, F_MODE);
66
67 text = 0;
68
69 AddCmd( ({"betritt", "betrete"}), "betritt" );
70 AddCmd( ({"beschreib", "beschreibe"}), "beschreiben");
71 AddCmd( ({"aender", "aendere"}), "aendern");
72 AddCmd( ({"klopf","klopfe"}), "klopfen");
MG Mud User88f12472016-06-24 23:31:02 +020073 AddCmd("notiz", "merktext");
74}
75
76varargs void Save(int crunched)
77{
78 save_object(HAUSSAVEPATH+owner);
79}
80
81void Load()
82{
83 restore_object(HAUSSAVEPATH+owner);
84}
85
86void init()
87{
88 // statt im Haus landet man im Hauptraum Raum 0, sollte ansich nicht passieren
89 // da man nomalerweise nicht ins Haus sondern direkt in den Hauptraum gemoved wird
90 if (environment(this_player()) == this_object()) {
91 this_player()->move(RAUMNAME(owner,0), M_GO | M_NO_SHOW | M_SILENT);
92 return;
93 }
94 ::init();
95}
96
97// Extra fuer Boing! ;)
98// Setzt man P_SHORT des Hauses auf 0, so verschwindet es zwar aus
99// der Beschreibung des Raumes, ist aber immer noch ansprechbar!
100string short()
101{
102 string ret;
103
104 ret = ::short();
105 if (previous_object() != environment() && !ret)
106 ret ="";
107
108 return ret;
109}
110
111// Zustand der Haustuer und evtl. Notiz mit einbauen.
112varargs string long(int mode)
113{
114 string ret, door;
115
116 door = haustuer::long(mode);
117
118 ret = QueryProp(P_LONG)+door;
119 if (text) {
120 ret += break_string( "An "+name(WEM,1)+" befindet sich eine Notiz: '"+text+"'.", 75);
121 }
122 return break_string(ret, 75);
123}
124
125// Setze neuen Besitzer fuer dieses Haus
126// setzt Default-Short, -Long und Id fuer neuen Besitzer,
127// leitet Besitzer an Haustuer weiter und laedt den Hauptraum
128varargs string SetOwner(string o)
129{
130 SetProp(P_SHORT, "Das Haus von "+capitalize(o));
131 SetProp(P_LONG, "Das Haus von "+capitalize(o)+", es sieht sehr nach einem Rohbau aus.\n");
132 AddId( ({ "\n"+o+"haus", "haus von "+o }) );
133 haustuer::SetTuerOwner(o);
134 load_object(RAUMNAME(o,0));
135 return owner = o;
136}
137
138// liefert den Name des Haus-Besitzers
Zesstraf57c62e2017-06-17 22:46:29 +0200139varargs string QueryOwner(int withNr) { return owner; }
MG Mud User88f12472016-06-24 23:31:02 +0200140
141private int tp_ownercheck()
142{
143 if(getuid(this_player()) != owner)
144 {
145 notify_fail( "Das ist nicht Dein Haus!\n" );
146 return 0;
147 }
148 return 1;
149}
150
151// Aktion zum Betreten
152static int betritt(string str)
153{
154 notify_fail("Was moechtest Du betreten?\n");
155
156 // Haus war nicht angesprochen
157 if (!str || !id(str))
158 return 0;
159
160 // Haustuer ist zu
161 if (Query(H_DOORSTAT) & D_CLOSED) {
162 printf("%s von %s ist zu.\n", capitalize(name(WER,1)), capitalize(owner));
163 return 1;
164 }
165 // bewege Spieler in Hauptraum
166 this_player()->move(RAUMNAME(owner,0), M_GO, 0, "betritt "+name(WEN,1), "kommt herein");
167 return 1;
168}
169
170// Aktion zum Setzen/Loeschen von Notizen am Haus
171static int
172merktext(string str)
173{
174 // darf der Spieler das, d.h. ist das sein Haus?
175 if(!tp_ownercheck())
176 {
177 notify_fail( "Du kannst keine Notiz an "+capitalize(name(WEM,1))+" von "+capitalize(owner)+" anbringen!\n" );
178 return 0;
179 }
180
181 str = this_player()->_unparsed_args();
182
183 // kein Text => Notiz loeschen, ansonsten => Text als Notiz setzen
184 if (!str || str == "") {
185 write( "OK, Notiz ist geloescht.\n" );
186 text = 0;
187 }
188 else {
189 write( "OK, Notiz lautet '"+str+"'\n");
190 text = str;
191 }
192
193 return 1;
194}
195
196// Aktion Anklopfen am Haus
197static int
198klopfen(string str)
199{
200 int i;
201 object room;
202
203 notify_fail( "Syntax: klopfe an <haus> an\n" );
204 // parsen von klopfe an <haus> an
205 if (!str || sscanf(str, "an %s an", str) != 1)
206 return 0;
207
208 if (str == "tuer" || str == "haustuer" || id(str)) {
209 // Meldungen an Spieler und Raum
210 printf( "Du klopfst an "+name(WEM,1)+" von "+capitalize(owner)+" an.\n");
211 say( capitalize(this_player()->name(WER))+" klopft an "+name(WEM,1)+" von "+capitalize(owner)+" an.\n" );
212 // in allen geladenen Raeumen Klopfen melden
213 for (i=VERWALTER->HausProp(owner,HP_ROOMS); i>=0; i--) {
214 if (room = find_object(RAUMNAME(owner,i)))
215 tell_room(room, "Du hoerst, wie jemand an der Haustuer anklopft.\n" );
216 }
217 return 1;
218 }
219 return 0;
220}
221
222// Aktion Tuer/Haus beschreiben
223static int
224beschreiben(string str)
225{
226 string *p, *ds;
227
228 // darf der Spieler das, d.h. ist das sein Haus?
229 if (!tp_ownercheck())
230 return 0;
231
232 notify_fail( "Hier draussen funktioniert nur 'beschreibe <haus> lang',\n"
233 +"'beschreibe haustuer' oder 'beschreibe tuerzustand'!\n");
234
235 // zu wenig Eingabe zum Parsen
236 if (!str || str == "")
237 return 0;
238
239 p = old_explode(str," ");
240
241 if (p[0] == "tuer" || p[0] == "haustuer") {
242 // beschreibe (haus)tuer
243 write( "Beschreibung der Haustuer angeben. Es ist nur eine Zeile moeglich.\n"
244 +"Als Platzhalter fuer den Zustand der Tuer dient %s. Falls die Tuer\n"
245 +"nicht in der Langebschreibung des Hauses auftauchen soll, bitte ein-\n"
246 +"fach nur <RETURN> druecken.\n]" );
247 input_to("doorDesc");
248 return 1;
249 }
250 else if (p[0] == "tuerzustand") {
251 // beschreibe tuerzustand
252 ds = Query(H_DOORLSTAT);
253 write( "Beschreibung des Tuerzustandes angeben. Es ist nur eine Zeile moeg-\n"
254 +"lich. Die Zustaende muessen durch Kommata getrennt in der Reihen-\n"
255 +"folge 'offen', 'geschlossen', 'abgeschlossen' angegeben werden.\n"
256 +"Momentaner Zustand:\n");
257 printf("'%s', '%s', '%s'.\n", ds[0], ds[1], ds[3]);
258 write( "(Abbruch: Einfach <RETURN> druecken!)\n]");
259 input_to("doorLDesc");
260 return 1;
261 }
262 else if (p[<1] == "lang" && id(implode(p[0..<2]," "))) {
263 object home = load_object(RAUMNAME(owner,0));
264 // beschreibe <haus> lang
265 home->beschreiben("haus lang", AUSSEN);
266 return 1;
267 }
268 // Eingabe Syntax nicht passend => notify_fail von oben
269 return 0;
270}
271
272// Aktion Haus Aendern
273static int
274aendern(string str)
275{
276 string *p, *ds;
277
278 // Darf der Spieler das, d.h. ist das sein Haus?
279 if (!tp_ownercheck())
280 return 0;
281
282 notify_fail( "Hier draussen funktioniert nur 'aendere <haus> lang'!\n");
283 // zu wenig Eingabe zum Parsen
284 if (!str || str == "")
285 return 0;
286
287 p = old_explode(str," ");
288
289 if (p[<1] == "lang" && id(implode(p[0..<2]," "))) {
290 object home = load_object(RAUMNAME(owner,0));
291 // aendere <haus> lang
292 home->aendern("haus lang", AUSSEN);
293 return 1;
294 }
295 // Eingabe Syntax nicht passend => notify_fail von oben
296 return 0;
297}
298
299// input_to zu beschreibe (haus)tuer
300static void doorDesc(string str)
301{
302 if (!str)
303 str = "";
304 if (sizeof(str))
305 str += "\n";
306
307 Set(H_DOOR, str);
308 Save();
309
310 if (str == "")
311 write("OK, Haustuer wurde geloescht.\n");
312 else
313 write("OK, Beschreibung der Haustuer wurde gesetzt.\n");
314}
315
316// input_to zu beschreibe tuerzustand
317static void doorLDesc(string str)
318{
319 string *s;
320
321 if (!str || sizeof(s=old_explode(str, ","))!=3) {
322 write("ABBRUCH!\nNichts geaendert!\n");
323 return;
324 }
325 Set(H_DOORLSTAT, ({ s[0], s[1], 0, s[2] }));
326 printf("OK, Tuerzustaende sehen wie folgt aus:\n'%s', '%s', '%s'.\n",
327 s[0], s[1], s[2]);
328 Save();
329}
330
331int SmartLog(string ofile, string typ, string msg, string date)
332{
333 object home;
334 string foo, bar;
335
336 string hn=RAUMNAME(owner,0);
337
338 write_file(REPFILE(owner), sprintf("%s von %s vor dem Haus (%s):\n%s\n",
339 typ,
340 capitalize(getuid(this_player())),
341 date,
342 break_string(msg,78)));
343
344 if (IS_LEARNER(owner)) {
345 log_file("report/"+owner+".rep",
346 sprintf("MELDUNG von %s im Seherhaus, vor dem Haus (%s):\n"
347 +"Bitte zur Kenntnis nehmen! (Mit dem Befehl 'meldungen') -Wargon\n",
348 capitalize(getuid(this_player())),
349 date));
350 }
351
352 home = load_object(hn);
353 home->Set(H_REPORT, home->Query(H_REPORT)+1);
354 home->Save();
355
356 return 1;
357}
358
359