// This file is part of UNItopia Mudlib.
// ----------------------------------------------------------------
// File:        /room/bsp/bsp9.c
// Description: Einfuehrungskurs - Raum 9
// Author:      Unbekannt.
// Modified by:

inherit "/i/room";

void reset() {
   object truhe, taler;

//	Bei Bedarf die Truhe erzeugen. Falls natuerlich ein Spieler die Truhe
//	entdeckt, oeffnet, das Geld herausnimmt aber die Truhe hier liegen
//	laesst, gibts kein neues Geld.....
   if (!present("francis_truhe",this_object()))
   {
      truhe = clone_object("/obj/truhe");
//	Das Klonen der Truhe

      truhe->add_id("francis_truhe");
//	Wir geben der Truhe eine (hoffentlich) eindeutige Id, damit sie vom
//	present(..) nicht mit anderen Truhen verwechselt werden kann.

      truhe->set_owner_name("francis");
//	set_owner_name(..) erzeugt eine Inschrift auf dem Deckel der Truhe.

      truhe->move(this_object());
//	Nach dem Clonen hat die Truhe KEINE Umgebung; holen wir sie mal her.

      truhe->set_hidden_until_next_move();
//	Die Truhe soll 'versteckt' sein, dass heisst Sie wird beim Auflisten
//	des Inhaltes des Raumes NICHT mit angezeigt ! Dies soll aber nur
//	solange gelten, bis ein Spieler die Truhe aufnimmt
//	(Intern ruft set_hidden_until_next_move() 
//	 die Funktion set_invis(..) auf).

      taler = clone_object("/obj/money");
//	Nun fuellen wir die Truhe mit etwas Geld

//	Es sollen mindestens 200 Kronen und maximal 599 Kronen drinliegen.
//	random(x) liefert eine Zufallszahl zwischen 0 und x-1 zurueck.
//	Dazu wird der Waehrungsname im Singular (1 Krone) angeben.
//	(Alle weiteren Informationen zu dieser Waehrung werden dann von der
//	Zentralbank abgefragt, braucht hier also nicht angegeben werden.)
      taler->init_money(200 + random(400), "krone");

      taler->move(truhe);
//	Und rein damit in die Truhe.


//	Nach dem Clonen sind Truhen offen. Wir muessen sie also noch schliessen.
//	Uebrigens kann man in geschlossene Gegenstaende nichts hineinlegen oder 
//	etwas aus ihnen herausholen, auch NICHT mit move(..) !!!
//	Oeffnen geht mit: truhe->open_con();
      truhe->close_con();
   }
// end if (truhe im Raum)
}


string busch_funktion(string str)
{
//	Und hier ist die Routine, die spaeter in add_v_item benutzt wird
//	Diese Routine muss vor dem add_v_item stehen, damit sie gefunden wird.

   object truhe;

   truhe = present("francis_truhe",this_object());
//	Ist die Truhe ueberhaupt noch da und noch 'versteckt' ?
//	Versteckte und unsichtbare Objekte erkennt man daran, dass query_invis()
//	eine Zahl ungleich 0 zurueckliefert. Naeheres findet man bei der 
//	Beschreibung der Funktion set_invis().
   if(truhe && truhe->query_invis())
      return
	"Der Busch hat lange spitze Dornen und dicke, "
	"dunkelgruene Blaetter, aber\n"
	"dein Blick wird sofort von einer im Busch"
	" verborgenen Truhe gefesselt.\n";
    return
      "Der Busch hat lange spitze Dornen und dicke dunkelgruene Blaetter;\n"
      "im Schatten seiner duerren Zweige gaehnt ein groesseres Loch.\n"
      "Offensichtlich war hier etwas versteckt.\n";
}

void create()
{
    set_short("Beispielraum Nr. 9");

    set_long(
"Du bist im Beispielraum Nr. 9. Hier wird ein Objekt 'versteckt', so dass "
"Spieler es nicht sofort sehen, sondern erst danach suchen muessen. "
"Man sieht hier einen Felsen, auf dem ein Busch waechst, in dem eine Truhe "
"versteckt ist.\n"
"Mit 'zinhalt hier' bekommst Du eine Liste des gesamten Inhalts des Raumes "
"einschliesslich Dir selbst. Die Truhe wird hierbei in runden Klammern "
"angezeigt, das bedeutet sie ist unsichtbar bzw versteckt.");

    set_exits(({ "bsp8" }), ({ "osten" })); 

//	Und nun kommt der Clou des ganzen. Die Truhe kann man natuerlich nur
//	finden, wenn irgendwo im Raum ein Hinweis auf sie zu finden ist.
//	Wenn die Truhe aber von einem Spieler mitgenommen wurde, sollte dieser
//	Hinweis auch geaendert werden !
//	
//	Die Truhe ist hier unter einem Busch versteckt.
//	Statt das man nun eine Beschreibung des Busches hier eintippt, 
//	uebergibt, man add_v_item eine CLOSURE (siehe /doc/lpc/closures*)
//	
//	Diese Routine wird JEDESMAL automatisch aufgerufen, wenn ein Spieler
//	den Busch anschaut, und sie kann feststellen, ob die Truhe unter
//	dem Busch liegt oder nicht und entsprechende Meldungen ausgeben.
//	
//	Die einfachste form einer Closure ist: #'fun
//	wobei fun der Name der Funktion ist, die aufgerufen werden soll.
    add_v_item( (["name":"felsblock",
		  "id":({"felsen","fels", "felsblock" }),
		  "gender":"maennlich",
		  "long":
		     "Du siehst einen grossen Felsblock, "
		     "auf dem erstaunlicherweise ein "
		     "ebenfalls grosser Busch waechst."
		]) );
    add_v_item( (["name":"busch",
		  "gender":"maennlich",
		  "id":({"busch","strauch"}),
		  "long":#'busch_funktion,
		  "look_msg":"$Der() untersucht den Busch",
		  "take":
		     "Du kannst den Busch beim besten Willen nicht entwurzeln.",
		  "take_msg":
		     "$Der() versucht vergeblich den Busch zu entwurzeln"

		]) );

    add_type("teleport_rein_verboten", 1);
    reset();
// Beim create wird der reset nicht automatisch aufgerufen, tun wir es halt
// von Hand.
}

