Autor |
Nachricht |
< Tarzan, wer ist Jane? |
|
Verfasst am:
Fr, 13 Okt 2006 - 16:54
|
|
|
Experte

Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg
|
|
Eigentlich eine ganz einfache Sache, die ich da vorhabe, aber irgendwas übersehe ich wohl: Ich möchte, dass Fragen an NPCs, die in der Form PERSON, WER IST <TOPIC> gestellt werden, nach FRAGE PERSON NACH <TOPIC> umgewandelt werden.
Mein bisheriger Versuch:
Code: | Class NPC
with name 'person',
orders [;
WhatIs:
"Wenn du ", (den) self, " zu etwas befragen willst,
benutze bitte die Form ~Frage ", (den) self, " nach
<etwas>~.";
! <<Ask self second>> ???
! <<Ask self noun>> ???
],
has animate;
Verb 'wer' 'was' 'wo'
* 'ist'/'bist'/'bin'/'sind' topic -> WhatIs
;
[ WhatIsSub;
"Finde es heraus.";
]; |
Anstelle der ungelenken Ansage soll der Befehl einfach umgeleitet werden, aber die Übergabe des Topics funktioniert nicht. <<Ask Tarzan 'jane'>> ist erlaubt und funktioniert auch, mit einer Variablen klappt es nicht. Hm, wer weiß, wie’s geht? |
|
|
|
 |
|
Verfasst am:
Sa, 14 Okt 2006 - 9:05
|
|
|
Experte

Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München
|
|
Das [topic]-Token verhält sich anders als andere "Ergebnistokens". Während [noun], [held], [multiexcept] usw. auf den Variablen noun und second abgelegt werden, werden bei [topic] nur die Variablen consult_from und consult_words gesetzt. Bei Ask und Tell wird noun bzw. second auf das erste Wort gesetzt, wenn es erkannt wird, ansonsten nicht. Der Priester-Code im DM4 benutzt nur die zweite Methode, er schaut nur auf second.
Dummerweise wird nicht bei jedem [topic] second oder noun auf das erste Wort gesetzt. Die Library enthält solch krude Zeilen wie
Code: |
if (action == ##Ask or ##Tell or ##Consult) ...
|
was das [topic]-Token etwas unintuitiv macht, da es sich bei allen anderen Aktionen nicht so verhält wie im DM4 in den Abschnitten §17 und §18 beschrieben.
Mein (nicht getesteter) Tip ist daher:
Code: |
Class NPC
with name 'person',
orders [ next;
WhatIs:
wn = consult_from;
next = NextWord();
<<Ask self next>>;
],
has animate;
|
Den Wortmarker wn nach dem Parsen zu verbiegen scheint mir legal. Man könnte, glaube ich, das NextWord() auch in die doppelten spitzen Klammern setzen und sich so eine lokale Variable sparen, indem man den gesamten Unterausdruck in Klammern setzt, also
Code: |
<<Ask self (NextWord())>>;
|
aber das habe ich nur im FAQ gelesen und nicht getestet.
Wenn man statt [topic] die [scope=WhatIsScope]-Variante wählt, bei der nicht alles beliebige, sondern nur gültige Objektnamen geparst werden, sollte das Umlenken aber funktionieren. (Ich finde diese Methode ja eleganter. Wieso sollte man beim Fragen über bestimmte Objekte eine andere Syntax zulassen als bei jeder anderen Interaktion?) _________________ Every silver lining has a cloud. |
|
|
|
 |
|
Verfasst am:
Sa, 14 Okt 2006 - 15:39
|
|
|
Experte

Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg
|
|
Danke, Martin, so funtioniert es -- auch mit NextWord() in den spitzen Klammern. Und wieder was gelernt.
Edit: Und es geht sogar, ohne dass der zweite Ausdruck in Klammern gesetzt werden muss, also <<Ask self NextWord()>>.
Edit 2: Und es geht noch ein Tickelchen besser:
Code: | Class NPC
with name 'person' 'f.' 'mensch' 'm.',
changing_gender,
orders [;
WhatIs:
wn = consult_from;
Descriptors(); ! Artikel und so überlesen...
<<Ask self NextWord()>>;
],
has animate; |
|
|
|
|
 |
|
|
Alle Zeiten sind GMT + 1 Stunde (MEZ) |
|
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.
|
|