MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | // |
| 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 | |
| 43 | inherit "/std/thing"; |
| 44 | inherit HAUSTUER; |
| 45 | |
| 46 | private nosave string text; |
| 47 | private nosave string owner; |
| 48 | |
| 49 | void 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 | |
| 78 | varargs void Save(int crunched) |
| 79 | { |
| 80 | save_object(HAUSSAVEPATH+owner); |
| 81 | } |
| 82 | |
| 83 | void Load() |
| 84 | { |
| 85 | restore_object(HAUSSAVEPATH+owner); |
| 86 | } |
| 87 | |
| 88 | void 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! |
| 102 | string 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. |
| 114 | varargs 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 |
| 130 | varargs 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 |
| 141 | string QueryOwner() { return owner; } |
| 142 | |
| 143 | private 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 |
| 154 | static 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 |
| 173 | static int |
| 174 | merktext(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 |
| 199 | static int |
| 200 | klopfen(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 |
| 225 | static int |
| 226 | beschreiben(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 |
| 275 | static int |
| 276 | aendern(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 |
| 302 | static 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 |
| 319 | static 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 | |
| 333 | int 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 | |