1. Allgemeines = Ein bischen Laberei muss sein

Hallo lieber Leser. Dieses HOWTO ist fuer "neue" TinyFugue User gedacht. Der Leser sollte sinnvollerweise schonmal ein MUD besucht haben. Ziel hier soll es sein neuen Usern eine einfach nachzuvollziehende, deutsche Dokumentation zur Verfuegung zu stellen, da die meiste Dokumentation sich um die fortgeschrittenen Funktionen von TF drehen und meist in englisch zur Verfuegung stehen.

TinyFugue [ab jetzt TF genannt] ist ist ein MUD-Client (MUD=Multi User Dungeon). Das Programm ist fuer Anfaenger zwar erstmal kryptisch, laesst sich aber nach einiger Zeit sehr gut an die eigenen Beduerfnisse anpassen. Das HOWTO basiert auf der Version 5.0 beta 8.

Ich habe dieses HOWTO fuer das deutsche MUD Avalon geschrieben. Wenn du dich mit einem anderen MUD (Morgengrauen, Unitopia oder Silberland) verbinden moechtest kannst du das jedoch jederzeit tun. Bitte beachte dabei dass manche MUDs bestimmte Trigger nicht erlauben. (Farb-"trigger" sollten jedoch keine Probleme machen, da Sie nicht vom Server, sondern vom Client ausgefuehrt werden.)

Bitte haltet euch daran. MUDspielen ist ein Recht das entzogen werden kann.

Der erste Eindruck eines TF-Users ist erstmal: WTF? Deshalb dachte ich mir, ich schreibe mal ein bischen was ueber meine TF-Erfahrungen zusammen, um anderen das Leben mit TF ein wenig zu vereinfachen. Die Hilfe ist naemlich leider nicht ganz so einfach zu verstehen (zumindest geht es mir als Nichtinformatiker so). Ueber Anregungen und Kritik freue ich mich (solange die Kritik konstruktiv ist).

Ich habe diese HOWTO hauptsaechlich nach dem sehr guten Vorbild von Hero und http://www.avalon-rpg.com/connect/index.html gestaltet. Im Gegensatz zu seinem HOWTO gehe ich jedoch ein bischen anders vor. Danke an Hero fuer seine tolle Einfuehrung! Sie hat mich erstmal auf den Gedanken gebracht mich etwas genauer mit TF zu beschaeftigen. Die Befehle koennen direkt im TF-Fenster eingegeben werden. Man kann die Befehle jederzeit in ein TF Fenster eingeben.

Besonders moechte ich auch Nikodemus erwaehnen, aus dem MUD Unitopia, der mir meine erste .tfrc gegeben und mir damit den Einstieg in TF erst ermoeglicht hat!

Genug der Vorrede:

2. Zweck des Programmes = Warum braucht man sowas?

TF wurde gebaut um Telnet zu ersetzen, sowie die fehlenden Funktionen von Telnet zu ergaenzen. In Telnet sind zum Beispiel nur die Texte farbig, die das MUD bereits farbig sendet. Es ist in Telnet nicht moeglich die Taste "F2" so zu konfigurieren, dass sie ein bestimmtes Kommando ans MUD schickt. Wenn in Telnet ein Kommando falsch abgeschickt wurde (Vertipper) muss man den kompletten Befehl nochmals tippen (und zwar richtig).

2.1. Beispiele dafuer:

  • Kommandos wiederholen = geht halt einfach

  • Farben = Farbige Hervorhebungen von Textelementen

  • Trigger = Automatisches reagieren und informieren

  • Hooks = Aliase auf oft benoetigte Befehle

  • Keybindings = Befehle auf Tasten legen (z.B. F3 auf Angriff legen)

  • Gags = Output der "nervt" kann unterdrueckt werden

  • Scripte = Komplexe Aktionen und Kommandolisten ausfuehren

  • SSL = Verschluesselte Verbindungen ohne externe Programme

  • 2 Fensterlayout = Trennen von Eingabe und "Mudtext"

  • Kompression = Manche Funktionen im MUD gibt es nur mit Kompression

TF kann jedoch leider nicht alles. Leider fehlt z.B. das ATCP Protokoll. Telnet kann das jedoch auch nicht (Zumindest nicht dass ich wuesste) sowie alle anderen Sachen die in der Liste stehen. Es gibt jede Menge anderer Clients. Ich moechte hier nur als Beispiel Mudlet erwaehnen das z.B. ATCP spricht aber noch in der Entwicklung ist.

3. Erste Schritte = Jeder Weg beginnt mit dem 1. Schritt

Zuerst mal wollen wir uns in Avalon einloggen und einen Char sowie eine .tfrc erstellen. Dazu starten wir TinyFugue mit dem Kommando "tf" in einem xterm. (Unter Windows: tf in das CMD-Fenster (DOS-Eingabeaufforderung) eingeben.) Das Fenster sollte in etwa so aussehen:

TinyFugue version 5.0 beta 8
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2002, 2003, 2004, 2005,
    2006-2007 Ken Keys (kenkeys@users.sourceforge.net)
Type `/help copyright' for more information.
Using PCRE version 2.08 31-Aug-1999
Type `/help', `/help topics', or `/help intro' for help.
Type `/quit' to quit tf.

