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

inherit "/i/room";
//	Wie gehabt: Funktionen der Raeume integrieren.

/*
    Die Funktion reset() wird vom Spiel in regelmaessigen Abstaenden
    aufgerufen (etwa alle halbe Stunde - wenn sich dieser Raum im
    Speicher befindet!). Es ist gebraeuchlich, reset() gleich am Ende
    der Funktion create() aufzurufen, darum steht die Funktion hier
    auch VOR der Funktion create(). 
    In reset() werden Initialisierungen von Objekten vorgenommen, die
    nicht staendig vorhanden sind, sondern auch einmal abhanden kommen
    koennen, so wie hier im Beispiel die Fackel.
    Wenn man vergisst, reset() im create() aufzurufen, erscheint die Fackel
    im Worst Case eben erst eine halbe Stunde, nachdem der Raum betreten
    wurde... (Vorsicht, FALLE!)
*/
void reset() {
   object fackel;
   /*
      Das ist eine Variablendeklaration. Hier wird festgelegt, dass
      die Variable fackel vom Typ 'object' ist (Fuer Insider: object
      ist einfach ein Pointer). Bevor eine Variable nicht deklariert
      wurde kann sie nicht benutzt werden! Neben object sind noch
      folgende Typen haeufig benutzt: int (Integer-Zahl) und
      string (Zeichenfolge). Will man hier z.B. mehrere Objekte
      deklarieren kann man auch schreiben: object fackel, seil, geld;
      
      Typischerweise deklariert man Variablen in der Funktion, in der
      man sie braucht, und zwar am Anfang. Man kann das auch spaeter tun,
      das ist aber unuebersichtlicher. Solche Variablen nennt man LOKAL.
      Sie sind nur in der Funktion bekannt, in der sie definiert sind.
      Zu den globalen Variablen kommen wir in einem anderen Raum, hier
      brauchen wir sie nicht...
   */

   if(!present("fackel",this_object()))
   {
      /*
	 Hier passiert zweierlei:
	 1. Die Funktion present(obj1,obj2) erlaubt es Abzufragen ob sich
	    das Objekt obj1 in dem Objekt obj2 befindet. Statt obj1 kann man
	    auch den Namen (genauer die ID) des Objektes angeben, so wie hier
	    geschehen. this_object() entspricht in diesem Fall dem Raum.
	 2. Die if()-Funktion ist eine Bedingung. Das was nach if() folgt
	    wird nur ausgefuehrt, wenn die Bedingung WAHR ist. Das '!' ist
	    eine logische Verneinung, d.h. wenn sich keine Fackel im Raum
	    befindet wird der nachfolgende Befehl ausgefuehrt. In diesem Fall
	    folgt jedoch ein Befehlsblock, den man durch '{' und '}'
	    einklammert.
	 Kurz: Das was jetzt folgt wird nur ausgefuehrt, wenn sich nicht
	 schon eine Fackel im Raum befindet (sonst haette man nach ein paar
	 reset()-Aufrufen den ganzen Raum voller Fackeln!).
      */

      fackel = clone_object("/obj/fackel");
      /*
	 Hier wird folgendes getan:
	 1. Sofern nicht schon vorhanden wird der Programmtext des Files 
	    /obj/fackel im Speicher abgelegt. (das Original)
	    (genaueres siehe /doc/funktionsweisen/clones)
	 2. Dann wird eine Kopie (clone) des Originals erzeugt
	    (Deine Fackel eben).
	 3. Der Variablen fackel wird das erzeugte Objekt (aus 2.) zugewiesen,
	    (korrekter ein Zeiger (Verweis) auf das erzeugte Objekt.)
	 D.h. im Endeffekt haben wir jetzt eine Variable fackel in der nun
	 tatsaechlich das in /obj/fackel.c definierte Objekt enthalten ist.
      */

      fackel->move(this_object());
      /*
	 Das Objekt fackel wird in das Objekt this_object() bewegt.
	 Die Objektvariable this_object() ist immer gleich dem Objekt welches
	 man hier gerade editiert, in diesem Fall ist this_object() also
	 der Raum hier und in diesen wird die Fackel hineinbewegt.
      */

   }	// Erst mit dieser Klammer ist der if-Block beendet.

} 	// Und hier ist Funktion reset() beendet.


