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