blob: d429789dc0940c8fb91252508c529396fbeacb30 [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("verbiete", "verbieten");
74 AddCmd("notiz", "merktext");
75}
76
77varargs void Save(int crunched)
78{
79 save_object(HAUSSAVEPATH+owner);
80}
81
82void Load()
83{
84 restore_object(HAUSSAVEPATH+owner);
85}
86
87void init()
88{
89 // statt im Haus landet man im Hauptraum Raum 0, sollte ansich nicht passieren
90 // da man nomalerweise nicht ins Haus sondern direkt in den Hauptraum gemoved wird
91 if (environment(this_player()) == this_object()) {
92 this_player()->move(RAUMNAME(owner,0), M_GO | M_NO_SHOW | M_SILENT);
93 return;
94 }
95 ::init();
96}
97
98// Extra fuer Boing! ;)
99// Setzt man P_SHORT des Hauses auf 0, so verschwindet es zwar aus
100// der Beschreibung des Raumes, ist aber immer noch ansprechbar!
101string short()
102{
103 string ret;
104
105 ret = ::short();
106 if (previous_object() != environment() && !ret)
107 ret ="";
108
109 return ret;
110}
111
112// Zustand der Haustuer und evtl. Notiz mit einbauen.
113varargs string long(int mode)
114{
115 string ret, door;
116
117 door = haustuer::long(mode);
118
119 ret = QueryProp(P_LONG)+door;
120 if (text) {
121 ret += break_string( "An "+name(WEM,1)+" befindet sich eine Notiz: '"+text+"'.", 75);
122 }
123 return break_string(ret, 75);
124}
125
126// Setze neuen Besitzer fuer dieses Haus
127// setzt Default-Short, -Long und Id fuer neuen Besitzer,
128// leitet Besitzer an Haustuer weiter und laedt den Hauptraum
129varargs string SetOwner(string o)
130{
131 SetProp(P_SHORT, "Das Haus von "+capitalize(o));
132 SetProp(P_LONG, "Das Haus von "+capitalize(o)+", es sieht sehr nach einem Rohbau aus.\n");
133 AddId( ({ "\n"+o+"haus", "haus von "+o }) );
134 haustuer::SetTuerOwner(o);
135 load_object(RAUMNAME(o,0));
136 return owner = o;
137}
138
139// liefert den Name des Haus-Besitzers
140string QueryOwner() { return owner; }
141
142private int tp_ownercheck()
143{
144 if(getuid(this_player()) != owner)
145 {
146 notify_fail( "Das ist nicht Dein Haus!\n" );
147 return 0;
148 }
149 return 1;
150}
151
152// Aktion zum Betreten
153static int betritt(string str)
154{
155 notify_fail("Was moechtest Du betreten?\n");
156
157 // Haus war nicht angesprochen
158 if (!str || !id(str))
159 return 0;
160
161 // Haustuer ist zu
162 if (Query(H_DOORSTAT) & D_CLOSED) {
163 printf("%s von %s ist zu.\n", capitalize(name(WER,1)), capitalize(owner));
164 return 1;
165 }
166 // bewege Spieler in Hauptraum
167 this_player()->move(RAUMNAME(owner,0), M_GO, 0, "betritt "+name(WEN,1), "kommt herein");
168 return 1;
169}
170
171// Aktion zum Setzen/Loeschen von Notizen am Haus
172static int
173merktext(string str)
174{
175 // darf der Spieler das, d.h. ist das sein Haus?
176 if(!tp_ownercheck())
177 {
178 notify_fail( "Du kannst keine Notiz an "+capitalize(name(WEM,1))+" von "+capitalize(owner)+" anbringen!\n" );
179 return 0;
180 }
181
182 str = this_player()->_unparsed_args();
183
184 // kein Text => Notiz loeschen, ansonsten => Text als Notiz setzen
185 if (!str || str == "") {
186 write( "OK, Notiz ist geloescht.\n" );
187 text = 0;
188 }
189 else {
190 write( "OK, Notiz lautet '"+str+"'\n");
191 text = str;
192 }
193
194 return 1;
195}
196
197// Aktion Anklopfen am Haus
198static int
199klopfen(string str)
200{
201 int i;
202 object room;
203
204 notify_fail( "Syntax: klopfe an <haus> an\n" );
205 // parsen von klopfe an <haus> an
206 if (!str || sscanf(str, "an %s an", str) != 1)
207 return 0;
208
209 if (str == "tuer" || str == "haustuer" || id(str)) {
210 // Meldungen an Spieler und Raum
211 printf( "Du klopfst an "+name(WEM,1)+" von "+capitalize(owner)+" an.\n");
212 say( capitalize(this_player()->name(WER))+" klopft an "+name(WEM,1)+" von "+capitalize(owner)+" an.\n" );
213 // in allen geladenen Raeumen Klopfen melden
214 for (i=VERWALTER->HausProp(owner,HP_ROOMS); i>=0; i--) {
215 if (room = find_object(RAUMNAME(owner,i)))
216 tell_room(room, "Du hoerst, wie jemand an der Haustuer anklopft.\n" );
217 }
218 return 1;
219 }
220 return 0;
221}
222
223// Aktion Tuer/Haus beschreiben
224static int
225beschreiben(string str)
226{
227 string *p, *ds;
228
229 // darf der Spieler das, d.h. ist das sein Haus?
230 if (!tp_ownercheck())
231 return 0;
232
233 notify_fail( "Hier draussen funktioniert nur 'beschreibe <haus> lang',\n"
234 +"'beschreibe haustuer' oder 'beschreibe tuerzustand'!\n");
235
236 // zu wenig Eingabe zum Parsen
237 if (!str || str == "")
238 return 0;
239
240 p = old_explode(str," ");
241
242 if (p[0] == "tuer" || p[0] == "haustuer") {
243 // beschreibe (haus)tuer
244 write( "Beschreibung der Haustuer angeben. Es ist nur eine Zeile moeglich.\n"
245 +"Als Platzhalter fuer den Zustand der Tuer dient %s. Falls die Tuer\n"
246 +"nicht in der Langebschreibung des Hauses auftauchen soll, bitte ein-\n"
247 +"fach nur <RETURN> druecken.\n]" );
248 input_to("doorDesc");
249 return 1;
250 }
251 else if (p[0] == "tuerzustand") {
252 // beschreibe tuerzustand
253 ds = Query(H_DOORLSTAT);
254 write( "Beschreibung des Tuerzustandes angeben. Es ist nur eine Zeile moeg-\n"
255 +"lich. Die Zustaende muessen durch Kommata getrennt in der Reihen-\n"
256 +"folge 'offen', 'geschlossen', 'abgeschlossen' angegeben werden.\n"
257 +"Momentaner Zustand:\n");
258 printf("'%s', '%s', '%s'.\n", ds[0], ds[1], ds[3]);
259 write( "(Abbruch: Einfach <RETURN> druecken!)\n]");
260 input_to("doorLDesc");
261 return 1;
262 }
263 else if (p[<1] == "lang" && id(implode(p[0..<2]," "))) {
264 object home = load_object(RAUMNAME(owner,0));
265 // beschreibe <haus> lang
266 home->beschreiben("haus lang", AUSSEN);
267 return 1;
268 }
269 // Eingabe Syntax nicht passend => notify_fail von oben
270 return 0;
271}
272
273// Aktion Haus Aendern
274static int
275aendern(string str)
276{
277 string *p, *ds;
278
279 // Darf der Spieler das, d.h. ist das sein Haus?
280 if (!tp_ownercheck())
281 return 0;
282
283 notify_fail( "Hier draussen funktioniert nur 'aendere <haus> lang'!\n");
284 // zu wenig Eingabe zum Parsen
285 if (!str || str == "")
286 return 0;
287
288 p = old_explode(str," ");
289
290 if (p[<1] == "lang" && id(implode(p[0..<2]," "))) {
291 object home = load_object(RAUMNAME(owner,0));
292 // aendere <haus> lang
293 home->aendern("haus lang", AUSSEN);
294 return 1;
295 }
296 // Eingabe Syntax nicht passend => notify_fail von oben
297 return 0;
298}
299
300// input_to zu beschreibe (haus)tuer
301static void doorDesc(string str)
302{
303 if (!str)
304 str = "";
305 if (sizeof(str))
306 str += "\n";
307
308 Set(H_DOOR, str);
309 Save();
310
311 if (str == "")
312 write("OK, Haustuer wurde geloescht.\n");
313 else
314 write("OK, Beschreibung der Haustuer wurde gesetzt.\n");
315}
316
317// input_to zu beschreibe tuerzustand
318static void doorLDesc(string str)
319{
320 string *s;
321
322 if (!str || sizeof(s=old_explode(str, ","))!=3) {
323 write("ABBRUCH!\nNichts geaendert!\n");
324 return;
325 }
326 Set(H_DOORLSTAT, ({ s[0], s[1], 0, s[2] }));
327 printf("OK, Tuerzustaende sehen wie folgt aus:\n'%s', '%s', '%s'.\n",
328 s[0], s[1], s[2]);
329 Save();
330}
331
332int SmartLog(string ofile, string typ, string msg, string date)
333{
334 object home;
335 string foo, bar;
336
337 string hn=RAUMNAME(owner,0);
338
339 write_file(REPFILE(owner), sprintf("%s von %s vor dem Haus (%s):\n%s\n",
340 typ,
341 capitalize(getuid(this_player())),
342 date,
343 break_string(msg,78)));
344
345 if (IS_LEARNER(owner)) {
346 log_file("report/"+owner+".rep",
347 sprintf("MELDUNG von %s im Seherhaus, vor dem Haus (%s):\n"
348 +"Bitte zur Kenntnis nehmen! (Mit dem Befehl 'meldungen') -Wargon\n",
349 capitalize(getuid(this_player())),
350 date));
351 }
352
353 home = load_object(hn);
354 home->Set(H_REPORT, home->Query(H_REPORT)+1);
355 home->Save();
356
357 return 1;
358}
359
360