void create() {
   set_short("Beispielraum Nr. 2");
   set_long(
      "Du bist im Beispielraum Nr. 2 des Einfuehrungskurses "
      "fuer Goetter. Mit dem Zauberstab-Kommando 'zmore hier' kannst "
      "Du den Quellcode dieses Raumes anschauen. Dieser Raum ist "
      "schon etwas komplexer als Beispiel Nr. 1: Es wird hier eine "
      "Fackel 'gecloned' und abgelegt und eine Glasvitrine sowie ein "
      "Sessel sind hier mit 'schaue auf' zu betrachten.");
   set_exits( ({"bsp3",   "bsp1"   }),
              ({"norden", "sueden" }) );
   /*
      Ab diesem Raum wird im Einfuehrungskurs die verkuerzte Schreibweise
      fuer die Ausgangsraeume benutzt:
      Statt immer den gesamten Filenamen des Ausgangsraums anzugeben wie 
      im letzen Raum bei set_exits, wird hier nur ein *relativer* Pfad,
      bezogen auf den Pfad *dieses* Raumes verwendet.
      Statt "/room/bsp3"
      kann man hier also nur "bsp3" schreiben weil, dieser Raum
      im gleichen Verzeichnis "/room/bsp" liegt wie
      das File *dieses* Objektes ("/room/bsp/bsp2").
   */

   add_v_item( ([
      "name":	"sessel",
      "gender":	"maennlich",
      "long":	"Ein kleiner behaglicher Sessel."
	       ]) );
   add_v_item( ([
      "name":	"glasvitrine",
      "gender":	"weiblich",
      "id":	({"glasvitrine", "vitrine"}),
      "long":	"Eine leere Glasvitrine. Sie steht hier wohl nur als Beispiel."
	       ]) );
   /*
      Mit add_v_item(mapping) kann man Beschreibungen von
      Objekten in den Raum einfuegen, welche nicht benutzt oder 
      bewegt werden koennen (sogenannte 'virtuelle Objekte').
      Uebergeben wird ein Mapping, mit dem das Objekt definiert wird.

      Mappings bestehen immer aus einem '([', den Eintraegen, die
      wiederum aus <Index> ':' <Wert> bestehen und durch ',' getrennt
      werden, und dem schliessenden '])'.

      Wichtig ist, dass die Eintraege "name":... und "gender":...
      nicht fehlen.
      Das virtuelle Objekt kann alle Eigenschaften eines 'normalen'
      Objektes haben: "adjektiv", "smell", "read", "feel", "noise"...
      Wenn im Mapping ein Eintrag "look_msg" vorhanden ist,
      wird dieser String ausgegeben anstelle der standard-Meldung.
      Der String kann aufgebaut sein, wie die Bewegungsmeldung:
      "$Der() betrachtet interessiert die Glasvitrine"
      Es gibt auch noch die Eintraege "smell_msg" und "read_msg".
      Solche virtuellen Objekte werden aber nur von Befehlen gefunden,
      die die Efun parse_com verwenden, deswegen sollten alle Objekte,
      die andere Objekte manipulieren wollen parse_com verwenden.

      WICHTIG:   Das wichtigste an einem Raum ist zwar die 'long'-
		 Beschreibung, aber es sollten auch immer ein
		 paar v_items definiert sein, die die Details
		 des Raums weiter beschreiben!!!
   */

   reset();
   /*
      Das ist ein Funktionsaufruf. Die aufgerufene Funktion muss immer
      ueber der aufrufenden Funktion stehen (also im Quelltext VOR dem
      Aufruf). Deshalb gehoert die inherit-Funktion auch an den Anfang
      des Quelltextes!
   */

   add_type("teleport_rein_verboten", 1);
//      Verhindert, dass hier Spieler reinteleportieren.

}
