IF-Forum

» IF-Forum - Autorencafé - Schreiben! - Place the object in scope
AntwortenNeues ThemaNeue Umfrage

Place the object in scope

Geschrieben um 14:30 am 15.06.2012 | Zitat | Editieren | Löschen
Krähe
Gast

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:


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:



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?
Geschrieben um 20:23 am 15.06.2012 | Zitat | Editieren | Löschen
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

In I6 hätte ich die Gedanken schnell implementiert:



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:

#003399

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:

#003399

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.
Geschrieben um 00:02 am 16.06.2012 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

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

blue

Damit erwischt du alle Objekte, egal ob sichtbar oder nicht.

Geschrieben um 08:03 am 16.06.2012 | Zitat | Editieren | Löschen
Krähe
Gast

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!

Geschrieben um 15:23 am 16.06.2012 | Zitat | Editieren | Löschen
Krähe
Gast

Super, der understand-token tuts! Ich finds zwar etwas unlogisch, dass der Understand-token die Aktionsdefinition umgeht, aber mir solls recht sein :)

Geschrieben um 19:55 am 16.06.2012 | Zitat | Editieren | Löschen
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

ChristianB:

blue

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.)

AntwortenNeues ThemaNeue Umfrage
Powered by Spam Board SVN © 2007 - 2021
Impressum / Datenschutz