image image


Twine 2: Variablen, Makros und Hooks in Harlowe

Nachdem ich am Wochenende hier im Schockwellenreiter das monströse, aber gleichwohl faszinierende Projekt »Moby Dick als Hypertext (in Twine)« von Mark Sample vorgestellt hatte, mußte ich doch meine lange Zeit brachliegenden Erkundungen von Twine 2 fortsetzen, dem Open Source Programm (GPL), um nichtlineare, interaktive Geschichten zu erzählen. Im ersten Teil stellte ich Hyperlinks als Basis für alle interaktive Geschichten und im zweiten Teil stellte ich Variablen und Hooks vor. Das möchte ich nun vertiefen, indem ich diese mit Makros kombiniere. Wie schon in den ersten beiden Tutorials benutze ich ein aktuelles Twine 2 (Twine 2.3.7) mit dem Default-Story-Format Harlowe (Harlowe 3.1.0).

image

Auch wenn ich mich bei diesem Beitrag stark an dem fünften Kapitel von Melissa Fords wunderbaren Buch »Writing Interactive Fiction with Twine« entlanghangle1, habe ich auf mein bewährtes Wunderland-Szenario zurückgegriffen. Begründet hatte ich das hier schon einmal, aber zum anderen mag ich die von vielen »Make Your Own Adventure Book«-Autoren gepflegte Anrede des Lesers mit der zweiten Person Singular nicht. In meinen Augen hat das oft etwas Pupertäres, den Leser in die Rolle des Helden, Raumfahrers oder Entdeckers hineinzuphantasieren. Das mag für ein jugendliches Publikum funktionieren, aber als (halbwegs) Erwachsener möchte ich die Geschichte lieber durch die Augen einer anderen Person – in diesem Fall Alice – sehen. Man stelle sich das mal vor: Ich als 67-jähriger Rentner soll einen jugendlichen Abenteurer spielen.

Doch genug des Rants, jetzt die Geschichte. Die Startpassage ist etwas länglich geraten, bringt noch nichts Neues und geht so:

==><==
<img src="http://localhost:8888/twine/images/caterpillar.jpg" />
<==

Alice wurde zum Pilz der kiffenden Raupe gerufen. Sie erzählte ihr von einem geheimnisvollen Ort
im Wunderland. Nur fünf Zugänge gäbe es zu diesem Tal, jeder sei durch einen besonderen Ring
gesichert. Leider wüßte sie nicht, welcher Ring zu welchem Zugang führe und welche Gefahren hinter
den jeweiligen Zugängen lauerten. Alice könne aber nur einen Ring mitnehmen. Die Raupe öffnete ein
kleines Schmuckkästchen und zeigte Ihr einen [[eisernen -> Eisenring]], einen
[[silbernen -> Silberring]], einen [[goldenen Ring -> Goldring]], einen
[[Ring mit einer durchbrochenen Blumen -> Blumenring]] und schließlich einen
[[Ring mit einer seltsamen Gravur -> Gravurring]].

Diese und die folgenden Passagen habe ich der besseren Lesbarkeit wegen umgebrochen. In Twine solltet Ihr den Zeilenumbruch natürlich wieder entfernen.

Der Start verlinkt zu fünf weiteren Passagen, die alle fünf einen sehr ähnlichen Text aufweisen. Ich nehme als Beispiel mal die Passage mit dem Eisenring:

(set: $ring to "Eisenring") Alice steckte den eisernen Ring an ihren Ringfinger. Sie wollte schon
den Pilz verlassen, aber die Raupe ergriff ihren Arm und sagte: »Du kannst noch einen weiteren
Gegenstand aus meinem magischen Kästchen für Deine Reise mitnehmen. Jeder von ihnen kann Dir auf
Deiner Reise helfen, aber Du weißt nicht wie und wann.«
Er öffnete einen zweiten Kasten. Dort lagen eine [[Feder]], eine [[Brille]] und ein [[Zauberhut]].

