IF-Forum

» IF-Forum - Autorencafé - Schreiben! - Kleine Fragen für zwischendurch ...
AntwortenNeues ThemaNeue Umfrage
» Mehrere Seiten: 12

Kleine Fragen für zwischendurch ...

Geschrieben um 09:56 am 23.08.2003 | Zitat | Editieren | Löschen
der.Grob
Mitglied
Student Gumby
Beiträge: 31

Ich habe ein Problem mit einer Tür - und zwar lässt sie sich aufschließen und öffnen wunderbar, wenn ich sie abschließen möchte macht sie mir allerdings Probleme (Meldung: 'Die Tür scheint nicht ins Schloss zu passen').

So sieht's aus:



 with name 'tuer',

  short_name "Tür",

  description [;

   if (location == raum)

    "Eine stinknormale Tür, die vermutlich in den Flur des Hauses führt.";

   else "Eine stinknormale Tür, die in einen Raum führt."; ],

  before [ ks;

   open:

    if (self hasnt locked || schluessel notin player)

     return false;

     ks = keep_silent; keep_silent = true;

     <unlock self schluessel>; keep_silent = ks;

     return true;

   lock:

    if (self hasnt open) return false;

     print "(Du machst zunächst die Tür zu.)^";

     ks = keep_silent; keep_silent = true;

     <close self>; keep_silent = ks;

     return false; ],

   after [ ks;

    unlock:

     if (self has locked) return false;

     print "Du schließt die Tür auf und öffnest sie.^";

     ks = keep_silent; keep_silent = true;

     <open self>; keep_silent = ks;

     return true; ],

  found_in raum flur,

  door_dir [;

   if (location == raum) return s_to;

   else return n_to; ],

  door_to [;

   if (location == raum) return flur;

   else return raum; ],

  with_key schluessel

 has female scenery door openable lockable locked;   

 

Object schluessel "Schlüssel" raum

 with name 'schluessel' 'tuerschluessel',

  dekl 1,

  description "Das scheint der Schlüssel für die Tür zu sein.",

 has male;```

Wer kann helfen?
Geschrieben um 10:38 am 23.08.2003 | Zitat | Editieren | Löschen
Clive
Mitglied
Bachelor Gumby
Beiträge: 60

Hm, der Fehler erscheint nur, wenn der Schlüssel nicht namentlich erwähnt wird. "schliesse tuer mit schluessel ab" funktioniert ja.

Also kann der Fehler auch auf diese Weise behoben werden:


Object tuer "Tür"

 with ...

         before [ks;

              open: ...

              lock:

               if (second == nothing) {

                if (schluessel in player) second = schluessel;

                else "Du hast nichts, womit du die Tür abschließen könntest."; }

               ...

         ],

 has ...;

Bei Bedarf muss dann die else-Meldung noch angepasst werden (falls sie nur ausgegeben werden soll, wenn die Tür nicht schon abgeschlossen ist etc.).

Geschrieben um 14:31 am 23.08.2003 | Zitat | Editieren | Löschen
der.Grob
Mitglied
Student Gumby
Beiträge: 31

Jo, danke - so klappt's.

Geschrieben um 11:06 am 01.09.2003 | Zitat | Editieren | Löschen
der.Grob
Mitglied
Student Gumby
Beiträge: 31

Folgendes:


 with short_name "Menschenmassen",

      name 'menschen' 'massen' 'menschenmassen',

      description

       "xxx.",

      before [;

       talk:

        "Man schenkt dir keine Beachtung."; ],

      found_in irgendwo,

 has animate pluralname female;

.

.

.

 

[ talkSub;

   if (noun == player)

    "Darüber wolltest du schon immer mal mit dir gesprochen haben.";

   "Dir fällt im Moment kein passendes Gesprächsthema ein."; ];

   

extend 'red'

 * 'mit'/'zu' creature      -> talk

 * creature      -> talk;

Wenn ich jetzt im Spiel 'red mit massen' eingebe, erscheint immer nur: 'Du wolltest vermutlich folgendes: "red mit die massen über..." - aber was, wie, womit?'

Leider finde ich den Fehler nicht - ist wahrscheinlich was vollkommen banales ... :roll:

Geschrieben um 11:45 am 01.09.2003 | Zitat | Editieren | Löschen
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

Hi!

Ich kenne die Inform-Lib nicht so genau, aber ich vermute, dass es bei 'red' irgendwo eine Zeile gibt, die etwa so aussieht:


Verb 'red'

    * 'mit' creature 'ueber' noun   -> tell

    * ...;

Diese Zeile wird natürlich zuerst überprüft, und dann fehlt dem Parser das Gesprächsthema. Du musst Deine Ergänzungen also an den Anfang der Verbdefinition stellen. Das geht mit first:


Extend 'red' first

    * 'mit'/'zu' creature        -> talk

    * creature                   -> talk;

(Die zweite Ergänzung ist für Scott-Adam-Fans, oder?)

Geschrieben um 12:12 am 01.09.2003 | Zitat | Editieren | Löschen
der.Grob
Mitglied
Student Gumby
Beiträge: 31

Ich sach's ja - was ganz banales. Danke.

Martin:

Die zweite Ergänzung ist für Scott-Adam-Fans, oder?

:wink:

Geschrieben um 18:56 am 16.09.2003 | Zitat | Editieren | Löschen
der.Grob
Mitglied
Student Gumby
Beiträge: 31


after [ ;

   wear:

     "Du kletterst in den Anzug, ...";

    take:

     "Du nimmst den Anzug ..."; ],```

