Autor |
Nachricht |
< I6 Initial-Property bei Objektgruppen? |
|
Verfasst am:
Do, 29 Jul 2010 - 11:12
|
|
|
Wasserträger

Anmeldungsdatum: 21.12.2009
Beiträge: 45
Wohnort: Kiel
|
|
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: Code: | 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 |
|
|
|
 |
|
Verfasst am:
Do, 29 Jul 2010 - 16:10
|
|
|
Experte

Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München
|
|
So einfach geht das, was Du willst, leider nicht. Und ich glaube, Du machst Dir hier alles ein wenig zu kompliziert.
C++ hat folgendes geschrieben: | 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 hat folgendes geschrieben: | 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++ hat folgendes geschrieben: | 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:
Code: |
objectloop (o in parent(self)) {
if (o ofclass Putzgeraet) {
give o workflag;
} else {
give o ~workflag;
}
}
WriteListFrom(child(parent(self)),
WORKFLAG_BIT + ...);
|
C++ hat folgendes geschrieben: | 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:
Code: |
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. _________________ Every silver lining has a cloud. |
|
|
|
 |
|
Verfasst am:
Do, 29 Jul 2010 - 19:27
|
|
|
Wasserträger

Anmeldungsdatum: 21.12.2009
Beiträge: 45
Wohnort: Kiel
|
|
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 |
|
|
|
 |
|
Verfasst am:
Fr, 30 Jul 2010 - 6:16
|
|
|
Experte

Anmeldungsdatum: 25.08.2002
Beiträge: 677
Wohnort: München
|
|
C++ hat folgendes geschrieben: | 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++ hat folgendes geschrieben: | (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++ hat folgendes geschrieben: | 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. _________________ Every silver lining has a cloud. |
|
|
|
 |
|
Verfasst am:
Mo, 2 Aug 2010 - 15:33
|
|
|
Wasserträger

Anmeldungsdatum: 21.12.2009
Beiträge: 45
Wohnort: Kiel
|
|
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 |
|
|
|
 |
|
|
Alle Zeiten sind GMT + 1 Stunde (MEZ) |
|
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.
|
|