IF-Forum

» IF-Forum - Autorencafé - Schreiben! - Feststellen ob etwas auf einer anderen Sache ist.
AntwortenNeues ThemaNeue Umfrage

Feststellen ob etwas auf einer anderen Sache ist.

Geschrieben um 19:33 am 14.05.2003 | Zitat | Editieren | Löschen
Mabruck
Mitglied
Pupil Gumby
Beiträge: 11

Hallo,

kann mir jemand helfen. Ich versuche gerade eine Tischdecke zu schaffen, die auf einem Tisch liegt. Diese soll man erst nehmen können, wenn anderen Objekte von Ihr runter genommen worden sind. In diesem Fall steht eine Object 'Vase' auf der Decke.

Ich habs mal versucht, aber diese Bespiel landet immer im ELSE-Zweig und nimmt trotz rfalse die Sachen trotzdem.


Object e_tisch "Tisch" Esszimmer

   with description

   "Ein fast viereckiger Tisch aus massivem Eichenholz.",

   name 'Tisch' 'viereckig' 'massiver' 'massiven',

   has male static supporter;

Object t_decke "Tischdecke" e_tisch

   with description

   "Eine blaue Tischdecke.",

   name 'Tischdecke' 'Decke' 'blaue' 'blau',

   react_before

   [;

      Take:

      if (vase in e_tisch)

      {

         print "Du bist doch kein Künstler";

         rfalse;

      }

      else

      {

         print "Du nimmst die Tischdecke, denn die Vase steht nicht mehr drauf.";

         move t_decke to player;

         rfalse;

      }

        ],

       has female supporter;

Object vase "Blumenvase" t_decke

   with description

   "Eine gelbe Blumenvase.",

   name 'Vase' 'Blumenvase',

   has female;

mfg

Thomas

Geschrieben um 20:08 am 14.05.2003 | Zitat | Editieren | Löschen
soquasi
Mitglied
Baby Gumby
Beiträge: 9

Ich versuch mal eine Antwort, auch wenn ich noch nicht so fit in Inform bin.

Mabruck:


...

Object t_decke "Tischdecke" e_tisch

   with description

   "Eine blaue Tischdecke.",

   name 'Tischdecke' 'Decke' 'blaue' 'blau',

   react_before

   [;

      Take:

      if (vase in e_tisch)

      {

         print "Du bist doch kein Künstler";

         rfalse;

      }...

Ich glaube, es müßte if(vase in self) heißen, oder? (vase in e_tisch) testet nur ob die Vase direkt auf dem Tisch steht.

soquasi

Geschrieben um 09:03 am 15.05.2003 | Zitat | Editieren | Löschen
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

soquasi:

Ich glaube, es müßte if(vase in self) heißen, oder? (vase in e_tisch) testet nur ob die Vase direkt auf dem Tisch steht.

Stimmt, mit "in" wird nur geprüft, ob ein Objekt direkt in oder auf einem anderen ist. Mit (children(self)) oder (child(self)) kann man prüfen, ob sich überhaupt etwas auf der Tischdecke befindet.

Der Code überprüft, ob die Tischdecke genommen werden kann, in react_before. Das ist falsch, da so das Aufheben aller Objekte im Raum - auch der Vase - unterbunden wird. Man könnte das zwar mit


      Take:

          if (noun==self && children(self))

             "Du bist doch kein Künstler";

verhindern, aber besser ist es, den Code in before zu packen, das sowieso nur aufgerufen wird, wenn noun die Tischdecke ist.

Außerdem ist es ungeschickt, das Nehmen der Tischdecke mit move beim Objekt zu implementieren. Besser ist, man lässt dies durch die normale Routine zum Aufheben von Gegenständen erledigen, die auch prüft, ob der Spieler genug Platz bei sich hat. Der Text, der beim Aufheben der Decke geschrieben wird, kann in after angegeben werden.

(Der ursprüngliche Code würde bei "nimm Tisch" auch die Decke nehmen, allerdings nur dann, wenn die Vasee nicht auf dem Tisch steht.)

Hier also der neue Code, der hoffentlich funktioniert:


Object e_tisch "Tisch" Esszimmer

   with description

   "Ein fast viereckiger Tisch aus massivem Eichenholz.",

   name 'Tisch' 'viereckig' 'massiver' 'massiven',

   has male static supporter;

Object t_decke "Tischdecke" e_tisch

   with description

   "Eine blaue Tischdecke.",

   name 'Tischdecke' 'Decke' 'blaue' 'blau',

   before [;

      Take:

          if (children(self))

             "Du bist doch kein Künstler";

   ],

   after [;

      Take:

      "Du nimmst die Tischdecke, denn es ist nichts mehr

      drauf.";

   ],

   has female supporter;

(Ich bin ebenfalls kein Inform-Experte und habe den Code nicht ausprobiert.)

Wenn das funktioniert, geht es natürlich weiter: Man kann nur Dinge auf die Tischdecke stellen, wenn sie auf dem Tisch oder irgendwo anders ausgebreitet ist. Und wenn die Tischdecke auf dem Tisch liegt, muss PutOn Augsburger_Tageblatt e_tisch umgewandelt werden in PutOn Augsburger_Tageblatt t_decke. Was ist, wenn die Decke gefaltet auf dem Tisch liegt? Viel Spaß! ;)

Geschrieben um 09:13 am 15.05.2003 | Zitat | Editieren | Löschen
Gast
Gast

Super,

das wars. und ich hab bestimmt ne Woche dran rumgebastelt.

Zitat:

Wenn das funktioniert, geht es natürlich weiter: Man kann nur Dinge auf die Tischdecke stellen, wenn sie auf dem Tisch oder irgendwo anders ausgebreitet ist. Und wenn die Tischdecke auf dem Tisch liegt, muss PutOn Augsburger_Tageblatt e_tisch umgewandelt werden in PutOn Augsburger_Tageblatt t_decke. Was ist, wenn die Decke gefaltet auf dem Tisch liegt?

Das sind gute Ansätze. Ich werds mal versuchen ob die Programmiert kriege.

Thomas

AntwortenNeues ThemaNeue Umfrage
Powered by Spam Board SVN © 2007 - 2021
Impressum / Datenschutz