Wenn ich den Anzug anziehen will, ohne ihn vorher genommen zu haben, wird der Anzug ja automatisch genommen. Allerdings wird hier bei 'zieh anzug an' der Anzug nur genommen aber nicht angezogen. Was muss abgeändert werden, damit die Folge von 'zieh anzug an' 'Du nimmst den Anzug ... Du kletterst in den Anzug, ...' ist?
Geschrieben um 20:26 am 16.09.2003 | Zitat | Editieren | Löschen
kairo
Mitglied
Dr Gumby
Beiträge: 284
<td valign="top"><div class="post"><p><strong>der.Grob:</strong></p> <blockquote> <pre><code></code></pre> </blockquote> <p>after &#91; ;</p> <p>   wear&#58;</p> <p>     &quot;Du kletterst in den Anzug, ...&quot;;</p> <p>    take&#58;</p> <p>     &quot;Du nimmst den Anzug ...&quot;; &#93;,```</p> <p>Ich vermute mal, dass du hier die Standardreaktion überschreibst, da die Print-Anweisung ja mit einem &quot;return true&quot; abschließt. Vielleicht hilft das?:</p> <pre><code> ... take&amp;#58; print "Du nimmst den Anzug ..."; return false;``` oder du machst alles selbst: </code></pre> <p>take&#58; give self worn; &quot;Du nimmst den Anzug und kletterst hinein.&quot;;</p> <pre><code> Zwei improvisierte Vorschläge, die ich nicht ausprobiert habe. Also selbst versuchen!</code></pre></div></td>
Geschrieben um 20:30 am 16.09.2003 | Zitat | Editieren | Löschen
der.Grob
Mitglied
Student Gumby
Beiträge: 31

Okay, probier ich mal aus - obwohl ich beim ersten Vorschlag vermute, dass wenn ich nur den Anzug nehmen möchte (ohne anziehen), dann 'meine' Meldung + die Standard-Meldung kommt. Teste ich gleich mal ...

Geschrieben um 21:37 am 16.09.2003 | Zitat | Editieren | Löschen
ChrisW
Mitglied
Dr Gumby
Beiträge: 275

So sollte es funktionieren:



after &#91; ;

   wear&#58;

     "Du kletterst in den Anzug, ...";

   take&#58;

     if &#40;onotheld_mode==0&#41; "Du nimmst den Anzug...";&#93;```
Geschrieben um 10:13 am 17.09.2003 | Zitat | Editieren | Löschen
der.Grob
Mitglied
Student Gumby
Beiträge: 31

kairo:

...

