//
//  haus.c  -- Das Rohgeruest eines Seherhauses.
//
//  Grundobjekt (c) 1994 Boing@MorgenGrauen
//  Abschliessen und Rauswerfen von Jof
//  Fuer Aenderungen ab dem 06.10.94 verantwortlich: Wargon
//
// $Date: 1996/02/21 18:09:55 $
// $Revision: 2.8 $
/* $Log: haus.c,v $
 * Revision 2.8  1996/02/21  18:09:55  Wargon
 * SmartLog() fuer Rueckmeldungen eingebaut.
 *
 * Revision 2.7  1995/07/06  11:18:07  Wargon
 * Langbeschreibung aenderbar.
 *
 * Revision 2.6  1995/04/21  10:48:20  Wargon
 * Bugfix in "beschreibe tuerstatus".
 *
 * Revision 2.5  1995/04/21  08:56:55  Wargon
 * Haustuer ausgelagert.
 * 'beschreibe tuerzustand' ist dazugekommen.
 *
 * Revision 2.4  1995/02/27  20:47:32  Wargon
 * Diverse Bugs gefixed...
 *
 * Revision 2.2  1995/02/15  11:19:17  Wargon
 * Die Haustuer kann jetzt auch beschrieben werden (H_DOOR).
 *
 * Revision 2.1  1995/02/04  14:51:14  Wargon
 * Statt "Haus" wird weitestgehend name() verwendet.
 *
 * Revision 2.0  1995/02/01  20:40:26  Wargon
 * Das Haus ist jetzt nur noch ein Objekt in einem Raum, nicht
 * mehr ein Raum im Raum.
 *
 */
#include "haus.h"
#include <properties.h>
#include <moving.h>
#include <wizlevels.h>

inherit "/std/thing";
inherit HAUSTUER;

private nosave string text;
private nosave string owner;

void create()
{
  if (!clonep(this_object())) return;

  thing::create();
  haustuer::create();

  SetProp(P_NAME, ({ "Haus", "Hauses", "Haus", "Haus" }));
  SetProp(P_IDS, ({"haus","sehe\rhaus"}));
  SetProp(P_GENDER, NEUTER);
  SetProp(P_NOGET,1);

  Set(P_LONG, SAVE, F_MODE);
  Set(P_SHORT, SAVE, F_MODE);
  Set(P_IDS, SAVE, F_MODE);
  Set(P_GENDER, SAVE, F_MODE);
  Set(P_NAME, SAVE, F_MODE);

  text = 0;

  AddCmd( ({"betritt", "betrete"}), "betritt" );
  AddCmd( ({"beschreib", "beschreibe"}), "beschreiben");
  AddCmd( ({"aender", "aendere"}), "aendern");
  AddCmd( ({"klopf","klopfe"}), "klopfen");
  AddCmd("notiz", "merktext");
}

varargs void Save(int crunched)
{
  save_object(HAUSSAVEPATH+owner);
}

void Load()
{
  restore_object(HAUSSAVEPATH+owner);
}

void init()
{
  // statt im Haus landet man im Hauptraum Raum 0, sollte ansich nicht passieren
  // da man nomalerweise nicht ins Haus sondern direkt in den Hauptraum gemoved wird
  if (environment(this_player()) == this_object()) {
    this_player()->move(RAUMNAME(owner,0), M_GO | M_NO_SHOW | M_SILENT);
    return;
  }
  ::init();
}

// Extra fuer Boing! ;)
// Setzt man P_SHORT des Hauses auf 0, so verschwindet es zwar aus
// der Beschreibung des Raumes, ist aber immer noch ansprechbar!
string short()
{
  string ret;

  ret = ::short();
  if (previous_object() != environment() && !ret)
    ret ="";

  return ret;
}

// Zustand der Haustuer und evtl. Notiz mit einbauen.
varargs string long(int mode)
{
  string ret, door;

  door = haustuer::long(mode);

  ret = QueryProp(P_LONG)+door;
  if (text) {
    ret += break_string( "An "+name(WEM,1)+" befindet sich eine Notiz: '"+text+"'.", 75);
  }
  return break_string(ret, 75);
}

