IF-Forum

» IF-Forum - Autorencafé - Schreiben! - I6: Frag ohne Person
AntwortenNeues ThemaNeue Umfrage

I6: Frag ohne Person

Geschrieben um 10:07 am 23.10.2013 | Zitat | Editieren | Löschen
Mischa
Mitglied
Master Gumby
Beiträge: 107

Um auch die Eingabe "frag nach <wasauchimmer>" für den Default-Dialogpartner des Spielers verstehen zu können, hab' ich das frag verb folgendermaßen erweitert


Extend 'frag'

   * creature                  -> Ask

   * creature 'nach' topic            -> Ask

   * 'nach' topic                  -> AskWithoutNoun

   ;

&#91;AskWithoutNounSub;

   !print "noun&#58; ", noun, " 2nd&#58; ", second, "^";

   if &#40;frau in real_location&#41;

      &lt;&lt;Ask frau second>>;

   else

      &lt;&lt;Ask second>>;

&#93;;

Wie man sich schon denken kann, funktioniert es natürlich nicht. (deswegen bin ich da! ;-) Allerdings weiß ich nicht warum.

Wenn man die auskommentierte Zeile einkommentiert, ist die Ausgabe des nouns und der Verbs nur "noun: 0 2nd: 0".

Das topic-Token kann ich gar nicht ansprechen/ausgeben. Da gibt's schon beim Kompilieren einen Fehler.

Weiß irgendwer, wie man das richtig umsetzt?

Geschrieben um 11:16 am 23.10.2013 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

Hmm. Sieht eigentlich ganz gut aus. Was funktioniert denn daran nicht?

Edit: Ach so, jetzt sehe ich es: Das topic sollte wohl eher mit noun anstatt second angesprochen werden. Bei Deinem neuen Satzmuster ohne creature gibt es nur ein einziges Satzobjekt, und das ist dann das noun.

Geschrieben um 11:43 am 23.10.2013 | Zitat | Editieren | Löschen
Mischa
Mitglied
Master Gumby
Beiträge: 107

Ich versuche die Antworten folgendermaßen zu erzeugen:


   life &#91;;

      Ask, Tell, Answer&#58;

         switch &#40;second&#41; &#123;

            'wetter','sonne'&#58;

               "~Schönes Wetter heute!~";

           default&#58;

                     "~Versteh' ich nicht!~";

        &#93;

Allerdings komme ich so mit der Frage ohne Person immer in den default-Zweig...

Geschrieben um 11:54 am 23.10.2013 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

Mischa:

Allerdings komme ich so mit der Frage ohne Person immer in den default-Zweig...

Ja, weil bei der Frage ohne noun (second == nothing) gilt. Du könntest vor der Behandlung der Ask-Tell-Answer-Abteilung testen, ob second einen brauchbaren Wert hat. Wenn nicht, dann wird eben noun untersucht, z.B. so:



      if &#40;second ~= nothing&#41; t = second;

      else t = noun;

      Ask, Tell, Answer&#58;

         switch &#40;t&#41; &#123;

            'wetter','sonne'&#58;

               "~Schönes Wetter heute!~";

           default&#58;

                     "~Versteh' ich nicht!~";

        &#93;```
Geschrieben um 12:21 am 23.10.2013 | Zitat | Editieren | Löschen
Mischa
Mitglied
Master Gumby
Beiträge: 107

ChristianB:

Mischa:

Allerdings komme ich so mit der Frage ohne Person immer in den default-Zweig...

Ja, weil bei der Frage ohne noun (second == nothing) gilt.

Finde ich aber nicht logisch...

Ich dachte durch Aufrufen von

&lt;&lt;Ask frau noun>>

würden noun und second auch dementsprechend gesetzt (also noun=frau und second=noun).

Aber schonmal danke für den Workaround! :-)

Geschrieben um 12:23 am 23.10.2013 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

Zitat:

Finde ich aber nicht logisch...

Stimmt. Das sollte eigentlich so funktionieren. Seltsam.

Geschrieben um 12:28 am 23.10.2013 | Zitat | Editieren | Löschen
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

Mischa:

Allerdings komme ich so mit der Frage ohne Person immer in den default-Zweig...