% LC_CTYPE category set to "de_DE.ISO8859-15" locale.
% LC_TIME category set to "de_DE.ISO8859-15" locale.
% Loading commands from /usr/local/lib/tf-50b8-lib/stdlib.tf.
--------(no world)--------------------------------------------------------20:18

Du siehst jetzt das Startfenster von TinyFugue. Im oberen Bereich steht die Version von TF, das Copyright und diverse Startinformationen. Das Vorgehen fuer Blinde und fuer Sehende habe ich jetzt hier mal getrennt aufgefuehrt, da ich es leicht unterschiedlich gestalten will. Der "/" steht fuer ein Kommando das direkt von TF ausgefuehrt wird (also ein nicht-MUD-Kommando).

3.1. Fuer Sehende

auf der Kommandozeile den Befehl "tf" eingeben.
$ tf
# Danach:
/telnet avalon.mud.de 7777
# Hiermit verbindet man sich mit dem MUD.
# Hostname ist avalon.mud.de
# Portnummer ist 7777
> gast
# Ich logge hier einen gast ein. Du kannst dir natuerlich auch einen neuen
# Char erstellen bzw. einen vorhandenen verwenden.
> 3 * enter druecken (ausser du willst was aendern)
# Bei einem Gast uebernehme ich damit alle Voreinstellungen.
# Bei einem vorhandenen Char ist dieser Schritt nicht notwendig.
> /partial Du
> b
# Damit wird ein Teil der Zeile, hier das Wort "Du" fett dargestellt.
> /set hiliteattr=Cyellow
> b
# Damit wird das Wort "Du" gelb dargestellt.
> /saveworld .tfrc
# Damit werden die Einlogginformationen in der Datei .tfrc abgespeichert.
> /save -a .tfrc
# Damit wird das "/partial Du" in der Datei .tfrc abgespeichert.
> <strg>+<p>
# Wenn du die STRG und die P Taste gleichzeitig drueckst wird der zuletzt
# ausgefuehrte Befehl nochmal in den Eingabebereich gesetzt und kann ihn
# editieren. (Das geht auch mehrfach)
> <strg>+<n>
# Das ist das Gegenteil des obigen Befehls. Wenn man also irgendwo in der
# Kommandogeschichte steht, kann man damit wieder in die andere Richtung
# blaettern.
> ende
# Damit verlassen wird das Mud um uns die .tfrc mal genauer anzusehen:

Die Datei .tfrc sieht nach dem Schreiben folgendermassen aus:

/test addworld("avalon.mud.de,7777", "telnet", "avalon.mud.de", "7777")
/def -Fp0 -P0h -t'Du'

3.2. Fuer Blinde

# auf der Kommandozeile den Befehl "tf -v" eingeben.
$ tf -v
# Screenreader koennen (meines Wissens) nicht gut mit dem Extra-Fenster
# fuer die Eingaben umgehen. deswegen schalten wir das mit -v aus.
> /telnet avalon.mud.de 7777
# Hiermit verbindet man sich mit dem MUD.
# Hostname ist avalon.mud.de
# Portnummer ist 7777
> gast
# Ich logge hier einen gast ein. Du kannst dir natuerlich auch einen neuen
# Char erstellen bzw. einen vorhandenen verwenden.
> enter
# zufaelliges Geschlecht.
> ja
# Unterstuetzung fuer Sprachsoftware einschalten.
> enter
> /trig *gefaehrlich* = /beep
# Damit setzen wir einen "partial trigger" auf den Text "gefaehrlich".
> sag das ist ein gefaehrliches mud.
# Der Text muesste jetzt ein vernehmbares "Beep" erzeugen.
> <strg>+<p>
# Wenn du die STRG und die P Taste gleichzeitig drueckst wird der zuletzt
# ausgefuehrte Befehl nochmal in den Eingabebereich gesetzt und kann ihn
# editieren. (Das geht auch mehrfach)
> <strg>+<n>
# Das ist das Gegenteil des obigen Befehls. Wenn man also irgendwo in der
# Kommandogeschichte steht, kann man damit wieder in die andere Richtung
# blaettern.
> ende

Die Datei .tfrc sieht nach dem Schreiben folgendermassen aus:

/test addworld("avalon.mud.de,7777", "telnet", "avalon.mud.de", "7777")
/def -p0 -mglob -t'*gefaehrlich*' = /beep

4. Hilfe!

Kein HOWTO kann alle Funktionen erklaeren. Ich will hier nur zeigen wie man relativ schnell einen Zugang zu den Funktionen von TF bekommt. Deshalb ist es besonders wichtig die Hilfe zu kennen. Sie ist zwar leider nur in Englisch verfuegbar und nicht besonders intuitiv verstehbar, aber: Sie hilft da weiter wo dieses HOWTO endet.

> /help

Zeigt die Hilfe an. Es gibt dann Hinweise auf /help (intro|topics|commands). Ein fortgeschrittener TF-Benutzer muss dort abundzu mal was nachsehen. Viel Erfolg!

5. Konfigurationsdatei = Faule Menschen haben mehr vom Leben

Jetzt haben wir eine Konfigurationsdatei. Die .tfrc ist die 1. Datei nach der TF sucht. Findet TF diese Datei, versucht es sich mit dem Mud direkt zu verbinden.

(Tipp: Will man dieses Verhalten nicht kann man "tf -q" eingeben, damit TF sich nicht automatisch verbindet.)

