Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/doc/beispiele/zauberwald/files.h b/doc/beispiele/zauberwald/files.h
new file mode 100644
index 0000000..8525d78
--- /dev/null
+++ b/doc/beispiele/zauberwald/files.h
@@ -0,0 +1,25 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#define HOME(x) "/doc/beispiele/"+x
+#define WALD(x) HOME("zauberwald/"+x)
+#define ROOM(x) WALD("room/"+x)
+#define NPC(x)  WALD("npc/"+x)
+#define OBJ(x)  WALD("obj/"+x)
+
+#include <defines.h>
+#include <properties.h>
+#include "/p/service/padreic/mnpc/mnpc.h"
+
+#define BS(x) break_string(x, 78)
+#define PO    previous_object()
+#define DEBUG(x) tell_object(find_player("padreic"), x);
+
+#define SAECKCHEN "/d/wald/padreic/obj/saeckchen.c"
+
+
+#define ZAUBERWALD "\npadreiczauberwald" /* gesetzt wenn man im wald ist */
+#define AGGRESSIVE_TIME 900              /* zeit bis zur befriedung */
+#define ZAUBERWALDNPC WALDID("npc")
+#define AUSGANG     "\npadreicausgang"   /* die letzte Bewegung */
+#define WALDID(x)   ZAUBERWALD+x
+#define EXTRA_LONG   "\npadreiczusatzlong" /* zur ergaenzung zur VC-long */
diff --git a/doc/beispiele/zauberwald/npc/arina.c b/doc/beispiele/zauberwald/npc/arina.c
new file mode 100644
index 0000000..9e08e25
--- /dev/null
+++ b/doc/beispiele/zauberwald/npc/arina.c
@@ -0,0 +1,101 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+#include <combat.h>
+#include <new_skills.h>
+#include "/p/zauberer/zauberer.h"
+
+inherit NPC("stdnpc");
+
+void create()
+{
+   ::create();
+   SetProp(P_SHORT, "Arina die Waldfee");
+   SetProp(P_LONG,
+      "Vor Dir steht Arina die weise Waldfee. Sie ist die Lehrerin des Waldes und\n"
+     +"unterrichtet die Pixies. In ihrer Hand haelt sie einen kleinen Zeigestock mit\n"
+     +"dem sie alles moegliche erklaert und Buchstaben in den Sand zeichnet. Auch\n"
+     +"Arina ist, genauso wie ihre Schwesten, bildhuebsch, doch ihr gestrenger Blick\n"
+     +"floesst jedem in ihrer Naehe grossen Respekt ein.\n");
+   SetProp(P_NAME, "Arina");
+   SetProp(P_ARTICLE, 0);
+   SetProp(P_GENDER, FEMALE);
+   SetProp(P_LEVEL, 80);
+   SetProp(P_ATTRIBUTES, (["int":80,"con":40,"str":16,"dex":50]) );
+   SetProp(P_DISABLE_ATTACK, -10000); // is nich :)
+   SetProp(P_BODY, 80);
+   SetProp(P_MAX_SP, 2000);
+   SetProp(P_SP, 2000);
+   SetProp(P_MAX_HP, 700);
+   SetProp(P_HP, 700);
+   SetProp(P_ALIGN, 400);
+   SetProp(P_RACE, "Fee");
+   SetProp(P_SIZE, 160+random(16));
+   SetProp(P_ALCOHOL, 0);
+   SetProp(P_CORPSE, OBJ("feenleiche"));
+   SetProp(P_MAX_ALCOHOL, 0); // kein rauschen :)
+   AddAdjective("wunderschoen");
+   AddId(({"arina", "fee", "waldfee", WALDID("fee")}));
+   SetProp(P_HANDS, ({" mit ihren zarten Haenden", 150, DT_BLUDGEON}) );
+   SetProp(P_SKILL_ATTRIBUTE_OFFSETS, ([SA_SPELL_PENETRATION: 200]));
+   SetProp(P_XP, 800*200*5*2);
+   SetProp(P_GUILD, "zauberer");
+   SetProp(P_Z_NO_MATERIAL, 1);
+   SetProp(P_DEFAULT_INFO, "schweigt und laechelt Dich einfach nur freundlich an.\n");
+   ModifySkill("verletze",
+      ([SI_SKILLABILITY:9000, SI_SPELLCOST:0,
+        SI_SPELLFATIGUE:0, SI_NO_CONSEQUENCES:10000,
+        SI_SKILLRESTR_USE:([P_GUILD_LEVEL:0,SR_FREE_HANDS:0]),
+        SI_ARMOUR_RESTR:0]),0,"zauberer");
+   SetProp(P_GUILD, 0);
+   SetProp(P_RESISTANCE_STRENGTHS,
+      ([DT_POISON: 0.15,
+        DT_MAGIC: -0.3 ]) );
+   AddItem(OBJ("stock"), CLONE_WIELD);
+   AddItem(OBJ("kleid"), CLONE_WEAR);
+   if (file_size(SAECKCHEN)>0) AddItem(SAECKCHEN, CLONE_NEW);
+}
+
+void Attack(object enemy)
+{
+   int normal_speed;
+   normal_speed=(enemy->QueryProp(P_SKILL_ATTRIBUTE_OFFSETS)||([]))[SA_SPEED]||100;
+   if (enemy && enemy->QuerySkillAttribute(SA_SPEED) > normal_speed) {
+      write("Die Fee macht eine beruhigende Handbewegung und ploetzlich fuehlst Du Dich\n"
+           +"ruhig und Du merkst wie Du allmaehlich wieder langsamer wirst...\n");
+      enemy->ModifySkillAttribute(SA_SPEED, -20, 180);
+   }
+   if (enemy) ::Attack(enemy);
+   SetProp(P_GUILD, "zauberer");
+   command("verletze mit "+({"feuer", "magie", "eis", "wasser", "wind"})[random(5)] );
+   SetProp(P_GUILD, 0);
+}
+
+int Defend(int dam, mixed dts, mixed spell, object enemy)
+{
+   int normal_speed;
+   normal_speed=(enemy->QueryProp(P_SKILL_ATTRIBUTE_OFFSETS)||([]))[SA_SPEED]||100;
+   if (enemy && enemy->QuerySkillAttribute(SA_SPEED) > normal_speed) {
+      write(Name(WER)+" macht eine beruhigende Handbewegung und ploetzlich fuehlst Du Dich\n"
+           +"ruhig und Du merkst wie Du allmaehlich wieder langsamer wirst...\n");
+      enemy->ModifySkillAttribute(SA_SPEED, -20, 180);
+   }
+
+   if ((!spell || (mappingp(spell) && spell[SP_PHYSICAL_ATTACK])) && !random(3)) {
+      tell_room(environment(), Name(WER)+" weicht schnell einen Schritt zurueck und weicht Deinem Angriff aus.\n");
+      dam=0;
+   }
+   return (int)::Defend(dam, dts, spell, enemy);
+}
+
+void NotifyPlayerDeath(object who, object killer, object lost_exp)
+{
+  if (!who || killer!=ME) return; // uninteressant
+  log_file("padreic/kill", ctime(time())+" "+capitalize(getuid(who))+" getoetet von /zauberwald/arina\n");
+}
+
+void die()
+{
+  log_file("padreic/kill", ctime(time())+" Arina wurde von "+get_killer()+" getoetet.\n");
+  ::die();
+}
diff --git a/doc/beispiele/zauberwald/npc/laufeiche.c b/doc/beispiele/zauberwald/npc/laufeiche.c
new file mode 100644
index 0000000..0649276
--- /dev/null
+++ b/doc/beispiele/zauberwald/npc/laufeiche.c
@@ -0,0 +1,124 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+#include <combat.h>
+#include <moving.h>
+#include <new_skills.h>
+
+inherit NPC("stdnpc");
+inherit MNPC_MOVING;
+
+void create()
+{
+   if (!clonep(ME)) return;
+   stdnpc::create();
+   moving::mnpc_create();
+   SetProp(P_NAME_ADJ, "alt");
+   SetProp(P_NAME, "Eiche");
+   SetProp(P_SHORT, "Eine alte Eiche");
+   SetProp(P_MSGOUT, "wandert");
+   SetProp(P_LONG,
+     "Vor Dir steht eine sehr sehr alte Eiche. Doch diese Eiche ist keine\n"
+    +"gewoehnliche Eiche, wie Du sie bereits an vielen anderen Stellen gesehn hast.\n"
+    +"Diese Eiche lebt! Du kannst deutlich einen Mund, eine Nase und sogar zwei\n"
+    +"Ohren erkennen. Sie ist eigentlich sehr friedlich gesonnen, kann aber auch\n"
+    +"sehr sehr boese werden, wenn es jemand wagt die Ruhe des Waldes zu stoeren.\n");
+   SetProp(P_RACE, "eiche");
+   SetProp(P_LEVEL, 50);
+   SetProp(P_ATTRIBUTES, (["int":50,"con":50,"str":70,"dex":15]) );
+   SetProp(P_GENDER, FEMALE);
+   SetProp(P_MAX_HP, 500);
+   SetProp(P_HP, 500);
+   SetProp(P_ALIGN, 500);
+   SetProp(P_BODY, 100);
+   SetProp(P_SIZE, 650+random(151));
+   AddAdjective("alt");
+   AddId(({"eiche", "eichen", WALDID("eiche") }));
+   SetProp(P_HANDS, ({" mit einem ihrer langen Aeste",400, DT_WHIP}) );
+   SetProp(P_SKILL_ATTRIBUTE_OFFSETS, ([SA_SPEED:180]));
+   SetProp(P_NOCORPSE, 1);
+   SetProp(P_XP, 500*400*5);
+   SetProp(P_DEFAULT_INFO, "bleibt absolut regungslos und reagiert ueberhaupt nicht.\n");
+   SetProp(P_RESISTANCE_STRENGTHS,
+    ([DT_SLASH:     0.1,
+      DT_MAGIC:    -1.0,
+      DT_BLUDGEON: -0.5,
+      DT_POISON:    0.25,
+      DT_HOLY:     -1.0,
+      DT_RIP:       0.25,
+      DT_FIRE:      0.25,
+      DT_PIERCE:   -0.5,
+      DT_WHIP:     -1.0 ]) );
+   SetProp(MNPC_AREA, ({ ROOM("weg2"), ROOM("lichtung") }) );
+   SetProp(MNPC_RANDOM, 10);
+   SetProp(MNPC_DELAY, 8);
+   SetProp(MNPC_WALK_TIME, 600);
+   SetProp(MNPC_FLAGS, MNPC_WALK|MNPC_NO_WALK_IN_FIGHT|MNPC_ONLY_EXITS);
+}
+
+static string _query_info()
+{
+   if (!PL || PL->QueryProp(ZAUBERWALD)<=time())
+      return "Die alte Eiche ist Dir sehr friedlich gesonnen. Es ist jedoch auch sicher\n"
+            +"klug dieses nicht zu aendern, da sie mit ihren Aesten wohl auch sehr kraeftig\n"
+            +"zuschlagen kann.\n";
+   return "Du hast den Zorn der alten Eiche auf Dich gezogen, das war ganz und gar nicht\n"
+         +"klug von Dir. Jetzt lebe auch mit den Konsequenzen....\n";
+}
+
+int remove()
+// wenn eine Eiche getoetet wird, dann verlangsamt das den reset der Eiche
+// die auf weg2 blockt. In der Regel steht ja auch so schon immer eine der
+// wanderden Eichen dort. Dies soll verhindern, das gerade eine Eiche resetet
+// wenn man eine tod hat.
+{
+   call_other(ROOM("weg2"), "delay_reset");
+   catch(call_other(QueryProp(MNPC_HOME), "delay_reset", 900+random(3600)));
+   return (int)::remove();
+}
+
+// wenn man den MNPC mit einem anderen stdnpc kombiniert muessen einige
+// funktionen per Hand ueberschrieben werden....
+
+void reset()
+{
+   stdnpc::reset();
+   moving::mnpc_reset();
+}
+
+void init()
+{
+   stdnpc::init();
+   moving::mnpc_init();
+}
+
+varargs int move(mixed dest, int meth, string dir, string out, string in)
+{
+   int i;
+
+   // extra fuer den Zauberwald eingebaut
+   if (environment() && object_name(environment())==ROOM("weg2")) {
+      // wenn es die einzige Eiche ist, dann bleibt sie hier stehn,
+      // bewacht den Weg und bewegt sich nicht mehr hier weg!
+      object *inv;
+
+      inv = all_inventory(environment()) - ({ ME });
+      for (i=sizeof(inv)-1; i>=0; i--)
+         if (BLUE_NAME(inv[i])==NPC("laufeiche")) break;
+      if (i<0) return ME_CANT_LEAVE_ENV;
+   }
+   //////////////////////////////////////
+   i=(int)stdnpc::move(dest, meth, dir, out, in);
+   if (i!=1) return i;
+   moving::mnpc_move();
+   return 1;
+}
+
+int PreventFollow(object dest)
+{  return moving::mnpc_PreventFollow(dest);  }
+
+void NotifyPlayerDeath(object who, object killer, object lost_exp)
+{
+  if (!who || killer!=ME) return; // uninteressant
+  log_file("padreic/kill", ctime(time())+" "+capitalize(getuid(who))+" getoetet von /zauberwald/laufeiche\n");
+}
diff --git a/doc/beispiele/zauberwald/npc/pixie.c b/doc/beispiele/zauberwald/npc/pixie.c
new file mode 100644
index 0000000..7ed953d
--- /dev/null
+++ b/doc/beispiele/zauberwald/npc/pixie.c
@@ -0,0 +1,150 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+#include <moving.h>
+#include <combat.h>
+
+inherit NPC("stdnpc");
+
+void create()
+{
+   ::create();
+   SetProp(P_SHORT, "Ein kleiner Pixie");
+   SetProp(P_SIZE, 55+random(11));
+   SetProp(P_LONG, BS(
+     "Der Pixie ist etwa "+QueryProp(P_SIZE)+"cm gross und sieht vermutlich einem "
+    +"kleinen pumeligen Menschenkind am aehnlichsten. Wie alle Pixies scheint er "
+    +"sehr verspielt zu sein und nichts als Unfug im Kopf zu haben, Du solltest "
+    +"Dich also vor ihm ihn acht nehmen. Auch wenn er aussieht wie ein Kind, sich "
+    +"benimmt wie ein Kind, so kann er Dir mit seiner Magie sicher uebel zu spieln."));
+   SetProp(P_INFO, /* kleine Warnung fuer die Kaempfer :) */
+     "Man sollte sich immer vor der Magie der Pixies in acht nehmen, sie ist nicht\n"
+    +"unbedingt gefaehrlich, aber es koennen die unerwartesten Dinge geschehn. So\n"
+    +"ist durchaus von Leuten bekannt die einen Kampf als kleine Ratte beendeten,\n"
+    +"oder deren Schwert im Kampf ploetzlich zu Scheisse zerfloss...\n");
+   SetProp(P_NAME_ADJ, "klein");
+   SetProp(P_NAME, "Pixie");
+   SetProp(P_GENDER, MALE);
+   SetProp(P_RACE, "pixie");
+   SetProp(P_ATTRIBUTES, (["int":30,"con":20,"str":15,"dex":30]) );
+   SetProp(P_LEVEL, 20);
+   SetProp(P_MAX_HP, 600);
+   SetProp(P_HP, 600);
+   SetProp(P_MAX_SP, 800);
+   SetProp(P_SP, 800);
+   SetProp(P_ALIGN, 250);
+   SetProp(P_HANDS, ({" mit seinen kleinen Haenden", 150, DT_BLUDGEON}) );
+   SetProp(P_XP, 600*150*5);
+   AddAdjective("klein");
+   AddId("pixie");
+}
+
+// teleporter Ziele im Gebiet. Der Pixie will ja einfach nur ein bisschen
+// Aergern und nicht helfen (ein Pixiekampf ist kein Ausgang :)
+#define DEST ({"lichtungno", "lichtungso", "lichtungn", "lichtungs", \
+               "lichtungnw", "lichtungsw", "lichtungo", "lichtungw", \
+               "weg2", "stein"})
+
+void Attack(object enemy)
+{
+   object ob, weapon;
+   
+   ob=SelectEnemy();
+   if (ob) switch(random(7*8)) { // jede 8te Runde ein Zauberspruch...
+      case 0: // in Frosch verwandeln...
+        if (!ob->QueryProp(P_FROG)) {
+          tell_object(ob, "Der Pixie dreht Dir eine lange Nase und verwandelt Dich in einen Frosch.\n");
+          say(BS("Der Pixie dreht "+ob->name(WEM)+" eine lange Nase und verwandelt "
+                +ob->QueryPronoun(WEN)+" in einen Frosch,"), ob);
+          ob->SetProp(P_FROG, 1);
+          return;
+        }
+        break;
+      case 8..10: // einfach nur nerviger Teleport innerhalb des Gebiets :)
+        tell_object(ob,
+          "Der Pixie schliesst kurz seine Augen und eh Du Dich versiehst, verschwimmt\n"
+         +"alles um Dich herum...\n");
+        say(BS("Der Pixie schliesst kurz seine Augen und ploetzlich loest sich "
+              +ob->name(WER)+" in Luft auf."), ob);
+        ob->move(ROOM(DEST[random(sizeof(DEST))]), M_TPORT|M_NOCHECK|M_SILENT);
+        return;
+      case 16: // Geschlecht aendern... :)
+        tell_object(ob,
+          "Der Pixie grinst breit bis ueber beide Ohren und schaut Dich an, Du weisst\n"
+         +"gar nicht wie Dir geschieht, aber irgendetwas aendert sich an Deinem Koerper.\n");
+        say(BS("Der Pixie grinst "+ob->name(WEN)+" breit an. Ploetzlich "
+         +(ob->QueryProp(P_GENDER)==FEMALE
+         ? "verschwinden ihre Brueste und es waechst ihr ploetzlich ein Bart."
+         : "verschwindet sein Bart und ihm wachsen zwei neue Brueste.")), ob);
+        if (ob->QueryProp(P_GENDER)==FEMALE)
+          ob->SetProp(P_GENDER, MALE);
+        else ob->SetProp(P_GENDER, FEMALE);
+        return;
+      case 24:
+        if (objectp(weapon=ob->QueryProp(P_WEAPON))) {
+           weapon->DoUnwield(1);
+           // verfluchte Waffen nicht betreffen :))
+           if (!objectp(weapon->QueryProp(P_WIELDED))) {
+              string str1, str2;
+              str1=str2=(weapon)->name(WER);
+              if (str1[0..2]=="ein") {
+                str1="D"+str1;
+                str2="s"+str2;
+              }
+              tell_object(ob, BS(
+               "Der Pixie starrt Dir in die Augen und schnippst einmal kurz mit seinen "
+              +"Fingern. Ploetzlich zerrint "+str1+" in Deinen Haenden zu einem Haufen "
+              +"Scheisse."));
+              say(BS("Der Pixie starrt "+weapon->name(WEM)+" in die Augen und "
+                    +"schnippst einmal kurz mit den Fingern. Ploetzlich "
+                    +"zerrint "+weapon->name(WEM)+" "+str2
+                    +" in einen Haufen Scheisse."), ob);
+              weapon->remove();
+              if (weapon) destruct(weapon);
+              return;
+           }
+        }
+        break;
+      case 32:
+        if (!ob->QueryProp(P_BLIND)) {
+          tell_object(ob, BS(
+             "Der Pixie haelt sich die Hand vor die Augen und grinst breit. Ploetzlich "
+            +"merkst Du, wie alles ganz dunkel um Dich rum wird..."));
+          say(BS("Der Pixie haelt sich die Hand vor die Augen und grinst breit. "
+                +ob->name(WER)
+                +" schaut daraufhin ziemlich irritiert in die Gegend."), ob);
+          ob->SetProp(P_BLIND, 1);
+          return;
+        }
+        break;
+      case 40:
+        if (ob->QueryProp(P_POISON)<3 && ob->QueryProp(P_MAX_POISON)>=3) {
+          tell_object(ob, BS(
+             "Der Pixie streicht sich mit der Hand zufrieden ueber seinen Bauch und schaut "
+            +"Dich dabei an. Ploetzlich wird Dir richtig uebel..."));
+          say(BS("Der Pixie streicht sich mit seiner Hand zufrieden ueber seinen Bauch und\n"
+                +"schaut "+ob->name(WEM)+" dabei in die Augen. Ploetzlich wird "+ob->name(WEM)
+                +" ganz uebel."), ob);
+          ob->SetProp(P_POISON, 3);
+          return;
+        }
+        break;
+      case 48:
+        if (!ob->QueryProp(P_DEAF)) {
+          tell_object(ob, "Der Pixie haelt sich die Ohren zu und grinst breit.\n");
+          say(BS("Der Pixie haelt sich die Ohren zu und grinst dabei "
+                +ob->name(WEN)+" an."), ob);
+          ob->SetProp(P_DEAF, 1);
+          return;
+        }
+        break;
+      default:
+   }
+   if (enemy && present(enemy, environment())) ::Attack(enemy);
+}
+
+void NotifyPlayerDeath(object who, object killer, object lost_exp)
+{
+  if (!who || killer!=ME) return; // uninteressant
+  log_file("padreic/kill", ctime(time())+" "+capitalize(getuid(who))+" getoetet von /zauberwald/pixie\n");
+}
diff --git a/doc/beispiele/zauberwald/npc/riese.c b/doc/beispiele/zauberwald/npc/riese.c
new file mode 100644
index 0000000..a68a3e2
--- /dev/null
+++ b/doc/beispiele/zauberwald/npc/riese.c
@@ -0,0 +1,92 @@
+// (c) 2003 by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+#include <properties.h>
+
+inherit NPC("stdnpc");
+
+void create()
+{
+   ::create();
+   create_default_npc(30, 2500);
+   SetProp(P_ARTICLE, 0);
+   SetProp(P_SHORT, "Grimmbart Felsenschieber");
+   SetProp(P_LONG,
+     "Vor Dir sitzt der Riese Grimmbart Felsenschieber. Eigentlich scheint er\n"
+    +"ein sehr gutmuetiger und freundlicher Riese zu sein. Aber irgendwie wirkt\n"
+    +"er derzeit sehr traurig.\n");
+
+   SetProp(P_NAME, "Grimmbart Felsenschieber");
+   SetProp(P_GENDER, MALE);
+   SetProp(P_SIZE, 297);
+   SetProp(P_ALIGN, 200);
+   SetProp(P_RESISTANCE_STRENGTHS,
+     ([DT_HOLY:-1.0,
+       DT_UNHOLY:0.5,
+       DT_MAGIC:0.25,
+       DT_POISON:-0.25,
+       DT_WHIP:-0.6,
+       DT_BLUDGEON:-0.3,
+       DT_PIERCE:-0.1,
+       DT_SLASH:-0.1
+     ]));
+
+   AddInfo(({"felsen", "fels"}),
+     "Ich liebe es meine Muskeln anzuspannen und Felsen zu schieben.",
+     "antwortet: ");
+   AddInfo("schieben",
+     "Ich habe doch keine Felsen mehr die ich schieben koennte.");
+   AddInfo(({"trauer", "traurigkeit"}),
+     "Frueher da habe ich den ganzen Tag hier meine Felsen hin- und "
+    +"hergeschoben, aber nun hat Ulinia mir verboten hier im Wald mit "
+    +"den Felsen zu spielen und ich musste sie alle wegtragen :o(",
+     "jammert: ");
+   AddInfo("tag", "Ja so ein Tag ist ganz schoen lang ohne Felsen",
+     "sagt: ");
+   AddInfo("ulinia",
+      "Eine richtig bloede Fee und haette sie ihre doofen Zauberkraefte nicht,"
+     +"koennte sie uns hier auch nicht alle so rumkommandieren *mopper*.",
+     "sagt: ");
+   AddInfo("grund",
+      "Nur weil mir einmal ausversehen ein klitzekleiner Fels in den Tuempel "
+     +"gefallen ist, musste ich all meine schoenen Felsen aus dem Wald bringen.",
+     "sagt: ");
+   AddInfo("tuempel",
+      "Bloeder Tuempel, wer braucht den schon!", "antwortet gereizt: ");
+   AddInfo("zauberkraefte",
+      "Ich freu mich schon richtig auf den Tag, an dem Ulinias Zauberkraefte "
+     +"nachlassen!",
+      "sagt: ");
+   AddInfo(({"wald", "zauberwald"}),
+      "Wenn es hier wieder ganz viele schoene Felsen gaebe, waer er wieder das "
+     +"reinste Paradies.", "antwortet: ");
+   AddInfo("paradies",
+      "Ja frueher war der Wald hier einmal das reinste Paradies.", "antwortet: ");
+
+   SetChats(3,
+     ({Name(WER)+" sagt: Ich bin so traurig.\n",
+       Name(WER)+" schluchzt: meine schoenen Felsen.. wuaaahhhhh\n",
+       Name(WER)+" sagt: nie wieder werde ich Felsen schieben koennen.\n",
+       Name(WER)+" sagt: F E L S E N !\n",
+       Name(WER)+" jammert: Die Welt ist so furchtbar ungerecht!\n",
+       Name(WER)+" fragt: Wie soll ich so bloss weiterleben?\n"
+     }));
+   
+   AddId("riese");
+   AddId("grimmbart");
+   AddId("felsenschieber");
+}
+
+void NotifyPlayerDeath(object who, object killer, object lost_exp)
+{
+  if (!who || killer!=ME) return; // uninteressant
+  log_file("padreic/kill", ctime(time())+" "+capitalize(getuid(who))
+    +"getoetet von /zauberwald/riese\n");
+}
+
+void die()
+{
+  log_file("padreic/kill", ctime(time())+" Grimmbart wurde von  "+get_killer()
+    +" getoetet.\n");
+  ::die();
+}
diff --git a/doc/beispiele/zauberwald/npc/stdnpc.c b/doc/beispiele/zauberwald/npc/stdnpc.c
new file mode 100644
index 0000000..a2b3d2f
--- /dev/null
+++ b/doc/beispiele/zauberwald/npc/stdnpc.c
@@ -0,0 +1,39 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+
+inherit "/std/npc";
+inherit "/p/service/mupfel/getkill";
+
+void create()
+{
+   ::create();
+   SetProp(ZAUBERWALDNPC, 1);
+   SetProp(P_AGGRESSIVE, ([P_RACE:(["Dunkelelf":1, 0:0.0]) ]));
+}
+
+int AutoAttack(object ob)
+{
+   if (ob && ob->QueryProp(ZAUBERWALD)>time()) return 1;
+   return ::AutoAttack(ob);
+}
+
+int InsertEnemy(object ob)
+{
+   int ret, is_enemy;
+   is_enemy=IsEnemy(ob);
+   ret=(int)::InsertEnemy(ob);
+   if (!is_enemy) { // alle anderen Zauberwald-NPCs im Raum verstaendigen
+      filter_objects(
+        filter_objects(all_inventory(environment())-users(), "QueryProp", ZAUBERWALDNPC),
+        "InsertEnemy", ob
+      );
+   }
+   return ret;
+}
+
+int Defend(int dam, mixed dts, mixed spell, object enemy)
+{
+   if (enemy) enemy->SetProp(ZAUBERWALD, time()+AGGRESSIVE_TIME);
+   return (int)::Defend(dam, dts, spell, enemy);
+}
diff --git a/doc/beispiele/zauberwald/npc/titina.c b/doc/beispiele/zauberwald/npc/titina.c
new file mode 100644
index 0000000..adce062
--- /dev/null
+++ b/doc/beispiele/zauberwald/npc/titina.c
@@ -0,0 +1,114 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+#include <combat.h>
+#include <new_skills.h>
+#include "/p/zauberer/zauberer.h"
+
+inherit NPC("stdnpc");
+
+void create()
+{
+   ::create();
+   SetProp(P_SHORT, "Titina die Waldfee");
+   SetProp(P_LONG,
+      BS("Vor Dir steht Titina die Waldfee. Ihr langes goldenes Haar weht "
+     +"leicht im Wind und das einzige was sie bedeckt, ist ein leichtes Blaetterkleid "
+     +"das ihre weiblichen Rundungen ausserordentlich gut zur Geltung bringt. "
+     +"Ihre schoenen blauen Augen, tun ein uebriges um Dich ganz wahnsinnig zu machen."));
+   SetProp(P_NAME, "Titina");
+   SetProp(P_ARTICLE, 0);
+   SetProp(P_GENDER, FEMALE);
+   SetProp(P_LEVEL, 80);
+   SetProp(P_ATTRIBUTES, (["int":60,"con":40,"str":16,"dex":50]) );
+   SetProp(P_DISABLE_ATTACK, -10000); // is nich :)
+   SetProp(P_BODY, 80);
+   SetProp(P_MAX_SP, 2000);
+   SetProp(P_SP, 2000);
+   SetProp(P_MAX_HP, 600);
+   SetProp(P_HP, 600);
+   SetProp(P_ALIGN, 400);
+   SetProp(P_RACE, "Fee");
+   SetProp(P_SIZE, 160+random(16));
+   SetProp(P_ALCOHOL, 0);
+   SetProp(P_CORPSE, OBJ("feenleiche"));
+   SetProp(P_MAX_ALCOHOL, 0); // kein rauschen :)
+   AddAdjective("wunderschoen");
+   AddId(({"titina", "fee", "waldfee", WALDID("fee")}));
+   SetProp(P_HANDS, ({" mit ihren zarten Haenden", 150, DT_BLUDGEON}) );
+   SetProp(P_SKILL_ATTRIBUTE_OFFSETS, ([SA_SPELL_PENETRATION: 100]));
+   SetProp(P_XP, 800*200*5*2);
+   SetProp(P_GUILD, "zauberer");
+   SetProp(P_Z_NO_MATERIAL, 1);
+   SetProp(P_DEFAULT_INFO, "schweigt und laechelt Dich einfach nur freundlich an.\n");
+   ModifySkill("verletze",
+      ([SI_SKILLABILITY:8000, SI_SPELLCOST:0,
+        SI_SPELLFATIGUE:0, SI_NO_CONSEQUENCES:10000,
+        SI_SKILLRESTR_USE:([P_GUILD_LEVEL:0,SR_FREE_HANDS:0]),
+        SI_ARMOUR_RESTR:0]),0,"zauberer");
+   SetProp(P_GUILD, 0);
+   SetProp(P_RESISTANCE_STRENGTHS,
+      ([DT_UNHOLY: 0.25,
+        DT_AIR:    0.3,
+        DT_POISON: 0.15]) ); // sonst selten in benutzung :)
+
+   AddItem(OBJ("kamm"), CLONE_WIELD);
+   AddItem(OBJ("kleid"), CLONE_WEAR);
+   if (file_size(SAECKCHEN)>0) AddItem(SAECKCHEN, CLONE_NEW);
+}
+
+static string _query_long()
+{
+   if (!PL || PL->QueryProp(P_GENDER)==FEMALE)
+      return Query(P_LONG)
+        +"Ihr ueberhebliches laecheln bringt Dich jedoch total zur Weissglut, so eine\n"
+        +"Zicke hier den ganzen Tag rumzusitzen und sich nur die Haare zu kaemmen.\n";
+   return Query(P_LONG)
+     +"Mit ihrem charmanten laecheln, zieht sie Dich sofort in ihren Bann und Du\n"
+     +"wuerdest ihr jeden Wunsch erfuellen, so sie denn einen aeussern wuerde.\n";
+}
+
+void Attack(object enemy)
+{
+   int normal_speed;
+   normal_speed=(enemy->QueryProp(P_SKILL_ATTRIBUTE_OFFSETS)||([]))[SA_SPEED]||100;
+   if (enemy && enemy->QuerySkillAttribute(SA_SPEED) > normal_speed) {
+      write("Die Fee macht eine beruhigende Handbewegung und ploetzlich fuehlst Du Dich\n"
+           +"ruhig und Du merkst wie Du allmaehlich wieder langsamer wirst...\n");
+      enemy->ModifySkillAttribute(SA_SPEED, -20, 180);
+   }
+   if (enemy) ::Attack(enemy);
+   SetProp(P_GUILD, "zauberer");
+   command("verletze mit "+({"feuer", "magie", "eis", "wasser", "gift",
+                             "wind", "saeure", "laerm"})[random(8)] );
+   SetProp(P_GUILD, 0);
+}
+
+int Defend(int dam, mixed dts, mixed spell, object enemy)
+{
+   int normal_speed;
+   normal_speed=(enemy->QueryProp(P_SKILL_ATTRIBUTE_OFFSETS)||([]))[SA_SPEED]||100;
+   if (enemy && enemy->QuerySkillAttribute(SA_SPEED) > normal_speed) {
+      write(Name(WER)+" macht eine beruhigende Handbewegung und ploetzlich fuehlst Du Dich\n"
+           +"ruhig und Du merkst wie Du allmaehlich wieder langsamer wirst...\n");
+      enemy->ModifySkillAttribute(SA_SPEED, -20, 180);
+   }
+
+   if ((!spell || (mappingp(spell) && spell[SP_PHYSICAL_ATTACK])) && !random(4)) {
+      tell_room(environment(), Name(WER)+" weicht schnell einen Schritt zurueck und weicht Deinem Angriff aus.\n");
+      dam=0;
+   }
+   return (int)::Defend(dam, dts, spell, enemy);
+}
+
+void NotifyPlayerDeath(object who, object killer, object lost_exp)
+{
+  if (!who || killer!=ME) return; // uninteressant
+  log_file("padreic/kill", ctime(time())+" "+capitalize(getuid(who))+" getoetet von /zauberwald/titina\n");
+}
+
+void die()
+{
+  log_file("padreic/kill", ctime(time())+" Titina wurde von "+get_killer()+" getoetet.\n");
+  ::die();
+}
diff --git a/doc/beispiele/zauberwald/npc/ulinia.c b/doc/beispiele/zauberwald/npc/ulinia.c
new file mode 100644
index 0000000..7ea596e
--- /dev/null
+++ b/doc/beispiele/zauberwald/npc/ulinia.c
@@ -0,0 +1,160 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+#include <combat.h>
+#include <moving.h>
+#include <new_skills.h>
+#include "/p/zauberer/zauberer.h"
+
+inherit NPC("stdnpc");
+
+string info_tarnzauber()
+{
+   object ob;
+   if (present("\ntarnzauber", PL))
+      return "sagt: Ich habe Dich doch bereist verzaubert.\n";
+   ob=clone_object(OBJ("tarnzauber"));
+   ob->move(PL, M_NOCHECK);
+   ob->Initialize(PL);
+   return "sagt: Nun gut, so sei es...\n"
+         +"macht eine weite Handbewegung und Du fuehlst wie Du Dich verwandelst.\n"
+         +"sagt: Viel Glueck!";
+}
+
+void create()
+{
+   ::create();
+   SetProp(P_SHORT, "Ulinia die Waldfee");
+   SetProp(P_LONG,
+      BS("Ueber dem Teich schwebt Ulinia die Waldfee. Ihr langes goldenes Haar weht "
+     +"leicht im Wind und das einzige was sie bedeckt, ist ein leichtes Blaetterkleid "
+     +"das ihre weiblichen Rundungen ausserordentlich gut zur Geltung bringt. "
+     +"In der Hand haelt sie einen kleinen Zauberstab, mit dem sie hoch ueber allem thront."));
+   SetProp(P_NAME, "Ulinia");
+   SetProp(P_ARTICLE, 0);
+   SetProp(P_GENDER, FEMALE);
+   SetProp(P_LEVEL, 80);
+   SetProp(P_ATTRIBUTES, (["int":80,"con":40,"str":16,"dex":50]) );
+   SetProp(P_DISABLE_ATTACK, -10000); // is nich :)
+   SetProp(P_BODY, 80);
+   SetProp(P_MAX_SP, 2000);
+   SetProp(P_SP, 2000);
+   SetProp(P_MAX_HP, 800);
+   SetProp(P_HP, 800);
+   SetProp(P_ALIGN, 400);
+   SetProp(P_RACE, "Fee");
+   SetProp(P_SIZE, 160+random(16));
+   SetProp(P_ALCOHOL, 0);
+   SetProp(P_CORPSE, OBJ("feenleiche"));
+   SetProp(P_MAX_ALCOHOL, 0); // kein rauschen :)
+   AddAdjective("wunderschoen");
+   AddId(({"fee", "waldfee", "ulinia", WALDID("fee")}));
+   SetProp(P_HANDS, ({" mit ihren zarten Haenden", 150, DT_BLUDGEON}) );
+   SetProp(P_SKILL_ATTRIBUTE_OFFSETS, ([SA_SPELL_PENETRATION: 250]));
+   SetProp(P_XP, 800*200*5*2);
+   SetProp(P_GUILD, "zauberer");
+   SetProp(P_Z_NO_MATERIAL, 1);
+   SetProp(P_DEFAULT_INFO, "schweigt und laechelt Dich einfach nur freundlich an.\n");
+   AddInfo(({"quest", "hilfe", "aufgabe", "dunkelelfenamulett", "delfenamulett"}),
+     "Ohh in der Tat haette ich da eine Aufgabe fuer Dich, aber ich muss Dich "
+    +"warnen, das sie nicht ganz ungefaehrlich ist.\n"
+    +"Ein befreundeter Kobold berichtete mir von einem lange verschollenen Buch, "
+    +"dass in der Bibliothek der Dunkelelfen wieder aufgetaucht ist. In diesem "
+    +"Buch ist unter anderem von einem alten Amulett die Rede, mit dessen Hilfe "
+    +"die Dunkelelfen ihre alte Macht wiedererlangen und erneut Furcht und "
+    +"Schrecken ueber das gesamte Morgengrauen bringen koennten. "
+    +"Wenn Du die Gefahr nicht scheust, waere es ausserordentlich nett wenn Du "
+    +"Dich nach Zzerenzzen begeben wuerdest und dort nach dem Amulett suchst.\n"
+    +"Solltest Du das Amulett tatsaechlich finden, so ist es wichtig das es "
+    +"auf keinen Fall in die Hand der Dunkelelfen geraet und zerstoert wird.",
+    "antwortet: ");
+   AddInfo("gefahr",
+     "Nun Du wirst Dich mitten unter die Dunkelelfen begeben muessen um "
+    +"zu ihrer Bibliothek gelangen zu koennen. In Zzerenzzen wirst Du "
+    +"hierbei voellig auf Dich allein gestellt sein.\n"
+    +"Alles was ich hierbei fuer Dich tun kann, ist einen Tarnzauber zu "
+    +"sprechen der Dich aeusserlich in einen Dunkelelfen verwandelt. "
+    +"Aber vorsicht, spaetestens wenn Du Dich in einen Kampf verwickelst, "
+    +"wird sich der Zauber loesen.", "sagt: ");
+   AddInfo("tarnzauber", #'info_tarnzauber, "");
+   AddInfo(({"furcht", "schrecken", "macht"}),
+     "Ja frueher waren die Dunkelelfen sehr sehr maechtig und alle "
+    +"friedliebenden Geschoepfe dieser Welt sollten hoffen das sie "
+    +"nie wieder ihre alte Macht erlangen werden.", "antwortet: ");  
+   AddInfo("amulett",
+     "Nun leider weiss ich auch nichts genaues ueber das Amulett. Ich bin "
+    +"nicht mal sicher ob es existiert oder je existiert hat. Aber sollte "
+    +"es noch existieren, muss es auf jeden Fall zerstoert werden!", "sagt: ");
+   AddInfo("kobold",
+     "Ich habe versprochen ihn nicht zu verraten und so kann ich Dir nichts "
+    +"weiter ueber ihn sagen.", "antwortet: ");
+   AddInfo(({"buch", "bibliothek"}),
+     "Ich denke am besten begibst Du Dich in die Hoehle des Loewen und versuchst "
+    +"in der Bibliothek der Dunkelelfen selbst ein Blick in dies Buch zu werfen.\n"
+    +"Wenn ich das noch recht in Erinnerung habe, handelt es sich hierbei um "
+    +"das Buch eines Dunkelelfen names Teyrion.", "sagt: ");
+   AddInfo("loewen", "Das ist doch bloss eine Redewendung.", "sagt: ");
+   AddInfo("redewendung", "Na das sagt man halt so...", "sagt: ");
+   AddInfo(({"hoehle", "zzerenzzen"}),
+     "Der Eingang nach Zzerenzzen liegt in der naehe von Wilhelmsburg gut hinter "
+    +"einem Wasserfall versteckt.", "sagt: ");
+   ModifySkill("verletze",
+      ([SI_SKILLABILITY:10000, SI_SPELLCOST:0,
+        SI_SPELLFATIGUE:0, SI_NO_CONSEQUENCES:10000,
+        SI_SKILLRESTR_USE:([P_GUILD_LEVEL:0,SR_FREE_HANDS:0]),
+        SI_ARMOUR_RESTR:0]),0,"zauberer");
+   SetProp(P_GUILD, 0);
+   SetProp(P_RESISTANCE_STRENGTHS,
+      ([DT_UNHOLY: 0.25,
+        DT_POISON: 0.15, 
+        DT_MAGIC: -0.3]) );
+
+   AddItem(OBJ("zauberstab"), CLONE_WIELD);
+   AddItem(OBJ("kleid"), CLONE_WEAR);
+   if (file_size(SAECKCHEN)>0) AddItem(SAECKCHEN, CLONE_NEW);
+}
+
+void Attack(object enemy)
+{
+   int normal_speed;
+   normal_speed=(enemy->QueryProp(P_SKILL_ATTRIBUTE_OFFSETS)||([]))[SA_SPEED]||100;
+   if (enemy && enemy->QuerySkillAttribute(SA_SPEED) > normal_speed) {
+      write("Die Fee macht eine beruhigende Handbewegung und ploetzlich fuehlst Du Dich\n"
+           +"ruhig und Du merkst wie Du allmaehlich wieder langsamer wirst...\n");
+      enemy->ModifySkillAttribute(SA_SPEED, -20, 180);
+   }
+   if (enemy) ::Attack(enemy);
+   SetProp(P_GUILD, "zauberer");
+   command("verletze mit "+({"feuer", "magie", "eis", "wasser", "gift",
+                             "wind", "saeure", "laerm"})[random(8)] );
+   SetProp(P_GUILD, 0);
+}
+
+int Defend(int dam, mixed dts, mixed spell, object enemy)
+{
+   int normal_speed;
+   normal_speed=(enemy->QueryProp(P_SKILL_ATTRIBUTE_OFFSETS)||([]))[SA_SPEED]||100;
+   if (enemy && enemy->QuerySkillAttribute(SA_SPEED) > normal_speed) {
+      write(Name(WER)+" macht eine beruhigende Handbewegung und ploetzlich fuehlst Du Dich\n"
+           +"ruhig und Du merkst wie Du allmaehlich wieder langsamer wirst...\n");
+      enemy->ModifySkillAttribute(SA_SPEED, -20, 180);
+   }
+
+   if ((!spell || (mappingp(spell) && spell[SP_PHYSICAL_ATTACK])) && !random(3)) {
+      tell_room(environment(), Name(WER)+" weicht schnell einen Schritt zurueck und weicht Deinem Angriff aus.\n");
+      dam=0;
+   }
+   return (int)::Defend(dam, dts, spell, enemy);
+}
+
+void NotifyPlayerDeath(object who, object killer, object lost_exp)
+{
+  if (!who || killer!=ME) return; // uninteressant
+  log_file("padreic/kill", ctime(time())+" "+capitalize(getuid(who))+" getoetet von /zauberwald/ulinia\n");
+}
+
+void die()
+{
+  log_file("padreic/kill", ctime(time())+" Ulinia wurde von "+get_killer()+" getoetet.\n");
+  ::die();
+}
diff --git a/doc/beispiele/zauberwald/npc/waechter.c b/doc/beispiele/zauberwald/npc/waechter.c
new file mode 100644
index 0000000..55c1a10
--- /dev/null
+++ b/doc/beispiele/zauberwald/npc/waechter.c
@@ -0,0 +1,87 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+#include <combat.h>
+#include <new_skills.h>
+
+inherit NPC("stdnpc");
+
+void create()
+{
+   ::create();
+   SetProp(P_NAME, "Waechter des Waldes");
+   SetProp(P_SHORT, "Der Waechter des Waldes");
+   SetProp(P_LONG,
+     "Vor Dir steht eine sehr sehr alte Eiche. Doch diese Eiche ist keine\n"
+    +"gewoehnliche Eiche, wie Du sie bereits an vielen anderen Stellen gesehn hast.\n"
+    +"Diese Eiche lebt! Du kannst deutlich einen Mund, eine Nase und sogar zwei\n"
+    +"Ohren erkennen. Sie ist eigentlich sehr friedlich gesonnen, kann aber auch\n"
+    +"sehr sehr boese werden, wenn es jemand wagt die Ruhe des Waldes zu stoeren.\n");
+   SetProp(P_RACE, "eiche");
+   SetProp(P_AGGRESSIVE, 0);
+   SetProp(P_LEVEL, 100);
+   SetProp(P_ATTRIBUTES, (["int":80,"con":100,"str":100,"dex":20]) );
+   SetProp(P_GENDER, MALE);
+   SetProp(P_MAX_HP, 1000);
+   SetProp(P_HP, 1000);
+   SetProp(P_ALIGN, 500);
+   SetProp(P_BODY, 100);
+   SetProp(P_SIZE, 1500);
+   SetProp(P_DISABLE_ATTACK, -10000); // is nich :)
+   AddId(({"eiche", "waechter","waechter des waldes", WALDID("waechtereiche") }));
+   SetProp(P_HANDS, ({" mit einem seiner langen Aeste",550,DT_WHIP}) );
+   SetProp(P_SKILL_ATTRIBUTE_OFFSETS, ([SA_SPEED:210]));
+   SetProp(P_NOCORPSE, 1);
+   SetProp(P_XP, 1000*550*5);
+   SetProp(P_DEFAULT_INFO, "bleibt absolut regungslos und reagiert ueberhaupt nicht.\n");
+   SetProp(P_RESISTANCE_STRENGTHS,
+    ([DT_SLASH:     0.1,
+      DT_MAGIC:    -1.0,
+      DT_BLUDGEON: -0.5,
+      DT_POISON:    0.25,
+      DT_HOLY:     -1.0,
+      DT_RIP:       0.25,
+      DT_FIRE:      0.25,
+      DT_PIERCE:   -0.5,
+      DT_WHIP:     -1.0 ]) );
+   AddCmd(({"osten", "westen"}), "cmd_blocken");
+}
+
+static string _query_info()
+{
+   if (!PL || PL->QueryProp(ZAUBERWALD)<=time())
+      return "Die alte Eiche ist Dir sehr friedlich gesonnen. Es ist jedoch auch sicher\n"
+            +"klug dieses nicht zu aendern, da sie mit ihren Aesten wohl auch sehr kraeftig\n"
+            +"zuschlagen kann.\n";
+   return "Du hast den Zorn der alten Waechtereiche auf Dich gezogen, das war ganz und\n"
+         +"gar nicht klug von Dir. Jetzt lebe auch mit den Konsequenzen....\n";
+}
+
+static int cmd_blocken()
+{
+   if (PL->QueryProp(P_RACE)=="Dunkelelf" &&
+       PL->QueryProp(AUSGANG)==query_verb()) {
+      write(BS(Name(WER, 1)+" laesst Dich nicht vorbei.")
+           +break_string("Du solltest hier besser verschwinden, "
+                        +"so Typen wie Du sind hier nicht gern gesehn!",
+                        78, Name(WER, 1)+" sagt: "));
+      return 1;
+   }
+   if (PL && PL->QueryProp(ZAUBERWALD) &&
+       PL->QueryProp(AUSGANG)==query_verb()) {
+      write(BS(Name(WER, 1)+" steht Dir da leider im Weg und laesst Dich nicht vorbei."));
+      return 1;
+   }
+}
+
+int remove()
+{
+   call_other(ROOM("weg1"), "delay_reset");
+   return (int)::remove();
+}
+
+void NotifyPlayerDeath(object who, object killer, object lost_exp)
+{
+  if (!who || killer!=ME) return; // uninteressant
+  log_file("padreic/kill", ctime(time())+" "+capitalize(getuid(who))+" getoetet von /zauberwald/waechter\n");
+}
diff --git a/doc/beispiele/zauberwald/obj/feenleiche.c b/doc/beispiele/zauberwald/obj/feenleiche.c
new file mode 100644
index 0000000..0e7e034
--- /dev/null
+++ b/doc/beispiele/zauberwald/obj/feenleiche.c
@@ -0,0 +1,24 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+#include "../files.h"
+#include <moving.h>
+
+inherit "std/corpse";
+
+int mampf( string str )
+{
+   object ob;
+   if (QueryDecay()<3) return (int)::mampf(str);
+   notify_fail("Was moechtest Du essen?\n");
+   if (!str || !id(str)) return 0;
+   if (!PL->eat_food(8)) return 1; // fehlermeldung gibt eat_food aus
+   if (!objectp(ob=present(WALDID("leichenmp"), PL))) {
+      ob=clone_object(OBJ("leichenmp"));
+      ob->move(PL, M_NOCHECK|M_GET);
+   }
+   ob->new_corpse();
+   PL->restore_spell_points(50+random(100));
+   write("Du merkst wie die noch im Koerper verbliebene Energie in Dich ueberfliesst.\n");
+   remove();
+   return 1;
+}
diff --git a/doc/beispiele/zauberwald/obj/hahnenfuss.c b/doc/beispiele/zauberwald/obj/hahnenfuss.c
new file mode 100644
index 0000000..8992e46
--- /dev/null
+++ b/doc/beispiele/zauberwald/obj/hahnenfuss.c
@@ -0,0 +1,32 @@
+#include <items/kraeuter/kraeuterliste.h>
+#include <items/kraeuter/kraeuter.h>
+#include "../files.h"
+
+inherit STDPLANT;
+
+void create()
+{
+   ::create();
+   customizeMe(WASSER_HAHNENFUSS_WEISS);
+}
+
+/*varargs int move(mixed dest, int method)
+{
+   // die Einwohner des Zauberwalds sehen es nicht gerne, wenn jemand ihre
+   // magischen Pflanzen pflueckt...
+   int res;
+   res=(int)::move(dest, method);
+   if (res!=1) return res;
+   if (environment()) 
+     environment()->SetProp(ZAUBERWALD, time()+AGGRESSIVE_TIME);
+   return 1;
+}*/
+
+protected void NotifyMove(object dest, object oldenv, int method) {
+  if ( !oldenv && objectp(dest) && query_once_interactive(dest) &&
+       strstr(object_name(environment(dest)),"zauberwald")>-1) {
+    dest->SetProp(ZAUBERWALD, time()+AGGRESSIVE_TIME);
+  }
+  return ::NotifyMove(dest, oldenv, method);
+}
+
diff --git a/doc/beispiele/zauberwald/obj/kamm.c b/doc/beispiele/zauberwald/obj/kamm.c
new file mode 100644
index 0000000..b26d6f8
--- /dev/null
+++ b/doc/beispiele/zauberwald/obj/kamm.c
@@ -0,0 +1,39 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+inherit "std/weapon";
+
+#include "../files.h"
+#include <combat.h>
+
+void create()
+{
+   ::create();
+   SetProp(P_SHORT, "Ein langer Kamm");
+   SetProp(P_NAME, "Kamm");
+   SetProp(P_GENDER, MALE);
+   SetProp(P_LONG,
+     "Dieser schoene Kamm gehoerte einmal einer Waldfee die damit immer ihr schoenes\n"
+    +"langes Haar kaemmte...\n");
+   AddAdjective("kamm");
+   AddId("kamm");
+   SetProp(P_WEAPON_TYPE, WT_CLUB);
+   SetProp(P_DAM_TYPE, DT_PIERCE);
+   SetProp(P_NR_HANDS, 1);
+   SetProp(P_WC, 100);
+   SetProp(P_VALUE, 100);
+   SetProp(P_NOBUY, 1);
+   SetProp(P_MATERIAL, ({ MAT_MISC_MAGIC, MAT_HORN }) );
+   AddCmd("kaemme", "cmd_kaemmen");
+}
+
+static int cmd_kaemmen(string str)
+{
+   notify_fail("Was moechtest Du denn kaemmen?\n");
+   if (str!="haare") return 0;
+   write("Eitel wie Du bist, versuchst Du Dir mit dem Kamm die Haare zu kaemmen, doch\n"
+        +"irgendwie ist er ein bisschen zu gross fuer Deine Haare.\n");
+   say(BS("Eitel wie "+PL->QueryPronoun()+" ist, kaemmt sich "+PL->name(WER)
+         +" die Haare. Doch irgendwie ist der Kamm ein bisschen zu gross fuer "
+         +PL->QueryPossPronoun(NEUTER, WEN, 1)+" kurzen Haare."));
+   return 1;
+}
diff --git a/doc/beispiele/zauberwald/obj/kleid.c b/doc/beispiele/zauberwald/obj/kleid.c
new file mode 100644
index 0000000..f52e157
--- /dev/null
+++ b/doc/beispiele/zauberwald/obj/kleid.c
@@ -0,0 +1,38 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+inherit "std/armour";
+
+#include "../files.h"
+#include <combat.h>
+
+void create()
+{
+   ::create();
+   SetProp(P_NAME, "Blaetterkleid");
+   SetProp(P_SHORT, "Ein Blaetterkleid");
+   SetProp(P_GENDER, NEUTER);
+   SetProp(P_LONG,
+     "Das Blaetterkleid stammt von einer Waldfee und war genau auf ihre Rundungen\n"
+    +"und ihre Groesse abgepasst. Du hast leider nicht die geringste Chance, dieses\n"
+    +"Kleid jemals tragen zu koennen.\n");
+   AddId(({"kleid", "blaetterkleid"}));
+   SetProp(P_MATERIAL, MAT_MISC_WOOD);
+   SetProp(P_ARMOUR_TYPE, AT_ARMOUR);
+   SetProp(P_VALUE, 500);
+   SetProp(P_NOBUY, 1);
+   SetProp(P_AC, 10);
+   SetProp(P_WEAR_FUNC, ME);
+}
+
+int WearFunc(object me, int silent)
+{
+   if (!PL || query_once_interactive(PL) || getuid(PL)!=getuid() ||
+       PL->QueryProp(P_RACE)!="Fee") {
+      if (!silent)
+        write("Dieses Kleid war genau auf die Rundungen und die Groesse der Waldfee\n"
+             +"angepasst von der es stammt. Du hast leider nicht die geringste Chance,\n"
+             +"dieses Kleid jemals tragen zu koennen.\n");
+      return 0;
+   }
+   return 1;
+}
diff --git a/doc/beispiele/zauberwald/obj/leichenmp.c b/doc/beispiele/zauberwald/obj/leichenmp.c
new file mode 100644
index 0000000..aea7c10
--- /dev/null
+++ b/doc/beispiele/zauberwald/obj/leichenmp.c
@@ -0,0 +1,81 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+/* Changelog:
+   * 09.11.06 Zesstra
+     object_info()[11] durch query_next_reset() ersetzt.
+     */
+#include "../files.h"
+
+inherit "/std/thing";
+
+static int leichen;
+
+void create()
+{
+    leichen=0;
+    if (!clonep(ME))
+       set_next_reset(-1);
+    else {
+       ::create();
+       SetProp(P_INVIS, 1);
+       SetProp(P_NODROP, 1);
+       SetProp(P_NEVERDROP, 1);
+       AddId(WALDID("leichenmp"));
+       set_next_reset(3600*3); // erster reset nach 3h
+    }
+}
+
+int remove()
+{
+    closure clo;
+    if (environment()) {
+      clo=environment()->Query(P_MAX_SP, F_QUERY_METHOD);
+      if (clo && to_object(clo)==ME)
+          environment()->Set(P_MAX_SP, 0, F_QUERY_METHOD);
+    }
+    destruct(ME);
+    return 1;
+}
+
+int calculate_mp()
+{
+    int mp;
+    switch(leichen) {
+       case 1:  mp = 5;  break;
+       case 2:  mp = 9;  break;
+       case 3:  mp = 12; break;
+       case 4:  mp = 14; break;
+       case 5:  mp = 15; break;
+       default: mp = 0;
+    }
+    SetProp(P_X_HEALTH_MOD, ([P_SP:mp]) );
+}
+
+void new_corpse()
+{
+    closure clo;
+    clo=PL->Query(P_MAX_SP, F_QUERY_METHOD);
+    if (clo && to_object(clo)!=ME) {
+       call_out("remove", 0);
+       return;
+    }
+    if (leichen<5) {
+       leichen++;
+       set_next_reset(3600+3);
+    }
+    else set_next_reset( (query_next_reset(ME)-time())+3600 );
+    calculate_mp();
+}
+
+void reset()
+{
+   leichen--;
+   if (environment()) {
+      tell_object(environment(), "Du spuerst wie Deine mentalen Kraefte schwaecher werden...\n");
+      if (environment()->QueryProp(P_SP) > environment()->QueryProp(P_MAX_SP))
+          environment()->SetProp(P_SP, environment()->QueryProp(P_MAX_SP));
+   }
+   calculate_mp();
+   if (leichen<=0)
+      remove();
+   else set_next_reset(3600);
+}
diff --git a/doc/beispiele/zauberwald/obj/stock.c b/doc/beispiele/zauberwald/obj/stock.c
new file mode 100644
index 0000000..f79d5e4
--- /dev/null
+++ b/doc/beispiele/zauberwald/obj/stock.c
@@ -0,0 +1,26 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+inherit "std/weapon";
+
+#include "../files.h"
+#include <combat.h>
+
+void create()
+{
+   ::create();
+   SetProp(P_SHORT, "Ein kleiner Zeigestock");
+   SetProp(P_NAME, "Zeigestock");
+   SetProp(P_GENDER, MALE);
+   SetProp(P_LONG,
+     "Ein kleiner Stock, mit dem man gut Dinge zeigen oder in den Sand malen kann.\n");
+   AddAdjective("klein");
+   AddId(({"stock", "zeigestock"}));
+   SetProp(P_WEAPON_TYPE, WT_STAFF);
+   SetProp(P_SIZE, 120);
+   SetProp(P_DAM_TYPE, DT_BLUDGEON);
+   SetProp(P_NR_HANDS, 1);
+   SetProp(P_WC, 120);
+   SetProp(P_VALUE, 300);
+   SetProp(P_NOBUY, 1);
+   SetProp(P_MATERIAL, MAT_MISC_WOOD);
+}
diff --git a/doc/beispiele/zauberwald/obj/tarnzauber.c b/doc/beispiele/zauberwald/obj/tarnzauber.c
new file mode 100644
index 0000000..c226494
--- /dev/null
+++ b/doc/beispiele/zauberwald/obj/tarnzauber.c
@@ -0,0 +1,78 @@
+// (c) 2003 by Padreic (Padreic@mg.mud.de)
+// Das Objekt realisiert einen Tarnzauber, aehnlich
+// dem Tarnhelm. Jedoch ohne Shadow und nur auf die
+// Rasse beschraenkt.
+
+#include <properties.h>
+#include <language.h>
+#include <moving.h>
+#include <defines.h>
+
+inherit "/std/thing";
+
+static string race;
+
+create()
+{
+  if (!clonep(this_object())) return;
+  ::create();
+  SetProp(P_SHORT, 0);
+  SetProp(P_LONG, "Tarnzauber");
+  SetProp(P_NAME, "Tarnzauber");
+  SetProp(P_INVIS, 1);
+  SetProp(P_GENDER, MALE);
+  SetProp(P_VALUE,  0);
+  SetProp(P_NOGET, 1);
+  SetProp(P_WEIGHT, 0);
+  Set(P_DEFEND_FUNC, ME);
+  AddId("\ntarnzauber");
+}
+
+// die NPCs im Zauberwald durchschauen den Zauber... :o)
+string _query_race()
+{
+   if (previous_object(1) && getuid(previous_object(1))==getuid())
+      return previous_object()->_query_race()||race;
+   return "Dunkelelf";
+}
+
+void Initialize(object pl)
+{
+   object *armours;
+   pl->Set(P_RACE, #'_query_race, F_QUERY_METHOD);
+   armours=(pl->QueryProp(P_ARMOURS));
+   if (member(armours, ME)>=0) return 0;
+   pl->SetProp(P_ARMOURS, armours+({ ME }));
+   race=pl->Query(P_RACE);
+}
+
+int QueryDefend(string *dtyp, mixed spell, object enemy)
+{
+  mixed am;
+  // noch ein paar paranoide Sicherheitsabfragen... :o)
+  if (!previous_object() ||
+      !pointerp(am=previous_object()->QueryProp(P_ARMOURS)) ||
+      member(am, ME)==-1) return 0;
+  tell_object(previous_object(), "Dein Tarnzauber loest sich auf.\n");
+  remove();
+}
+
+int DefendFunc(string *dtyp, mixed spell, object enemy)
+{
+   return QueryDefend(dtyp, spell, enemy);
+}
+
+varargs int move(mixed dest, int method)
+// beim Tod soll sich der Zauber entfernen und auch nirgends rumfliegen
+{
+   int res;
+   res=(int)::move(dest, method);
+   if (!living(environment())) remove();
+   return res;
+}
+
+varargs int remove(int silent)
+{
+  if (living(environment())) environment()->Set(P_RACE,0,F_QUERY_METHOD);
+  return (int)::remove(silent);
+}
diff --git a/doc/beispiele/zauberwald/obj/zauberstab.c b/doc/beispiele/zauberwald/obj/zauberstab.c
new file mode 100644
index 0000000..1e01fa6
--- /dev/null
+++ b/doc/beispiele/zauberwald/obj/zauberstab.c
@@ -0,0 +1,36 @@
+// (c) by Padreic (Padreic@mg.mud.de)
+
+inherit "std/weapon";
+
+#include "../files.h"
+#include <combat.h>
+
+void create()
+{
+   ::create();
+   SetProp(P_SHORT, "Ein Zauberstab");
+   SetProp(P_NAME, "Zauberstab");
+   SetProp(P_GENDER, MALE);
+   SetProp(P_LONG,
+     "Dies war einmal der Zauberstab einer Waldfee aus dem Zauberwald. In dem Stab\n"
+    +"liegt sicherlich noch eine grosse Magie verborgen, doch nutzen kannst Du sie\n"
+    +"nicht.\n");
+   AddId(({"stab", "zauberstab"}));
+   SetProp(P_WEAPON_TYPE, WT_CLUB);
+   SetProp(P_DAM_TYPE, ({ DT_MAGIC, DT_BLUDGEON }) );
+   SetProp(P_NR_HANDS, 1);
+   SetProp(P_WC, 140);
+   SetProp(P_VALUE, 800);
+   SetProp(P_NOBUY, 1);
+   SetProp(P_HIT_FUNC, ME);
+   SetProp(P_MATERIAL, ({ MAT_MISC_MAGIC, MAT_MISC_WOOD }) );
+}
+
+int HitFunc(object enemy)
+{
+    object ob;
+    ob=QueryProp(P_WIELDED);
+    if (ob && !query_once_interactive(ob) && getuid(ob)==getuid() &&
+        ob->QueryProp(P_RACE)=="Fee") return 100+random(300);
+    return 0;
+}
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";
+}