Hier gibt es das erste Makro: set $variable to name. In diesem Fall wird der Variablen $ring der String "Eisenring" zugewiesen. Die Variable behält diesen Wert über die gesamte Erzählung, es sei denn, der Wert wird in einer anderen Passage wieder überschrieben.

Die anderen vier Passagen werden mit ähnlichen Texten gefüllt und verlinken alle zu den Passagen Feder, Brille und Zauberhut. Auch diese drei Passagen besitzen einen fast identischen Text. Ich zeige das exemplarisch an der Passage Feder:

(set: $magicalItem to "Feder") Alice ergriff die (print: $magicalItem) und verstaute sie vorsichtig
in ihrer Tasche. »Es ist Zeit zu gehen« sagte die Raupe, »der (print: $ring) wird Dich führen.«
Alice strich mit dem Zeigefinger über den (print: $ring) und eine geheimnisvolle Macht ergriff sie
und brachte sie zu einem [[leuchtenden Platz -> Wunderland]].

Neu ist hier das Makro print:, das den Wert der Variablen ausgibt. Müßte in diesen Passagen nicht der Wert von $magicalItem gesetzt werden, könnte man alle vier in einer einzigen Passage unterbringen. Frau hätte dann aber unter Umständen Probleme mit dem Geschlecht der Gegenstände: die Feder und der Zauberhut.

Wenn man sich obigen Screenshot anschaut, habe ich mit diesen wenigen Tricks schon eine recht verwirrende Struktur erzeugt.

In der darauffolgenden Passage Wunderland führen wir die Strenge der Geschichte wieder zusammen und lernen ein weiteres Makro kennen:

Alice staunte. Ist das der geheime Ort? Sie stand auf einem Hügel, vor ihr ein weites Tal und dahinter
das Meer. Auf einem weiteren Hügel überragte eine Burg ein kleines Dorf, das sich im Halbkreis um den
Burghügel schmiegte.

Sie drehte sich um und sah einen riesigen Baum hinter sich. An den Ästen hingen dutzende bronzener
Schlüssel.

(if: $magicalItem is "Feder")[Die Feder schien sich in ihrer Tasche zu bewegen, so als ob sie Alice
daran erinnern wollte, daß sie [[fliegen könne -> Flug]]. Oder sollte sie erst einmal das
[[Dorf aufsuchen -> Dorf]] und weitere Erdundungen einziehen?](else:)[Leider waren die Schlüssel
unerreichbar für Alice. Sie beschloß daher, [[den Hügel herunter ins Dorf -> Dorf]] zu gehen.]

Das neue Makro ist das if: … else:-Makro. Wenn die if-Bedingung wahr ist, wird der anschließende Hook ausgeführt (Alice fliegt auf den Baum), wenn nicht, der Hook hinter dem else: (Alice geht den Hügel hinunter ins Dorf).

Wenn Alice sich tatsächlich entschließt, zu fliegen, wird diese Passage gespielt:

(set: $gotKey to true)Alice nahm die Feder in ihre Hand und schwebte langsam nach oben. Die Feder brachte auch ihren (print: $ring) zum Schimmern und der lenkte ihre Hand zu einem der Schlüssel. Alice pflückte ihn vom Ast und verstaute ihn in ihrer Tasche. Vorsichtig schwebte sie wieder nach unten.

Nun war sie bereit, das [[Dorf -> Dorf]] zu erkunden.

Hier seht Ihr, das mit mit set: Variablen nicht nur Strings zuweisen kann, sondern auch numerische oder – wie in obigmen Fall – boolsche Werte.

Dann läuft die Geschichte wieder zusammen Alice versucht, das Dorf zu erreichen und muß an einem müden Ritter vorbei:

<img src="http://localhost:8888/twine/images/knight.jpg" />

Der Weg zum Dorf war von einem großen, steineren Wall versperrt. Nur ein Durchgang war offen, der
von einem traurig aussehenden Ritter auf einem dürren Pferd blockiert wurde, der träumend vor
sich hindöste.

