IF-Forum

» IF-Forum - Autorencafé - Schreiben! - I6 Darauf-Property?
AntwortenNeues ThemaNeue Umfrage

I6 Darauf-Property?

Geschrieben um 12:21 am 14.07.2010 | Zitat | Editieren | Löschen
C++
Mitglied
Bachelor Gumby
Beiträge: 40

Hallo an alle!

Es sind wieder Sommerferien und draußen ist es viel zu warm, daher vertiefe ich meine Gehversuche mit I6, genauer: Deform. (In mir verstärkt sich der Eindruck, dass ich damit ziemlich out bin, aber macht nix...)

Da ich mit TAG angefangen habe, bin ich bei den leicht zu handelnden Objektbeschreibungen etwas verwöhnt. Gibt es bei I6 auch eine Möglichkeit, eine Darauf- oder Darin-Property zu definieren? Für Nicht-TAG-ler:

  • sie soll sowohl in der Objekt- als auch in der Raumbeschreibung angesprochen werden;

  • sie soll alle Tochter-, Enkel- usf.-Objekte aufzählen;

  • stattdessen soll die Nennung der Tochterobjekte in der Raumbeschreibung unterlassen werden.

Meine bisherige Idee: die Invent-Property dazu verwenden. Daran friemel ich gerade herum, aber bisher ohne nennenswerten Erfolg.

Kennt jemand eine andere, einfachere Möglichkeit oder hat jemand so was schon mal gemacht und online gestellt? Ich freu mich über Hinweise und wünsche schöne Sommertage.

Christof

Geschrieben um 14:52 am 14.07.2010 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

Vergleichbares gibt es in deform standardmäßig nicht.

Raumbeschreibung:

Falls Dich nur die Inhaltslisten als Nebensatz (in Klammern) stört, könntest Du die deform-Option der unverschachtelten Listen benutzen, indem Du am Anfang Deines Codes

Constant NO_NESTED_LISTS;

definierst.

Ansonsten kannst du per



    if (inventory_stage == 2 && action ~= ##Inv) rtrue;

];```

die Ausgabe des Inhalts in der Raumbeschreibung komplett unterbinden.

Eine Ausgabe der Inhaltslisten nach der Objektbeschreibung kannst du von Hand nachliefern, z.B.

``` ...

with before [;

            Examine:

                 PrintOrRun(self.description); print " In ", (dem) self, " siehst du mit Schrecken ";

                 WriteListFromCase(child(self), ENGLISH_BIT + RECURSE_BIT + PARTINV_BIT + TERSE_BIT + CONCEAL_BIT + WORKFLAG_BIT, Akk);

                 ".";

],```

Schöne Ferien!

Christian
Geschrieben um 09:51 am 15.07.2010 | Zitat | Editieren | Löschen
C++
Mitglied
Bachelor Gumby
Beiträge: 40

Hallo Christian,

danke schön erst mal für die schnelle Antwort. Die Auflistung im einzelnen Satz gefällt mir schon deutlich besser.

Dein letzter Hinweis funktioniert bei mir nicht. Ich habe den Befehl PrintOrRun durch print (string) ersetzt, weil WinFrotz dabei immer einen Illegal-Object-Fehler anzeigt und dann abstürzt. Aber da meine Objektbeschreibungen eher simpel sind, macht das nichts. (Was sie kompliziert macht, sind ja die Inhaltsbeschreibungen, die ich gemäß deiner Anleitung in der before-Property aufliste.)

Es sieht dann so aus:


Class    Ablage

with      before [;

   Examine:

           print (string) (self.description);

           print " Auf ", (dem) self, " siehst du ";

           WriteListFromCase(child(self), ENGLISH_BIT + RECURSE_BIT + PARTINV_BIT + TERSE_BIT + CONCEAL_BIT + WORKFLAG_BIT, Akk);

            ".";

            ],

has      supporter enterable;

Nun tauchen folgende Probleme auf:

  1. Die auf der Ablge befindlichen Dinge werden nicht aufgelistet.

  2. Ist eine Ablage leer und wird dann untersucht, gibt es ebenfalls eine Fehlerwarnung (ohne Absturz):

Zitat:

Auf dem stuhl siehst du Warning! @get_parent called with object 0 (PC = d259) (occurence = 1)

Warning! @get_child called with object 0 (PC = d25c) (occurence = 1)

und noch zwei davon.

Vielleicht hast du auch eine Idee, wie man diesen Fehler fixen kann. Ansonst ist wie gesagt die ausführliche Inventarbeschreibung ohne Klammern schon eine gute Sache und ich brauche (vorerst) keine ausgefallenen Listen. Es wäre nur schön, wenn nicht immer Auf dem ... ist/ sind ... verwendet würde, und ich will erst mal nicht in der Lib rumspielen.

Schöne Grüße,

Christof

Geschrieben um 18:06 am 15.07.2010 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

Ja, die von mir vorgeschlagene Liste war Unfug. Sie enthielt die Listenoptionen ISARE_BIT und WORKFLAG_BIT. Wenn Du die aus der Listenanweisung herausnimmst, klappt es vielleicht besser.

Zu den Listenoptionen:

ISARE_BIT stellt der Liste ein "ist" oder ein "sind" voran. Das WORKFLAG_BIT berücksichtigt nur Objekte, die zuvor zum Listen markiert wurden.

Wenn du die description als String ausgibst, kannst Du bei keinem Objekt eine Routine als description verwenden, was die Möglichkeiten der Klasse "Ablage" einschränkt.

Geschrieben um 20:28 am 15.07.2010 | Zitat | Editieren | Löschen
ChristianB
Mitglied
Retired Gumby
Beiträge: 1062

Tschuldigung, aber ich bin jetzt erst zum Testen gekommen. Deshalb kommt hier ein gestester Vorschlag, der (glaube ich) das macht, was Du möchtest. Die Routine SayWhatsInOrOnIt kannst Du für Behälter und Ablagen benutzen und sie funktioniert mit und ohne NO_NESTED_LISTS.



    if (obj has container) print "Auf ";

    else if (obj has supporter) print "In ";

    else print "An ";

    print (dem) obj, " siehst du ";

    if (children(obj) == 0) "nichts.";

    WriteListFromCase(child(obj),

        ENGLISH_BIT + TERSE_BIT + CONCEAL_BIT, Akk);

    print "."; if (WriteSublists()==0) "";

];

 

Class Ablage

  with

    before [;

        Examine:

           if (self provides description)

               { PrintOrRun(self, description); print " "; }

           return SayWhatsInOrOnIt(self);

    ],

has supporter enterable;```

