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

#include <message.h>
// Das brauchen wir, um bei Meldungen mit send_message angeben zu koennen,
// welchen Typ sie haben (Kann man sie sehen, hoeren, riechen?) und
// welchen Grund (Emote, Bewegung, Kampf usw.).

inherit "/i/room";

void create() {
   set_short("Beispielraum Nr. 3");
   set_long(
      "Du bist im Beispielraum Nr. 3 des Einfuehrungskurses fuer "
      "Goetter. Mit dem Zauberstab-Kommando 'zmore hier' kannst Du den "
      "Quellcode dieses Raumes ansehen. Dieser Raum hier hat Kunstlicht "
      "und Kaempfen ist auch verboten. Beides wird ueber 'Typen' "
      "erreicht. Zusaetzlich gibt es hier auch noch ein Zusatz-Kommando "
      "'bloedle'. Du kannst es ja mal eingeben!");
   add_type("teleport_rein_verboten", 1);
   add_type("kunstlicht", 1);
//	Dieses Kommando setzt den Typ des Raumes auf 'Kunstlicht', d.h.
//	er liegt nicht mehr im Freien und die Lichtverhaeltnisse werden
//	nicht mehr durch den Tag/Nacht-Zyklus beeinflusst. Die '1' bedeutet
//	nur, dass das Kunstlicht gesetzt werden soll - uebergibt man statt
//	dessen eine '0', dann wird das Kunstlicht wieder rueckgaengig gemacht.

   set_own_light(1);
//	Hiermit wird die Licht-Stufe gesetzt. Ist die Licht-Stufe eines Raumes
//	ueber Null, dann ist es hell, ansonsten dunkel. Zur Berechnung der
//	Licht-Stufe eines Raumes wird nicht nur das eigene Licht des Raums 
//	sondern die Licht-Stufen aller Objekte die sich z.Z. im Raum befinden 
//	beachtet (genauer: aufsummiert). Mit dem Zauberstab kann man
//	mit 'zlicht' die Licht-Stufe veraendern.

   add_type("kaempfen_verboten",1);
//	Hiermit wird ein weiterer Typ im Raum gesetzt. Dieser Typ bewirkt, dass
//	in diesem Raum kaempfe untersagt sind (wer haette das gedacht). Es
//	gibt noch einige Typen mehr: in /doc/funktionsweisen/raeume/typen
//	steht dazu mehr.

   set_exits( ({"bsp4", "bsp2" }), ({"norden","sueden"}) );
}

void init() {
//	Diese Funktion wird immer dann aufgerufen, wenn ein Lebewesen das
//	Objekt betritt oder in dessen Umgebung bewegt wird. Hier kann man
//	deshalb vorzueglich zusaetzliche Kommandos definieren. Das Lebewesen
//	welches den init()-Aufruf ausgeloest hat, ist in der Objekt-Variable
//	this_player() definiert - auf diese kann man dann nacher beim
//	Abarbeiten des Kommandos zugreifen. 
//	[Call-Outs sollten nur dann in init() gestartet werden, wenn man 
//	sicherstellt, dass der vorherige Call-Out abgebrochen wird!]

   add_action("bloedlefunktion","bloedle");
//	Mit diesem Befehl addiert man ein neues Kommando fuer den Spieler zu
//	den bereits vorhandenen dazu. 	In diesem Fall heisst das Kommando
//	'bloedle'. Sobald dieses vom Spieler eingegeben wird (und er befindet
//	sich noch in diesem Raum) wird die Funktion 'bloedlefunktion'
//      aufgerufen.
//	Man kann mit diesem Befehl sogar bereits vorhandene Kommandos ueber-
//	lagern (z.B. 'schaue' etc.).
//	add_action() sollte im Normalfall nur in init() benutzt werden.
//      Normalfall heisst hier: bis auf ganz, ganz, ganz wenige Ausnahmen.
}

int bloedlefunktion(string str) {
//	Diese Funktion wird dann aufgerufen, wenn der Spieler das 'bloedle'-
//	Kommando eingibt. Siehe add_action().
//	Die Funktion MUSS einen Integer-Wert zurueckgeben, naemlich '1' wenn
//	das Kommando ausgefuehrt wurde und '0' wenn etwas nicht geklappt hat!
//	Wird eine '0' zurueckgeliefert dann sucht der Parser nach dem naechsten
//	Objekt mit einer add_action() auf das Kommando 'bloedle' und fuehrt
//	diese aus.

   if(!str) {
//	In str wird der Rest der Eingabezeile des Spielers uebergeben. D.h.
//	gibt der Spieler 'bloedle herum' ein, dann wird str nur 'herum'
//	geliefert. Hier wird abgefragt ob NUR 'bloedle' eingegeben wurde.

      this_player()->send_message(
//	Mit send_message werden vom this_player() aus Meldungen gesendet.
//	this_player() ist immer derjenige, der die action ausfuehrt,
//	also 'bloedle' eintippt.
          MT_LOOK,
//      Der erste Parameter ist der Typ der Meldung:
//      Unsere Meldung kann man sehen. (MT_LOOK)
          MA_EMOTE,
//      Der zweiter Parameter ist der Grund der Meldung:
//      MA_EMOTE fuer einen Seele-aehnlichen Befehl.
          wrap(Der(this_player())+" bloedelt herum."),
//      Nun der Text an alle anderen im Raum. this_player erhaelt diese
//      Meldung NICHT.
//	Die Funktion Der() ist eine von vielen Grammatikfunktionen, die
//	in /doc/funktionsweisen/grammatik/deklin beschrieben sind, uns
//	hier aber nicht weiter interessieren.
//	(Der(this_player()) liefert in diesem Fall den Namen des Spielers.)
//      wrap sorgt dafuer, dass das Ganze schoen umgebrochen wird.
          "Ok, Du bloedelst herum.\n", this_player());
//      Zum Schluss kann man noch eine extra-Meldung ausgeben. Wir geben
//      da die Meldung an this_player() an.

      return 1;
//	Liefere 1 zurueck und beende die Funktion. D.h. alles ok, das
//	Kommando wurde ordnungsgemaess ausgefuehrt.
//	Der Driver sucht danach keine weiteren add_action auf 'bloedle'
//	in anderen Objekten mehr.
   }

//	Hierher kommen nur Kommandos, die hinter 'bloedle' noch etwas mit
//	angegeben haben...

   notify_fail("Was willst Du herumbloedeln?\n");
//	Mit notify_fail() kann man eine Fehlermeldung setzen. Der vorherige
//	notify_fail()-Befehl wird hiermit ueberschrieben. Wird jetzt von
//	allen Funktionen eine 0 zurueckgeliefert, wird die Fehlermeldung
//	an den Spieler ausgegeben. So auch hier....

   return 0;
//	Gebe 0 zurueck und Beende Funktion. D.h. in der Ausfuehrung des
//	Kommandos ist ein Fehler aufgetreten. Der Parser sucht ab hier nach
//	weiteren add_action("...","bloedle") die irgendwo gesetzt sein koennen.
}

