New files.

Change-Id: Ife5efe076a66e07821e95c800cd59d7577d8fb45
diff --git a/defs.h b/defs.h
new file mode 100644
index 0000000..1cbc466
--- /dev/null
+++ b/defs.h
@@ -0,0 +1,66 @@
+#ifndef __TUTORIAL_DEFS_H__
+#define __TUTORIAL_DEFS_H__
+
+/* Diese Pragmas sollten heutzutage Pflicht sein. Der Compiler wird durch
+   sie angewiesen, strenger auf korrekte Typisierung etc. zu achten. Siehe
+   "man pragma". */
+#pragma strong_types
+#pragma save_types
+#pragma rtt_checks
+
+
+// Diese Includes braucht man so oft, die kann man eigentlich immer nehmen:
+#include <properties.h>
+#include <language.h>
+#include <moving.h>
+
+
+// Diese Defines brauchen wir auch nahezu staendig:
+#ifdef ENV
+#undef ENV
+#endif
+#define ENV environment
+#ifdef TO
+#undef TO
+#endif
+#define TO this_object()
+#ifdef TP
+#undef TP
+#endif
+#define TP this_player()
+#ifdef TPN
+#undef TPN
+#endif
+#define TPN this_player()->name()
+#ifdef TPNC
+#undef TPNC
+#endif
+#define TPNC this_player()->Name()
+#ifdef BSLF
+#undef BSLF
+#endif
+#define BSLF(x) break_string(x, 78, 0, BS_LEAVE_MY_LFS)
+#ifdef BSPS
+#undef BSPS
+#endif
+#define BSPS(x, y) break_string(x, 78, y, BS_LEAVE_MY_LFS)
+#ifdef BSPN
+#undef BSPN
+#endif
+#define BSPN(x, y) break_string(x, 78, y, BS_LEAVE_MY_LFS|BS_PREPEND_INDENT)
+
+// Fuer Verwendung in Defend():
+#define NO_AC AT_HELMET:0,\
+              AT_AMULET:0,\
+              AT_GLOVE:0,\
+              AT_RING:0,\
+              AT_SHIELD:0,\
+              AT_CLOAK:0,\
+              AT_ARMOUR:0,\
+              AT_BELT:0,\
+              AT_TROUSERS:0,\
+              AT_BOOT:0,\
+              P_BODY:0
+
+
+#endif // __FADEN_DEFS_H__
diff --git a/room/huette1.c b/room/huette1.c
new file mode 100644
index 0000000..6e76e1c
--- /dev/null
+++ b/room/huette1.c
@@ -0,0 +1,24 @@
+// Wir erben vom Standard-Raum der Mudlib:
+inherit "/std/room";
+
+/* Und wir holen uns einige Defines, die wir oefter verwenden und deswegen
+   nicht in jedem Raum erneut schreiben wollen: */
+#include __PATH__(1)"defs.h"
+
+
+protected void create() {
+  ::create();
+
+  SetProp(P_INT_SHORT, "Eine schummrige Huette");
+  SetProp(P_INT_LONG, BSLF(
+    "Viel erkennen kannst Du hier nicht, es gibt naemlich noch keine "
+    "Details. Die lernen wir spaeter. Dies ist nur ein nackter Raum, "
+    "keine Details, keine Ausgaenge, nichts drin. Aber Licht ist schon "
+    "an."));
+
+  // Die Props kann man in den betreffenden Manpages nachlesen.
+  SetProp(P_LIGHT, 1);
+  SetProp(P_INDOORS, 1);
+  SetProp(P_LIGHT_TYPE, LT_GLOWING);
+}
+
diff --git a/room/huette2.c b/room/huette2.c
new file mode 100644
index 0000000..4326acb
--- /dev/null
+++ b/room/huette2.c
@@ -0,0 +1,38 @@
+inherit "/std/room";
+
+#include __PATH__(1)"defs.h"
+
+
+string sonderfall();
+
+protected void create() {
+  ::create();
+
+  SetProp(P_INT_SHORT, "Eine schummrige Huette");
+  SetProp(P_INT_LONG, BSLF(
+    "Nun gibt es hier einige Details. Du kannst sie untersuchen."));
+
+  SetProp(P_LIGHT, 1);
+  SetProp(P_INDOORS, 1);
+  SetProp(P_LIGHT_TYPE, LT_GLOWING);
+
+  AddDetail("detail", BSLF(
+    "Dieses ist ein statisches Detail (der Normalfall). Es funktioniert "
+    "nur fuer den Plural, den Singular haben wir ja nirgends erwaehnt."));
+  AddDetail(({"plural", "singular"}), BSLF(
+    "Wenn Du nicht gerade Ark heisst, musst Du nicht fuer ALLES etwas "
+    "aushecken, gerade wenn Dein Raum sonst so mit unsinnigen Details "
+    "zugepflastert wird, dass man Tage braucht, um den abzuforschen - das "
+    "frustriert naemlich Spieler auch.\n"
+    "Allerdings sollte ein gut beschriebener Raum die allermeisten Details "
+    "beschreiben. Aus Gruenden der Uebersichtlichkeit verzichte ich hier "
+    "allerdings mal darauf, der Lerneffekt wird dadurch ja nicht groesser."));
+  AddDetail("normalfall", #'sonderfall);
+}
+
+string sonderfall() {
+  return BSLF(
+    "Ja, "+TP->name()+", man kann Details auch dynamisch erzeugen, indem man "
+    "den Rueckgabewert einer Function oder auch einer Inline-Closure zurueck"
+    "gibt. Letzteres handeln wir aber spaeter ab.");
+}
diff --git a/room/huette3a.c b/room/huette3a.c
new file mode 100644
index 0000000..bcf9daf
--- /dev/null
+++ b/room/huette3a.c
@@ -0,0 +1,22 @@
+inherit "/std/room";
+
+#include __PATH__(1)"defs.h"
+
+
+protected void create() {
+  ::create();
+
+  SetProp(P_INT_SHORT, "Eine schummrige Huette");
+  SetProp(P_INT_LONG, BSLF(
+    "Viel erkennen kannst Du hier nicht, es gibt naemlich schon wieder "
+    "keine Details. Dafuer aber einen Durchgang nach Osten, durch den "
+    "Du ins grelle Sonnenlicht rausgehen kannst. Falls Du Dich traust ..."));
+
+  SetProp(P_LIGHT, 1);
+  SetProp(P_INDOORS, 1);
+  SetProp(P_LIGHT_TYPE, LT_GLOWING);
+
+  // Dies ist ein einfacher, statischer Ausgang
+  AddExit("osten", __DIR__"huette3b");
+}
+
diff --git a/room/huette3b.c b/room/huette3b.c
new file mode 100644
index 0000000..47c1eff
--- /dev/null
+++ b/room/huette3b.c
@@ -0,0 +1,31 @@
+inherit "/std/room";
+
+#include __PATH__(1)"defs.h"
+
+
+protected void create() {
+  ::create();
+
+  SetProp(P_INT_SHORT, "Vor der Huette");
+  SetProp(P_INT_LONG, BSLF(
+    "Blinzelnd stehst Du im grellen, boesen Sonnenlicht. Es blendet Deine "
+    "Augen und verbrennt Deine Haut. Du kannst schnell nach Westen zurueck "
+    "in die Huette fliehen."));
+
+  SetProp(P_LIGHT, 1);
+  SetProp(P_INDOORS, 1);
+  SetProp(P_LIGHT_TYPE, LT_SUN);
+
+  // Ein Beispiel mit einem dynamischen Ausgang:
+  AddExit("westen", #'westen);
+}
+
+/* ... in dem wir eine zusaetzliche Meldung ausgeben, weil man den Ausgang
+   sonst ja auch haette statisch schreiben koennen.
+   Wenn ein Ausgang statisch geschrieben werden kann, sollte man das
+   auch tun, das liest sich leichter. */
+int westen() {
+  tell_room(TO, BSLF(
+    "Ein Sack Reis kippt um."));
+  return TP->move(__DIR__"huette3b", M_GO);
+}