Forum moved to if-forum.org
Autor Nachricht
<  'implicit taking'-Problem
Frottee
BeitragVerfasst am: Do, 11 März 2004 - 14:27  Antworten mit Zitat
Wasserträger
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??
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Martin
BeitragVerfasst am: Do, 11 März 2004 - 21:37  Antworten mit Zitat
Experte
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.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ChrisW
BeitragVerfasst am: Do, 11 März 2004 - 23:41  Antworten mit Zitat
Abenteurer
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
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Frottee
BeitragVerfasst am: Do, 11 März 2004 - 23:54  Antworten mit Zitat
Wasserträger
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
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Martin
BeitragVerfasst am: Mo, 15 März 2004 - 20:50  Antworten mit Zitat
Experte
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.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail 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