// Setze neuen Besitzer fuer dieses Haus
// setzt Default-Short, -Long und Id fuer neuen Besitzer,
// leitet Besitzer an Haustuer weiter und laedt den Hauptraum
varargs string SetOwner(string o)
{
  SetProp(P_SHORT, "Das Haus von "+capitalize(o));
  SetProp(P_LONG, "Das Haus von "+capitalize(o)+", es sieht sehr nach einem Rohbau aus.\n");
  AddId( ({ "\n"+o+"haus", "haus von "+o }) );
  haustuer::SetTuerOwner(o);
  load_object(RAUMNAME(o,0));
  return owner = o;
}

// liefert den Name des Haus-Besitzers
varargs string QueryOwner(int withNr) { return owner; }

private int tp_ownercheck()
{
  if(getuid(this_player()) != owner)
  {
    notify_fail( "Das ist nicht Dein Haus!\n" );
    return 0;
  }
  return 1;
}

// Aktion zum Betreten
static int betritt(string str)
{
  notify_fail("Was moechtest Du betreten?\n");

  // Haus war nicht angesprochen
  if (!str || !id(str))
    return 0;

  // Haustuer ist zu
  if (Query(H_DOORSTAT) & D_CLOSED) {
    printf("%s von %s ist zu.\n", capitalize(name(WER,1)), capitalize(owner));
    return 1;
  }
  // bewege Spieler in Hauptraum
  this_player()->move(RAUMNAME(owner,0), M_GO, 0, "betritt "+name(WEN,1), "kommt herein");
  return 1;
}

// Aktion zum Setzen/Loeschen von Notizen am Haus
static int
merktext(string str)
{
  // darf der Spieler das, d.h. ist das sein Haus?
  if(!tp_ownercheck())
  {
    notify_fail( "Du kannst keine Notiz an "+capitalize(name(WEM,1))+" von "+capitalize(owner)+" anbringen!\n" );
    return 0;
  }

  str = this_player()->_unparsed_args();

  // kein Text => Notiz loeschen, ansonsten => Text als Notiz setzen
  if (!str || str == "") {
    write( "OK, Notiz ist geloescht.\n" );
    text = 0;
  }
  else {
    write( "OK, Notiz lautet '"+str+"'\n");
    text = str;
  }

  return 1;
}

// Aktion Anklopfen am Haus
static int
klopfen(string str)
{
  int i;
  object room;

  notify_fail( "Syntax: klopfe an <haus> an\n" );
  // parsen von klopfe an <haus> an
  if (!str || sscanf(str, "an %s an", str) != 1)
    return 0;

  if (str == "tuer" || str == "haustuer" || id(str)) {
    // Meldungen an Spieler und Raum
    printf( "Du klopfst an "+name(WEM,1)+" von "+capitalize(owner)+" an.\n");
    say( capitalize(this_player()->name(WER))+" klopft an "+name(WEM,1)+" von "+capitalize(owner)+" an.\n" );
    // in allen geladenen Raeumen Klopfen melden
    for (i=VERWALTER->HausProp(owner,HP_ROOMS); i>=0; i--) {
      if (room = find_object(RAUMNAME(owner,i)))
	tell_room(room, "Du hoerst, wie jemand an der Haustuer anklopft.\n" );
    }
    return 1;
  }
  return 0;
}

