Forum moved to if-forum.org
Autor Nachricht
<  Place the object in scope
Krähe
BeitragVerfasst am: Fr, 15 Jun 2012 - 13:30  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 02.12.2011
Beiträge: 40
Wohnort: Heidelberg

Und schon wieder das nächste Problem...
In meinem Spiel spielt es eine wichtige Rolle, über Dinge nachdenken zu können. Zunächst mal kein Problem: Die Inform-Standardaktion blockieren, neue Aktion einrichten, Check, Carry out und Report Rules schreiben. Was ich bislang zustande gebracht hab, sieht so aus:

Code:
Part Thinking

Section Kill thinking

The block thinking rule is not listed in the check thinking rulebook.
Understand the command "denk" as something new.
Understand the command "denk nach" as something new.

Section advanced thinking

advanced thinking is an action applying to one thing.

understand  "denk an [thing]" as advanced thinking.
Understand "denk [thing]" as advanced thinking.

Section Block thinking about unknown things

Check advanced thinking:
   if the noun is unknown:
      Say "(Muss mir noch ne Library Message für schreiben)";
      Rule fails.



Beim Testen der Check Rule hatte ich dann das Problem, dass Inform mich nur über Dinge, die sichtbar und in meinem Raum sind, hat nachdenken lassen. Also ab in die Documentation. Ergebnis:
Code:
Section Scope

Before deciding the scope of the player while advanced thinking (This is the you can think about everything rule):
   place the noun in scope.


Das führt aber zu Runtime Errors:
Zitat:
>denke an bett
[Rule "you can think about everything rule" applies.]

[** Programming error: tried to find the "." of (something) **]

[** Programming error: tried to find the "." of (something) **]
[Rule "you can think about everything rule" applies.]

[** Programming error: tried to find the "." of (something) **]

[** Programming error: tried to find the "." of (something) **]
[advanced thinking das Bett]
[Rule "Check advanced thinking" applies.]
[advanced thinking das Bett - succeeded]

Über das Bett nachzudenken funktioniert (Soweit man das über eine noch nicht implementierte Aktion sagen kann) trotz der "programming Errors", weil das Bett schon vorher in Scope ist (Weil im selben Raum wie der Spieler).
So sieht das ganze aus, wenn das Objekt woanders ist ("y" ist ein von mir erstelltes testobjekt, an dem ich in meiner Freizeit furchtbare Dinge ausprobiere ;) )

Zitat:
>denke an y
[Rule "you can think about everything rule" applies.]

[** Programming error: tried to find the "." of (something) **]

[** Programming error: tried to find the "." of (something) **]
[Rule "you can think about everything rule" applies.]

[** Programming error: tried to find the "." of (something) **]

[** Programming error: tried to find the "." of (something) **]
So etwas kannst du hier nicht sehen.


Hat irgendjemand ne Idee dazu?
_________________
In a world without walls and fences, who needs Windows and Gates?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Martin
BeitragVerfasst am: Fr, 15 Jun 2012 - 19:23  Antworten mit Zitat
Experte
Experte


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

In I6 hätte ich die Gedanken schnell implementiert:

Code:

Verb 'denk'
    * 'ueber' scope=Thought 'nach'  -> ThinkAbout
    * 'an' scope=Though             -> ThinkAbout
    ;

[ Thought   o;
    switch (scope_stage) {
    1:  rfalse;     ! No multiple objects
    2:  objectloop (o is known) PlaceInScope(o);
        rtrue;      ! Definition replaces scope
    3:  "Dazu fällt dir nichts ein.";
    }
];


Die Scope-Rules funktionieren nicht so, wie man denkt. Es ist nicht so, dass der Parser ein Objekt findet und dann prüft, ob es im Scope ist. Stattdessen bestimmt der Parser für jedes mögliche Satzmuster, das zum Verb passt, den Scope und untersucht dann alle Objekte, die im Scope sind.

Der Vorteil ist, dass man so nicht alle Objekte untersuchen muss. Wenn ein Spiel 200 Räume hat, muss ich die Eingabe nur auf das, was im momentanen Raum ist untersuchen. Der nacteil ist, dass ich so keine genauen Fehlermeldungen ausgeben kann: Es heißt "Du siehst hier nichts dergleichen", weil der Perser halt nicht überprüft hat, ob es im Nebenraum einen schwarzen Schimmel gibt.

Die Idee mit dem Scope war schon ganz gut, hat aber einen Schönheitsfehler: Der Scope wird bestimmt, bevor das noun und das second noun gesetzt werden, die beide vermutlich noch nothing sind und die Programming errors erzeugen.

Zusammen mit dem "understand as something new" funktioniert folgendes:

Pondering is an action applying to one visible thing.

Understand "denk an [thing]" as pondering.
Understand "denk [thing]" as pondering.
Understand "sinnier ueber [thing]" as pondering.

A thing can be unknown or known. A thing is usually unknown.

Check pondering:
if the noun is unknown:
say "Zu [dem noun] fällt dir nichts Besonderes ein.";
rule fails.

Carry out pondering: say "Du sinnierst ein wenig über [den noun]."

Before deciding the scope of the player while pondering:
___ repeat with item running through things:
___ ___ place the item in scope.


