Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/doc/beispiele/zauberwald/room/eingang.c b/doc/beispiele/zauberwald/room/eingang.c
new file mode 100644
index 0000000..058a05e
--- /dev/null
+++ b/doc/beispiele/zauberwald/room/eingang.c
@@ -0,0 +1,48 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+
+inherit ROOM("stdroom");
+
+void create()
+{
+ ::create();
+ SetProp(P_INDOORS, 0);
+ SetProp(P_LIGHT, 1);
+ SetProp(P_INT_SHORT, "Auf einem kleinen Waldweg");
+ SetProp(P_INT_LONG,
+ "Du stehst auf einem kleinen Waldweg der nach Westen hin tiefer in den Wald\n"
+ +"hinein fuehrt. Nach Osten kannst Du jedoch auch wieder zurueck zur Kreuzung\n"
+ +"gelangen. Alles ist hier recht duester, denn das Zweigdach der Baeume laesst\n"
+ +"kaum noch Sonnenlicht hindurch.\n");
+ AddDetail("wald", QueryProp(P_INT_LONG));
+ AddDetail(({"boden", "weg", "erde", "waldweg"}),
+ "Der Weg wurde nicht richtig angelegt und es scheint auch nicht so, als wuerde\n"
+ +"ihn jemand pflegen. Dennoch wachsen keinerlei Pflanzen auf dem Weg und Du\n"
+ +"gehst auf der blossen Erde.\n");
+ AddDetail(({"wegrand", "wegesrand", "gestruepp"}),
+ "Am Wegesrand wachsen einige alte Baeume und andere Pflanzen die zusammen ein\n"
+ +"undurchdringliches Gestruepp ergeben. Dir bleibt also nichts weiter uebrig, als\n"
+ +"nur den Weg nach Westen oder nach Osten zu folgen.\n");
+ AddDetail(({"baeume", "alter"}),
+ "Das Alter der Baeume laesst sich nicht genau bestimmen, sie scheinen jedoch\n"
+ +"sehr sehr alt zu sein. In einem der Baeume siehst Du ein kleines Baumhaus.\n");
+ AddDetail(({"pflanzen", "farne", "straeucher"}),
+ "Verschiedene Straeucher, Farne und zahlreiche Baeume zieren den Wegesrand.\n"
+ +"Du entdeckst dabei aber nichts weiter auffaelliges.\n");
+ AddDetail(({"osten", "kreuzung"}),
+ "Wenn Du dem Weg nach Osten hin folgst, kannst Du zurueck zur Kreuzung gelangen.\n");
+ AddDetail(({"zweige", "zweigdach", "sonnenlicht", "licht", "dach", "westen"}),
+ "Das Zweigdach der Baeume laesst hier so wenig Sonnenlicht hindurch, das Du ein\n"
+ +"Stueck weiter im Westen kaum noch ohne eigene Lichtquelle weiterkommen kannst.\n"
+ +"Du solltest Dich also besser nicht ohne eigene Lichtquelle tiefer in den Wald\n"
+ +"hinein wagen.\n");
+ AddDetail(({"fackel", "lampe", "licht", "lichtquelle", "lichtspruch"}),
+ "Wenn Du beabsichtigst weiter nach Westen zu gehn, solltest Du eine Fackel,\n"
+ +"eine Lampe oder sonst irgendeine Lichtquelle mitnehemn. Zumindest ist es dort\n"
+ +"sehr dunkel.\n");
+ AddDetail(({"wolke", "wolken", "sonne", "himmel"}),
+ "Der Himmel ist durch das dichte Dach der Zweige, nicht mehr zu sehn.\n");
+ AddExit("osten", "/d/unterwelt/raeume/wald4");
+ AddExit("westen", ROOM("weg1"));
+}
diff --git a/doc/beispiele/zauberwald/room/huette.c b/doc/beispiele/zauberwald/room/huette.c
new file mode 100644
index 0000000..e19a272
--- /dev/null
+++ b/doc/beispiele/zauberwald/room/huette.c
@@ -0,0 +1,129 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+// Ein Raum zum schoenen einbinden eines Seherhauses in den Wald
+
+#include "../files.h"
+#include <moving.h>
+
+inherit ROOM("stdroom");
+
+void create()
+{
+ ::create();
+ SetProp(P_INDOORS, 1);
+ SetProp(P_LIGHT, 1);
+ SetProp(P_INT_SHORT, "Mitten im Wald");
+ SetProp(P_INT_LONG,
+ "Du stehst nun inmitten des Zauberwalds genau vor einer riesigen Buche unter\n"
+ +"der jemand eine kleine Huette gebaut hat. Ringsumher stehen weitere Buesche\n"
+ +"und Baeume und bilden eine dichte Vegetation, doch im Vergleich zu dieser\n"
+ +"riesigen Buche wirkt alles andere wirklich mickrig. Durch das dichte\n"
+ +"Blaetterdach dringt nur wenig Licht und so wundert es auch nicht das der\n"
+ +"Boden hier relativ feucht ist und die Pflanzen so gut gedeihen koennen. Nach\n"
+ +"Norden fuehrt als einziger Ausgang ein kleiner Trampelpfad zur Lichtung.\n");
+ AddDetail(({"natur", "wald", "zauberwald"}), QueryProp(P_INT_LONG));
+ AddDetail(({"buesche", "baeume", "vegetation", "pflanzen", "farne"}),
+ "Rings um die Huette herscht eine wilde Vegetation. Es wachsen verschiedenste\n"
+ +"Farne und Buesche und eine vielfalt verschiedenster Baeume. Alles zusammen\n"
+ +"bildet eine fast undurchdringliche Vegetation.\n");
+ AddDetail(({"licht", "blaetterdach"}),
+ "Durch das relativ dichte Blaetterdach der hohen Baeume, faellt eigentlich nur\n"
+ +"sehr wenig Licht durch und so ist es hier doch schon relativ duester, auch\n"
+ +"wenn man noch nicht unbedingt eine eigene Lichtquelle braucht um etwas sehen\n"
+ +"zu koennen.\n");
+ AddDetail("lichtquelle",
+ "Eine eigene Lichtquelle ist hier nicht unbedingt erforderlich, da dann doch\n"
+ +"noch genuegend Licht durch das Blaetterdach durchdringt.\n");
+ AddDetail("himmel",
+ "Es scheint Dir als wuerde die Sonne gerade scheinen, auch wen das dichte\n"
+ +"Blaetterdach die meisten Sonnenstrahlen nicht hindurch laesst.\n");
+ AddDetail("boden",
+ "Der Boden ist hier eigentlich, mit Ausnahme des Trampelpfads natuerlich,\n"
+ +"ziemlich zugewachsen und von zahlreichen Pflanzen ueberwuchert.\n");
+ AddDetail("erde",
+ "Die Erde ist hier ueberall ein wenig lehmig, aber wirklich besonderes kannst\n"
+ +"Du an der Erde nicht entdecken.\n");
+ AddDetail(({"trampelpfad", "ausgang", "pfad"}),
+ "Der Trampelpfad scheint doch relativ oft benutzt zu werden, denn die Erde ist\n"
+ +"fast voellig bloss gelegt und die wenigen Pflanzen die dann doch versuchen ihn\n"
+ +"zu bewachsen sind fast alle niedergetrampelt.\n");
+ AddDetail(({"lichtung", "norden"}),
+ "Vielleicht solltest Du einfach dem Trampelpfad nach Norden folgen und Dir die\n"
+ +"Lichtung einfach aus der Naehe anschauen.\n");
+ AddDetail(({"buche", "riesige buche"}),
+ "Eichen sollst Du weichen, Buchen sollst Du suchen!\n");
+ AddDetail(({"eiche", "eichen"}),
+ "Du siehst zwar alles moegliche an Baeumen hier, aber Eichen befinden sich zum\n"
+ +"Glueck nicht dadrunter.\n");
+ AddDetail(({"glueck", "frage"}),
+ "Ob es soetwas wie Glueck ueberhaupt gibt, ist wohl eher eine philosophische\n"
+ +"Frage und etwas wo man stundenlang drueber diskutieren koennte. Fuer den\n"
+ +"Moment beschliesst Du jedenfalls lieber die schoene Natur zu geniessen und\n"
+ +"dem zwitschern der Voegel zu lauschen, als Dich mit soetwas zu beschaeftigen.\n");
+ AddDetail(({"voegel", "zipfel", "baumzipfel", "zipfel der baeume"}),
+ "Oben in den Zipfeln der Baeume kannst Du wage einige Voegel erkennen, doch um\n"
+ +"diese naeher spezifizieren zu koennen, sind diese dann doch zu weit weg.\n");
+ AddDetail("moment",
+ "Geniesse den Moment und lebe Dein Leben!\n");
+ AddDetail("ruhe",
+ "Die Ruhe wird hier und da lediglich vom zwitschern einiger Voegel unterbrochen.\n");
+ AddSpecialDetail(({"huette"}), "det_huette");
+ AddSounds(SENSE_DEFAULT,
+ "Es ist hier wirklich herrlich ruhig und nur hier und da hoerst Du das\n"
+ +"zwitschern einiger Voegel. Natur pur.\n");
+ AddSounds(({"voegel", "zwitschern", "voegel zwitschern"}),
+ "Du lauschst dem zwitschern der Voegel und geniesst die himmlische Ruhe.\n");
+ AddCmd(({"such", "suche"}), "cmd_suchen");
+ AddCmd(({"geniess", "geniesse"}), "cmd_geniessen");
+ AddCmd(({"leb", "lebe"}), "cmd_leben");
+ AddCmd(({"kletter", "klettere"}), "cmd_klettern");
+ AddExit("norden", ROOM("lichtungs"));
+}
+
+static string det_huette()
+// Langbeschreibung nicht fest setzen, damit der Spieler sie selbst
+// aendern kann.
+{
+ object ob;
+ if (ob=present("\nmorgeneshaus", ME))
+ return ob->long();
+}
+
+static int cmd_suchen(string str)
+{
+ notify_fail("WAS moechtest Du suchen?\n");
+ if (str!="buchen" && str!="buche") return 0;
+ write("Du brauchst nicht lange suchen und schon entdeckt Du eine riesige Buche vor\n"
+ +"Dir, aber eigentlich waere es wohl auch eher erstaunlich, wenn Du diese\n"
+ +"riesige Buche direkt vor Deiner Nase uebersehen wuerdest :).\n");
+ return 1;
+}
+
+static int cmd_geniessen(string str)
+{
+ notify_fail("WAS moechtest Du geniessen?\n");
+ if (str!="moment" && str!="den moment" && str!="ruhe") return 0;
+ write("Du haeltst einen Moment inne und geniesst die himmlische Ruhe, die nur durch\n"
+ +"das zwitschern einiger Voegel durchbrochen aber nicht gestoert wird.\n");
+ return 1;
+}
+
+static int cmd_leben(string str)
+{
+ notify_fail("WAS moechtest Du leben?\n");
+ if (str!="leben" && str!="mein leben" && str!="dein leben") return 0;
+ write("Nun, wenn die Welt so einfach waere das Du mit einem simplen Kommando Dein\n"
+ +"ganzes Leben steuern koenntest, dann waer die Welt doch wirklich langweilig,\n"
+ +"oder? Ich will doch stark hoffen, das es sooo weit noch nicht bei Dir ist :).\n");
+ return 1;
+}
+
+static int cmd_klettern(string str)
+{
+ notify_fail("WOHIN oder WORAUF moechtest Du klettern?\n");
+ if (member(({"auf baum", "auf baumzipfel", "baum hoch",
+ "buche hoch", "auf buche"}), str)==-1) return 0;
+ write("Du versuchst vergeblich die riesige Buche hochzuklettern, doch die unteren\n"
+ +"Aeste haengen leider bereits viel zu hoch, um diese erklimmen zu koennen.\n");
+ return 1;
+}
diff --git a/doc/beispiele/zauberwald/room/schule.c b/doc/beispiele/zauberwald/room/schule.c
new file mode 100644
index 0000000..a97acc4
--- /dev/null
+++ b/doc/beispiele/zauberwald/room/schule.c
@@ -0,0 +1,78 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+
+inherit ROOM("stdroom");
+
+void create()
+{
+ ::create();
+ SetProp(P_INDOORS, 0);
+ SetProp(P_LIGHT, 1);
+ AddSpecialDetail(({"pixieschule", "schule", "sandplatz", "waldschule"}), "_query_int_long");
+ AddDetail(({"spuren", "kampfplatz", "sand"}),
+ "Die Spuren im Sand deuten auf einen laengeren Kampf hin, der hier getobt\n"
+ +"haben muss. Wer auch immer ihn verloren hat, er hat sich wacker gewehrt.\n");
+ AddDetail("wald",
+ "Was meinst Du eigentlich, wo Du gerad die ganze Zeit rumlaeufst? Mach einfach\n"
+ +"die Augen auf und schau Dir alles in Ruhe an.\n");
+ AddDetail("ruhe", "In der Ruhe liegt die Kraft...\n");
+ AddDetail(({"augen", "details", "kampfzauber", "kopf", "freund"}),
+ "Nu uebertreib mal nich, nicht jedes Substantiv verbirgt wirklich ein\n"
+ +"sinnvolles Detail.\n");
+ AddDetail("kraft",
+ "Wow! Deine Kraft ist ploetzlich auf 32 angestiegen...\n"
+ +"Das hast Du jetzt aber nicht wirklich geglaubt, oder?\n"
+ +"Wieso untersuchst Du solche Details eigentlich?\n");
+ AddSpecialDetail("zeit", "det_zeit");
+ AddDetail(({"pixies", "bloedsinn", "unfug", "zauberwesen", "streich"}),
+ "Pixies sind kleine Zauberwesen, die nichts als Unfug im Kopf haben. Wie\n"
+ +"niemand sonst nutzen sie ihre magischen Faehigkeiten nicht um jemanden zu\n"
+ +"heilen oder fuer Kampfzauber. Nein sie nutzen sie um jemanden zu Aergern\n"
+ +"oder ihm einen Streich zu spielen. Einen Pixie zum Freund zu haben, kann\n"
+ +"sicher sehr unterhaltsam sein, auf die Dauer aber wohl auch ziemlich\n"
+ +"anstrengend.\n");
+ AddSpecialDetail("boden", "det_boden");
+ AddDetail("halbkreis",
+ "Einige Pixies sitzen im Halbkreis um Arina herum und hoeren gespannt zu, wie\n"
+ +"sie ihnen einen spannende Geschichte erzaehlt.\n");
+ AddDetail(({"geschichten", "sprache"}),
+ "Wenn Arina doch bloss in einer Sprache sprechen wuerde, Die Du verstehst...\n"
+ +"Ihre Geschichten hoeren sich jedenfalls ausserordentlich spannend an. *seufz*\n");
+ AddDetail("himmel", "Der Himmel ist klar und nahezu wolkenfrei.\n");
+ AddDetail(({"osten", "ausgang", "lichtung", "weg", "waldweg"}),
+ "Der einzige Ausgang von hier, ist der kleine Waldweg im Osten der zurueck\n"
+ +"zur grossen Lichtung fuehrt.\n");
+ SetProp(P_INT_SHORT, "Die Pixieschule");
+ AddExit("osten", ROOM("lichtungnw"));
+ AddItem(NPC("pixie"), REFRESH_MOVE_HOME);
+ AddItem(NPC("pixie"), REFRESH_MOVE_HOME);
+ AddItem(NPC("pixie"), REFRESH_MOVE_HOME);
+ AddItem(NPC("arina"), REFRESH_REMOVE, 1);
+}
+
+static string det_boden()
+{
+ if (present(WALDID("fee"), ME))
+ return GetDetail("halbkreis");
+ return GetDetail("sand");
+}
+
+static string det_zeit()
+{ return "Wir haben genau "+dtime(time())[<8..]+".\n"; }
+
+static string _query_int_long()
+{
+ if (present(WALDID("fee"), ME))
+ return "Du befindest Dich in der Waldschule der Pixies. Einige Pixies sitzen im\n"
+ +"Halbkreis um die Waldfee Arina rum und hoeren gespannt ihren Geschichten zu.\n"
+ +"Gelegentlich erhebt sich Arina um mit einem Stock etwas in den Sand zu\n"
+ +"zeichnen, oder um einen der Pixies zu ermahnen weil er wieder irgendeinen\n"
+ +"verrueckten Bloedsinn gemacht hat. Da sich ringsherum der dichte Wald\n"
+ +"anschliesst, ist der einzige Ausgang, der Weg zurueck nach Osten auf die\n"
+ +"grosse Lichtung.\n";
+ return "Du stehst auf einem kleinen Sandplatz mitten im Wald. Hier und da siehst Du\n"
+ +"im Sand noch deutlich die Spuren eines Kampfes. Umgeben wird dieser Platz\n"
+ +"von einem dichten Wald, so dass der einzige Ausgang der Weg zurueck nach\n"
+ +"Osten zur grossen Lichtung ist.\n";
+}
diff --git a/doc/beispiele/zauberwald/room/stdlichtung.c b/doc/beispiele/zauberwald/room/stdlichtung.c
new file mode 100644
index 0000000..341ee6e
--- /dev/null
+++ b/doc/beispiele/zauberwald/room/stdlichtung.c
@@ -0,0 +1,157 @@
+// (c) by Thomas Winheller (Padreic@mg.mud.de)
+
+#include "../files.h"
+#include <moving.h>
+
+inherit ROOM("stdroom");
+inherit "/std/room/kraeuter";
+
+void maybe_replace_program()
+// dieser Standardraum, darf _nicht_ replaced werden...
+{ }
+
+int tuempel_ex(string exit, mapping map_ldfied)
+{ return map_ldfied[exit]==ROOM("tuempel"); }
+
+static int plant;
+
+void create()
+{
+ int i;
+ string tuempel, dir;
+ mixed tmp;
+
+ if (!clonep(ME)) return;
+ ::create();
+ plant=0;
+ SetProp(P_INDOORS, 0);
+ SetProp(P_LIGHT, 1);
+ SetProp(P_INT_SHORT, "Am Rande der Zauberlichtung");
+ SetProp(EXTRA_LONG, "");
+ if (PO) dir=(PO->CustomizeObject());
+ if (!dir) return;
+ dir=(["o":"ost", "w":"west", "n":"nord", "s":"sued",
+ "no":"nordost", "nw":"nordwest",
+ "so":"suedost", "sw":"suedwest"])[dir[8..]];
+ tuempel=filter(m_indices(QueryProp(P_EXITS)||([])), "tuempel_ex", ME, QueryProp(P_EXITS)||([]))[0][0..<3];
+ dir=capitalize(dir); tuempel=capitalize(tuempel);
+ SetProp(P_INT_LONG, BS(
+ "Du stehst am "+dir+"rand der grossen Lichtung inmitten des Zauberwalds. "
+ +tuempel+"lich von hier, befindet sich genau in der Mitte der "
+ +"Lichtung ein kleiner Tuempel in dessen Wasser sich das Sonnenlicht in "
+ +"allen Farben des Regenbogens spiegelt. Hier und da stehen um den Teich "
+ +"herum vereinzelt einige Eichen die sich irgendwie zu bewegen "
+ +"scheinen und ab und zu siehst Du wie sich einige kleine Pixies aus "
+ +"dem Wald heraus ans Wasser trauen. Die Eichen jedoch, halten immer "
+ +"einen deutlichen Abstand zum Wasser."+QueryProp(EXTRA_LONG)));
+ AddDetail(({"raum", lower_case(dir)+"rand", "zauberwald"}), QueryProp(P_INT_LONG));
+ AddDetail(({"pixies", "zauberwesen", "unfug"}),
+ "Pixies sind kleine verspielte Zauberwesen, die hier im Zauberwald wohnen. Um\n"
+ +"einem von ihnen zu begegnen wirst Du hier im Wald sicher nich lange suchen\n"
+ +"muessen, doch vorsicht, sie haben nichts als Unfug im Kopf...\n");
+ AddDetail(({"farben", "regenbogen", "computer"}),
+ "Noch nie einen Regenbogen gesehn? Hmm.. dann sitzt Du wirklich eindeutig\n"
+ +"zuviel vor Deinem Computer...\n");
+ AddDetail("abstand",
+ "Wieso sie diesen Abstand halten kannst Du nicht nachvollziehn, aber mehr als\n"
+ +"ein paar Meter gehen sie nie an den alten Weiher dran.\n");
+ AddDetail(({"sonne", "sonnenstrahlen", "sonnenlicht", "himmel", "herz"}),
+ "Zahlreiche warme Sonnenstrahlen erwaermen Dein Herz und Du bist richtig\n"
+ +"gluecklich. Solch ein Idyllisches Plaetzchen willst Du am liebsten nie\n"
+ +"wieder verlassen. Fehlt eigentlich nur noch ein Partner, mit dem man\n"
+ +"hier gemeinsam in der Sonne liegen und das rauschen des Wassers geniessen\n"
+ +"kann.\n");
+ AddDetail("partner", "Den musst Du Dir schon selbst mitbringen...\n");
+ AddDetail(({"wald", "zauberwald"}),
+ "Du befindest Dich quasi mittem ihn ihm. Rund herum um die Lichtung schliesst\n"
+ +"sich ein dichter Wald an.\n");
+ AddDetail(({"eiche", "eichen"}),
+ "Hier befindet sich gerade keine, so dass Du sie nich naeher ansehn kannst.\n");
+ AddDetail(({"lichtung", "rand", "plaetzchen"}), QueryProp(P_INT_LONG));
+ AddDetail(({"wasser", "tuempel", "teich", lower_case(tuempel)+"en", "mitte"}),
+ "Wenn Du Dir den Tuempel in der Mitte der Lichtung etwas naeher ansehen\n"
+ +"moechtest, solltest Du vielleicht einfach noch ein bisschen naeher rangehn.\n");
+ AddDetail(({"waldweg", "weg"}),
+ "Ueber den Waldweg kannst Du den Wald wieder verlassen wenn Du moechtest.\n");
+ AddDetail(({"boden"}),
+ "Der Boden ist hier nirgends nackt sichtbar, sondern ist mit einem schoenen\n"
+ +"gruenen Rasenteppich bedeckt. Nicht zu hoch und nicht zu tief, offensichtlich\n"
+ +"bedarf diese Grasart keinerlei Pflege oder aber irgendjemand pflegt diesen\n"
+ +"Rasen hier seeehhhhrrr gruendlich.\n");
+ AddDetail(({"grasart", "rasen", "art", "gras", "rasenteppich", "halme"}),
+ "Du schaust Dir den Rasen noch einmal gruendlich an und streichst mit Deiner\n"
+ +"Hand durch die Halme. Was auch immer das fuer eine Art ist, solch einen Rasen\n"
+ +"hast Du noch nicht gesehn.\n");
+ AddDetail("hand",
+ "Sei lieber vorsichtig, sonst ist die Hand schneller ab als Du denkst...\n");
+ AddDetail("pflege",
+ "Ob jemand diesen Rasen pflegt, bzw. _wer_ kannst Du nicht entdecken...\n");
+ AddSounds(({"rauschen", "wasser"}), "Leise hoerst Du das rauschen des Wassers....\n");
+}
+
+#define VERB (["iss": "essen", "esse": "essen", "pflueck": "pfluecken", "pfluecke": "pfluecken"])
+
+static int cmd_pilze(string str)
+{
+ notify_fail("Was moechtest Du "+VERB[query_verb()]+"?\n");
+ if (str!="pilz" && str!="pilze") return 0;
+ if (plant>time()) {
+ write("Du solltest die Pilze erstmal in Ruhe wieder etwas nachwachsen lassen.\n");
+ return 1;
+ }
+ if (PL->QueryProp(ZAUBERWALD)<=time()) {
+ write("Du bist nur Gast hier und die Bewohner des Zauberwalds, sehen es nicht gerne\n"
+ +"wenn man hier einfach so die Pilze pflueckt.\n");
+ return 1;
+ }
+ plant=time()+300;
+ write("Du pflueckst Dir einige Pilze und isst sie. Anschliessend geht es Dir\n"
+ +"bedeutend besser.\n");
+ PL->reduce_hit_points( negate(100+random(100)) );
+ return 1;
+}
+
+static int cmd_farne(string str)
+{
+ int food;
+ notify_fail("Was moechtest Du "+VERB[query_verb()]+"?\n");
+ if (str!="farn" && str!="farne") return 0;
+ if (PL->QueryProp(ZAUBERWALD)<=time()) {
+ write("Du bist nur Gast hier und die Bewohner des Zauberwalds, sehen es nicht gerne\n"
+ +"wenn man hier einfach so den Farn abreisst.\n");
+ return 1;
+ }
+ // das tanken am Wasser ist umsonst, es heilt dabei wie ein
+ // mittleres Kneipenessen das genau 1 Muenze kostet. Geheilt werden nur HP
+ // Ein Missbrauch ist im Wald ausgeschlossen, bzw. man muesste den
+ // gesamten Wald leermetzeln und kann dann hier tanken bis zum naechsten
+ // reset. Bei Kosten von einer Muenze pro Heilung ist es sehr fraglich
+ // ob sich das lohnt.... :)
+ food=(PL->QueryProp(P_MAX_FOOD)) - (PL->QueryProp(P_FOOD));
+ if (food>10) food=10; // nie mehr als fuer 10 food tanken...
+ if (food <= 0 || !PL->eat_food(food, 1)) {
+ write("Du bist so voll, Du kannst leider wirklich nichts mehr essen...\n");
+ return 1;
+ }
+ write("Du pflueckst ein wenig von dem Farn und isst ihn. Sogleich spuerst Du, wie es\n"
+ +"Dir allmaehlich wieder besser geht...\n");
+ if (PL->eat_food(food)) { // food gutschreiben erfolgreich?
+ PL->buffer_hp(food*6, 8);
+ PL->SetProp(ZAUBERWALD, time()+AGGRESSIVE_TIME);
+ }
+ return 1;
+}
+
+static int cmd_sueden()
+{
+ if (PL->QueryProp(ZAUBERWALD)>time()) {
+ write("Du versuchst in den Wald zu fluechten, doch die Farne und Buesche bilden\n"
+ +"eine pflanzliche Barriere und lassen Dich nicht hindurch.\n");
+ return 1;
+ }
+ write("Du machst einen Schritt hin nach Sueden und sofort biegen sich auf magische\n"
+ +"Weise die Farne und Buesche zur Seite und geben einen Trampelpfad nach Sueden\n"
+ +"frei.\n");
+ PL->move(ROOM("huette"), M_GO, "durch die Buesche nach Sueden", "zwaengt sich");
+ return 1;
+}
diff --git a/doc/beispiele/zauberwald/room/stdroom.c b/doc/beispiele/zauberwald/room/stdroom.c
new file mode 100644
index 0000000..35297e6
--- /dev/null
+++ b/doc/beispiele/zauberwald/room/stdroom.c
@@ -0,0 +1,52 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+inherit "std/room";
+
+#include "../files.h"
+#include <moving.h>
+
+static string sounds();
+
+void create()
+{
+ ::create();
+ SetProp(P_NO_TPORT, NO_TPORT);
+ AddSmells(SENSE_DEFAULT,
+ "Der Duft vom Harz der Baeume und einiger sonstiger Pflanzen liegt in der Luft.\n"
+ +"Man merkt sofort, Du stehst mittem im Wald.\n");
+ AddSounds(SENSE_DEFAULT, #'sounds);
+ AddSounds(({"voegel", "voegeln", "zwitschern"}),
+ "Das herrliche zwitschern der Voegel, ist das einzige das die Ruhe im Wald\n"
+ +"durchbricht.\n");
+}
+
+static string sounds()
+{
+ if (sizeof(filter_objects(all_inventory(), "InFight")))
+ return "Der Laerm des Kampfes stoert die Ruhe des Waldes und uebertoent alles.\n";
+ if (sizeof(filter(all_inventory(), #'query_once_interactive))>1)
+ return "Es ist unheimlich still hier im Wald und nur das zwitschern einiger Voegel\n"
+ +"ist zu hoeren.\n";
+ return "Du hast das Gefuehl, als waerst Du ganz allein hier im Wald. Alles ist ruhig\n"
+ +"und nur hier und da vernimmst Du das zwitschern einiger Voegel.\n";
+}
+
+varargs void delay_reset(int time)
+// NPCs koennen boing resets verhindern
+{
+ if (time)
+ set_next_reset(time);
+ else set_next_reset(3600);
+}
+
+int _normalfunction()
+{
+ mixed z;
+ int i;
+ z=this_player()->QueryProp(AUSGANG);
+ this_player()->SetProp(AUSGANG, query_verb());
+ i=(int)::_normalfunction();
+ if (!i) this_player()->SetProp(AUSGANG, z);
+ return i;
+}
+
\ No newline at end of file
diff --git a/doc/beispiele/zauberwald/room/stein.c b/doc/beispiele/zauberwald/room/stein.c
new file mode 100644
index 0000000..cd74b07
--- /dev/null
+++ b/doc/beispiele/zauberwald/room/stein.c
@@ -0,0 +1,112 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+
+inherit ROOM("stdroom");
+
+void create()
+{
+ ::create();
+ SetProp(P_INDOORS, 0);
+ SetProp(P_LIGHT, 1);
+ SetProp(P_INT_SHORT, "Bei einem Stein");
+ AddSpecialDetail(({"ort", "wald", "platz"}), "_query_int_long");
+ AddDetail("stein",
+ "Der Stein ist, durch die Sonnenstrahlen ordentlich aufgeheizt, angenehm warm\n"
+ +"und bietet eigentlich den idealen Platz um es sich gut gehn zu lassen und in\n"
+ +"der Sonne zu liegen.\n");
+ AddDetail(({"sonne", "himmel", "sonnenstrahlen", "strahlen"}),
+ "Der blaue Himmel ist nahezu wolkenfrei und so strahlt die Sonne in voller\n"
+ +"Pracht oben am Himmel und ihre Strahlen prasseln auf Deine Haut.\n");
+ AddDetail(({"boden", "weg", "waldweg", "erde"}),
+ "Ein ganz normaler Waldweg halt, ein bisschen sandig, einige kleine Aestchen\n"
+ +"ganz normal halt.\n");
+ AddSpecialDetail("zeit", "det_zeit");
+ AddDetail(({"aestchen", "stoeckchen"}),
+ "Ganz kleine heruntergefallene Stoeckchen, durch reges drueber laufen\n"
+ +"im Laufe der Zeit kleingemalen und vom Wetter aufgeloest...\n");
+ AddDetail("wetter",
+ "Auch wenn hier heute die Sonne scheint, gibt es natuerlich auch hier\n"
+ +"gelegentlich verregnete Tage.\n");
+ AddDetail("tage", "Naja... allzuviele sind es jedoch nicht.\n");
+ AddDetail(({"nordosten", "lichtung", "ausgang", "weiher"}),
+ "Im Nordosten kannst Du immer noch die grosse Lichtung mit den wandernden Eichen\n"
+ +"und dem verwunschenen Weiher erkennen.\n");
+ AddDetail(({"eichen", "wandernde eichen"}),
+ "Im Nordosten auf der Lichtung hast Du vorhin wandernde Eichen gesehn,\n"
+ +"vielleicht solltest Du einfach nochmal zurueck gehn und sie Dir naeher\n"
+ +"anschaun.\n");
+ AddDetail(({"wolke", "wolken", "schaefchenwolke"}),
+ "Der Himmel ist eigentlich wolkenfrei nur hier und da zieht mal eine kleine\n"
+ +"Schaefchenwolke vorbei.\n");
+ AddExit("nordosten", ROOM("lichtungsw"));
+ AddItem(NPC("titina"), REFRESH_REMOVE, 1);
+ AddCmd(({"setz", "setze", "leg", "lege", "kletter", "klettere"}), "cmd_setzen");
+ AddCmd(({"steh", "stehe"}), "cmd_aufstehn");
+}
+
+#define STEIN WALDID("stein")
+
+void init()
+{
+ if (PL) PL->SetProp(STEIN, 0);
+ ::init();
+}
+
+static int cmd_aufstehn(string str)
+{
+ if (!PL->QueryProp(STEIN)) return 0;
+ if (str!="auf" && str!="von stein auf") {
+ notify_fail("Von was moechtest Du aufstehn?\n");
+ return 0;
+ }
+ PL->SetProp(STEIN, 0);
+ write("Du kletterst also vom Stein wieder runter und stehst auf.\n");
+ return 1;
+}
+
+#define VERB(x) (["setz": "setzt", "leg": "legst", "kletter": "kletterst"])[x]
+
+static int cmd_setzen(string str)
+{
+ string verb;
+ verb=query_verb();
+ if (verb && verb[<1]=='e') verb=verb[0..<2];
+ if (str!="auf stein" && str!="stein" && str!="von stein") {
+ notify_fail(BS("Wohin moechtest Du "
+ +(verb!="kletter" ? "Dich " : "")+verb+"en?"));
+ return 0;
+ }
+ if (PL->QueryProp(STEIN)) {
+ if (verb!="kletter" || str=="auf stein") {
+ write("Du sitzt doch bereits auf dem Stein!\n");
+ return 1;
+ }
+ PL->SetProp(STEIN, 0);
+ write("Du kletterst also vom Stein wieder runter und stehst auf.\n");
+ return 1;
+ }
+
+ write(BS("Entspannt "+VERB(verb)+" Du "+(verb!="kletter" ? "Dich " : "")
+ +"auf den Stein und geniesst die Sonne."));
+ PL->SetProp(STEIN, time());
+ return 1;
+}
+
+static string det_zeit()
+{ return "Wir haben genau "+dtime(time())[<8..]+".\n"; }
+
+static string _query_int_long()
+{
+ if (present(WALDID("fee"), ME))
+ return
+ "Hier mitten im Wald steht ein grosser Stein, auf dem Titina die wunderschoene\n"
+ +"Waldfee sitzt und sich in aller Ruhe ihr langes goldenes Haar kaemmt. Die\n"
+ +"Sonne strahlt genau auf den Stein und es ist wohl wirklich der gemuetlichste\n"
+ +"Ort auf Erden. Links und rechts vom Weg schliesst der dichte Wald an und so\n"
+ +"ist der einzige Ausgang Richtung Nordosten zurueck zur Lichtung.\n";
+ return "Hier mitten im Wald steht ein grosser Stein, der von der Sonne ordentlich\n"
+ +"aufgeheizt wird und ihn zu einem traumhaften Ort fuer alle Sonnenliebhaber\n"
+ +"macht. Links und rechts vom Weg schliesst direkt der dichte Wald an und so\n"
+ +"ist der einzige Ausgang Richtung Nordosten zurueck zur Lichtung.\n";
+}
diff --git a/doc/beispiele/zauberwald/room/tuempel.c b/doc/beispiele/zauberwald/room/tuempel.c
new file mode 100644
index 0000000..6f22d86
--- /dev/null
+++ b/doc/beispiele/zauberwald/room/tuempel.c
@@ -0,0 +1,179 @@
+// (c) by Thomas Winheller (Padreic@mg.mud.de)
+
+#include "../files.h"
+#include <moving.h>
+
+inherit ROOM("stdroom");
+inherit "/std/room/kraeuter";
+
+void create()
+{
+ ::create();
+ SetProp(P_LIGHT, 2);
+ SetProp(P_INDOORS, 0);
+ SetProp(P_INT_SHORT, "An einem verwunschenden Weiher");
+ AddSpecialDetail(({"ort", "weiher"}), "_query_int_long");
+ AddDetail(({"seerosen", "farben", "farbenvielfalt"}),
+ "Auf dem Wasser schwimmen zahlreiche Seerosen in allen Farben des Regenbogens\n"
+ +"eine solche Farbenvielfalt wie hier, hast Du bisher noch nirgendwo sonst\n"
+ +"gesehn.\n");
+ AddDetail("regenbogen", "Derzeit steht keiner am Himmel.\n");
+ AddDetail(({"libelle", "libellen", "atmosphaere", "summen"}),
+ "Hier und da schwirren ueber dem Weiher einige Libellen herum. Ihr Summen\n"
+ +"verbreitet eine richtig idyllische Atmosphaere an diesem Ort.\n");
+ AddDetail(({"pixies", "zauberwesen"}),
+ "Pixies sind kleine verspielte Zauberwesen, die hier im Zauberwald wohnen. Um\n"
+ +"einem von ihnen zu begegnen wirst Du hier im Wald sicher nich lange suchen\n"
+ +"muessen, doch vorsicht, sie haben nichts als Unfug im Kopf...\n");
+ AddDetail(({"wald", "zauberwald", "punkt"}),
+ "Der verwunschene Weiher ist mehr oder weniger der zentrale Punkt hier im\n"
+ +"Zauberwald. Er liegt mitten auf einer grossen Lichtung umgeben vom dichten\n"
+ +"Wald der Pixies\n");
+ AddDetail(({"lichtung", "mitte"}),
+ "Der Weiher befindet sich genau in der Mitte der Lichtung, sieh Dich halt\n"
+ +"einfach mal um.\n");
+ AddDetail(({"boden", "ufer"}),
+ "Das Ufer des Weihers besteht aus zahlreichen Steinen die bis in den Weiher\n"
+ +"hineinreichen. Auf und zwischen diesen Steinen sind jedoch ueberall zahlreiche\n"
+ +"kleine und mittlere Pflanzen gewachsen.\n");
+ AddDetail(({"stein", "steine"}), "Ein Stein ist ein Stein ist ein Stein ist ein Stein ist ein Stein.\n");
+ AddDetail("pflanzen",
+ "Die verschiedensten Pflanzen wachsen zwischen den Steinen empor und begruenen\n"
+ +"das Ufer. An einer Stelle kannst Du sogar weissen Wasser-Hahnenfuss wachsen\n"
+ +"sehen.\n");
+ AddDetail(({"wasser", "schimmer", "schimmern"}),
+ "Das Wasser ist irgendwie recht trueb und es geht ein sehr seltsames Schimmern\n"
+ +"von ihm aus. Irgendetwas besonderes hat es mit diesem Wasser auf sich, das\n"
+ +"spuerst Du genau. Du weisst jedoch nicht, ob es etwas gutes oder etwas boeses\n"
+ +"ist.\n");
+ AddDetail(({"himmel", "luft", "sonne", "waerme", "strahlen", "sonnenstrahlen"}),
+ "Die Sonne steht hoch am Himmel und fuellt diesen Ort mit einer herrlichen\n"
+ +"Waerme und ihre Strahlen reflektieren im Wasser in allen erdenklichen Farben.\n");
+ AddExit("norden", ROOM("lichtungn"));
+ AddExit("nordosten", ROOM("lichtungno"));
+ AddExit("nordwesten", ROOM("lichtungnw"));
+ AddExit("osten", ROOM("lichtungo"));
+ AddExit("westen", ROOM("lichtungw"));
+ AddExit("sueden", ROOM("lichtungs"));
+ AddExit("suedwesten", ROOM("lichtungsw"));
+ AddExit("suedosten", ROOM("lichtungso"));
+ AddItem(NPC("ulinia"), REFRESH_REMOVE, 1);
+ AddCmd(({"bad", "bade", "schwimm", "schwimme", "tauch", "tauche"}), "cmd_schwimmen");
+ AddCmd(({"trink", "trinke"}), "cmd_trinken");
+ AddCmd(({"pflueck", "pfluecke"}), "cmd_pfluecken");
+ // Detail per Hand hinzufuegen, da GetPlant anstelle von AddPlant
+ // verwendet wird.
+ AddPlantDetail(OBJ("hahnenfuss"));
+}
+
+static int cmd_trinken(string str)
+{
+ int drink;
+ object ob;
+ if (member(({"wasser", "wasser aus teich", "wasser aus tuempel",
+ "wasser aus see", "aus teich", "aus tuempel", "aus wasser",
+ "aus see"}), str)==-1) {
+ notify_fail("Was moechtest Du trinken?\n");
+ return 0;
+ }
+ if ((ob=present(WALDID("fee"), ME)) && !ob->IsEnemy(PL)) {
+ write(BS("Die Waldfee scheint Deinen Entschluss ein wenig von dem "
+ +"Wasser zu kosten, bemerkt zu haben und straft Dich mit einem "
+ +"mahnenden Blick ab. Du ueberlegst es Dir also noch einmal und "
+ +"laesst von Deinem Vorhaben ab."));
+ return 1;
+ }
+ // das tanken am Wasser ist umsonst, es heilt dabei wie ein
+ // Kneipengetraenk das genau 1 Muenze kostet. Geheilt werden nur SP
+ // Ein Missbrauch ist im Wald ausgeschlossen, bzw. man muesste den
+ // gesamten Wald leermetzeln und kann dann ueben bis zum naechsten
+ // reset. Bei Kosten von einer Muenze pro Heilung ist es sehr fraglich
+ // ob sich das lohnt.... :)
+ drink=(PL->QueryProp(P_MAX_DRINK)) - (PL->QueryProp(P_DRINK));
+ if (drink>10) drink=10; // nie mehr als fuer 10 soak tanken...
+ if (drink <= 0 || !PL->drink_soft(drink, 1)) {
+ write("Du bist so voll, Du kannst leider wirklich nichts mehr trinken...\n");
+ return 1;
+ }
+ write("Du gehst an den Rand des Weihers und nimmst einen kraeftigen Schluck von dem\n"
+ +"Wasser. Sogleich spuerst Du, wie Deine mentalen Kraefte langsam gestaerkt\n"
+ +"werden.\n");
+ if (PL->drink_soft(drink)) { // soak gutschreiben erfolgreich?
+ PL->buffer_sp(drink*6, 5);
+ PL->SetProp(ZAUBERWALD, time()+AGGRESSIVE_TIME);
+ }
+ return 1;
+}
+
+static int cmd_schwimmen(string str)
+{
+ string verb;
+
+ // besondere Eigenschaft der schluesselwoerter ausnutzen... :)
+ verb=(query_verb()||"");
+ if (verb[<1]!='e') verb+="e";
+ if (member(({"in teich", "in weiher", "in tuempel", "in see"}), str)==-1) {
+ notify_fail("Worin willst Du "+verb+"n?\n");
+ return 0;
+ }
+ str=capitalize(str[3..]); // "in " abschneiden...
+ if (present(WALDID("fee"), ME)) {
+ write(BS("Die Waldfee scheint Deinen Entschluss im "+str+" "+verb
+ +"n zu gehn irgendwie bemerkt zu haben und straft Dich mit einem "
+ +"mahnenden Blick ab. Deine Lust zum "+capitalize(verb)
+ +"n sinkt sogleich gegen null, denn Du verspuerst keine grosse "
+ +"Lust Dich mit der Waldfee anzulegen."));
+ return 1;
+ }
+ write(BS("Mutig gehst Du einen Schritt ins Wasser, da ueberkommt Dich auch "
+ +"schon ein seltsames kribbeln am ganzen Koerper. In windeseile "
+ +"hast Du den "+str+" auch schon wieder verlassen."));
+ return 1;
+}
+
+static int cmd_pfluecken(string str)
+{
+ object ob;
+ notify_fail("WAS moechtest Du pfluecken?\n");
+ if (member(({"hahnenfuss",
+ "wasser-hahnenfuss",
+ "weisser hahnenfuss",
+ "weisser wasser-hahnenfuss"}), str)<0) return 0;
+ if ((ob=present(WALDID("fee"), ME)) && !ob->IsEnemy(PL)) {
+ write(BS("Die Waldfee scheint Dein Vorhaben bemerkt zu haben und "
+ +"straft Dich mit einem mahnenden Blick ab. Du ueberlegst es Dir "
+ +"wieder anders und laesst von Deinem Vorhaben ab, solange die "
+ +"Fee hier wacht."));
+ return 1;
+ }
+ ob=GetPlant(OBJ("hahnenfuss"));
+ if (objectp(ob)) {
+ if (ob->move(PL, M_GET)==1)
+ write(BS("Vorsichtig pflueckst Du "+ob->name(WEN, 1)
+ +" und nimmst "+ob->QueryPronoun(WEN)+" an Dich."));
+ else write(BS("Vorsichtig pflueckst Du "+ob->name(WEN, 1)+" kannst "
+ +ob->QueryPronoun(WEN)+" aber nicht nehmen."));
+ }
+ else if (!ob)
+ write(BS("Der Hahnenfuss ist noch nicht wieder weit genug "
+ +"nachgewachsen um ihn pfluecken zu koennen."));
+ return 1;
+}
+
+static string _query_int_long()
+{
+ if (present(WALDID("fee"), ME))
+ return
+ "Du stehst nun an einem kleinen verwunschenen Weiher, inmitten des Zauberwalds.\n"
+ +"Auf dem Wasser schwimmen zahlreiche Seerosen in den verschiedensten Farben\n"
+ +"und hier und dort schwirrt eine Libelle in der Luft. Mitten ueber dem Weiher\n"
+ +"schwebt eine wunderschoene Waldfee in der Luft und scheint den Weiher zu\n"
+ +"bewachen. Irgendetwas geheimnisvolles scheint es mit dem Weiher auf sich\n"
+ +"zu haben, nur was?\n";
+ return
+ "Du stehst nun an einem kleinen verwunschenen Weiher, inmitten des Zauberwalds.\n"
+ +"Auf dem Wasser schwimmen zahlreiche Seerosen in den verschiedensten Farben und\n"
+ +"hier und dort schwirrt eine Libelle in der Luft. Alles scheint hier sehr\n"
+ +"friedlich zu sein, fast ein wenig zu friedlich. Irgendetwas geheimnisvolles\n"
+ +"scheint es mit diesem Weiher auf sich zu haben, nur was?\n";
+}
diff --git a/doc/beispiele/zauberwald/room/virtual_compiler.c b/doc/beispiele/zauberwald/room/virtual_compiler.c
new file mode 100644
index 0000000..1cc4d5c
--- /dev/null
+++ b/doc/beispiele/zauberwald/room/virtual_compiler.c
@@ -0,0 +1,133 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include <properties.h>
+#include <v_compiler.h>
+#include "../files.h"
+#include "/p/service/padreic/kraeuter/plant.h"
+
+inherit "std/virtual/v_compiler";
+
+create()
+{
+ ::create();
+ SetProp(P_STD_OBJECT, ROOM("stdlichtung"));
+ SetProp(P_COMPILER_PATH, ROOM(""));
+}
+
+string Validate(string file)
+{
+ file=::Validate(file);
+ switch(file) {
+ case "lichtungso":
+ case "lichtungo":
+ case "lichtungno":
+ case "lichtungn":
+ case "lichtungs":
+ case "lichtungnw":
+ case "lichtungw":
+ case "lichtungsw": return file;
+ default:
+ }
+}
+
+mixed CustomizeObject()
+{
+ string file;
+ file=Validate(::CustomizeObject());
+ if (!random(3)) PO->AddItem(NPC("laufeiche"), REFRESH_DESTRUCT, ([MNPC_HOME: ROOM(file)]) );
+ switch(file) {
+ case "lichtungno":
+ PO->AddExit("westen", ROOM("lichtungn"));
+ PO->AddExit("sueden", ROOM("lichtungo"));
+ PO->AddExit("suedwesten", ROOM("tuempel"));
+ PO->AddExit("suedosten", ROOM("weg2"));
+ PO->SetProp(EXTRA_LONG,
+ " Im Suedosten befindet sich der Waldweg, ueber den Du den Wald wieder "
+ +"verlassen kannst.");
+ return file;
+
+ case "lichtungo":
+ PO->AddExit("norden", ROOM("lichtungno"));
+ PO->AddExit("sueden", ROOM("lichtungso"));
+ PO->AddExit("westen", ROOM("tuempel"));
+ PO->AddExit("osten", ROOM("weg2"));
+ PO->SetProp(EXTRA_LONG,
+ " Im Osten befindet sich der Waldweg, ueber den Du den Wald wieder "
+ +"verlassen kannst.");
+ return file;
+
+ case "lichtungso":
+ PO->AddExit("westen", ROOM("lichtungs"));
+ PO->AddExit("norden", ROOM("lichtungo"));
+ PO->AddExit("nordwesten", ROOM("tuempel"));
+ PO->AddExit("nordosten", ROOM("weg2"));
+ PO->SetProp(EXTRA_LONG,
+ " Im Nordosten befindet sich der Waldweg, ueber den Du den Wald wieder "
+ +"verlassen kannst.");
+ PO->AddItem(NPC("riese"), REFRESH_DESTRUCT);
+ return file;
+
+ case "lichtungs":
+ PO->AddExit("westen", ROOM("lichtungsw"));
+ PO->AddExit("osten", ROOM("lichtungso"));
+ PO->AddExit("norden", ROOM("tuempel"));
+ PO->SetProp(EXTRA_LONG,
+ " In der Wiese siehst Du an einer Stelle etwas Klee wachsen.");
+ PO->AddPlant(BITTERKLEE);
+ // "klee" _nach_ dem AddPlant einfuegen, damit die restlichen Details
+ // wie Bitterklee trotzdem noch eingefuegt werden
+ PO->RemoveDetail(({"klee"}));
+ PO->AddDetail(({"stelle", "klee"}),
+ "Bei der Stelle scheint es sich unzweifelhaft um Bitterklee zu handeln.\n");
+ PO->AddCmd("sueden", "cmd_sueden");
+ return file;
+
+ case "lichtungn":
+ PO->AddExit("westen", ROOM("lichtungnw"));
+ PO->AddExit("osten", ROOM("lichtungno"));
+ PO->AddExit("sueden", ROOM("tuempel"));
+ PO->SetProp(EXTRA_LONG, " Am Rand der Wiese entdeckt Du einige kleine Pilze im Gras.");
+ PO->AddCmd(({"esse", "iss", "pflueck", "pfluecke"}), "cmd_pilze");
+ PO->AddDetail(({"pilz", "pilze", "schimmer"}),
+ "Die Pilze haben einen aeusserst seltsamen metallischem Schimmer und\n"
+ +"verbreiten einen sehr angenehmen suesslichen Duft im Raum.\n");
+ PO->AddSmells(({"pilz", "pilze"}),
+ "Die Pilze verbreiten einen sehr suesslichen Duft.\n");
+ PO->AddSmells("duft", "Der Duft ist eigentlich sehr befreiend und angenehm.\n");
+ return file;
+
+ case "lichtungnw":
+ PO->AddExit("westen", ROOM("schule"));
+ PO->AddExit("osten", ROOM("lichtungn"));
+ PO->AddExit("sueden", ROOM("lichtungw"));
+ PO->AddExit("suedosten", ROOM("tuempel"));
+ PO->SetProp(EXTRA_LONG,
+ " Nach Westen kannst Du ein Stueck in den Wald hinein gehn.");
+ return file;
+
+ case "lichtungw":
+ PO->AddExit("norden", ROOM("lichtungnw"));
+ PO->AddExit("sueden", ROOM("lichtungsw"));
+ PO->AddExit("osten", ROOM("tuempel"));
+ PO->SetProp(EXTRA_LONG, " Am Waldrand stehen einige blaeuliche Farne.");
+ PO->AddCmd(({"esse", "iss", "pflueck", "pfluecke"}), "cmd_farne");
+ PO->AddDetail(({"farn", "farne"}),
+ "Die blaeulichen Farne sind wirklich sehr merkwuerdig. soetwas hast Du bisher\n"
+ +"noch nirgendwo gesehn. Irgendetwas besonderes hat es sicherlich damit auf sich.\n");
+ return file;
+
+ case "lichtungsw":
+ PO->AddExit("osten", ROOM("lichtungs"));
+ PO->AddExit("norden", ROOM("lichtungw"));
+ PO->AddExit("nordosten", ROOM("tuempel"));
+ PO->AddExit("suedwesten", ROOM("stein"));
+ PO->SetProp(EXTRA_LONG,
+ " Nach Suedwesten kannst Du ein Stueck in den Wald hinein gehn.");
+ return file;
+
+ default: return 0;
+ }
+ return file;
+}
+
+int NoParaObjects() { return 1; }
diff --git a/doc/beispiele/zauberwald/room/weg1.c b/doc/beispiele/zauberwald/room/weg1.c
new file mode 100644
index 0000000..169b73f
--- /dev/null
+++ b/doc/beispiele/zauberwald/room/weg1.c
@@ -0,0 +1,75 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+
+inherit ROOM("stdroom");
+
+void create()
+{
+ ::create();
+ SetProp(P_INDOORS, 0);
+ SetProp(P_LIGHT, 0);
+ SetProp(P_INT_SHORT, "Auf einem Waldweg im Zauberwald");
+ AddDetail(({"blaetterdach", "dach", "baeume"}),
+ "Die Baeume rechts und links des Weges bilden ueber dem Weg ein so dichtes\n"
+ +"Blaetterdach, das so gut wie ueberhaupt kein Sonnenlicht mehr auf den Weg\n"
+ +"scheint.\n");
+ AddSpecialDetail("szene", "_query_int_long");
+ AddSpecialDetail(({"weg", "weges", "waldweg", "boden"}), "det_weg");
+ AddDetail(({"licht", "sonnenlicht", "sonnenstrahlen"}),
+ "Durch das dichte Blaetterdach schaffen es die Sonnenstrahlen nur noch sehr\n"
+ +"vereinzelt bis auf den Weg durchzukommen. Dadurch ist es hier unten relativ\n"
+ +"Feucht, kalt und dunkel.\n");
+ AddDetail(({"himmel", "sonne", "wolke", "wolken"}),
+ "Das Blaetterdach ist hier so dicht, das Du den Himmel nicht mal mehr erahnen\n"
+ +"kannst. Du weisst nicht mal, ob es regnet oder ob die Sonne scheint.\n");
+ AddDetail("feucht",
+ "Bloss weil feucht grossgeschrieben ist es noch lange kein Substantiv, wenn\n"
+ +"ueberhaupt heisst es dann _Feuchtigkeit_ :).\n");
+ AddDetail("substantiv", "Nicht jedes Substantiv ist ein sinnvolles Detail :)\n");
+ AddDetail("feuchtigkeit", "Ein wenig feucht, wie man es halt aus jedem Wald so kennt.\n");
+ AddDetail("kaelte",
+ "Durch das wenige Sonnenlicht, das bis nach hier unten durchdringt, ist es\n"
+ +"hier verhaeltnismaessig frisch.\n");
+ AddDetail("dunkelheit",
+ "Wenn es hell ist, ist es nicht mehr dunkel und wenn es nicht hell ist, kannst\n"
+ +"Du nicht viel sehn. Wie also willst Du die Dunkelheit untersuchen :)?\n");
+ AddDetail("_feuchtigkeit_", "Meine Guete, nimm doch nich immer alles gleich _so_ woertlich.\n");
+ AddDetail("guete", "Sei lieber vorsichtig, soo guetig bin ich nu auch nicht :).\n");
+ AddDetail(({"lichtquelle", "nachtsicht"}),
+ "Hier ist es eigentlich verdammt dunkel und ohne Nachtsicht oder eine eigene\n"
+ +"Lichtquelle, koenntest Du hier _nichts_ sehn.\n");
+ AddDetail(({"ausgang", "osten"}),
+ "Wenn Du dem Weg Richtung Osten folgst, dann kommst Du ziemlich bald wieder\n"
+ +"Richtung Ausgang.\n");
+ AddDetail(({"stueck", "wald", "westen"}),
+ "Naja.. Du stehst zwar schon im Wald drin, aber nach Westen hin, gehst es noch\n"
+ +"ein Stueck tiefer hinein.\n");
+ AddExit("osten", ROOM("eingang"));
+ AddExit("westen", ROOM("weg2"));
+ AddItem(NPC("waechter"), REFRESH_REMOVE, 1);
+}
+
+static string det_weg()
+{
+ if (present(WALDID("waechtereiche"), ME))
+ return "Mitten auf dem Weg steht der Waechter des Waldes und kontrolliert sehr genau,\n"
+ +"wer in den Wald hinein darf und wer nicht. Eigentlich ist er jedoch den\n"
+ +"meisten immer sehr friedlich gesonnen.\n";
+ return "Der Weg fuehrt hier nach Westen noch ein Stueck tiefer in den Wald hinein,\n"
+ +"nach Osten kannst Du jedoch wieder in Richtung Ausgang des Zauberwalds gehn.\n";
+}
+
+static string _query_int_long()
+{
+ if (present(WALDID("waechtereiche"), ME))
+ return "Hier ist es jetzt richtig duester und ohne eigene Lichtquelle koenntest Du\n"
+ +"nichts mehr sehn, da so gut wie ueberhaupt kein Licht mehr durch das\n"
+ +"Blaetterdach auf den Weg scheint. Mitten in dieser eigentlich lebens-\n"
+ +"unfreundlichen Szene, steht eine grosse alte Eiche mitten auf dem Weg.\n";
+ return "Hier ist es jetzt richtig duester und ohne eigene Lichtquelle koenntest Du\n"
+ +"hier nichts mehr sehn, da so gut wie ueberhaupt kein Licht mehr durch das\n"
+ +"Blaetterdach auf den Weg scheint. Du kannst noch ein Stueck tiefer in den\n"
+ +"Wald hinein und nach Westen gehn, oder aber zurueck Richtung Kreuzung nach\n"
+ +"Osten.\n";
+}
diff --git a/doc/beispiele/zauberwald/room/weg2.c b/doc/beispiele/zauberwald/room/weg2.c
new file mode 100644
index 0000000..0d06169
--- /dev/null
+++ b/doc/beispiele/zauberwald/room/weg2.c
@@ -0,0 +1,93 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+
+inherit ROOM("stdroom");
+
+void create()
+{
+ ::create();
+ SetProp(P_INDOORS, 0);
+ SetProp(P_LIGHT, 1);
+ SetProp(P_INT_SHORT, "Am Rande einer Lichtung im Zauberwald");
+ AddSpecialDetail(({"wald", "zauberwald"}), "_query_int_long");
+ AddDetail(({"westen", "lichtung", "plaetzchen", "idyllisches plaetzchen"}),
+ "Im Westen befindet sich eine grosse Lichtung mit einem kleinen Tuempel, am\n"
+ +"Rande der Lichtung stehen vereinzelt noch einige Baeume aber zum Tuempel hin,\n"
+ +"wird es dann mehr und mehr nur noch Gras das den Boden bedeckt.\n");
+ AddDetail(({"rasen", "gras"}),
+ "Am besten betrittst Du die Lichtung einfach und schaust Dir den Rasen\n"
+ +"naeher an.\n");
+ AddDetail("tuempel",
+ "Wenn Du Dir den Tuempel naeher ansehen moechtest, dann solltest Du schon\n"
+ +"ein Stueck naeher rangehen.\n");
+ AddDetail(({"stueck", "raum"}),
+ "Na wenigstens einen Raum weiter solltest Du schon gehn.\n");
+ AddDetail("schatten",
+ "Hier befindest Du Dich noch im Schatten der Baeume, die Lichtung im Westen\n"
+ +"liegt jedoch komplett in der waermenden Sonne.\n");
+ AddSpecialDetail("sonne", "det_sonne");
+ AddDetail(({"wegesrand", "baeume", "wegrand", "rand"}),
+ "Am Wegesrand stehen einige Baeume die ein schoenes Blaetterdach ueber den Weg\n"
+ +"spannen und den Weg in ihren Schatten legen.\n");
+ AddDetail(({"himmel", "blaetterdach", "dach", "licht", "sonnenstrahlen", "wolken", "wolke"}),
+ "Das Blaetterdach ist ziemlich dicht, so dass Du nicht soo viel sehen kannst,\n"
+ +"aber einige Sonnenstrahlen durchbrechen das Dach und erreichen den Weg.\n");
+ AddDetail(({"weg", "boden", "erde", "ausgang", "osten", "richtung"}),
+ "Im Westen fuehrt der Weg zu einer grossen Lichtung, waehrend er nach Osten hin\n"
+ +"Richtung Ausgang des Zauberwalds fuehrt.\n");
+ AddDetail("voegel", "Du kannst sie deutlich hoeren, bekommst aber keinen zu sehn.\n");
+ AddExit("osten", ROOM("weg1"));
+ AddExit("suedwesten", ROOM("lichtungso"));
+ AddExit("westen", ROOM("lichtungo"));
+ AddExit("nordwesten", ROOM("lichtungno"));
+ AddCmd("osten", "cmd_osten");
+ AddItem(NPC("laufeiche"), REFRESH_DESTRUCT);
+}
+
+static string det_sonne()
+{
+ if (PL) PL->SetProp(P_BLIND, 1);
+ return "Du schaust fasziniert in die Sonne und untersucht sie naeher, doch das war\n"
+ +"wohl ein grosser Fehler, denn ploetzlich wird es ganz ganz dunkel um Dich rum.\n";
+}
+
+void init()
+{
+ // wenn man von westen kommt und keine blockende Eiche hier ist, dann
+ // so betrachten als waere man aus dem osten gekommen
+ if (query_once_interactive(PL) && !present(WALDID("eiche")))
+ PL->SetProp(AUSGANG, "westen");
+ ::init();
+}
+
+static int cmd_osten()
+// wenn gerade eine Eiche hierhin gelaufen ist, kommen feindliche
+// Spieler nicht mehr vorbei :)
+{
+ if (PL && PL->QueryProp(AUSGANG)!="westen" &&
+ PL->QueryProp(ZAUBERWALD)>time() && present(WALDID("eiche"), ME)) {
+ if (present(WALDID("eiche 2"), ME))
+ write("Die Eichen stehen Dir dabei leider im Weg und lassen Dich nicht vorbei.\n");
+ else write("Die Eiche steht Dir dabei leider im Weg und laesst Dich nicht vorbei.\n");
+ return 1;
+ }
+}
+
+static string _query_int_long()
+{
+ if (!PL || PL->QueryProp(ZAUBERWALD)<=time())
+ return
+ "Du stehst nun mitten im Zauberwald. Im Westen erstreckt sich vor Dir eine\n"
+ +"grosse Lichtung, auf die Du muehelos gelangen kannst. Nach Osten hin fuehrt\n"
+ +"ein schmaler Weg zurueck zum Ausgang des Waldes. Alles scheint hier sehr\n"
+ +"friedlich zu sein, die Voegel zwitschern und das Blaetterdach ist hier auch\n"
+ +"nicht mehr so dicht wie im Osten, so dass einige Sonnenstrahlen den Weg\n"
+ +"erreichen. Es zieht Dich foermlich nach Westen auf die Lichtung, mitten auf\n"
+ +"dieses sonnige idyllische Plaetzchen.\n";
+ return "Nichts wie raus hier. Es war ganz und gar keine gute Idee hier im Wald Deiner\n"
+ +"Aggressivitaet freien Lauf zu lassen. Du kannst von Glueck haben, wenn Du mit\n"
+ +"einem blauen Auge davon kommst und den Wald noch lebend verlassen kannst.\n"
+ +"Nach Westen gelangst Du auf die grosse Lichtung, ratsamer waere jedoch wohl\n"
+ +"eher der Waldweg im Osten, ueber den Du den Zauberwald wieder verlassen kannst.\n";
+}