// Aktion Tuer/Haus beschreiben
static int
beschreiben(string str)
{
  string *p, *ds;

  // darf der Spieler das, d.h. ist das sein Haus?
  if (!tp_ownercheck())
    return 0;

  notify_fail( "Hier draussen funktioniert nur 'beschreibe <haus> lang',\n"
	      +"'beschreibe haustuer' oder 'beschreibe tuerzustand'!\n");

  // zu wenig Eingabe zum Parsen
  if (!str || str == "")
    return 0;

  p = old_explode(str," ");

  if (p[0] == "tuer" || p[0] == "haustuer") {
    // beschreibe (haus)tuer
    write( "Beschreibung der Haustuer angeben. Es ist nur eine Zeile moeglich.\n"
	  +"Als Platzhalter fuer den Zustand der Tuer dient %s. Falls die Tuer\n"
	  +"nicht in der Langebschreibung des Hauses auftauchen soll, bitte ein-\n"
	  +"fach nur <RETURN> druecken.\n]" );
    input_to("doorDesc");
    return 1;
  }
  else if (p[0] == "tuerzustand") {
    // beschreibe tuerzustand
    ds = Query(H_DOORLSTAT);
    write( "Beschreibung des Tuerzustandes angeben. Es ist nur eine Zeile moeg-\n"
	  +"lich. Die Zustaende muessen durch Kommata getrennt in der Reihen-\n"
	  +"folge 'offen', 'geschlossen', 'abgeschlossen' angegeben werden.\n"
	  +"Momentaner Zustand:\n");
    printf("'%s', '%s', '%s'.\n", ds[0], ds[1], ds[3]);
    write( "(Abbruch: Einfach <RETURN> druecken!)\n]");
    input_to("doorLDesc");
    return 1;
  }
  else if (p[<1] == "lang" && id(implode(p[0..<2]," "))) {
    object home = load_object(RAUMNAME(owner,0));
    // beschreibe <haus> lang
    home->beschreiben("haus lang", AUSSEN);
    return 1;
  }
  // Eingabe Syntax nicht passend => notify_fail von oben
  return 0;
}

// Aktion Haus Aendern
static int
aendern(string str)
{
  string *p, *ds;

  // Darf der Spieler das, d.h. ist das sein Haus?
  if (!tp_ownercheck())
    return 0;

  notify_fail( "Hier draussen funktioniert nur 'aendere <haus> lang'!\n");
  // zu wenig Eingabe zum Parsen
  if (!str || str == "")
    return 0;

  p = old_explode(str," ");

  if (p[<1] == "lang" && id(implode(p[0..<2]," "))) {
    object home = load_object(RAUMNAME(owner,0));
    // aendere <haus> lang
    home->aendern("haus lang", AUSSEN);
    return 1;
  }
  // Eingabe Syntax nicht passend => notify_fail von oben
  return 0; 
}

// input_to zu beschreibe (haus)tuer
static void doorDesc(string str)
{
  if (!str)
    str = "";
  if (sizeof(str))
    str += "\n";

  Set(H_DOOR, str);
  Save();

  if (str == "")
    write("OK, Haustuer wurde geloescht.\n");
  else
    write("OK, Beschreibung der Haustuer wurde gesetzt.\n");
}

// input_to zu beschreibe tuerzustand
static void doorLDesc(string str)
{
  string *s;

  if (!str || sizeof(s=old_explode(str, ","))!=3) {
    write("ABBRUCH!\nNichts geaendert!\n");
    return;
  }
  Set(H_DOORLSTAT, ({ s[0], s[1], 0, s[2] }));
  printf("OK, Tuerzustaende sehen wie folgt aus:\n'%s', '%s', '%s'.\n",
	 s[0], s[1], s[2]);
  Save();
}

int SmartLog(string ofile, string typ, string msg, string date)
{
  object home;
  string foo, bar;
  
  string hn=RAUMNAME(owner,0);

  write_file(REPFILE(owner), sprintf("%s von %s vor dem Haus (%s):\n%s\n",
				     typ,
				     capitalize(getuid(this_player())),
				     date,
				     break_string(msg,78)));

  if (IS_LEARNER(owner)) {
    log_file("report/"+owner+".rep",
	     sprintf("MELDUNG von %s im Seherhaus, vor dem Haus (%s):\n"
		     +"Bitte zur Kenntnis nehmen! (Mit dem Befehl 'meldungen')  -Wargon\n",
		     capitalize(getuid(this_player())),
		     date));
  }

  home = load_object(hn);
  home->Set(H_REPORT, home->Query(H_REPORT)+1);
  home->Save();

  return 1;
}