Wenn Username und Passwort in der Datei enthalten sind, muss man Sie nicht immer eingeben. Man kann auch mehr als eine .tfrc haben. Will man dann die "richtige" .tfrc laden kann man zum Beispiel mit "-f" eine Datei manuell angeben:

$ tf -f.tfrc_trickster

Dabei ist zu beachten zwischen -f und dem Dateinamen .tfrc_trickster kein Leerzeichen zu lassen. Unter Windows kann man das in eine Verknuepfung reinschreiben. Unter Linux einen alias erstellen. Ich habe in meiner .bashrc zum Beispiel stehen:

alias trickster='tf -f.tfrc_trickster'

Ich editiere diese Datei mit einem Texteditor. Man koennte zwar auch direkt in TF diese Scripte schreiben, aber ich habe lieber volle Kontrolle ueber das was in dieser Datei steht.

Sachen die in der .tfrc stehen (koennen):

  1. Globale Einstellungen (Wieviele Zeilen hat visual? z.B. 3 oder 6?)

  2. Logininformationen

  3. Zusaetzlich zu ladende Konfigurationsdateien oder Scripte

  4. Trigger

  5. Logging aktivieren

5.1. Globale Einstellungen

Hier einige Voreinstellungen die ich fuer sinnvoll halte. Alle gesetzten Variablen kann man mit "/set" (ohne Parameter) sehen.

Fuer Sehende kann man, wenn der Bildschirm gross genug ist den Befehl

/set isize=4

verwenden um das Eingabefenster zu vergroessern und mehr vergangene Befehle darzustellen.

Sobald die Mudausgabe groesser als ein Fenster ist, kommt man nur mit "TAB" weiter. Um dieses Verhalten auszuschalten reicht ein:

/set more=off

Blinde hingegen koennen das Eingabefenster ausschalten durch Eingabe von:

/visual off

Die Uhr die TF standardmaessig auf der Trennlinie anzeigt schaltet man so aus:

/clock off

5.2. Logininformationen

Die erste Zeile kann auch so aussehen:

;/addworld  MUD-typ Worldname     Username  Userpasswort  Server        Port
/addworld  -Tlp     AVA_Trickster Trickster xxx           avalon.mud.de 7777

Diese Zeile verbindet TF unverschluesselt direkt mit dem MUD und ist aequivalent zu der Zeile die jetzt schon in der .tfrc steht.

Der Befehl /addworld ist folgendermassen aufgebaut:

/addworld   = Neue Verbindungsdaten fuer eine "Welt" eingeben
<Worldname> = Wie soll der Titel in der Trennzeile sein (AVALON_Trickster)
-Tlp       = Welches Protokoll verwendet das MUD
<Username>  = Username des Benutzers im MUD
<Passwort>  = sollte man wissen
<Server>    = In unserem Fall avalon.mud.de
<port>      = Fuer unseren Fall 7777

Eine Alternative waere:

/addworld -x -T"lp" "AVA_Trickster" Trickster xxx avalon.mud.de 7778

Hier wird eine verschluesselte Verbindung mit dem MUD aufgebaut. Leider ist aufgrund der Lizenz von Openssl diese Option nicht in allen Linuxversionen eingebaut. Man kann sie jedoch nachtraeglich einkompilieren.

5.3. Zusaetzlich zu ladende Konfigurationsdateien oder Scripte

Mit dem Befehl "/load color.tf" kann man eine Datei "color.tf" in TF laden. Alle in der Datei vorhandenen Befehle werden dann ausgefuehrt als wuerden Sie in der .tfrc stehen. In dem Kapitel ueber Farben werde ich das erklaeren.

Man sollte sich angewoehnen wenn man mehrere Chars hat Scripte in eigene Dateien auszulagern. Nehmen wir an man hat Probleme sich die Position der Mondtore in Avalon zu merken, kann man sich dafuer ein "mondtor.tf" schreiben das man mit der Zeile "/load mondtor.tf" dazuladen ohne dass man das Script wenn man es veraendert in jeder Datei manuell aendern muss.

Je nach Gilde/Zunft/Waffenvorlieben/Standardzauber kann man sich eigene *.tf Dateien erstellen und kann diese je nach Notwendigkeit dazuladen oder nicht.

(HINT: Damit man nicht solange warten muss bis ich die Farbfunktionen erklaere, kann man sich hier color.tf auch runterladen.)

5.4. Trigger

Als wir vorhin "/save -a .tfrc" eingegeben haben, wurden automatisch alle aktiven Trigger als Macro in die Dateien gespeichert:

/def -Fp0 -P0h -t'Du'
/def -p0 -mglob -t'*gefaehrlich*' = /beep

Diese muessen jetzt nicht mehr manuell konfiguriert werden, sondern werden direkt beim Starten geladen und sind aktiv. Ich schreibe Trigger lieber per Hand in die .tfrc rein, da ich dann bessere Kontrolle ueber das Layout habe. In die .tfrc umfangreiche Macros zu schreiben halte ich eher fuer nicht sinnvoll. Standardfunktionen, die man jedoch immer und unbedingt haben muss sind hier gut aufgehoben.

5.5. Logging aktivieren

Manchmal geht der Output einfach zu schnell. Als Sehender sieht man haeufig nicht alles und als Blinder hoert man nicht alles. Um dann mal schnell was nachlesen zu koennen, kann man ein log aktivieren:

Hiermit werden alle Befehle an das MUD geloggt(Tastatureingabe):

