IF-Forum

» IF-Forum - Autorencafé - Schreiben! - I6 Initial-Property bei Objektgruppen?
AntwortenNeues ThemaNeue Umfrage

I6 Initial-Property bei Objektgruppen?

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

Hallo an alle!

Ich möchte in einem Raum einen Haufen Putzgeäte abstellen. Diese sollen einzeln angesprochen werden können, aber sonst als Gruppe oder Liste aufgeführt werden, etwa so:

Zitat:

Du bist in einer halbdunklen Besenkammer. In einer Ecke stehen ein paar Putzgeräte herum.

u putzgeräte

Es handelt sich um einen Besen, einen Eimer und eine Kehrschaufel.

u Besen

Ein oller Reisigbesen.

nimm putzgeraet

Was meinst du - den Besen, den Eimer oder die Kehrschaufel.

Ich weiß noch nicht, wie ich das realisieren soll, habe aber drei Ideen:

Eine Möglichkeit ist eine Objektklasse mit list-together-Property.

Diese erlaubt m.W. nur langweilige Ansagen wie "Du siehst hier, dass drei Putzgeräte in der Ecke stehen, nämlich ...". Frage 1: Lässt sich die Property modifizeren, dass die Meldung "Du siehst hier" unterdrückt oder abgewandelt wird?

Eine andere Möglichkeit wäre ein zusätzliches Objekt "Putzgeräte", das über den Objektnamen 'putzgeraete' angesprochen werden kann und eine Liste ausgibt. Jedoch habe ich keine Möglichkeit gefunden, mit WriteListFrom nur die Objekte einer Klasse auszugeben, etwa so: WritelistFrom(x ofclass putzgeraete, ...) Frage 2: Geht das irgendwie?

Die dritte Idee ist, in der Besenkammer einfach einen Behälter "Ecke" zu definieren und über before [;Receive: ...] alles in den Rest der Besenkammer zu schmeißen, was nicht Putzgerät ist. Die Ecke bekommt dann ein Initial mit einem WritelistFrom oder sie geht gleich in die Raumbeschreibung. Das müsste gehen, scheint mir aber etwas zu aufwändig. Frage 3: Hat das schon mal jemand gemacht und/ oder bessere Ideen?

Ich freu mich über Hinweise, Antworten etc.

Christof

Geschrieben um 17:10 am 29.07.2010 | Zitat | Editieren | Löschen
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

So einfach geht das, was Du willst, leider nicht. Und ich glaube, Du machst Dir hier alles ein wenig zu kompliziert.

C++:

Eine Möglichkeit ist eine Objektklasse mit list-together-Property.

Genau. Diese erlaubt zwar nicht, wie Du meinst, langweilige Ansagen und kann schon gar nicht dazu verwendet werden, um Sätze wie "In der Ecke steht" oder so zu verwenden.

Die Property list_together bewirkt, dass in Listen - ob nun im Inventar, on Räumen oder in Behältern - Objekte, deren Eigenschaft list_together denselben Wert hat, zusammen stehen. Wenn dieser Wert ein Text ist, etwa "Putzgeräte", dann wird dieser Wert der Unterliste vorangestellt. Wenn dieser Wert eine Routine ist, kann man alles noch viel flexibler machen. (Die so generierten Listen werden dann allerdings in den langweiligen Ansagen verwendet.)

Mit list_together könnte man also alles machen, was Du möchtest, außer, dass man die Putzgeräte nicht kollektiv ansprechen kann:

Frotz:

Du siehst hier drei Putzgeräte (einen Besen, ein Kehrblech und einen Eimer (der leer ist)).

u putzzeug

Hier kannst du nur ein Objekt angeben.

nimm putzzeug

Besen: In Ordnung.

Kehrblech: In Ordnung.

Eimer: In Ordnung.

Das ist vielleicht nicht so schön, aber so ist auf jeden Fall klar, dass das Putzzeug wichtig ist und dass man die Dinge einzeln nehmen kann. Die Stückeltaktik beim Aufheben macht selbst das auf Story fixierte I7 noch so. (Die alternative Platypus-Lib hatte einen narrative mode, der versucht hat, ganze Sätze aus den Listen zu machen, also etwa "Du hast jetzt den Eimer, den Besen und das Kehrblech".)

C++:

Jedoch habe ich keine Möglichkeit gefunden, mit WriteListFrom nur die Objekte einer Klasse auszugeben, etwa so ...

Listen kann man mit dem Attribut workflag einschränken:


    objectloop (o in parent(self)) {

        if (o ofclass Putzgeraet) {

            give o workflag;

        } else {

            give o ~workflag;

        }

    }

    WriteListFrom(child(parent(self)),

        WORKFLAG_BIT + ...);

C++:

Die dritte Idee ist, in der Besenkammer einfach einen Behälter "Ecke" zu definieren ...

Ich würde den Behälter "Putzgeräte" nennen. Das wäre dann so ähnlich wie die beiden Handschuhe aus Aufgabe 14 im DM4, die man einzeln oder zusammen ansprechen kann.

Ein anderen Link, der Dich vielleicht interessiert, sind die in die Raumbeschreibung integrierten Objekte von Andrew Plotkin.

