Neues Beispiel.
diff --git a/README b/README
index 86cfb7b..fe59064 100644
--- a/README
+++ b/README
@@ -86,6 +86,10 @@
room/huette17.c
18. Ein Beispiel fuer eine einfache, kleine Miniquest.
room/huette18.c
+19. Ein Beispiel fuer einen Gegenstand, den man beim Forschen "findet",
+ und der dann - unter den ueblichen Checks - in das Inventory des
+ Spielers bewegt wird.
+ room/huette19.c obj/schoki.c
B. Unser erster eigener NPC
@@ -124,5 +128,7 @@
obj/axt3.c
7. Ein grosser, nicht bewegbarer Behaelter.
obj/kiste.c
-
+8. Ein weiteres Beispiel fuer ein Gegenstand, der weder Waffe noch Ruestung
+ ist.
+ obj/schoki.c
diff --git a/obj/schoki.c b/obj/schoki.c
new file mode 100644
index 0000000..cb936b5
--- /dev/null
+++ b/obj/schoki.c
@@ -0,0 +1,51 @@
+inherit "/std/thing" ;
+
+#include __PATH__(1)"defs.h"
+
+int cmd_essen();
+
+
+protected void create() {
+ if (!clonep()) {
+ set_next_reset(-1);
+ return;
+ }
+ ::create();
+
+ SetProp(P_SHORT, "Ein kleines Stueck Schokolade");
+ SetProp(P_LONG, BSLF(
+ "Das Stueck Schokolade ist nicht sehr gross, sieht aber sehr lecker "
+ "aus."));
+ SetProp(P_INFO, BSLF(
+ "Dieses kleine Schokoladenstueck ist essbar und macht dabei nichtmal "+
+ "satt. Allerdings heilt sie Dich auch nicht."));
+ SetProp(P_NAME, "Schokoladenstueck");
+
+ SetProp(P_GENDER, NEUTER);
+ SetProp(P_WEIGHT, 10);
+ SetProp(P_VALUE, 0);
+ SetProp(P_MATERIAL, ([MAT_CHOCOLATE:100]));
+ AddId(({"schoki", "schoko", "schokolade",
+ "schokoladenstueck", "schokostueck", "stueck"});
+
+ AddCmd("iss|ess|esse&@ID", #'cmd_essen,
+ "Was willst Du essen?|");
+}
+
+
+int cmd_essen() {
+ if (ENV()!=TP) {
+ tell_object(TP, BSLF(
+ "Dazu solltest Du das Schokoladenstueck schon dabeihaben."));
+ return 1;
+ }
+
+ tell_object(TP, BSLF(
+ "Du steckst die Schokolade in den Mund und laesst sie Dir auf der "
+ "Zunge foermlich zergehen. Lecker!"));
+ tell_room(ENV(TP), BSLF(
+ TPNC+" steckt sich ein Stueck Schokolade in den Mund."), ({TP}));
+ remove(1);
+ return 1;
+}
+
diff --git a/room/huette19.c b/room/huette19.c
new file mode 100644
index 0000000..ad2423d
--- /dev/null
+++ b/room/huette19.c
@@ -0,0 +1,105 @@
+inherit "/std/room";
+
+#include __PATH__(1)"defs.h"
+
+int cmd_knopf();
+
+int schoki_da = 1; // 1 wenn Schoki vorhanden ist, 0 wenn nicht
+
+protected void create() {
+ ::create();
+
+ SetProp(P_INT_SHORT, "Eine Huette mit verstecktem Gegenstand");
+ SetProp(P_INT_LONG, BSLF(
+ "Diese Huette sieht auf den ersten Blick recht leer aus."));
+
+ SetProp(P_LIGHT, 1);
+ SetProp(P_INDOORS, 1);
+ SetProp(P_LIGHT_TYPE, LT_GLOWING);
+
+ AddDetail("blick", BSLF(
+ "Dein Blick faellt auf die kahle Wand, hier ist echt nichts los."));
+ AddDetail("wand", BSLF(
+ "An der Wand ist nichts zu finden, nur ein kleiner Knopf ist da "
+ "angebracht."));
+ AddDetail("knopf", BSLF(
+ "Der Knopf ist so klein und niedlich, Du moechtest ihn doch bestimmt "
+ "gern mal druecken, oder?"));
+
+ AddCmd("drueck|druecke&knopf", #'cmd_knopf,
+ "Wen oder was willst Du druecken?^");
+}
+
+void reset() {
+ ::reset();
+ if (!schoki_da) {
+ // Einmal pro Reset gibts neue Schoki:
+ tell_room(TO, BSLF(
+ "Der Knopf an der Wand knirscht leise."));
+ schoki_da = 1;
+ }
+}
+
+int cmd_knopf() {
+ if (!schoki_da) {
+ // Diesen Reset wurde die Schoki schon abgeholt:
+ tell_object(TP, BSLF(
+ "Du drueckst den Knopf, aber nichts passiert. Gedulde Dich ein wenig "
+ "und probiere es spaeter nochmal."));
+ tell_room(TO, BSLF(
+ TPNC+" macht sich an der Wand zu schaffen. Nichts passiert."), ({TP}));
+ return 1;
+ }
+
+ /* Das Objekt wird geclont ... */
+ object ob = clone_object(__PATH__(1)"obj/schoki");
+ if (!objectp(ob)) {
+ /* ... aber es gab dabei einen Fehler, das Objekt konnte nicht erzeugt
+ werden: */
+ tell_object(TP, BSLF(
+ "Da ist wohl etwas schiefgegangen, Du hoerst von weiter oben nur "
+ "ein resigniertes Jammern."));
+ tell_room(TO, BSLF(
+ TPNC+" macht sich an der Wand zu schaffen. Von oben hoerst Du "
+ "Gejammer."), ({TP}));
+ } else if (ob->move(TP, M_GET) == MOVE_OK) {
+ /* Beim Bewegen eines Gegenstandes in den Spieler ist eine Pruefung auf
+ den Erfolg des Aufrufes Pflicht. Fuer moegliche Gruende, dass move()
+ fehlschlaegt, lies Dir bitte die Manpage zu move() durch.
+
+ Das Objekt wurde erfolgreich erzeugt, und es wurde erfolgreich in den
+ Spieler bewegt, der die Aktion ausgeloest hat: */
+ tell_object(TP, BSLF(
+ "Eine Klappe oeffnet sich an der Decke, und etwas faellt von oben "
+ "herab. Geschickt faengst Du es auf."));
+ tell_room(TO, BSLF(
+ "Etwas faellt von oben herab und wird geschickt von "+TPN+
+ " aufgefangen."), ({TP}));
+ schoki_da = 0;
+ } else {
+ /* Das Objekt wurde erfolgreich erzeugt, aber es konnte nicht in den
+ Spieler bewegt werden. Da das Objekt in diesem Fall sehr einfach
+ gebaut ist und keine Sonderbehandlung dafuer beinhaltet, bewegt
+ zu werden, ist der Spieler offensichtlich ueberladen. Wir muessen
+ also in diesem Fall nicht pruefen, welchen Fehlerwert move()
+ zurueckgeliefert hat. */
+ tell_object(TP, BSLF(
+ "Eine klappe oeffnet sich an der Decke, und etwas faellt von oben "
+ "herab. Du bist aber schon zu vollgeladen, um es noch halten zu "
+ "koennen. Es faellt zu Boden."));
+ tell_room(TO, BSLF(
+ "Etwas faellt von oben herab, aber "+TPN+" stellt sich zu dusslig "
+ "an. Schnell, hebe es auf, bevor "+TP->QueryPronoun(WER)+" sich "
+ "besinnt!"), ({TP}));
+ schoki_da = 0;
+ /* Beim Bewegen des Objektes in den Raum kann auch etwas schiefgehen,
+ aber ueblicherweise passiert das nur in seltenen Ausnahmefaellen.
+ Normalerweise prueft man den Rueckgabewert von move() beim Bewegen
+ von Gegenstaenden oder Spielern in einen Raum nicht, denn wenn das
+ nicht klappt, WILL man Debug-Output auf den entsprechenden Magier-
+ Ebenen und im Fehlerteufel haben: */
+ ob->move(TO, M_PUT);
+ }
+ return 1;
+}
+