> /log -i tf_befehle.log

Hiermit werden alle Ausgaben des MUDs in einer Datei gespeichert. Fortgeschrittene User koennen noch den Namen der Welt (AVA_TrickSTER) direkt ohne Leerzeichen anhaengen um das Logging auf diese Welt zu beschraenken und gleichzeitig in meheren MUDs zu spielen.

> /log -wAVA_TrickSTer

Tastatureingaben und MUD-Output kann man so setzen:

> /log -g on

Fertig. (Nuja. Der Anfang ist gemacht.) Unter unixoiden Betriebssystemen reicht es nun tf zu starten. TinyFugue sollte sich nun automatisch mit Avalon verbinden. Damit der Weg zur 1. .tfrc nicht so schwer wird hier ein Beispiel: .tfrc zum runterladen.

6. Macros und Trigger = Das Leben ist schoener wenn man sie hat. (Crashkurs)

Trigger koennen verschiedene Aufgaben uebernehmen. Hier mal eine kleine Liste:

  1. Einfaerben von Text

  2. Ausgeben von Toenen (oder Hinweistexten)

  3. Automatisches reagieren auf MUD-Output

  4. Loggen bestimmter Events

  5. Verkuerzen von Aktionen

In dieser Sektion lernst du ein paar Trigger kennen, und was man damit erreichen kann. Ein moeglicher Trigger sieht in seiner kuerzesten Form so aus:

> /trig *Du* = /beep

Diese Zeile bedeutet: Wenn das Mud den Zeichenstring DU ausgibt (und optional davor oder danach Zeichen stehen) wird TF automatisch das interne Kommandoh /beep ausfuehren, das einen Konsolenpiepser ausgibt. (Funktioniert nur wenn das Terminal dazu auch in der Lage ist. Xterm und das Doseingabefenster koennen das wenn die Lautstaerke des Rechners richtig eingestellt ist!) Fuer TF ist /trig eine bestimmte Syntax intern fuer ein Macro. Dieses sieht fuer den obigen Fall folgendermassen aus:

/def -p0 -mglob -t'*Du*' = /beep

Ziemlich aehnlich nicht wahr? In TF sind Macros eine Obermenge. Trigger sind eine Untermenge. Der Befehl "/trig" ist intern das gleiche wie "/def -p0 -mglob -t".

/def    = jetzt kommt ein Macro
-p0     = Das Macro hat die Prioritaet "0"
-mglob  = Es wird fuer die interpretation von "*" und "?" die syntax einer
          Shell benutzt (es gibt noch mregexp fuer regulaere Ausdruecke)
-t      = Jetzt kommt ein Triggertext (Wenn der Trigger passt wird der
          Befehl ausgefuehrt der nach dem = kommt)
'*Du*'  = Wenn irgendwo im Text "DU" steht und davor oder dahinter nichts oder
          vieles, dann passt das "Muster"
=       = Das Istgleichzeichen sagt: jetzt kommt ein Befehl oder eine Liste von
          Befehlen.
/beep   = Ist ein interner TF Befehl der einen Beep ausgib. Hier koennen auch
          Mehrere Befehle die mit "%;" getrennt sind stehen. Beispielsweise:
          "/beep %; /echo Da steht ein Du im MUD rum. %; laechle %;"

Es gibt Macros in verschiedenen Inkarnationen:

  • Trigger = Fuehrt etwas aus wenn ein bestimmter Input vom MUD oder vom User kommt

  • Hook = Reagiert auf eingaben des Users und fuehrt etwas aus (ein Alias)

  • Gag = Macht Output des MUD unsichtbar

  • Bind = Verknuepft Tasten mit Funktionen

  • hilite = Faerbt ganze Zeilen

  • partial = Faerbt bestimmte Woerter

Gut. Dann schreiben wir mal ein paar Macros.

6.1. Einfaerben von Text = Bunte Farben, ganz ohne Drogen

Wir wollen dass sobald der Text "Trauer breitet sich ueber Avalon aus." in einer Zeile steht, diese in der Farbe Rot dargestellt wird.

> /def -P0hCred -t'Trauer breitet sich ueber Avalon aus.'

/def            = Beginn der Macrodefinition
-P0hCred        = -P (Partial Hilite)
                   0 (Alles was vom Regulaeren Ausdruck gemached wird)
                   h (hilite)
                   C (color)
                   red (rot einfaerben)
-t(Trigger)     = Einleitung des Triggers
'(Text)'        = Was eingefaerbt werden

Je nach Aufgabe kann TF verschiedene Farben benutzen. Rot zur Warnung, gruen um Informationen darzustellen usw.. Je nach verwendetem Terminal ist die Menge der Verwendbaren Farben jedoch unterschiedlich. Es gibt 8 Basisfarben die in den meisten Faellen funktionieren:

black, red, green, yellow, blue, magenta, cyan, white. (schwarz, rot, gruen, gelb, blau, magenta, tuerkis, weiss).

In xterm (oder rxvt) kann man 8 zusaetliche (hellere) Farben verwenden: grey, brightred, brightgreen, brightyellow, brightblue, brightmagenta, brightcyan, brightwhite.

Ich verwende max. 16 Farben. Wenn mehr Farben benoetigt werden, kann rxvt 256 oder mehr Farben verwenden. Wieviele Farben dein Terminal kann, kann man mit diesem Befehl rausfinden:

