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);
+}