Autor |
Nachricht |
< I6: Nicht offensichtliche Objekte... |
|
Verfasst am:
Sa, 17 Aug 2013 - 12:13
|
|
|
Abenteurer
Anmeldungsdatum: 05.03.2008
Beiträge: 285
Wohnort: Wien
|
|
Wieder eine aktuelle Frage aus meinem Projekt:
Wie erstellt ihr nicht offensichtliche Objekte?
- Wenn man sie als scenery erstellt, kann man sie nicht mitnehmen.
- Wenn man sie mit dem Attribut concealed erstellt, muss man ihnen das entweder beim Aufheben oder beim erneuten Ablegen wegnehmen, da sie sonst in Raumbeschreibungen nicht vorkommen.
- Oder man nimmt den Objekten das concealed Attribut nicht weg und sieht in jeder Raumbeschreibung einen Absatz vor, der das Objekt beschreibt, falls es gerade im Raum liegt.
Irgendwie alles nicht optimal... |
|
|
|
|
|
Verfasst am:
So, 18 Aug 2013 - 12:45
|
|
|
Experte
Anmeldungsdatum: 25.03.2010
Beiträge: 660
|
|
Ich empfehle eine Kombination aus describe und moved:
Code: | Object secret
describe [;
if (secret hasnt moved)
rtrue;
];
Object cover
description [;
print "Eine schoene Decke";
if (secret hasnt moved)
print ". Darunter entdeckst du das Geheimnis";
".";
]; |
Sobald es einmal aufgehoben wurde, bekommt es automatisch "moved" und wird dann regulaer gelistet, dafuer nicht mehr in der Beschreibung der Decke. |
|
|
|
|
|
Verfasst am:
So, 18 Aug 2013 - 13:08
|
|
|
Experte
Anmeldungsdatum: 05.05.2004
Beiträge: 633
Wohnort: Hamburg
|
|
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.
Code: | Constant Story "Testspiel";
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. |
|
|
|
|
|
|
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.
|
|