________________________________________________________________________
[<<] [Inhalt] [>>] III. Beispiele

12. Andere Personen im Spiel

12.1.   Reden mit anderen
12.2.   Maschinen mit Spracherkennung
12.3.   Ein schleichender Dieb

12.1. Reden mit anderen

Eine Sache, die sicherlich etwas Übung verlangt, die aber wesentlich zur Spielatmosphäre beiträgt, ist das Reden mit anderen Personen (oder auch mit anderen Objekten) im Spiel. Dazu gibt es in TAG die Möglichkeit, Sätze zu anderen Personen zu sagen:

        > RITTER, TÖTE DEN DRACHEN
        > RITTER, "TÖTE DEN DRACHEN"
        > SAGE ZU DEM RITTER "TÖTE DEN DRACHEN"

Die Reaktion eines Objekts (das nicht notwendigerweise eine Person sein muß) auf einen ihm gegebenen Befehl wird in der Aktion BefAusf des Objekts angegeben. Wenn in diesem Ausführungsblock nichts angegeben wird, so wird einfach ein platter Standardsatz gedruckt: "Das scheint nicht besonders an einem Gespräch interessiert zu sein." oder so.

Am einfachsten sind wohl einsilbige Zeitgenossen zu programmieren. Zum Beispiel ein Troll an einer Brücke, der seinen Tribut verlangt, aber sonst mit dem Spieler nicht viel zu tun haben will:

        Obj     Troll
        Name    'Troll' m
        vor     'brücken'
        subst   'troll' m   'wächter' m
        Attr    Person
        Besch   'Der Troll ist ein ziemlich häßlicher Kerl, der vor
                Muskeln strotzt. Er beobachtet jeden deiner Schritte.'
        Erst    'Ein stämmiger Troll steht hier vor der Brücke und
                versperrt den Weg nach Norden.'
        VorReakt
          (gehen)       Bed /(aRitg = N) oder (Troll_bezahlt)
                                '"Halt, Freundchen, nicht so schnell!"
                                brummt der Troll. "Wenn du über meine
                                Brücke willst mußt du mir einen Schatz
                                geben."'
          (geben)       Bed (aObj2 Schatz)
                                '"Das will ich nicht!", schnarrt der
                                Troll."'
                        ObjNach aObj2 Nirwana
                        Setze Troll_bezahlt
                        Stop    '"Danke, Freund!", sagt der Troll.
                                Seine Augen glänzen, als er [den aObj2]
                                schnell einsteckt und einen Schritt zur
                                Seite macht.'
        EndeAusf
        BefAusf
          (nicht_verst) Text    'Der Troll grunzt abfällig und zieht
                                seine Augenbrauen zusammen.'
          (sonst)       Text    'Der Troll grunzt etwas
                                Unverständliches.'
                        Absatz
                        Wenn /(Troll_bezahlt) dann
                          Text   '"Zahl deinen Zoll oder laß mich in
                                 Ruhe."
                        sonst
                          Text   '"Du darfst meine Brücke benutzen,
                                 aber laß mich bitte in Frieden."'
          Ende
        EndeAusf
        NachReakt
          (gehen)       Wenn (Troll_bezahlt) dann
                          Text '"Hallo, Freund!" Der Troll versucht,
                               seinem Gesicht mit einer Fratze ein
                               gefälliges Aussehen zu verleihen.'
                        sonst
                          Text 'Der Troll grunzt: "Wenn du über die
                               Brücke willst, mußt du mir einen
                               Schatz geben."'
                        Ende
        EndeAusf

In der Anweisung bedeutet (nicht_verst), daß es einen Fehler in der Anweisung an den Troll gab. Diese Fehler werden nicht vom Parser angezeigt, sondern müssen in der BefAusf ausgegeben werden, wenn es gewünscht ist.

Obwohl der Troll nicht gerade gesprächig ist, so ist der Code für sein Verhalten doch schon ziemlich lang. Noch einsilbigere Zeitgenossen kämen mit folgenden Zeilen zurecht:

        Obj     Katze
        Name    'schwarz^ Katze' f
        Adj     'schwarz'
        subst   'katze' f   'mieze' f   'kätzchen' n
        Besch   'Ziemlich aggressiv, die Kleine.'
        BefAusf
          (global)      Text 'Die Katze faucht dich an.'
        EndeAusf
        VorAusf
          (untersuchen)
          (sonst)       Stop 'Die Katze faucht dich an.'
        EndeAusf

Die leere Zeile nach (untersuchen) bewirkt, daß dieser Befehl als einziger funktioniert wie gehabt, da alle anderen Befehle durch die (sonst)-Klausel zu einem vorzeitigen Ende kommen: Die Katze faucht den Spieler an.

12.2. Maschinen mit Spracherkennung