(if: $magicalItem is "Zauberhut")[Der](else:)[Die] (print: $magicalItem) vibrierte.

(if: $magicalItem is "Feder")[Alice nahm die bewährte Feder und schwebte über den schlafenden Ritter,
der sie nicht bemerkte.](elseif:  $magicalItem is "Brille")[Alice setzte sich die Brille auf und
bemerkte, daß sie unsichtbar wurde. Leise schlich sie an den Ritter vorbei auf die andere Seite.]
(elseif:  $magicalItem is "Zauberhut")[Der Zauberhut zog Alice förmlich direkt auf den Wall zu.
Sie fühlte sich elastisch wie eine Gummipuppe. Unbemerkt schob sie sich durch die Ritzen der Mauer.
Ihr Körper wurde dabei dünn wie ein Faden. Als sie die andere Seite erreicht hatte, nahm sie wieder
ihre normale Form an.]

Alice erreichte so das Dorf und betrat einen [[Biergarten]] am Ortseingang.

Hier seht Ihr, daß es nicht nur die if: … else:-Konstruktion in Harlowe gibt, sondern auch die Mehrfachverzweigung mit if: … elseif:.

Die letzten beiden Passagen bringen nichts Neues mehr und ich habe sie nur geschrieben, um diesem Tutorial irgendeinen Abschluß zu geben. Also erst einmal die Passage Biergarten:

<img src="http://localhost:8888/twine/images/tea-party.jpg" />

Hier saßen seltsamerweise wieder ihre alten Freunde, der Märzhase, der verrückte Hutmacher und das weiße
Kaninchen an einem Tisch und begrüßten sie lautstark. Alice war verwirrt und beschloß,
[[die Geschichte zu verlassen -> Ende]].

Und zum Abschluß das Ende:

<img src="http://localhost:8888/twine/images/grinse-katze.png" />

Am Ausgang des Biergartens traf sie auf die Grinsekatze. Sie grinste nur und meinte: »Hat die Raupe
wieder zu viel gekifft?« Und verschwand …

Wer jetzt völlig verwirrt ist: Es ist durchaus möglich, nichtlineare, interaktive Geschichten nur mit Hyperlinks zu schreiben. Aber Variablen, Hooks und Makros erlauben es Euch als Autorin oder Autor, mehr Abwechslung und interessante Variationen in Eure Geschichten zu packen. Harlowe besitzt noch viel mehr Makros, ein Blick in die Dokumentation lohnt daher auf jeden Fall.

Twine mit Harlowe erinnert mich stark an HyperCard mit Hypertalk. Das war eines der ersten Werkzeuge, mit denen man interaktive, nichtlineare Geschichten erzählen konnte. Und wie bei Harlowe war ich beim ersten Kontakt mit Hypertalk von den vielen Möglichkeiten dieser Sprache überwältigt.

Das Spiel habe ich natürlich online gestellt und Ihr könnt es hier spielen. Und die Quellen und sämtliche Bilder findet Ihr natürlich auch in meinem GitHub-Repositorium zu Twine.

Meine Hoffnung ist, daß Ihr mit diesem dritten Teil meiner Entdeckungsreise durch Twine etwas anfangen könnt und Euch zu eigenen, mehr oder weniger abstrusen und aufregenden Geschichten insprieren laßt. Ich werde ebenfalls meine Erkundungen dieses Spielzeugs fortsetzen, denn Hypertext und interaktive Geschichten sind cool.

  1. Die gedruckte Version des Buches, die ich besitze, ist bei mir abge- und im Handel vergriffen, für gebrauchte Exemplare werden Mondpreise verlangt, aber es gibt eine Ebook- (Kindle-) Version, die aktuell für € 8,08 zu haben ist. Und die ist das Buch definitiv wert. 


(Kommentieren) 

image image



Über …

Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter Rentner, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!

Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.

Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.

Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.


Werbung

Diese Spalte wurde absichtlich leergelassen!


Werbung


image  image  image
image  image  image


image