/load testcolor.tf

Zum Anfang kann man sich die Datei color.tf von mir als Beispiel runterladen. Die Zeilen werden weiter unten erklaert.

6.2. Ausgeben von Toenen (oder Hinweistexten) = Endlich Sounds…

Jetzt ergaenzen wird das obige Beispiel um einen Beep:

/def -ab -P0hCred -t'Trauer breitet sich ueber Avalon aus.'
-ab  = Setze das Attribut (-a) Bell (b)

Wenn der Beep nicht mehr ausreicht oder nervt kann man folgendes machen:

/def -P0hCred -t'Trauer breitet sich ueber Avalon aus.' todesmeldung = \
        /sys espeak -v de "Wieder einer Tot"

Das Zeichen "\" steht immer dann am Ende einer Zeile wenn der Befehl noch weitergehen soll, aber der Platz nicht ausreicht. Der Befehl /sys ermoeglicht es dem Betriebssystem einen Befehl zu geben. der Befehl "espeak -v de "Wieder einer Tot" gibt den Text mit espeak ueber die Soundkarte wieder (Wenn das Programm installiert ist). Zusaetzlich habe ich dem Trigger den Namen "todesmeldung" gegeben.

6.3. Automatisches reagieren auf MUD-Output = Suche nach Ergonomie

Nehmen wir an wir sehen eine Kiste. Wir schauen uns diese Kiste an. In der Beschreibung der Kiste steht "Die Kiste ist geschlossen.". Was wuerde ein neugieriger User wohl wollen? Beispielsweise den Befehl "oeffne Kiste" eingeben. Dies machen wir folgendermassen:

(Vorsicht! Durch diesen Befehl ist im MUD mal einer meiner Chars in einem Dungeon gewaltsam zu Tode gekommen!)

> /def -mregexp -p2 -t'^D[a-z .]* ([A-Za-z]*) ist geschlossen\\.$' oeff_ki = \
        oeffne %P1 %;

/def            = beginnt das Macro
-mregexp        = sagt: der Triggertext enthaelt regulaere Ausdruecke.
-p2             = setzt die Prioritaet auf 2. Wenn ein Trigger mit Prioritaet
                1 auf den gleichen Text passt, wird dieser ausgefuehrt
                und nicht der oeff_ki trigger.
-t'txt'         = ist der Text mit den eingebauten regulaeren Ausdruecken.
oeff_ki         = ist der Triggername (es ist immer gut einen zu haben).
=               = weist dem Makro den auszufuehrenden Befehl zu.
'oeffne %P1'    = ist schliesslich der Befehl der auszufuehren ist, wobei
                  %P1 eine Variable ist, die automatisch mit dem Inhalt von
                '([A-Za-z]*)' gefuellt ist (in unserem Fall "Kiste")
%;              = schliesst den Befehl ab und wirkt wie ein "enter" in der
                  Konsole.

6.4. Loggen bestimmter Events = Ich will Daten. Und zwar viele Daten.

Manchmal moechte man wissen wie oft man z.B. einen bestimmten Befehl erfolgreich ausgefuehrt hat. Eine (sehr simple) Vorgehensweise ist z.B.:

> /def -t"Super! Mit praezisen Schnitten weidest Du die Leiche aus." weiden = \
        /sys echo "Ausweiden erfolgreich" >>ausweiden.log

Damit wird fuer jedesmal wenn man erfolgreich ausgeweidet hat ein Logeintrag in die Datei ausweiden.log geschrieben. Jetzt kann man ganz leicht zaehlen wie man ausgeweidet hat.

Fuer dieses Beispiel habe ich einen Befehl gewaehlt der Win/Unix/Linux-Usern wahrscheinlich bekannt ist. Es ist ja ein Betriebsystemaufruf zur Ausgabeumleitung. Systemaufrufe mit /sys sollte man jedoch vermeiden, da man mit einem falsch geschriebenen Aufruf viel Arbeit kaputtmachen kann. Ausserdem gibt es Befehle wie "grep" oder "wc" die auch manchmal innerhalb des MUD aufgerufen werden sollen. Diese gibt es aber nur unter Unix/Linux. Deshalb:

/load textutil.tf

Damit wird der Befehl "/writefile" geladen, der es ermoeglicht direkt aus TF heraus in eine Datei zu schreiben. Die weiteren Befehle (die wir hier nicht brauchen), waeren: grep, egrep, fgrep, readfile, wc,

Damit kann man den Befehl so schreiben:

> /def -t"Super! Mit praezisen Schnitten weidest Du die Leiche aus." weiden = \
        /echo "Ausweiden erfolgreich" |writefile ~/ausweiden.log

6.5. Verkuerzen von Aktionen = eine Taste oder 50?

Manche Aktionen im MUD will man schneller ausfuehren. Immer die gleichen Aktionen manuell per Hand ausfuehren ist manchmal etwas langweilig. Fuer ganz besonders haeufige Aktionen kann man mehrere Befehle auf eine Taste legen:

/def key_f2=b leiche %; lege alles von leiche in meinen rucksack %;

Damit lege ich auf die Taste F2 die Funktionen "b leiche" in der ich sehe was mein Opfer bei sich hatte und mit lege alles von meinem Opfer in meinen rucksack. "key_f3" kann man dann auf eine andere Funktion legen usw. Da die Vorlieben der verschiedenen MUD-User unterschiedlich sind kann ich hier nur auf "help keys" verweisen, Wo nicht nur die Standardbelegung der Tasten, sondern auch das Belegen mit Funktionen genau erklaert wird.

