Ich habe nicht genau verstanden, was du erreichen möchtest. Ich vermute, es geht dir darum, ein Objekt, solange es noch nicht bewegt wurde, aus der Raumbeschreibung rauszuhalten, aber für den Parser sichtbar zu halten, ohne dass das Objekt die Attribute scenery oder concealed besitzt.
Im folgenden Beispiel wird eine Klasse HiddenObject definiert, die sich von normalen Objekten lediglich dadurch unterscheidet, dass sie eine Dummy-Initial-Property besitzt. Zusätzlich habe ich die Routine Locale() ersetzt und dort die Behandlung der Ausgabe der Initial-Property für Objekte der Klasse HiddenObject angepasst.
Im Beispiel ist der Fernseher ein HiddenObject. Er wird in der Raumbeschreibung nicht erwähnt, solange er noch nicht bewegt wurde.
Das Beispiel sieht wuchtiger aus, als es ist, denn die ersetzte Routine Locale() ist so lang. Dabei geht es nur um wenige Zeilen, die geändert wurden.
Constant Headline "^Ein interaktiver Probelauf^";
Include "Parser";
Class HiddenObject
with initial [; rtrue; ];
Replace Locale;
Include "VerbLib";
[ Locale descin text1 text2 case o k p j f2 flag;
objectloop (o in descin) give o ~workflag;
k=0;
objectloop (o in descin)
if (o hasnt concealed && NotSupportingThePlayer(o)) {
#Ifndef MANUAL_PRONOUNS;
PronounNotice(o);
#Endif;
if (o hasnt scenery) {
give o workflag; k++;
p = initial; f2 = 0;
if ((o has door || o has container) && o has open && o provides when_open) {
p = when_open; f2 = 1; jump Prop_Chosen;
}
if ((o has door || o has container) && o hasnt open && o provides when_closed) {
p = when_closed; f2 = 1; jump Prop_Chosen;
}
if (o has switchable && o has on && o provides when_on) {
p = when_on; f2 = 1; jump Prop_Chosen;
}
if (o has switchable && o hasnt on && o provides when_off) {
p = when_off; f2 = 1;
}
.Prop_Chosen;
if (o hasnt moved || o.&describe ~= 0 || f2 == 1) {
if (o.&describe ~= 0 && RunRoutines(o, describe) ~= 0) {
flag = 1;
give o ~workflag; k--;
}
else {
j = o.p;
if (j ~= 0) {
!!! Diese Abfrage ist neu!!!
if (o ofclass HiddenObject) {
print "";
} else {
new_line;
PrintOrRun(o, p);
}
flag = 1;
give o ~workflag; k--;
if (o has supporter && child(o) ~= 0) SayWhatsOn(o);
}
}
}
}
else
if (o has supporter && child(o) ~= 0) SayWhatsOn(o);
}
if (k == 0) return 0;
if (text1 ~= 0) {
new_line;
if (flag == 1) text1 = text2;
print (string) text1, " ";
WriteListFrom(child(descin),
ENGLISH_BIT + RECURSE_BIT + PARTINV_BIT + TERSE_BIT + CONCEAL_BIT
+ WORKFLAG_BIT, case);
return k;
}
if (flag == 1) L__M(##Look, 5, descin);
else L__M(##Look, 6, descin);
];
Class Tasse
with name 'tasse' 'tassen//p' 'becher' 'm.',
plural "Tassen",
has female
;
Object Testraum "Testraum"
with
description "Hier wird getestet.",
has light;
Object -> Bistrotisch "Bistrotisch"
with name 'bistrotisch' 'tisch' 'tischchen' 'n.' 'bistrotischchen' 'n.',
has male supporter;
Tasse ->-> "Tasse";
Tasse ->-> "Tasse";
Tasse ->-> "Tasse";
Tasse ->-> Espressotasse "Espressotasse"
with name 'espressotasse'
;
Object ->->-> Kaffee "Kaffee"
with name 'eklig' 'kaffee' 'espresso' 'bruehe' 'f.',
article "etwas",
has male;
Object -> Fussboden "Fußboden"
with name 'fussboden' 'boden',
has male scenery;
HiddenObject -> Fernseher "Fernseher"
with name 'fernseher' 'tv',
description "Ein neuer Fernseher ...",
kanal 3,
has male switchable;
[ Initialise;
location = Testraum;
print "^^^";
];
Include "GermanG";```
Das ist vielleicht etwas weniger fehleranfällig als das jonglieren mit concealed und scenery.