Autor |
Nachricht |
< I6: Frag ohne Person |
|
Verfasst am:
Mi, 23 Okt 2013 - 9:07
|
|
|
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? |
|
|
|
|
|
Verfasst am:
Mi, 23 Okt 2013 - 10:16
|
|
|
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. |
|
|
|
|
|
Verfasst am:
Mi, 23 Okt 2013 - 10:43
|
|
|
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... |
|
|
|
|
|
Verfasst am:
Mi, 23 Okt 2013 - 10:54
|
|
|
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!~";
] |
|
|
|
|
|
|
Verfasst am:
Mi, 23 Okt 2013 - 11:21
|
|
|
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
würden noun und second auch dementsprechend gesetzt (also noun=frau und second=noun).
Aber schonmal danke für den Workaround! :-) |
|
|
|
|
|
Verfasst am:
Mi, 23 Okt 2013 - 11:23
|
|
|
Experte
Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg
|
|
Zitat: | Finde ich aber nicht logisch... |
Stimmt. Das sollte eigentlich so funktionieren. Seltsam. |
|
|
|
|
|
Verfasst am:
Mi, 23 Okt 2013 - 11:28
|
|
|
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. |
|
|
|
|
|
Verfasst am:
Mi, 23 Okt 2013 - 11:43
|
|
|
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. |
|
|
|
|
|
Verfasst am:
Mi, 23 Okt 2013 - 12:04
|
|
|
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! :-) |
|
|
|
|
|
Verfasst am:
Mi, 23 Okt 2013 - 12:18
|
|
|
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. |
|
|
|
|
|
Verfasst am:
Mi, 23 Okt 2013 - 12:26
|
|
|
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. |
|
|
|
|
|