Eine andere Methode das Gleiche zu erreichen sind Aliase. Innerhalb der MUDs die ich kenne ist die Anzahl der Aliase (Kuerzel) beschraenkt. In TF kann ich eine unendliche Anzahl festlegen (und wieder vergessen…).

/load alias.tf

Damit kann man Aliase sehr einfach bauen:

> /alias pl b leiche %; lege alles von leiche in meinen rucksack %;

Damit wird das Alias "pl" (fuer pluendere Leiche) erstellt.

Je haeufiger man einen Befehl eingeben muss, desto eher legt man Ihn auf eine Taste. Wenn der Befehl oder die Abfolge von Befehlen nicht ganz so oft gebraucht werden sollte man Sie eher auf ein Alias legen (Tasten sind kostbar). Alle gesetzten Aliase kann man so darstellen:

/alias

Loeschen geht mit:

/unalias <Name des Alias>

7. Umgang mit Variablen und Bedingungen = Endlich "Ziele" und Abfragen.

7.1. Verwendung von Variablen

Bisher haben wir Befehle und interne Funktionen kennengelernt. Damit kann man viele Aufgaben und Herausforderungen bewaeltigen. Variablen machen das Spielen jedoch noch ein bischen einfacher. So setzt man eine Variable:

/set pflanze=sanguon

Ausgeben kann man sich den Inhalt der Variable %pflanze mit:

/eval /echo %pflanze

Nehmen wir an wir wollen uns eine Sanguonpflanze pfluecken, koennen wir das mit "pfluecke sanguon". So geht das automatisch:

> /def key_f2 = /eval /send pfluecke %pflanze %; lege sanguon in Rucksack

Jetzt muessen wir nur noch das Setzen der Variable bequemer machen:

> /alias pf /set pflanze=%{1} %; /echo sammel: %pflanze %;

/alias               = Wir bauen einen /alias mit dem namen "pf" in TF
/set pflanze=%{1} %; = Wir setzen die Variable pflanze und alles was
                       nach "pf" steht, wird der Variable Pflanze zugewiesen.
/echo %pflanze %;    = Zur Kontrolle wird der Inhalt der Variable "pflanze"
                       nochmal ausgegeben.

Zur Verwendung gibt man jetzt "pf Sanguon" ein. Damit wird Sanguon gepflueckt wenn man F2 drueckt. "pf Kreuzblume" sammelt bei F2 dann Kreuzblumen.

Mit solchen Variablen kann man natuerlich viel mehr erreichen:

  • In Dhungar das richtige Stockwerk erreichen ohne dauernd fluchen zu muessen

  • Die richtigen Gegner im richtigen Augenblick angreifen

  • Sammeln wichtiger Items wenn die Zeit knapp ist

  • Als Reisender das richtige Mondtor machen

  • Als Magier den richtigen Gegner bzw. Zauber waehlen

7.2. Verwendung von Bedingungen

Manchmal muessen fuer eine bestimmte Aktion Vorbedingungen erfuellt sein. Zum Beispiel kann ich nur etwas in meine Tasche legen wenn ich Sie vorher aus meinem Rucksack genommen habe. Lege xxx in meine Tasche produziert dann ein "Tasche" nicht gefunden. Wenn man mit Variablen arbeitet kann man dem Macro je nach Bedingung andere Ziele zuordnen.

> /alias beh /set behaelter=%{1} %; /echo Behaelter: %behaelter %;

> /alias lg /if ({behaelter} !~ "") \
              /eval /send lege %1 in meinen %behaelter %; \
             /else /eval /send lege %1 in Rucksack %; \
           /endif

/alias                  = legt den Alias lg an  der bedeutet:
                          lege das erste ding nach "lg" in (behaelter)
lg                      = der Alias
/if ({behaelter} !~ "") = Testet ab ob die Variable %behaelter leer ist
/eval /send             = Wenn die Variable nicht leer ist, ersetzt /eval die
                          Variablen mit Inhalt und sendet diese an das MUD
lege %1                 = Erste Variable nach lg
in meinen %behaelter    = Variable behaelter wird mit dem richtigen Behaelter
                          gefuellt.
/else                   = Wenn die Variable leer ist
/eval /echo lege %1     = Wird %1 in
in Rucksack             = den Rucksack gelegt (Da die Variable "behaelter" leer
                          ist wird Sie durch "Rucksack" ersetzt)

Hier wieder zum runterladen: lg.tf

8. Fuellen von Variablen = Jetzt wird es anspruchsvoller

Man kann Variablen auch automatisiert fuellen lassen. Was das fuer einen Sinn hat? Ganz einfach. Nehmen wir an ein Freund von uns kitzelt dich. Du willst Ihn automatisiert zurueckkitzeln.

> xxx kitzelt dich.

> /def -t'([A-Zaz ]*)[ ]+kitzelt dich\.' zurueckkitzeln = \
        kitzel %P1 %;

([A-Za-z ]*) ist ein regulaerer Ausdruck. Man koennte sagen ein "Muster". Wenn dieses Muster zutrifft wird das was auf das "Muster" passt, in die Variable %P1 eingetragen.

