________________________________________________________________________
| ||
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. | ||
|