take: print "Du nimmst den Anzug ..."; return false;```

Da hatte ich wohl falsch vermutet - denn damit klappt es. Danke.

@ChrW - Deinen Code habe ich auch mal eingefügt, allerdings ohne den gewünschten Erfolg. :roll:

Geschrieben um 10:45 am 17.09.2003 | Zitat | Editieren | Löschen
ChrisW
Mitglied
Dr Gumby
Beiträge: 275

der.Grob:

Da hatte ich wohl falsch vermutet...

Hast du nicht (falls sich deine Version der Inform-Library nicht gänzlich anders verhält als meine). Der Code führt zu:

**>nimm anzug

Du nimmst den Anzug ...Du trägst den Anzug jetzt bei dir.**

Das ist deine Meldung + der Standardmeldung, oder?

Zitat:

@ChrW - Deinen Code habe ich auch mal eingefügt, allerdings ohne den gewünschten Erfolg.

Nanu? Bei mir funktioniert er. Was stimmt daran nicht?

**>nimm anzug

Du nimmst den Anzug...

leg anzug weg

Fallengelassen.

zieh anzug an

(Dazu nimmst du zuerst den Anzug)

Du kletterst in den Anzug, ...**

Wenn du wirklich "Du nimmst den Anzug ... Du kletterst in den Anzug, ..." haben willst:



     print "Du nimmst den Anzug...";

     if &#40;onotheld_mode==0&#41; return true;```

Das Ergebnis wäre:

**>zieh anzug an

(Dazu nimmst du zuerst den Anzug)

Du nimmst den Anzug...Du kletterst in den Anzug, ...**

Wozu du den Spieler doppelt darauf hinweisen willst, dass er den Anzug nimmt, ist mir zwar schleierhaft, aber du wirst schon deine Gründe haben.
Geschrieben um 19:56 am 17.09.2003 | Zitat | Editieren | Löschen
der.Grob
Mitglied
Student Gumby
Beiträge: 31

ChrW:

**>nimm anzug

Du nimmst den Anzug ...Du trägst den Anzug jetzt bei dir.**

Das ist deine Meldung + der Standardmeldung, oder?

Jo, hast Recht - auf die Schnelle hatte ich nur 'zieh anzug an' getestet. Da kam dann das, was ich sehen wollte. Bei 'nimm anzug' ist das natürlich doppelt-gemoppelt. :roll:

edit: Mit dem 'if (onotheld_mode==0)' klappt das jetzt so, wie ich mir das vorstelle. Thx. Und ich habe tatsächlich meine Gründe, es so zu machen, wie ich es mache - hehe. 8)

Geschrieben um 19:51 am 20.09.2003 | Zitat | Editieren | Löschen
der.Grob
Mitglied
Student Gumby
Beiträge: 31

Heute mal ein Problem mit GInfoG.h:



...

life &#91;;

   Ask, tell&#58; switch &#40;second&#41; &#123;

      Tvater&#58;

        "~Er war der beste Raumpilot in der ganzen Galaxis. Und listenreich im

         Krieg.~";

      default&#58; "Dazu kann der gute Rassel O'Hara nichts sagen.";  &#125;; &#93;,

...

         