[A-Z] matched alle Grossbuchstaben
[A-Za-z] matched alle Grossbuchstaben und Kleinbuchstaben
([A-Za-z]*) matched alle Woerter
([A-Za-z ]*) matched alle Woerter und alle mit leerzeichen getrennten Woerter
        an der entsprechenden Position

Eine komplette Dokumentation versteckt sich unter "/help pcre". (Ich habe erst waehrend ich dieses HOWTO geschrieben habe die entsprechende Hilfe entdeckt).

Hier mal ein paar Beispiele aus der Datei "color.tf" von oben.

  1. ([wW]asser) matched auf wasser und Wasser.

  2. ()(([sS]child)([ ]) matched auf jedes Wort in dem Schild oder schild enthalten ist, beziehungsweise das Wort "Schild" gross oder klein geschrieben und alleine stehend.

  3. [dD]ich)|([dD]ir matched auf die Woerter Dich, dich, dir oder Dir als alleinstehende Woerter.

Als Nichtinformatiker muss ich leider die Erklaerung von regulaeren Ausdruecken verzichten. Ich kann das zwar "etwas" aber nicht "richtig". Deswegen hier auch mal ein etwas komplexeres Beispiel:

/def -F -mregexp -t"^TP:[ ]+([0-9]*)/([0-9]*) [ ]+ZP:[ ]+([0-9]*)/([0-9]*)\
        [ ]+AP:[ ]+([0-9]*)/([0-9]*) [ ]+MP:[ ]+([0-9]*)/([0-9]*)$" ksp = \
    /if ({P1} == {P2}) \
        /set tpmax=1 %; \
          /else /set tpmax=0 %; \
    /endif %;\
    /if ({P3} == {P4}) \
        /set zpmax=1 %; \
          /else /set zpmax=0 %; \
    /endif %; \
    /if ({P5} == {P6}) \
        /set apmax=1 %; \
          /else /set apmax=0 %; \
    /endif %; \
    /if ({P7} == {P8}) \
        /set mpmax=1 %; \
          /else /set mpmax=0 %; \
    /endif %; \
    /if ({tpmax} == '1') \
           /eval /echo TP sind voll %; \
         /else /eval /echo TP sind nicht voll %; \
    /endif %; \
    /if ({zpmax} == '1') \
            /eval /echo ZP sind voll %; \
        /else /eval /echo ZP sind nicht voll %; \
    /endif %; \
    /if ({apmax} == '1') \
            /eval /echo AP sind voll %; \
        /else /eval /echo AP sind nicht voll %; \
    /endif %; \
    /if ({mpmax} == '1') \
            /eval /echo MP sind voll %; \
        /else /eval /echo MP sind nicht voll %; \
    /endif %; \
    /if ({tpmax} == {zpmax} == {apmax} == {mpmax} == 1) \
        /echo ### geh endlich kaempfen du Faultier ### %;
       /else /repeat -60 1 ksp %;
    /endif %;

9. Verwaltung von Macros / Triggern / Aliasen

Mit /list kann man sich alle momentan geladenen Macros anzeigen. Sinnvoll ist das zum Beispiel wenn man einen kurzen Trigger geschrieben hat und diesen nicht mehr verwenden will ( oder weil er nicht oder nicht richtig funktioniert).

Damit wir das besser sehen koennen, erzeugen wir uns vier Trigger:

> /def -t'xxx' xxx = /echo das ist ein test
> /def -t'aaa' aaa = /echo das ist ein 2. test
> /def -t'bbb' bbb = /echo das ist ein 3. test
> /def -i -t'argl' argl = /echo das ist ein 4. test

> /list

Damit sieht man alle im Moment geladenen Macros die nicht unsichtbar sind. Macros die man normalerweise immer aktiv hat kann man mit "/def -i" unsichtbar machen. "/list" zeigt diese dann normalerweise nicht an.

> /undefn 772

loescht das entsprechende Macro wieder.

> /list -i

Damit zeigt man sich auch die "unsichtbaren" Macros an. Aliase die man mit dem Befehl /alias angelegt hat sind zum Beispiel unsichtbar markiert. Mit "list -i" kann man sie sich anzeigen.

> /list -s

Damit werden die Macros in einer "Kurzliste" angezeigt (Macrotyp, Matchtext und wenn vorhanden der Name).

> /list = *test*

Damit listet man alle Macros auf, die unsichtbar oder nicht unsichtbar sind und die im "body" des Macros mindestens einmal das Wort "test" enthalten

> /list -t'*b*'

Damit listet man alle Macros auf die als triggertext mindestens ein b enthalten.

> /purge

Damit werden alle Macros die sichtbar sind geloescht. Sinnvoll ist das wenn ein Trigger aus dem Ruder laeuft und nicht das macht was man will.

> /purge bbb

Damit wird der Trigger bbb geloescht. Ich habe mir aengewoehnt allen Macros eindeutige Namen zu geben um Sie schnell loeschen zu koennen (Ausnahme sind Farben). Wenn man keine Namen verwendet muss man unter Umstaenden /purge verwenden, was in gefaehrlichen Gegenden eher vermieden werden sollte.

10. Der /repeat Befehl

Manchmal moechte man eine Aktion genau zu einem bestimmten (festen) Zeitpunkt ausfuehren. Dafuer kann man das Kommando "/at" verwenden.

> /at 19:59 /echo In einer Minute laeuft die Tagesschau! Hoer auf mit mudden.

Das Kommando "/at" startet um 19:59 und gib mit "/echo" den obigen Text aus. Das ist eine Superoption um nie wieder die Metzelrunde (ich meinte natuerlich die Tagesschau) zu verpassen. Will man eine Aktion jedoch nicht nur einmal sondern alle x Minuten durchfuehren koennte ein Befehl in dieser Art dem einen oder anderen Hobbit vor dem Hungertod bewahren:

> /repeat -00:02 20 tue ni nahrung von korb von sack %; iss nahrung

Dieser Befehl holt alle 2 Minuten eine kleine Rinderhaelfte oder aehnliches aus dem Rucksack und rettet den armen Hobbit vor dem Hungertod. Der Befehl wird 20 mal ausgefuehrt. Der 1. /repeat Durchlauf beginnt nach 2 Minuten. Das Zeitformat ist entweder Stunden:Minuten:Sekunden (00:02:00, bzw. 00:02) oder -120 fuer alle 120 Sekunden.

Der /repeat Befehl kann auch das fehlende "sleep" ersetzen. "/help sleep" verweist direkt auf den /repeat Befehl. Will man einen Befehl nach einer bestimmten Zeit ausfuehren sagt man einfach nur:

> /repeat -120 1 /echo Jetzt sind die 2 Minuten abgelaufen.

Will man den "repeat" Befehl sofort starten und in 2 Minuten ein 2. mal sagt man:

> /repeat -n -120 2 /echo Test startet sofort und nach Ablauf von 2 Minuten.

Eine weitere tolle Funktion koennen wir ausprobieren waehrend obiger Befehl laeuft. "/ps" zeigt die Prozess ID (PID), wann der Befehl das naechste mal laeuft, wie oft der Befehl noch ausgefuehrt wird.

> /ps

Ausgabe: PID NEXT T D WORLD PTIME COUNT COMMAND 2 0:01:58 r 0:02:00 1 /echo Test startet sofort….

> /kill 2

Mit dem Befehl kann ein "/repeat" Befehl vorzeitig gestoppt werden. Die "2" ist die PID aus dem "/ps" Befehl. Wenn nur ein Befehl laeuft kann die PID auch mit "ps -s" direkt ausgegeben werden.

11. Der /gag Befehl

Manchmal wird durch das MUD sehr viel Text immer wieder erzeugt. Wenn jedoch zuviel Output da ist wird auch ein gewisser "Stress" erzeugt. Der Befehl "/gag" ist dem Englischen "to gag" entliehen, was uebersetzt knebeln heisst. Genau das wollen wir jetzt mal machen.

> /gag "Kleine Blitze zucken aus den Manawolken auf Dich herab."

Dieser Befehl wuerde die Regenerationsanzeige eines Magiers ausschalten.

Das Problem des Befehles ist die richtige Dosierung. Wenn man zuviel mit "*" oder aehnlichem arbeitet, kann man sich sehr schnell wichtige Meldungen ausschalten. In den falschen Gebieten keine gute Idee.

12. Der /quote Befehl

Nehmen wir an, wir haben eine Liste von Kommandos die folgendermassen aussieht:

h
h
oeffne schrank
nimm zweihaender aus schrank
nimm ruestung von schrank
nimm waffenguertel von schrank
ziehe alles an
r
r
sag jetzt kann es in den Kampf gehen

Jetzt koennten wir diese Befehle nacheinander eingeben und waeren richtig ausgeruestet. Hmm. Manuell? Jedes mal wieder? Nein.

/quote -3 '"~/befehle_fuer_tf.txt"'

Der Befehl funktioniert wie der Befehl "/repeat", nur dass bei jeder Ausfuehrung ein anderer Befehl ausgefuehrt werden kann. Das kleine Zeichen " ' " ist wichtig! Es gibt dem quote Befehl die Anweisung Wie mit dem Inhalt der Datei umgegangen werden soll:

 ' = send   = sendet den text einer Datei zeilenweise an das MUD
 ` = exec   = fuehrt den Text als ein TF-Kommando aus
 # = recall = holt den Text aus der History. z.B "/recall -i 19:40"
 ! = sh     = fuehrt den Befehl in einer shell aus.

Nehmen wir an wir haben eine Textdatei mit dem Inhalt:

/echo test
/echo text 2
/echo text 3
/echo text 4
> /quote -S /echo !cat ~/datei.txt

Das gibt den Inhalt der Datei in einem Rutsch aus. Ohne es an TF zu schicken, damit es ausgefuehrt wird und ohne es zu interpretieren.

> /quote /echo '~/testxx

Das gibt die Datei aus mit einem delay vor der Ausgabe der Zeile.

> /quote -dexec 'testxx

Versucht die Datei zeilenweise mit einem Abstand von einer Sekunde auszufuehren.

> /quote -3 -dexec #-i 19:50-19:55

Damit wird der Inhalt des Befehlspuffers von 19:50 bis 19:55 jetzt mit einem Abstand von 3 Sekunden nochmals ausgefuehrt.

(Tipp: gib mal "/recall -t -i 19:00" ein. Das Zeigt dir aehnlich dem Kommando puffer in Avalon die Befehle der (max. 24h) Zeit ab 19:00 an. Auf den Recall Befehl und seine Syntax will ich hier nicht verweisen. Deswegen: "/help recall")

Viel Erfolg! (Und EP)