Das ist Stoff für Science Fiction: Der Bordcomputer versteht Anweisungen der Mannschaft: Zum Beispiel kann man den Kurs des Raumgleiters ändern, wenn man dem Computer sagt "Kurs auf XXX", wobei XXX eine der Mondbasen ist, die der Computer kennt:

        Obj     Computer
        Name    'Bordcomputer'
        vor     'bord' 'kontroll' 'steuer'
        subst   'computer' m  'rechner' m  'panel' n  'lautsprecher' m
        subst   'mikrofon' n  'mikro' n  'gerät' n  'hans' m
        Besch   'Dieses Wunderwerk der Technik steuert das Raumschiff.
                Es ist eines der ersten vollkommen sprachgesteuerten
                Geräte, die 2070 von der Sirius, Inc. ausgeliefert
                wurden und ist immer noch so zuverlässig wie am ersten
                Tag.

                Ein Mikrofon, ein Lautsprecher und ein kleiner
                Bildschirm sind die Hauptmerkkmale des schwarzen
                Kontrollpanels. Auf einer kleinen Plakette rechts
                unten steht "HANS" [1].'

        BefAusf
          (nicht_verst) Text '"Nicht verstanden. Bitte wiederholen."'
          (kurs_auf)    Bed (aObj Raumstation)
                                '"Das ist keine der Raumstationen, die
                                ich kenne."'
                        Bed /(Ziel = aObj)
                                'Kurs bereits auf [Ziel] gesetzt.'
                        Sei Ziel aObj
                        Text    '"O.K., neuer Kurs auf [Ziel]".

                                Der Gleiter macht eine kleine,
                                unscheinbare Korrekturbewegung, als
                                er sein neues Ziel ansteuert.'
          (sonst)       Text    '"Das steht außerhalb meiner
                                Möglichkeiten."'
        EndeAusf

        ObjVar  Ziel Magellan
        ObjAttr Raumstation

        Bef     kurs_auf
        Name    'Kurs nehmen'
        Verb    'kurs'
        Syntax  auf dasObj (Allg)
        Ausf
          Text  'Sag es nicht mir, sag%s deinem Computer.'
        EndeAusf

        Deko    Magellan
        Name    'Magellan' m 1
        ObjAttr Raumstation
        subst   'magellan'

        Deko    Thyle_ii
        name    'Thyle II' m 1
        ObjAttr Raumstation
        subst   'thyle' m 'ii' m

        Deko    Schiaparelli
        name    'Schiaparelli' m 1
        ObjAttr Raumstation
        subst   'schiaparelli' m

        Fußnoten
        1       'HANS - Heuristisch-Algorithmisches
                Navigations-System.'

Die Dekorationen dienen nur als Referenz für den Bordcomputer. Sie befinden sich in keinem Raum, müssen aber dennoch definiert werden, damit das Programm die Vokabeln kennt. Der Befehl kurs_auf muss natürlich auch definiert werden, obwohl er nur etwas Sinnvolles macht, wenn ihn der Computer ausführt.

Wer Lust hat, kann dem Computer ja noch zusätzliche Kompetenzen verabreichen: halbe Kraft, volle Kraft, Schilde aktivieren usw.

12.3. Ein schleichender Dieb

Manche Zeitgenossen reden nicht, sondern begnügen sich damit, umherzuschleichen und auf ihre Chance zu warten, dem Spieler Unheil zuzufügen. Der Dieb in Zork und der Pirat und die Zwerge aus Adventure sind Beispiele für ein solches Verhalten.

Im Gegensatz zum Nachtwächter aus Kapitel 6 sollen sich diese Geschöpfe aber mehr oder wenig zufällig bewegen. Ein einfacher Algorithmus dazu sähe so aus:

        Obj     Dieb
        Name    'Herr~ in Schwarz' m
        Adj     'schwarz' 'dunkel' 'verdächtig'
        Subst   'herr' m  'herrn' m  'dieb' m  'mann' m
        Attr    Person
        Erst    'Ein Herr in Schwarz ist hier und schaut sich
                verstohlen um.'
        Besch   'Dieser Herr sieht in der Tat sehr verdächtig aus.'

        RaumAttr Nicht_für_Dieb

        Aktion  Dieb_Schleicht *
        Ausf
          Wenn (Proz 30) dann
            | Prüfen, ob es gültige Richtungen gibt
            Lösche Aux
            Schleife xRitg
              SeiRaum xRaum aRaum xRitg
              Wenn /(xRaum = 0) und /(xRaum Nicht_für_Dieb) dann
                Inkr Aux
              Ende
            Ende
            | Wenn ja, dann bewege den Dieb in eine davon
            Wenn (Aux) dann
              Wiederhole
                Zufall xRitg MinRitg MaxRitg
                SeiRaum xRaum aRaum xRitg
              bis /(xRaum = 0) und /(xRaum Nicht_für_Dieb)
              Wenn (Dieb hier) dann
                Text '[#]Der Herr verläßt den Raum.'
              Ende
              ObjNach Dieb xRaum
              Wenn (Dieb hier) dann
                Text '[#]Ein Herr in Schwarz hat soeben den Raum
                     betreten.'
              Ende
            Ende
          Ende
        EndeAusf

Dieser simple Algorithmus berücksichtigt allerdings keine Wege und keine mit Türen versperrten Ausgänge. (Vielleicht kann man ja annehmen, daß der Dieb sich gut genug auskennt, und weiß, wie man die Türen öffnet.) Immerhin kann man mit dem Raum-Attribut Nicht_für_Dieb bestimmte Räume für ihn sperren.

Martin Oehm, 04.02.2000 Vorheriges KapitelInhaltsverzeichnisNächstes Kapitel