Forum moved to if-forum.org
Autor Nachricht
<  I6: Frag ohne Person
Mischa
BeitragVerfasst am: Mi, 23 Okt 2013 - 9:07  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 05.03.2008
Beiträge: 285
Wohnort: Wien

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

Code:

Extend 'frag'
   * creature                  -> Ask
   * creature 'nach' topic            -> Ask
   * 'nach' topic                  -> AskWithoutNoun
   ;


[AskWithoutNounSub;
   !print "noun: ", noun, " 2nd: ", second, "^";

   if (frau in real_location)
      <<Ask frau second>>;
   else
      <<Ask second>>;
];


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?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ChristianB
BeitragVerfasst am: Mi, 23 Okt 2013 - 10:16  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg

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.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mischa
BeitragVerfasst am: Mi, 23 Okt 2013 - 10:43  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 05.03.2008
Beiträge: 285
Wohnort: Wien

Ich versuche die Antworten folgendermaßen zu erzeugen:

Code:

   life [;
      Ask, Tell, Answer:
         switch (second) {
            'wetter','sonne':
               "~Schönes Wetter heute!~";
           default:
                     "~Versteh' ich nicht!~";
        ]


Allerdings komme ich so mit der Frage ohne Person immer in den default-Zweig...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ChristianB
BeitragVerfasst am: Mi, 23 Okt 2013 - 10:54  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg

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

Code:
life [ t;
      if (second ~= nothing) t = second;
      else t = noun;

      Ask, Tell, Answer:
         switch (t) {
            'wetter','sonne':
               "~Schönes Wetter heute!~";
           default:
                     "~Versteh' ich nicht!~";
        ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mischa
BeitragVerfasst am: Mi, 23 Okt 2013 - 11:21  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 05.03.2008
Beiträge: 285
Wohnort: Wien

ChristianB hat folgendes geschrieben:
Mischa hat folgendes geschrieben:
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
Code:
<<Ask frau noun>>

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

Aber schonmal danke für den Workaround! :-)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ChristianB
BeitragVerfasst am: Mi, 23 Okt 2013 - 11:23  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg

Zitat:
Finde ich aber nicht logisch...

Stimmt. Das sollte eigentlich so funktionieren. Seltsam.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Martin
BeitragVerfasst am: Mi, 23 Okt 2013 - 11:28  Antworten mit Zitat
Experte
Experte


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

Mischa hat folgendes geschrieben:
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:
Code:
[ FindActor;
    if (frau in location) return frau;
    rfalse;
];

[ AskWithoutNounSub
    whom;
   
    whom = FindActor();
    if (whom) {
        wn = consult_from;
        Descriptors();
        second = NextWord();
        <<Ask whom second>>;
    }
    "Hier ist niemand, den du fragen könntest.";
];


Deinen zweiten Zweig <<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.
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Martin
BeitragVerfasst am: Mi, 23 Okt 2013 - 11:43  Antworten mit Zitat
Experte
Experte


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

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

Code:
if (action_to_be == ##Ask or ##Answer or ##Tell) ...

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.
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mischa
BeitragVerfasst am: Mi, 23 Okt 2013 - 12:04  Antworten mit Zitat
Abenteurer
Abenteurer


Anmeldungsdatum: 05.03.2008
Beiträge: 285
Wohnort: Wien

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! :-)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ChristianB
BeitragVerfasst am: Mi, 23 Okt 2013 - 12:18  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg

Mischa hat folgendes geschrieben:
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.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ChristianB
BeitragVerfasst am: Mi, 23 Okt 2013 - 12:26  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg

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:

Code:
...
if (found_obj) {
        wn = consult_from;
        Descriptors();
        print "(", (den) found_obj, ")^";   
        <<Ask found_obj NextWord()>>;
    }

...

Wieder was Altes neu gelernt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
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