Flüssigkeiten sind ein beliebter Bestandteil von Rätseln. Allerdings sind sie nicht sehr leicht zu programmieren. Ein paar Besonderheiten werden in diesem Artikel mit TAG-Code erklärt.
Zunächst soll ein Behälter mit Wasser aus einem See oder größeren Gefäß gefüllt werden können:
Bef füllen
Name 'füllen'
Verb 'fülle'
Syntax dasObj (Behälter beimir) mit demObj
Ausf
Bed (aObj Behälter)
'[Der aObj] [ist] kein Behälter.'
lokale objVar xObj, yObj
sei yObj 0
schleife xObj (xObj in aObj)
sei yObj xObj
Ende
Bed (yObj = 0)
'In [dem aObj] [ist yObj] bereits [der yObj].'
Puffer 'Das wird kaum gehen.'
EndeAusf
Pseudo gefüllt_aus füllen
Der Befehl prüft hier nur, ob aObj ein leerer Behälter ist. Eine negative Standardantwort wird auf den Puffer geschrieben. Wenn etwas passieren soll, muss dies beim jeweiligen Objekt beschrieben werden, und zwar - anders als sonst - nach dem eigentlichen Befehl, in der NachAusf:
Obj See
Name 'Süßwassersee' m
Subst 'see' m
Ort Wüste
Attr fest
NachAusf
(gefüllt_aus)
objNach Wasser in aObj
text 'Du füllst [den aObj] mit klarem Wasser
aus dem See.'
EndeAusf
Obj Wasser
Name 'Wasser' n 3
Subst 'wasser' n
Attr Fluid
Das Objekt Wasser ist vorher nicht im Spiel, es ist im Nirwana. Ein Problem ist hier, dass der Spieler »Fülle Krug mit Wasser« eingeben will und mit »Wasser« den See meint. Danach soll damit aber eindeutig das Wasser im Krug gemeint sein. Mit der Aktion ObjParser kann man »Wasser« als Synonym für den See zulassen, wenn das Objekt Wasser nicht zu sehen ist:
Aktion ObjParser
Ausf
| Knöpfe?
lokal x
LeseArt m x
Wenn (Wort = 'wasser') und
(See hier) und /(Wasser hier) dann
Sei aObj see
Ende
EndeAusf
Das Wasser kann mit dem folgenden Befehl auf andere Gegenstände gegossen werden:
Bef begießen
Name 'begießen'
Verb 'begieße'
Syntax dasObj mit demObj
Ausf
lokale objVar xObj
Bed (aObj2 Fluid)
'[Den aObj2] kann man nicht gießen.'
MutterObj xObj aObj2
Bed (xObj > 0)
'[Der aObj2] [muss/müssen] dazu in einem Behälter
sein.'
Bed (xObj beimir)
'Dazu musst du [den xObj] haben.'
Puffer 'Besser nicht.'
EndeAusf
Der Befehl prüft hier, ob der Spieler den Behälter, in dem das Wasser ist, bei sich hat. Die Angabe beimir beim zweiten Objekt würde hier nicht funktionieren. Auch hier muss besonderes Verhalten wieder in der NachAusf eines Objekts behandelt werden:
Flagge Pflanzengröße 0
Obj Pflanze
Name 'Pflanze Chuck' m 1
Subst 'chuck' m, 'pflanze' f
Ort Wüste
Attr immobil
NachAusf
(begießen)
objNach aObj2 Nirwana
Bed (aObj2 = Wasser)
'"Bääh!"'
Jenach Pflanzengröße
(0) inkr Pflanzengröße
text 'Chuck schießt zwanzig Zentimeter
höher.'
(1) inkr Pflanzengröße
text 'Chuck schießt noch einmal zwanzig
Zentimeter höher.'
(2) inkr Pflanzengröße
text 'Chuck schießt wiederum zwanzig
Zentimeter höher. Er reicht jetzt
bis ans Sims.'
(sonst)
text 'Nichts passiert...'
Ende
EndeAusf
Wichtig ist hier, dass das wasser aus dem Krug entfernt wird, da im eigentlichen Befehl nichts passiert.
Zum Schluss soll es dem Spieler ermöglicht werden, beim Begießen den Behälter anstelle der Flüssigkeit anzugeben, wie es bei alternativen Verben, wie z.B. »leere Krug auf Pflanze« sinnvoll sein kann. Dazu kann man im Nachparser die Ergebnisse des Parsers ändern:
Aktion Nachparser
Ausf
| Behälter wenn möglich in Inhalt umwandeln
Wenn (aBef = begiessen) und (aObj2 Behälter) dann
lokale objVar xObj, yObj
schleife xObj (xObj in aObj2)
sei yObj xObj
Ende
sei aObj2 yObj
Ende
EndeAusf
10.02.2002, Martin Oehm
|
Fünf Unterschiedliche Ideen rund um ein Thema
Auftanken Kurzentwürfe für Abenteuer
Ersatzteile Fertige Objekte, Befehle und Räume für Abenteuer
Werkstatt Mechanik und Innenleben von Textadventures
Testfahrt Die Straßenlage deutscher Adventures
Grand Prix Der Textadventure- Wettbewerb
Abbiegen Lohnende Nebenstraßen
Intern Was textfire.de will, wer es macht und wie man mitmacht
|