Autor |
Nachricht |
< 'implicit taking'-Problem |
|
Verfasst am:
Do, 11 März 2004 - 14:27
|
|
|
Wasserträger
Anmeldungsdatum: 07.06.2003
Beiträge: 35
|
|
Hallo,
ich habe ein kleines Problem mit dem lästigen "implicit taking" der Inform-Library.
Gibt es eine Möglichkeit, dieses implizite Nehmen von Gegenständen auszuschalten oder es irgendwie zu manipulieren?
Ich meine z.B., dass man den Wackelpudding in einem Glas durchaus essen kann, ohne ihn vorher aus dem Glas nehmen zu müssen. Oder dass ich einem NPC das Glühwürmchen in einem verschlossenen durchsichtigen Behälter auch zeigen kann, ohne es vorher herauszunehmen. Die Library ist da aber anderer Meinung (und in den meisten Fällen hat sie ja durchaus recht).
Das Problem ist, dass dieser ##Take-Befehl vom Parser generiert wird, bevor ich überhaupt eine Möglichkeit habe, den ursprünglichen Befehl zu manipulieren. Ich würde zum Beispiel aus <<Show Gluehwuermchen Mann>> einfach <<Show Glasbehaelter Mann>> machen und schon wäre das Problem für mich erledigt.
GEHT ABER NICHT, weil der Parser automatsich IMMER zuerst die ##Take-action generiert (und die in meinem Fall zu einer ablehnenden Nachricht führt). Ich habe es sogar schon mit GamePreRoutine versucht, aber selbst da existiert schon die ##Take-action.
Hilfe, weiss einer eine Lösung?? |
|
|
|
|
|
Verfasst am:
Do, 11 März 2004 - 21:37
|
|
|
Experte
Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München
|
|
Tatsächlich behandelt der Inform-Parser das held-Token eigenartig: Wenn das Objekt nicht beim Spieler ist, erzeugt der Parser die Aktion ##Take, die eigentliche Eingabe merkt er sich dabei im globalen Feld kept_results. (Ich hätte eher gedacht, der Parser würde nach der Analyse etwas wie <##Take Gluehwuermchen> durchführen und dann die Aktion abbrechen, wenn das Würmchen dann immer noch nicht beim Spieler ist.)
Naja, du hast ja schon herausgefunden, dass selbst die GamePreRoutine nichts nützt - das implizite Aufheben kommt schon vorher vom Parser. Mit den Feldeinträgen oben und der Flagge notheld_mode bzw. deren Backup onotheld_mode kann man aber einen dreckigen Hack durchführen:
Code: |
Constant Story "Was Süßes zum Dessert";
Constant Headline "^^Eine interaktive Nahrungsaufnahme^
Copyright (c) 2004 Martin Oehm^^";
Constant TARGET_ZCODE;
Constant WORDSIZE = 2;
Include "Parser";
Object LibraryMessages
with before [;
Miscellany: if (lm_n==26) {
if (kept_results-->0==##Eat && lm_o==Pudding) rtrue;
}
];
Include "VerbLib";
[ Initialise;
location = Esszimmer;
print "Der Magen knurrt. Jetzt eine Kleinigkeit zu essen wär
nicht schlecht...^^";
];
Object Esszimmer "Esszimmer"
with description "In diesem Zimmer wird gegessen.",
has light;
Object -> Glas
with dekl 0,
short_name "Glas",
name 'glas',
before [;
Eat: if (Pudding in self )
"Wenn du den Pudding essen willst, sag das.";
],
has neuter container open;
Object -> -> Pudding
with dekl 1,
short_name "Pudding",
name 'pudding',
before [;
Eat:
if (Loeffel notin player)
"Du stichst mit dem Finger in den Pudding
und schleckst ihn ab. Lecker! Aber nur mit
dem Finger wirst du Stunden brauchen, den
Pudding zu essen.";
remove self;
"Hmm. Lecker! Du löffelst den Pudding
gierig aus.";
Take:
if (onotheld_mode && kept_results-->0==##Eat)
<<Eat self>>;
"Den Pudding kannst du nicht mitnehmen.
Aber essen, wenn du einen Löffel hast.";
],
has male;
Object -> Loeffel
with dekl 1,
short_name "Löffel",
name 'loeffel',
has male;
Include "GermanG";
|
In der Take-Klausel wird nun geprüft, ob das Nehmen nicht ein implicit take der Aktion ##Eat ist. Wenn ja, wird das Nehmen direkt zum Essen umgeleitet - die Form <...> bzw. <<...>> überprüft die Zugänglichkeit des Objekts nicht mehr, das wird alles vom Parser vorher erledigt.
Natürlich muss man noch die passende Library Message abfangen.
Nicht gerade elegant und sicherlich unübersichtlich, wenn man das für mehrere Objekte machen muss. Aber es funktioniert. _________________ Every silver lining has a cloud. |
|
|
|
|
|
Verfasst am:
Do, 11 März 2004 - 23:41
|
|
|
Abenteurer
Anmeldungsdatum: 26.08.2002
Beiträge: 278
Wohnort: Leipzig
|
|
Wow! Habe ich dir schonmal gesagt, dass ich deine Codebeispiele genial finde? Schon das Dosen-Beispiel neulich. Und nun das hier. Wir hatten in irgendeinem Thread schon mal eine Frage bzgl. eines Anzugs und dem Zusammenspiel wear/take, die nur mit notheld_mode zu lösen war. Ich hab damals ewig gebraucht, um das rauszufinden...
Martin hat folgendes geschrieben: | Mit den Feldeinträgen oben und der Flagge notheld_mode bzw. deren Backup onotheld_mode kann man aber einen dreckigen Hack durchführen. |
Der notheld_mode ist m.E. an sich schon ein dreckiger Hack.
Eigentlich habe ich deinem Code nichts mehr hinzuzufügen. Nur eine kleine Ergänzung, damit der Spieler wenigstens automatisch das Glas nimmt, um den Pudding zu essen:
Code: |
Take:
if (onotheld_mode && kept_results-->0==##Eat)
{if (Glas notin Player)
{print"(Dazu nimmst du zuerst ", (den)Glas, ")^";
<<Take Glas>>;}
<<Eat self>>;}
"Den Pudding kannst du nicht mitnehmen.
Aber essen, wenn du einen Löffel hast.";
|
Das <<Take Glas>> muss dabei in die doppelte Klammer, weil der onotheld_mode ja noch true ist. Take Glas gibt deshalb automatisch keinen Text aus und löst im Anschluss Eat Pudding aus. Kompliziert. Dreckiger Hack, wie du schon sagtest.
Zitat: |
Nicht gerade elegant und sicherlich unübersichtlich, wenn man das für mehrere Objekte machen muss. Aber es funktioniert. |
Aber zum Glück braucht mans ja sehr selten... _________________ "Ein Musiker! Was will der hier so spät?" Stolzing (Meistersinger v.N.)
Zuletzt bearbeitet von ChrisW am Do, 11 März 2004 - 23:58, insgesamt einmal bearbeitet |
|
|
|
|
|
Verfasst am:
Do, 11 März 2004 - 23:54
|
|
|
Wasserträger
Anmeldungsdatum: 07.06.2003
Beiträge: 35
|
|
Ich danke euch vielmals...
Nachvollziehen kann ich's heute nacht leider nicht mehr, weil ich gerade aus der Kneipe komme und ein paar Bier intus habe. :-)
Aber morgen schau ich mir eure Codebeispiele noch mal an und dann wird das schon laufen!
VIELEN VIELEN DANK! Ich hab in den letzten Tagen wirklich STUNDEN an diesem eine Objekt rumgebastelt und wäre fast verzweifelt.
(Der etwas betrunkene) Marc |
|
|
|
|
|
Verfasst am:
Mo, 15 März 2004 - 20:50
|
|
|
Experte
Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München
|
|
ChrW hat folgendes geschrieben: | Wow! Habe ich dir schonmal gesagt, dass ich deine Codebeispiele genial finde? |
Nö, noch nicht. Aber jetzt ist es ja offiziell. :-) Danke natürlich, freut mich zu hören, dass die Code-Posts gut ankommen.
ChrW hat folgendes geschrieben: | Nur eine kleine Ergänzung, damit der Spieler wenigstens automatisch das Glas nimmt, um den Pudding zu essen: |
Das gefällt mir. Erst das implizite Nehmen ausschalten und es dann auf ein anderes Objekt umbiegen. Clever!
Wirklich gut, dass man diesen Kram nicht explizit zu jedem Objekt angeben muss. _________________ Every silver lining has a cloud. |
|
|
|
|
|
|
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.
|
|