Behälter mit Flüssigkeiten

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