Man könnte auch nur ein Objekt Putzgeräte vorhalten, das dann durch die tatsächlichen Putzobjekte ersetzt wird, wenn man etwas anderes macht, als sie zu untersuchen. Oder man könnte die description-Property des Raums so hinbiegen, dass sie die Putzgeräte in der Kammer so zeigt, wie Du es willst. Ansonsten wären der Besen und der Eimer dann normale Objekte:


  Class Utensil

   with name 'utensil',

        pname 'utensilie'

            'putzzeug' 'putzgerae',

        description [;

            "Es ist ", (ein) self, ". Mit Putzgeräten kennst

            Du dich nicht so aus, was?";

        ],

        describe [ ;

            if (self has general) rtrue;

            rfalse;

        ],

        each_turn [;

            give self ~general;

        ],

    has ~static;

 Object Kammer "Kammer"

   with description [ o n;

            print "Diese Abstellkammer ist, wie fast alles

                auf der S.S. Gigantic, etwas überdimensioniert";

               

            objectloop (o in self) {

                if (o ofclass Utensil) {

                    n++;

                    give o workflag;

                    give o general;

                } else {

                    give o ~workflag;

                }

            }

            if (n) {

                print ". In einer Ecke stehen einige Putzgeräte: ";

                WriteListFrom(child(self),

                    WORKFLAG_BIT + ENGLISH_BIT);

            }

            print ".^";

            rtrue;

        ],

    has light;

Viele Möglichkeiten, die alle nicht trivial sind. Vielleicht solltest Du Dir den Aufwand sparen und die Kammer noch einmal überdenken.

Geschrieben um 20:27 am 29.07.2010 | Zitat | Editieren | Löschen
C++
Mitglied
Bachelor Gumby
Beiträge: 40

Hallo und schönen Dank, Martin!

Mit langweilige Ansage meinte ich genau die Floskel "Du siehst hier", die ich gern ersetzen möchte.

Mir wird jetzt so langsam klar, dass meine zweite und dritte Idee wohl auf eigentlich denselben Trick rauslaufen. Die Funktion der Workflag war mir bisher so nicht bekannt, jetzt habe ich sie begriffen. (Auch dafür: Danke.)

Die von dir genannten Objekt auf der S.S. Gigantic sind ein kleiner Hinrnverzwirbler. Ich verstehe sie folgendermaßen: Die General-Flag dient dazu, alle in der Putzgeräte-Liste aufgeführten (mit Workflag versehenen) Utensilien in der Raumbeschreibung qua describe zu unterdrücken. So wird jedes Objekt nur einmal genannt. Das klingt gut und leistet ziemlich genau das, was ich will, aber eben, wie du sagtest, relativ aufwändig. (Macht aber nichts, die Besenkammer und die Geräte sind essenziell.)

(Vorerst) letzte Frage: Statt "pname" meintest du die plural-Property, oder? Pname habe ich jedenfalls weder im DM4 noch in der Lib gefunden...

Schöne Grüße,

Christof

Geschrieben um 07:16 am 30.07.2010 | Zitat | Editieren | Löschen
Martin
Avatar
Mitglied
Prof Gumby
Beiträge: 634

C++:

Ich verstehe sie folgendermaßen: Die General-Flag dient dazu, alle in der Putzgeräte-Liste aufgeführten (mit Workflag versehenen) Utensilien in der Raumbeschreibung qua describe zu unterdrücken.

Genau. das erste Putzmittel ist dafür verantwortlich, die Liste zu schreiben. Alle aufgelisteten Putzmittel bekommen die Attribute general und workflag als Zeichen dafür, dass sie schon genannt wurden. Eigentlich müsste workflag reichen, aber ich verwendet hier auch general, das als Allround-Attribut vorgdefiniert ist, weil man nie weiß, was die Lib noch so mit der workflag anstellt. In meinem Beispiel aber wahrscheinlich nichts.

Außerdem hat mein Code noch einen Bug: Man müsste nach jedem Zug, mit einem daemon oder so, das Attribut general wieder löschen. War nicht genug getestet, entschuldige.

C++:

(Macht aber nichts, die Besenkammer und die Geräte sind essenziell.)

Die Frage ist aber, ob es auch essenziell ist, das alles so kompliziert zu implementieren und ob das dem Spieler etwas bringt, der vielleicht eher verwirrt wird. Das werden Dir die Tester aber schon sagen.

C++:

Statt "pname" meintest du die plural-Property, oder?

Nein, ich meinte schon pname, das allerdings keine Library-Property ist. Ich hatte es beim Rumspielen eingeführt, um es in einer parse_name zu verwenden, die ich aber wieder verworfen habe. Mit dem Beispiel hat das nicht zu tun.

Die pname-Vokabeln sollten allerdings zu name gehören und vermutlich auch alle die '...//p'-Notation für Plurale verwenden.

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

Moin!

Zitat:

Die Frage ist aber, ob es auch essenziell ist, das alles so kompliziert zu implementieren und ob das dem Spieler etwas bringt, der vielleicht eher verwirrt wird. Das werden Dir die Tester aber schon sagen.

Stimmt sicher, ich bin ja noch in der Lernphase; bis ein gutes Abenteuer rauskommt, wird's wohl noch etwas dauern. Aber ich will natürlich alle technischen Möglichkeiten kennen, bevor ich sie am Ende doch nicht ausschöpfe.

Bis (sicher) bald...

Christof

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