Viele Grüße,

Christian
Geschrieben um 21:16 am 15.07.2010 | Zitat | Editieren | Löschen
C++
Mitglied
Bachelor Gumby
Beiträge: 40

Guten Abend!

ChristianB:

Tschuldigung, aber ich bin jetzt erst zum Testen gekommen. Deshalb kommt hier ein gestester Vorschlag, der (glaube ich) das macht, was Du möchtest. Die Routine SayWhatsInOrOnIt kannst Du für Behälter und Ablagen benutzen und sie funktioniert mit und ohne NO_NESTED_LISTS.

Kein Grund zum Entschuldigen, das ist ja kein Dienstleistungsbetrieb hier. Die meisten meiner Fragen liegen ohnehin in der Tatsache begründet, dass ich das DM nicht von Deckel zu Deckel durcharbeiten kann und nicht immer die richtigen Suchbegriffe finde. Und Stück für Stück fange ich an, die Programmiersprache zu druchblicken.

Ich bin nach deinen Tipps auf eine ähnliche Idee gekommen und habe eine Routine programmiert, die ähnliches leistet. Nur kannte ich die Bedingung children == 0 nicht, das habe ich mit einer While-Schleife umschifft.

Ein weiteres Problem war, dass die Objektbeschreibung zweimal ausgedruckt wurde; der Return-Befehl hat Deform also nicht daran gehindert, nach dem Abarbeiten des Before-Befehls das Objekt noch mal zu beschreiben, und zwar dann erst mit Ablageinhalt.

Daher habe ich die Funktion in einer After-Property aufgerufen und so funzt es bei mir:


[ZeigeInhalt x i;

  i = 0;

  while(child(x)) {i = 1; rfalse;};

  if (i == 1) {

    print " Auf ", (dem) x, " siehst du ";

    WriteListFromCase(child(x), ENGLISH_BIT + RECURSE_BIT +PARTINV_BIT + TERSE_BIT + CONCEAL_BIT, Akk);

    if (WriteSublists()==0) "";

    ".";

  };

];

Class    Ablage

with

  After [;

    Examine, Look:

      ZeigeInhalt(self);

  ]

;

Deine Variante werde ich aber auch gleich ausprobieren, damit ich die genannten Befehle besser verstehe.

Übrigens klappt es bei mir nicht, die Inhaltslisten mit dem Invent-Befehl in der Raumbeschreibung zu deaktivieren, aber das ist das nächste Projekt.

Schönen Dank noch mal und bis zur nächsten Frage...

Christof

Geschrieben um 09:34 am 20.07.2010 | Zitat | Editieren | Löschen
C++
Mitglied
Bachelor Gumby
Beiträge: 40

Und noch mal hallo an alle, die es wissen wollen!

Ich habe nun doch in der Lib rumgespielt und in der in german.h angegebenen Language-Routine im Abschnitt Look die Einträge 4 und -1 verändert; statt der bisherigen Einträge wird auf die Routine ZeigeInhalt verwiesen.

Dort wird erst geprüft, ob ein Objekt überhaupt Töchter hat, und wenn ja, ob es eine darauf-Property besitzt. Wenn nicht, wird die Liste ausgegeben, und zwar (ein kleiner Spleen von mir) unter Verwendung von Zufallstexten, sodass verschiedeneAngaben möglich sind:

*Auf dem Tisch siehst du eine Flasche Korn und zwei Gläser.

Es befinden sich eine Flasche Korn und zwei Gläser auf dem Tisch.

Eine Flasche Korn und zwei Gläser befinden sich auf dem Tisch.

Du siehst auf dem Tisch eine Flasche Korn und zwei Gläser.

*u.s.w.

Weil diese Texte oft noch zu zu langweilig (und nichtssagend) sind, gibt es auch die Möglichkeit, dass Gegenstände herumliegen:

*Auf dem Bett liegen drei Paar Socken.

Ein Stapel Wäsche liegt im Waschkorb.*

Nur wenig komplizierter wird es, wenn Gegenstände per se nicht liegen, sondern stehen, wie etwa der Wäschekorb. Der bekommt eine Property l_verb "steh", die besagt, dass er steht und nicht liegt. Hier kann der Programmierer auch andere Verben, jedoch nur einteilige: "vergammel" ja, "herumoxidier" nein.

Auf der To-Do-Liste ist noch das Verarbeiten von Gegenständen, die stehen und liegen können.

*Eine Flasche Korn und drei Gläser stehen auf dem Tisch.

Auf dem Wohnzimmerteppich liegt eine leere Schnapsflasche.*

Das vielleicht später. Wer Interesse hat, die Erweiterung auszuprobieren oder vielleicht erst mal nur kritisch durchzulesen findet sie unter www.gehirnthaler.net -> Download. Ich freu mich über Rückmeldungen. (Die Änderungen sind wie o.a. zu finden; die zusätzlich Routinen etc. sind unten angefügt.)

Christof

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