Forum moved to if-forum.org
Autor Nachricht
<  Feststellen ob etwas auf einer anderen Sache ist.
Mabruck
BeitragVerfasst am: Mi, 14 Mai 2003 - 18:33  Antworten mit Zitat
Neuling
Neuling


Anmeldungsdatum: 17.10.2002
Beiträge: 13
Wohnort: Friesland

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.

Code:

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
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
soquasi
BeitragVerfasst am: Mi, 14 Mai 2003 - 19:08  Antworten mit Zitat
Neuling
Neuling


Anmeldungsdatum: 26.08.2002
Beiträge: 9
Wohnort: Im tiefsten Hessen

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

Mabruck hat folgendes geschrieben:

Code:

...
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
_________________
Two roads diverged in a wood, and I - I took the one less traveled by, and that has made all the difference. (Robert Frost)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Martin
BeitragVerfasst am: Do, 15 Mai 2003 - 8:03  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München

soquasi hat folgendes geschrieben:
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
Code:

      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:
Code:

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ß! ;)
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Gast
BeitragVerfasst am: Do, 15 Mai 2003 - 8:13  Antworten mit Zitat






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
Nach oben
Beiträge der letzten Zeit anzeigen:   
Alle Zeiten sind GMT + 1 Stunde (MEZ)

Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Seite 1 von 1
if-de :: Forum Foren-Übersicht  >  Inform & Glulx

Neues Thema eröffnen   Neue Antwort erstellen


 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.



Kontakt: Administrator

Powered by phpBB and NoseBleed v1.05