Uh, uh, consulting topics, eines meiner Lieblings-Hassthemen von Inform.

Topics werden, egal, ob sie nun das erste oder zweite Objekt im Satz sind, so abgelegt, dass man die Eingabe mit consult_from und consult_words selbst untersuchen muss. Dass bei ##Ask second auf das erste Wort gesetzt wird, ist eine Ausnahme, die in parserm.h fest verdrahtet ist. Über die globale Variable parsed_number und von da weiter über special_number2 gelangt der Wert des ersten Worts zu second, wenn die action ##Ask ist.

So geht's also:



    if &#40;frau in location&#41; return frau;

    rfalse;

&#93;;

&#91; AskWithoutNounSub

    whom;

   

    whom = FindActor&#40;&#41;;

    if &#40;whom&#41; &#123;

        wn = consult_from;

        Descriptors&#40;&#41;;

        second = NextWord&#40;&#41;;

        &lt;&lt;Ask whom second>>;

    &#125;

    "Hier ist niemand, den du fragen könntest.";

&#93;;```

Deinen zweiten Zweig &lt;&lt;ask second>> habe ich herausgenommen, weil das ja bedeuten würde, dass man das erste Wort des Topic nach etwas fragen möchte. In FindActor() könnte man natürlich etwas komplizierteres implementieren. mit Descriptors() werden Artikel und so überlesen, so dass man "frage nach dem wetter" sagen kann.
Geschrieben um 12:43 am 23.10.2013 | Zitat | Editieren | Löschen
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

Christian:

Du könntest vor der Behandlung der Ask-Tell-Answer-Abteilung testen, ob second einen brauchbaren Wert hat. Wenn nicht, dann wird eben noun untersucht, z.B. so:

Dieser Workaround funktioniert aber auch nicht, weil in den von Graham als Konversation gekennzeichneten Aktionen noun bzw. second gesetzt werden, in allen anderen Aktionen, die Topics verwenden, nicht. daswird in parserm.h, __ParseToken, Abscnitt A explizit mit:

abgefragt. Außerdem ist es ja selbst bei ##Ask legal, dass second Null ist: Es kann ja ein nicht erkanntes Wort angegeben werden, wie zum Beispiel "Wyvern" in der Tabelle in §18 im DM4, die den Mischmasch der Konversation in I6 ganz gut illustriert.

Das ist ja das Blöde: Es gibt keinen schönen Mechanismus, mit dem man die Konversationsthemen selbst erweitern kann, so dass sie auch die Sonderbehandlung bekommen. Man muss das alles selbst umsetzen.

Geschrieben um 13:04 am 23.10.2013 | Zitat | Editieren | Löschen
Mischa
Mitglied
Master Gumby
Beiträge: 107

Ah!

Und wieder wird mir Inform ein wenig klarer! :-)

Danke!

Und die FindActor() Funktion ist auch genial, so kann man nämlich sogar mehrere Aktoren angeben und zwischen denen (durch else if) priorisieren! :-)

Geschrieben um 13:18 am 23.10.2013 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

Mischa:

Und wieder wird mir Inform ein wenig klarer! :-)

Echt? Bei mir ist es umgekehrt ;) Danke, Martin, für die Erklärungen. Dennoch bin ich mir ziemlich sicher, dass ich bislang die Topics irgendwie anders durch die Gegend geschubst habe; eher so, wie Mischa es versucht hat. Ich muss das mal in Ruhe nachsehen.

Geschrieben um 13:26 am 23.10.2013 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

Okay, ich habe mich falsch erinnert. Ich hab's so gemacht, wie Martin so richtig erklärt hat, zum Beispiel bei der automatischen Suche nach einem Gesprächspartner:



if &#40;found_obj&#41; &#123;

        wn = consult_from;

        Descriptors&#40;&#41;;

        print "&#40;", &#40;den&#41; found_obj, "&#41;^";   

        &lt;&lt;Ask found_obj NextWord&#40;&#41;>>;

    &#125;

...```

Wieder was Altes neu gelernt.
AntwortenNeues ThemaNeue Umfrage
Powered by Spam Board SVN © 2007 - 2021
Impressum / Datenschutz