Topic Tvater Topics

 with short_name "Vater",

         name 'vater' 'raumpilot',

 has  male;```

Anstatt meiner default-Meldung kommt nur: '[Dieses Thema überfordert mich.]'

Habe ich irgendwas übersehen? Wenn ja, was?   :roll:
Geschrieben um 10:01 am 22.09.2003 | Zitat | Editieren | Löschen
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

Hmm, ich gebe einfach mal ein paar meiner Gedanken wieder, die hoffentlich weiterhelfen. Kommentare von erfahrenen Informern, die trittsicher in der deutschen Lib sind, erwünscht.

Wenn Du die normale Definition der Library benutzt, in der 'fragen' mit dem Token topic definiert wird, enthält second kein Objekt, sondern das erste Wort des Gesprächsthemas, das kein Artikel ist. (Zumindest ist dies in der englischen Lib so, die mir aber sehr nahe am Original scheint.) Also wäre Dein Code (vgl. DM4, Seite 135):


life &#91;;

    Ask, tell&#58; switch &#40;second&#41; &#123;

       'vater', 'raumpilot'&#58;

           "~Er war der beste Raumpilot in der ganzen Galaxis.

            Und listenreich im Krieg.~";

       default&#58; "Dazu kann der gute Rassel O'Hara nichts

            sagen.";  &#125;;

&#93;,

Die Definition des Objekts Tvater entfällt dann.

Das erklärt aber nur, warum der Vater als Gesprächsthema nicht gefunden wurde. Wieso nicht die Default-Meldung, sondern eine ganz andere Meldung kommt, bleibt ungeklärt.

Zitat:

Anstatt meiner default-Meldung kommt nur: '[Dieses Thema überfordert mich.]'

Diese Meldung kann ich in meiner Lib (15.08.2002) nicht finden. Mir scheint, Du hast hier einen Code wie den für Fragen wie "Was ist ein Graus?" verwendet (DM4, Seite 233), der eine ähnliche Antwort bringt. Hast Du vielleicht das Verb 'frage' geändert, so dass es nicht auf Ask verweist?

Geschrieben um 12:17 am 22.09.2003 | Zitat | Editieren | Löschen
ChrisW
Mitglied
Dr Gumby
Beiträge: 275

Martin:

Zitat:

Anstatt meiner default-Meldung kommt nur: '[Dieses Thema überfordert mich.]'

Diese Meldung kann ich in meiner Lib (15.08.2002) nicht finden. Mir scheint, Du hast hier einen Code wie den für Fragen wie "Was ist ein Graus?" verwendet (DM4, Seite 233), der eine ähnliche Antwort bringt.

Genau, er hat ginfo.h verwendet, Frank Borgers Übersetzung des Moduls info.h ins Deutsche (http://www.if.frob.de/informis/node32.html), welches aber nichts anderes macht als das Codebeispiel im DM4.

Wenn kein passendes Topic-Objekt existiert, spuckt die TopicScope-Routine die beschriebene Meldung aus. Bis zum default-Ausführungsblock kommt das Spiel erst gar nicht.

Einen Lösungsvorschlag für das Problem habe ich aber leider nicht. (Abgesehen davon, auf ginfo zu verzichten und es auf die "herkömmliche" Art zu machen...)

Geschrieben um 14:37 am 22.09.2003 | Zitat | Editieren | Löschen
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

Aha! Ich tippe darauf, dass vergessen wurde, die Grammatikdefinitionen von Ginfo einzubinden:


Include "GInfo";

...

Include "GrammarG";

Include "GInfoG";

Auf diese Weise würde Ask immer noch so funktionieren, wie in der Lib und wie im DM4 beschrieben. Oder es ist wieder ein Problem, das mit extend ... first gelöst werden kann.

Ich finde den GInfo-Ansatz übrigens wesentlich eleganter als den Consult-Kram.

Geschrieben um 18:35 am 22.09.2003 | Zitat | Editieren | Löschen
der.Grob
Mitglied
Student Gumby
Beiträge: 31

Zitat:

Wenn kein passendes Topic-Objekt existiert, spuckt die TopicScope-Routine die beschriebene Meldung aus. Bis zum default-Ausführungsblock kommt das Spiel erst gar nicht.

Da liegt wahrscheinlich das Problem. Allerdings habe ich mich an Frank Borgers 'Eden' orientiert, und meines Erachtens auch nichts anders bzw. falsch gemacht. GInfo und GInfoG sind auch an den richtigen Stellen eingebunden ... :roll:

Geschrieben um 18:47 am 22.09.2003 | Zitat | Editieren | Löschen
der.Grob
Mitglied
Student Gumby
Beiträge: 31

Martin:

Oder es ist wieder ein Problem, das mit extend ... first gelöst werden kann.

Mmh, habe ich gerade mal ausprobiert - wenn ich das so mache, kommt direkt die default-Meldung, auch wenn ich im Spiel nach den 'richtigen' Sachen (in meinem Beispiel nach 'vater') frage.

Geschrieben um 20:48 am 22.09.2003 | Zitat | Editieren | Löschen
ChrisW
Mitglied
Dr Gumby
Beiträge: 275

Martin:

Ich finde den GInfo-Ansatz übrigens wesentlich eleganter als den Consult-Kram.

Dem schließe ich mich an. Meine Vermutung war nur, das "default" würde mit ginfo.h vielleicht prinzipiell nicht funktionieren. Irrtum meinerseits, Frank Borger verwendet es in "Eden" andauernd.

Im Vergleich zu den Topics im Eden-Quelltext fehlt deinem Tvater zwar die Deklination (dekl 2 müsste passen), aber das kann ja wohl kaum der Fehler sein...

» Mehrere Seiten: 12
AntwortenNeues ThemaNeue Umfrage
Powered by Spam Board SVN © 2007 - 2021
Impressum / Datenschutz