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