________________________________________________________________________
| ||
10. Verschiedene Arten von Objekten
| ||
10.1. Behälter und AblagenObjekte liegen selten direkt auf dem Fußboden, meist befinden sie sich auf oder in anderen Objekten. Damit ein Objekt andere aufnehmen kann, muß es das Attri- but Ablage oder Behälter besitzen. Ablagen sind, wie man vermuten möchte, Objekte, die eine ebene Oberfläche haben, auf denen etwas abgelegt werden kann. Typische Ablagen sind Tische, Regale und Tabletts. Objekte, die darauf liegen, bekommen z.B. die Angabe 'Ort auf Tablett' bei ihrer Definition. Behälter sind Objekte, in die etwas hineingelegt werden kann. Die Objekte in einem Behälter können manipuliert werden, wenn der Behälter weder geschlossen noch abgeschlossen ist, d.h. wenn er offen ist oder einen anderen Zustand besitzt. (Es gibt auch Behälter, die nicht verschließbar sind, wie etwa ein Wassereimer.) Im Allgemeinen kann man in geschlossene Behälter nicht hineinschauen. Gibt man einem Behälter jedoch das Attribut Transparent, so kann man die Dinge in diesem Behälter sehen, jedoch nicht berühren:
Obj Vitrine
Name 'Glasvitrine' f
Adj 'gläsern'
Vor 'glas' 'schau'
Subst 'vitrine' f 'kasten' m
Zust abgeschlossen verschließbar
Attr Behälter Transparent
Darin 'In dem gläsernen Schaukasten [ist 0] [liste 0]
ausgestellt.'
Um nicht ständig den Standard-Text 'In/Auf dem x siehst du y.' zu benutzen, kann man bei Behältern die Texte Darin und Darauf definieren, die dann stattdessen angezeigt werden. Dabei muß der Befehl [liste x] auftauchen, jenachdem, in welchem Fall die Liste stehen soll mit x = 0, 1 oder 2. Ist x = 0, d.h. wird die Liste im Nominativ geschrieben, so muß das Verb je nach Anzahl der Dinge in der Liste nach Singular und Plural veränderlich sein. Dazu gibt man bei den Verben oder den Endungen anstelle eines Objekts 0 an. Mit [ist 0] wird dann 'sind' geschrieben, wenn die Liste mehr als ein Objekt enthält oder das einzige Objekt im Plural steht, und 'ist' sonst. (Bißchen umständlich vielleicht, aber es lohnt sich, wenn dann der Satzbau stimmt.) Es können beliebig viele Gegenstände in einen Behälter oder auf eine Ablage gelegt werden, solange iht Volumen zusammen nicht größer ist als das Volumen des Behälters oder der Ablage. Wer also zu keinem Objekt ein Volumen definiert, kann unbeschränkt Dinge dort lagern. Mit Hilfe der Volumendefinition kann aber verhindert werden, daß unsinnige Dinge ineinandergestapelt werden, wie z.B. eine Spitzhacke in einen Brotkorb. Das Konzept des Volumens ist bei Ablagen sicherlich nicht ganz richtig, denn was ist das Volumen eines Tabletts? Aber auch hier dient das Volumen von Gegenständen nur als grobes Maß für seine Größe. Anders als die meisten anderen Autorensysteme unterscheidet TAG zwischen Behältern und Ablagen, und ein Objekt kann auch Ablage und Behälter zugleich sein:
Obj Kommode
Name 'Kommode "Linköping"' f
Subst 'kommode' f 'Linköping' f 'schublade' f
Zust geschlossen
Attr Ablage Behälter
Besch 'Ein Designer-Stück aus Buche aus der Serie
"Kirkegaard". Sie hat eine schwarz abgesetze
Schublade.'
Darauf '[Liste 0] lieg[en 0] auf der Kommode.'
Darin 'In der geöffneten Schublade der Kommode kannst du
[liste 1] sehen.'
Mit dieser Definition funktioniert das folgende:
> u Kommode
Ein Designer-Stück aus Buche aus der Serie "Kirkegaard". Sie
hat eine schwarz abgesetze Schublade. Das Telefonbuch von
Stockholm liegt auf der Kommode.
> öffne Schublade
Die Kommode ist nun offen. In der geöffneten Schublade der
Kommode kannst du einige Taschentücher, eine Krawattennadel
und ein Paar Handschuhe sehen.
> u Kommode
Ein Designer-Stück aus Buche aus der Serie "Kirkegaard". Sie
hat eine schwarz abgesetze Schublade. In der geöffneten
Schublade der Kommode kannst du einige Taschentücher, eine
Krawattennadel und ein Paar Handschuhe sehen. Das Telefonbuch
von Stockholm liegt auf der Kommode.
Behälter können natürlich auch abgeschlossen sein. Zu abgeschlossenen Objekten und deren passenden Schlüsseln gibt es im nächsten Kapitel mehr. Ein Behälter oder eine Ablage können mit dem Pseudo-Befehl empfangen auf Objekte reagieren, die in oder auf sie gestellt werden und mit freigeben regelt das Heraus- und Herunternehmen von Ablagen und Behältern:
Obj Decke
Name 'Picknick-Decke' f
vor 'picknick' 'patchwork'
Subst 'decke' f 'tuch' n 'plane' f
Besch 'Es ist die alte Patchwork-Decke, die Tante Gisela vor
zwanzig Jahren in liebevoller Handarbeit angefertigt
hat. (Du verfluchst den Herausgeber der Handarbeits/-/
zeitschriften immer noch, aber im Gegensatz zu den
zahllosen Makramee-Eulen kann man diese Decke gut zum
Picknicken benutzen.)'
VorAusf
(empfangen) MutterObj iObj selbst
Bed (iObj = 0)
'Dazu solltest Du die Decke erst hinlegen.'
(nehmen) Sei #Liste 1
ObjListe iObj (iObj auf Decke)
Bed /(AnzListe)
'Solange [liste 0] noch auf der Decke
[ist], kannst du sie nicht nehmen.'
EndeAusf
NachAusf
(hinlegen) Text 'Du breitest die Decke auf dem Boden aus.'
(freigeben) Wenn (Proz 60) dann
Text 'Die Decke wirft Falten, als du
[den aObj] herunternimmst.'
Ende
EndeAusf
| ||
10.2. Türen und SchlüsselTüren sind wohl die beliebteste Art von Hindernissen in Adventures.Deshalb gibt es das vorgefertigte Attribut Tür in TAG. Türen haben in der Regel zwei Ortsangaben. Das Betreten des dahinterliegenden Raumes ist nur möglich, wenn die Tür nicht abgeschlossen ist. Ist sie nur zu, so wird sie automatisch geöffnet, wenn der Spieler hindurchgeht. Eine einfache Tür wäre:
Obj Haustür
Name 'blaue Haustür' f
adj 'blau'
vor 'eingangs' 'haus'
subst 'tür' f
Ort Vor_Haus Diele
Zust geschlossen
Attr Fest Tür
Besch 'Die schlichte, blau gestrichene Tür ist
[Haustür.Zust].'
Damit haben wir eine Tür, die von vor dem Haus in die Diele führt. Geht der Spieler von einem der beiden Räume in den anderen, so wird die Tür 'mitgenommen' und die beiden Räume vertauscht. Das geschieht automatisch, es spielt auch keine Rolle von welcher Seite der Spieler die Tür zuerst zu sehen bekommt. Einen kleinen Haken gibt es allerdings bei Türen: Beim Gehen von einem Raum in den anderen wird geprüft, ob sich eine Tür dazwischen befindet, die abgeschlossen ist und deren beide Raumangaben mit dem Start- und Zielräumen übereinstimmen. Ist das der Fall, so wird das gesagt, und der Spieler bleibt wo er ist. Diese Bedingung greift auch dann, wenn es z.B. zwei Türen zum selben Raum gibt, eine offen, die anderen verschlossen. Die verschlossene Türe ist immer dominant. Auch wenn es eine normale Verbindung zu einem Raum gibt und eine, die mit einer Tür verschlossen ist. In dem Fall müsste man sich mit einer Weg-Definition behelfen:
Raum Diele
N Wohnzimmer
O durch_Tür
S Bad
W Vor_Haus
Besch 'Von dieser geschmackvoll eingerichteten Diele aus
gibt es zwei Wege ins Wohnzimmer, eine Tür im Osten,
und einen offenen Durchgang im Norden.'
Weg durch_Tür
Ausf
Bed (Dielentür offen)
'Die Dielentür ist aber noch zu.'
Wenn (aRaum Diele) dann
GeheZu Wohnzimmer
ObjNach Dielentür Wohnzimmer
sonst
GeheZu Diele
ObjNach Dielentür Diele
Ende
Wenn (Mistelzweig in nirgendwo) dann
ObjNach Mistelzweig aRaum
Text 'Als ich durch die Tür gehe, stoße ich mit dem
Kopf an einen alten Mistelzweig, der wohl noch
seit der letzten Weihnachtsfeier dort hängt.
Er fällt auf den Boden.'
Ende
EndeAusf
Obj Dielentür
Name 'Dielentür' f
Subst 'dielentür' f 'tür' f
Ort Diele
Attr Fest
Zust offen
Das ist ungefähr die Art und Weise, wie TAG Türen behandelt. Die Geschichte mit dem Mistelzweig ist nur ein Zusatz: Es muß ja schliesslich einen Grund geben, um durch die Tür zu wollen. Diese "von Hand" eingabaute Tür darf natürlich nicht das Tür-Attribut besitzen. (Die Theorie hinter den Türen von TAG ist, daß sie immer zwei Räume verbinden bzw. voneinander trennen, die ansonsten keine weitere Verbindung haben. Ich denke, für die meisten Türen gilt das. Deswegen kann man bei außergewöhnlichen Türen ruhig etwas Mehraufwand in Kauf nehmen.) Der Zielraum einer Tür kann mit Obj.Ort2 angesprochen und auch geändert werden. Der Zielraum ist immer der Raum, in dem man gerade nicht ist. So kann man zum Beispiel eine magische Tür erschaffen:
Aktion Tür_Zeichen
Ausf
Wenn (aRaum = großer_Saal) dann
Text 'In der Mitte der Tür prangt das Zeichen'
jenach Zaubertür.Ort2
(See) Text 'des Wassers.'
(Berg) Text 'der Luft.'
(Mine) Text 'der Erde.'
(Vulkan) Text 'des Feuers.'
Ende
Ende
EndeAusf
Obj Zaubertür
Name 'eigenartig^ Tür' f
adj 'eigenartig'
subst 'tür' f
Ort großer_Saal See
Besch 'Es ist eine geheimnisvolle Tür. [Tür_Zeichen]'
Weg durch_Tür
Ausf
Bed (Zaubertür offen) dann
'Die eigenartige Tür ist noch geschlossen.'
GeheZu Zaubertür.Ort2
EndeAusf
Bef ignis
Name '"IGNIS" sagen'
Verb 'ignis'
Ausf
Bed (aRaum = großer_Saal) und /(Zaubertür.Ort2 = Vulkan)
'Nichs passiert...'
Sei Zaubertür.Ort2 Vulkan
Text 'Du hörst ein dumpfes Grollen aus den Tiefen der Erde,
als das Zeichen des Feuers auf der Tür erscheint.'
EndeAusf
Das Gehen durch die Tür muß mit einer Weg-Definition gemacht werden, weil die Tür nicht weiß, in welcher Richtung sie sich befindet. Sie weiß nur, welche Räume sie verbindet. (Beim Gehen in einen anderen Raum, prüft das Programm bei der Ausführung nur, ob es eine Tür gibt, deren Ort2 der Zielraum ist.) Türen in Adventures sind selten sperrangelweit auf. Obwohl es High-Tech und Magie gibt, die Türen verschlossen halten, ist das übliche Mittel dazu doch noch ein Schlüssel. Der passende Schlüssel zur Haustür oben wäre:
Obj Haustürschl
Name 'Stahlschlüssel' m
vor 'haus' 'haustür' 'stahl'
subst 'schlüssel' m
Attr Schlüssel
Ort unter Fußmatte
Öffnet Haustür
Besch 'Paßt bestimmt auf die Haustür...'
Die Öffnet-Definition beschreibt also das Objekt, auf den der Schlüssel paßt. Auch hier ist wieder der denkbar einfachste Fall angenommen: Jeder Schlüssel paßt auf eine Tür. Fehlt die Öffnet-Angabe, so paßt der Schlüssel nirgendwo im Spiel. Aber auch hier kann man abhelfen: Obj.Öffnet enthält das Objekt, das der Schlüssel momentan aufschließt:
Obj General
Name 'Generalschlüssel' m
[...]
VorAusf
(aufschl_mit) Sei selbst.öffnet aObj
EndeAusf
Und schon sind Türen kein Hindernis mehr. Schlüssel können übrigens nicht nur Türen, sondern auch andere Objekte als öffnet-Objekt besitzen, etwa Behälter und Vorhängeschlösser. Achtung: Der Speicherplatz für öffnet und 'Ort2 ist derselbe. Ein Objekt kann also nicht gleichzeiteig Schlüssel und Tür sein, was mir logisch erscheint. Auf dem selben Platz liegt auch die Information Anz, die die Anzahl der Objekte angibt, wenn es einen Plural besitzt. Auch hier denke ich, daß eine Tür und ein (klar von allen anderen unterscheidbarer) Schlüssel nicht mehrfach auftreten. Es gibt aber ein paar Stolperstricke: öffnet ist ein Objekt, Ort2 ein Raum und Anz eine Zahl. Belegt man z.B. Anz von einer Tür, so landet man sonstwo. Dies nur als Information und als Warnung, die Attribute Tür und Schlüssel erst abzuchecken, bevor Ihr diese Variablen bei einem allgemeinen Objekt verändert. | ||
10.3. Sitze, Liegen und begehbare ObjekteGenau wie Objekte auf anderen liegen können, kann sich auch der Spieler in oder auf anderen Objekten befinden. Solche Objekte müssen das Attribut Sitz, Liege oder Standfläche besitzen:
Obj Sessel
Name 'Ledersessel' m
Vor 'leder'
Subst 'sessel' m
Ort Stube
Attr Fest Sitz In_Obj Ablage
Besch 'Der Sessel ist ein wahres Monstrum. Vom Standpunkt
des Designers ist er sicher verbesserungswürdig, an
Bequemlichkeit allerdings kaum zu überbieten.'
Dieser Sessel ist ein Sitz, sobald sich der Spieler daraufsetzt, wird aSitz mit dem Sessel belegt. Da der Sessel ein In_Obj ist, sitzt man im Sessel, nicht auf ihm. Der Spieler kann sich allerdings weder auf den Sessel legen noch darauf stellen. Dazu wären die Attribute Liege und Standfläche nötig.Ü> TAG unterscheidet, ob der Spieler auf einem Gegenstand sitzt, steht oder liegt. Das wird in der Flagge bSitz festgehalten, die die Werte %sitzen (1), %stellen (2) und %legen (3) haben kann. Ist aSitz = 0, so hat diese Flagge keine Bedeutung, es wird einfach angenommen, daß der Spieler steht, oder - noch einfacher - daß es keine Rolle spielt, in welcher Haltung er sich in einem Raum befindet. Um sich von einem Sitz auf einen anderen zu setzen, muß der Spieler erst aufstehen. Dasselbe gilt für das Verlassen des Raums. Wenn der Spieler auf dem selben Objekt bleibt und nur seine Haltung ändert, kann das ohne weiteres geschehen. wenn er auf einem Sofa liegt, muß er nicht erst aufstehen, um sich darauf zu legen. Sitze, Standflächen und Liegen können auch Behälter und Ablagen sein. Was aber passiert, wenn sich der Spieler auf eine Ablage setzt, auf der viele Sachen liegen, das muß der Autor des Adventures selbst programmieren. Eines oder mehrere der Attribute Sitz, Liege oder Standfläche zusammen mit dem Behälter-Attribut machen ein Objekt begehbar. Wenn das Objekt nicht transparent ist und geschlossen wird, wenn sich der Spieler darin befindet, so ist es in diesem Objekt dunkel (es sei denn, das Objekt selbst ist eine Lichtquelle, dann ist es darin immer hell) und der Spieler kann nur die Sachen in diesem Objekt sehen. Das Objekt ist dann quasi wie ein Raum im Raum. Für eine Hütte ist eine solche Definition nicht besonders klug, aber für einen Kleiderschrank oder etwas ähnliches ist es sicherlich angebracht, ihn als Objekt zu definieren, da der Spieler auch Sachen daraus nehmen kann, ohne hineinzugehen. Auf diese Weise kann man auch einen Käfig implementieren, den der Spieler betreten kann oder in dem er gefangen ist.
Obj Käfig
Name 'groß^ Käfig' m
Adj 'gross' 'käfig' 'eisen'
Subst 'käfig' m 'stangen' p 'stange' f
Attr Immobil Behälter Standfläche Transparent InObj
Zust geschlossen
Besch 'Es ist ein großer, quadratischer Käfig, dessen dicke
Eisenstangen bis an die Decke reichen.'
Erst 'In der Mitte des Raumes steht ein großer Käfig,
dessen Tür [selbst.Zust] ist.'
InBesch 'Du stehst in einem Käfig und schaust durch die dicken
Gitterstäbe hinaus.'
Und damit ist der Käfig fertig. Wichtig ist, daß der Käfig transparent ist. Wenn nicht, dann könnte der Spieler den Raum, in dem der Käfig steht und die anderen Sachen darin nicht sehen. | ||
10.4. FahrzeugeIn TAG können Sitze, Liegen und Standflächen als Fahrzeuge definiert werden. Das heißt, diese Objekte bewegen sich mit dem Spieler, wenn er sich in oder auf ihnen befindet. Das ist zwar schon ganz bequem, aber dennoch gibt es einige Einschränkungen, denn man kann ja z.B. nicht mit einem Auto einen Steilhang hochfahren. Als Beispiel soll hier (in Anlehnung an Zork I) ein Boot definiert werden, mit dem man natürlich nur auf dem Wasser fahren kann.
RaumAttr Wasser
RaumVar xRaum
Obj Boot
Name 'Ruderboot' n
vor 'ruder' 'paddel'
Subst 'boot' n 'bötchen' n
Besch 'Dieses Boot ist aus Holz und hat zwei Riemen.'
VorAusf
(gehen) SeiRaum xRaum aRaum aRitg
Wenn /(xRaum = 0) dann
Bed (xRaum Wasser) oder (aRaum Wasser)
'In diese Richtung kannst du schlecht
rudern - dort ist kein Wasser.'
Wenn /(aRaum Wasser) dann
Text 'Du ruderst nach [ARitg], wo Du
wieder festen Boden unter den
Füßen hast.'
sonst
Text 'Du ruderst nach [ARitg].[#]'
Ende
Absatz
Ende
EndeAusf
Bef gehen
VorAusf
SeiRaum xRaum aRaum aRitg
Bed /(xRaum Wasser) oder (aSitz Fahrzeug)
'In dieser Richtung ist für meinen Geschmack
zuviel Wasser.'
NachAusf
Bef rudern
Name 'rudern'
Verb 'rudere' 'fahre' 'paddle'
Syntax nachRitg
Ausf
Bed /(aSitz = 0) und (aSitz Fahrzeug)
'Dazu bräuchtest du wohl ein Boot...'
Ausf gehen aSitz aRitg
NachAusf
Mit dem Raumattribut beschreibt man, ob ein Raum Wasser ist oder nicht. Ein Strand wäre kein Wasser, ein Ort auf einem See oder in einem Fluß schon. Die Bedingung zum Paddeln ist nun, daß der Zielraum, der momentane Raum oder beide Wasser sind. Mit der Erweiterung des Befehls gehen wird verhindert, daß man auch zu Fuß übers Wasser gehen kann. Wenn man beim Befehl gehen auf einem Fahrzeug sitzt, so ist aObj das Fahr- zeug, damit man es in der Vorausführung berücksichtigen kann. | ||
10.5. Unwichtige DekorationenManche Spiele benutzen Dekorationen, die zu nichts benutzt werden können. Man kann sie zwar untersuchen, aber wenn man eine konkrete Handlung ausführen will, so kommt ein Satz wie "Das ist nicht wichtig." Eine solche Dekoration kann man wie folgt definieren:
ObjKlasse unwichtig
VorAusf
(untersuchen)
(sonst) Stop 'Ein flüchtiger Blick auf [den selbst]
sagt dir, daß [er] total unwichtig
[ist].'
EndeAusf
Und damit braucht man sich keine Sorgen mehr darüber zu machen, daß es bei den Dekorationen Stolpersteine gibt, wie es oft der Fall ist, wenn der Spieler wirklich alles versuchen muß. Die leere Anweisung bei (untersuchen) bewirkt, daß dieser Befehl nicht unter die Klausel (sonst) fällt. Nur beim Untersuchen geht es also weiter wie gewohnt, alle anderen Befehle führen zum Abbruch. Dabei ist es egal, ob die Deko aObj oder aObj2 im Befehl ist, da mit (sonst) auch Pseudo-Aktionen berücksichtigt werden. | ||
10.6. Ähnliche Objekte an verschiedenen OrtenUm Objekte zu sparen, kann man eine Klasse von ähnlichen Objekten, die sich an verschiedenen Orten befinden, als ein Objekt definieren. Nehmen wir an, es gäbe verschiedene Torbögen, durch die man gehen könnte und die einen dann magisch zu einem anderen Ort teleportieren.
RaumAttr Teleporter
RaumVar ZielRaum
Flagge TorNr
Obj Torbogen
Name 'steinern^ Torbogen' m
Adj 'steinern'
Vor 'tor' 'stein'
Subst 'bogen' m 'tor' n
Attr Fest
Besch 'Oben auf dem Torbogen ist auf einem vorstehenden
Stein die Zahl [Rom TorNr] eingemeißelt.'
VorAusf
(betreten) Bed /(Münzen.Anz < TorNr) und (Münzen BeiMir)
'Du willst durch den Bogen gehen, aber
du prallst wie an einer unsichtbaren
Wand ab.'
Text 'Du trittst durch den Bogen. Die Luft
scheint sich zu verwirbeln, es kommt
Dir vor wie ein Schleier.
Als sich der Dunst gelegt hat, schaust
Du dich genauer um. Du befindest
dich...'
GeheZu ZielRaum
(schauen) Bed (Münzen.Anz < TorNr) oder
/(Münzen BeiMir) dann
'Wenn du ganz genau hinschaust, siehst
du durch den Torbogen ganz schwach
einen anderen Raum. Du kannst aber
nichts Genaues erkennen.'
EndeAusf
Aktion *
Ausf
Wenn (aRaum Teleporter) und /(Torbogen hier)
Jenach (aRaum)
(Brunnen) Sei ZielRaum Stille_Bucht
Sei TorNr 1
(Klostergarten)
Sei ZielRaum Alte_Heide
Sei TorNr 2
(Friedhof) Sei ZielRaum Hades
Sei TorNr 7
[...]
Ende
ObjNach Torbogen aRaum
Ende
EndeAusf
Raum Friedhof
Name 'Friedhof'
W Vor_Kapelle
SO Gruft
Attr Teleporter
Besch 'Dies ist der etwas trostlos wirkende Friedhof der
St.-Gabriel-Kapelle, die sich im Westen düster gegen
den Himmel abzeichnet. Ein paar Holzkreuze verraten,
wer in den ungepflegten Gräbern vermodert. Im Südosten
steht der wuchtige Bau einer Familiengruft.
Ein steinerner Torbogen steht hier, ein gotisches
Monstrum auf zwei Säulen, halb mit Efeu bewachsen. Die
römische Ziffer VII ist auf dem obersten Stein
eingemeißelt.'
Ende
Der Torbogen wird in einer Aktion, die nach jedem Zug aufgerufen wird, in den momentanen Aufenthaltsort geholt, wenn dieser das Attribut Teleporter besitzt. Je nach aRaum werden dann der Zielraum und die römische Ziffer über dem Torbogen gesetzt. (Ganz genauso funktionieren übrigens die Dekorationen, die in der Ortsdefinition ein Raumattribut benutzen, nur daß sie keine weiteren Variablen setzen.) Man hätte dasselbe auch mit der Objektklasse Torbogen bewerkstelligen können. Aber diese Lösung würde soviele Objekte benötigen, wie es Torbögen gibt plus eine Objektklasse. Die Lösung oben benötigt ein Objekt und eine Aktion, was dann recht praktisch ist, wenn das Spiel groß ist und man die gesparten Objekte anderweitig verwenden kann. | ||
|