Alle Objekte werden hier in einer Schleife in den Scope gelegt. (Sätze wie "Place all items in scope" oder "Now every item is in scope" gegen leider nicht, weil es sich wieder im ein Spezialkonstrukt handelt.)

Diese Brute-Force-Methode könnte bei vielen Objekten und bei vielen Satzmustern zu einem Verb die Satzanalyse stark verlangsamen. Daher wäre die richtige Methode, nur alle "known things" in den Scope zuz legen. Dann ist die Fehlermeldung, wenn man an etwas Unbekanntes denkt, aber "Du siehst so etwas hier nicht". Man müsste also die Fehlermeldung ändern. Die Check-Phrase muss trotzdem bleiben, weil sichtbare, aber unbekannte Objekte nicht aus dem Scope herausfallen - man kann den Scope nur erweitern. (Ich habe zumindest keine Methode gefunden, den Scope komplett neu zu definieren.) Die Lösung zu verbessern lasse ich mal als Aufgabe für laue Sommernächte so stehen. :-)

Hier ist wichtig, dass die action auf ein "visible thing" und nicht nur auf ein "thing" zutrifft: Ein "thing" muss berührbar sein und ein "visible thing" nur sichtbar. Wenn ich an ein Pferd auf einem entfernten Reitweg denke, sagt mir der Parser sonst: "Du kannst nicht in Reitweg hineingreifen."

Ich habe lange suchen müssen, bis ich diese nicht ganz zufriedenstellende Lösung gefunden habe. Wenn ich I6 nicht gekannt hätte, hätte ich wie der Ochs vorm Berge gestanden. Ich hoffe, sie hilft Dir erst einmal weiter.

Nachtrag: Die etwas bessere Lösung, in der nur die als "known" markierten Objekte betrachtet werden, erhält man mit:

Before deciding the scope of the player while pondering:
___ repeat with item running through known things:
___ ___ place the item in scope.

Rule for printing a parser error when the latest parser error is the can't see any such thing error: say "Dazu fällt dir nichts ein." instead.


Die Check-Phrase muss beibehalten werden. Wenn man an ein sichtbares, aber nicht bekanntes Objekt denkt, kommt "Zu der Theaterkarte fällt dir nichts Besonderes ein.", also der Text aus der Check-Phrase.

Wenn man an ein nicht sichtbares, unbekanntes Objekt denkt, kommt der Parser-Fehler "Dazu fällt dir nichts ein." Diese Meldung kann sich nicht auf ein noun beziehen, weil einfach kein noun gefunden wurde - die Dinge die nicht im Scope sind, die man also "nicht sehen kann", werden nicht untersucht.
_________________
Every silver lining has a cloud.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ChristianB
BeitragVerfasst am: Fr, 15 Jun 2012 - 23:02  Antworten mit Zitat
Experte
Experte


Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg

Inform 7 kennt die Understand-Token [any thing], [any room] etc. Damit umgeht man sämtliche scope-Einschränkungen.

Understand "denk an [any thing]" as advanced thinking.

Damit erwischt du alle Objekte, egal ob sichtbar oder nicht.
_________________
Worichtung willst du ingehen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Krähe
BeitragVerfasst am: Sa, 16 Jun 2012 - 7:03  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 02.12.2011
Beiträge: 40
Wohnort: Heidelberg

Ah, ich hätte gedacht, das erst das Objekt gesucht wird und dann entschieden wird ob es in scope ist. Klar, dass es dann nicht geht. Die repeat-loop sieht so aus als täte sie was ich will, vielen Dank, Martin! Mit der Performance wird das wohl keine Probleme geben, das Spiel ist recht klein.
@Christian: Das wäre eine Lösung, die ich schon wegen ihrer Einfachheit sehr gerne verwenden würde. Macht der understand-token da wirklich einen unterschied? Ich dachte, es käme da auf die Definition der Aktion selber an, und da gäbe es nur die Optionen "visible" und "touchable"? Läuft dann nicht der Understand-token der Aktionsdefinition entgegen? Ich werde auf jeden Fall beide Methoden heute Abend ausprobieren. Vielen Dank euch beiden!
_________________
In a world without walls and fences, who needs Windows and Gates?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Krähe
BeitragVerfasst am: Sa, 16 Jun 2012 - 14:23  Antworten mit Zitat
Wasserträger
Wasserträger


Anmeldungsdatum: 02.12.2011
Beiträge: 40
Wohnort: Heidelberg

Super, der understand-token tuts! Ich finds zwar etwas unlogisch, dass der Understand-token die Aktionsdefinition umgeht, aber mir solls recht sein :)
_________________
In a world without walls and fences, who needs Windows and Gates?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Martin
BeitragVerfasst am: Sa, 16 Jun 2012 - 18:55  Antworten mit Zitat
Experte
Experte


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

ChristianB hat folgendes geschrieben:
Understand "denk an [any thing]" as advanced thinking.

Touché. So macht man das natürlich in I7.

(Das kommt davon, wenn man partout I6-Code in I7 schreiben will. Mein Fehler-Workaround oben hat außerdem noch einen dicken Bug: Er ersetzt die Fehlermeldung für alle Aktionen.)
_________________
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