Trautes Heym Gästebuch


Trautes Heym
Merket auf!
Talli Ho!

 

Tandaradey
Gästezimmer
Taverne

 

Spielhilfe
Wegweyser
Grundriß

 

Abonnieren


Gesangsunterricht für MMORPG-Barden

mit Vorlage für eigene Lieder

Die Werkzeuge
Die Methode
Ein fertiges Beispiel
Quellen und Verweise

Diese Anleitung soll Hilfe für all jene sein, die in MMOs gerne Reden halten, Geschichten erzählen oder insbesondere singen. Auch wenn ich an mehreren Stellen auf Besonderheiten im Zusammenhang mit dem Spiel "Der Herr der Ringe Online" eingehe, ist diese Anleitung aufgrund des eingesetzten Werkzeugs jedoch universell. Die Notwendigkeit zum Finden der hier vorgestellten Lösung ergab sich ebenfalls durch Änderungen, die der Hersteller an diesem Spiel vornahm.
Irgendwann, ich glaube es war im Jahr 2009, entschied Turbine plötzlich, daß es besser wäre, die Anzahl der zur Verfügung stehenden Aliaseinträge pro Spielfigur zu beschränken - und zwar auf 50. Nun ziehe man von dieser Zahl noch die Einträge für diverse Floskeln und Aktionen, die man im Spiel immer mal wieder schnell zur Hand haben muß, ab und es bleibt ... so gut wie nichts. Zumindest bei mir - ganz abgesehen davon, daß ich Lieder in meinem Repertoire habe, die allein aus mehr als 50 Zeilen bestehen. Zumindest besaß Turbine die Güte, bereits vorhandene Einträge unangetastet zu lassen, was es mir ermöglichte, durch Umbelegung vorhandener Aliaseinträge noch eine Weile so wie bisher weiterzumachen.
Die hier vorgestellte Methode besitzt allerdings nicht nur den Vorteil, daß sie unabhängig von der Spielfigur, ja sogar unabhängig vom Spiel funktioniert, sondern bietet darüber hinaus noch die Möglichkeit Abläufe zu automatisieren. Wer jetzt Cheater schreit, dürfte zum Einen ziemlich falsch hier sein, zum Anderen noch nicht verstanden haben, daß es hier nicht um die Erschleichung spielerischer Vorteile geht, sondern um das Überwinden motorischer Unzulänglichkeiten (Tippgeschwindigkeit). Eine ausgebildete Schreibkraft sollte vermutlich dazu in der Lage sein, selbst ohne Aliaseinträge zu singen, aber das dürfte dann mehr Arbeit als Spiel sein. Außerdem sollte man nicht vergessen, daß es auch Menschen mit körperlichen Gebrechen gibt, die ihnen beim Tippen im Wege stehen. Doch damit genug der einleitenden Worte. Kommen wir nun zur Vorstellung des Werkzeugs der Wahl.

Trennlinie

Die Werkzeuge

  • AutoHotkey

Dies ist das einzige Werkzeug, das benötigt wird. Es reicht die normale Version (v3), die nicht mehr weiterentwickelt wird. Nur wer noch höhere Ansprüche an die Programmierbarkeit stellt oder Unicode-Unterstützung benötigt, sollte/muß zur Version _L greifen. Die Einsatzmöglichkeiten dieses Programms gehen weit über den hier gezeigten Anwendungsfall hinaus. Die wesentliche Funktion ist das Lauschen auf Eingabeereignisse und die Simulation selbiger. Hier beschränken wir uns allein auf Tastaturereignisse. Das Schöne an AutoHotkey ist, daß es wirklich ganz universell einsetzbar ist, völlig losgelöst von einer bestimmten Anwendung, und daher ist das hier gezeigte Vorgehen auch für alle anderen Spiele anwendbar. Anzumerken wäre noch, daß das manuelle Singen sich mit einer Makrotastatur noch einmal wesentlich komfortabler gestalten läßt.

Trennlinie

Die Methode

Meine händische Methode sah so aus:

  • für jede Zeile des Liedes oder Verses einen Aliaseintrag mit fortlaufender Numerierung anlegen
  • beim Vortragen den ersten Alias eintippen und alle weiteren mit Hilfe des Eingabepuffers und Änderung der fortlaufenden Nummer aufrufen
  • (und bei Liedern) dabei auf das passende Timing zur Musik achten

Dieser händischen Methode entstammen die im Folgenden verwendeten Bezeichnungen für die Hotstrings. Trotz Erstellung eines automatischen Ablaufs bei Liedern, trage ich dennoch auch jede Zeile einzeln ein, so wie sie vorher als Alias im Spiel vorhanden war. Die Möglichkeit eines händischen Vortrages ist damit also nach wie vor gegeben, eben ganz so wie mit den Aliaseinträgen im Spiel. Dabei gilt es jedoch eines zu beachten:

ein Alias im Spiel wird nach der Eingabe ersetzt, ein Hotstring von AutoHotkey vorher.

Welchen Unterschied macht das? Bei Verwendung der Aliaseinträge erscheint in der Eingabezeile wieder der Alias, wenn ich mit "Pfeil hoch" die letzte Eingabe im Chatfenster aufrufe, nicht dessen Inhalt. Bei Verwendung der Hotstrings erscheint in diesem Fall der zum Hotstring hinterlegte Text und nicht sein Name, weil es das ist, was im Chatfenster tatsächlich eingegeben wurde. Es ist auch nicht möglich mit Strg+C/Strg+V den festen Namensteil eines Hotstrings immer wieder einzugeben und dann nur noch die passende Nummer zu ergänzen. Der Grund dafür ist, daß es bei AutoHotkey nicht um die Ersetzung von Text, sondern um die Ersetzung von Eingabeereignissen geht. Legt man beispielsweise ";liedauenland" in die Zwischenablage und drückt dann im Chatfenster Strg+V gefolgt von "01", dann sieht AutoHotkey eben genau das: [Strg+V] - 0 - 1. Der Hotstring heißt aber ";liedauenland01" und nicht "[Strg+V]01". Ist man allerdings im Besitz einer Tastatur mit Makrotasten, dann kann man den festen Namensteil auf eine Makrotaste legen und braucht dann nur noch diese Taste gefolgt von den passenden zwei Ziffern zu drücken.

Ich möchte nun zunächst die Vorlage vorstellen, die am Ende des Beitrags auch als Datei zum Herunterladen bereitsteht.

#Hotstring C ; case sensitivity

; Panic button
ScrollLock::
StopPlaying := true
return

::;lied<name>99::<Titel>
::;lied<name>00::/spielen <datei>
::;lied<name>xx::<Text>

::;spiel<name>::
StopPlaying := false
SendInput /spielen <datei>{Enter}
Sleep <n>
if StopPlaying
return
Goto Lied<Name>
return

::;singe<name>::
StopPlaying := false
Lied<Name>:
SendInput {Esc 2}{Enter}<Text>{Enter}
Sleep <n>
if StopPlaying
return
.
.
.
SendInput {Esc 2}{Enter}<Text>{Enter}
return

Es ist hoffentlich jedem klar, daß die Angaben in spitzen Klammern durch entsprechende Namen, Zahlen und Texte ersetzt werden müssen - spätestens jetzt.

Gehen wir nun ein wenig näher auf die einzelnen Inhalte ein.

#Hotstring C ; case sensitivity

Der Kommentar - alles nach einem Semikolon in einem Skript ist ein Kommentar - sagt es bereits, doch für die, die des Englischen nicht mächtig sind, sei es hier erläutert.
Bei dieser Zeile handelt es sich um eine Anweisung an das Programm (AutoHotkey) bei den Hotstrings doch bitte schön zwischen Groß- und Kleinschreibung zu unterscheiden. Es kann also einen Hotstring ";liedauenland" und einen Hotstring ";Liedauenland", sowie ";LiedAuenland" usw. geben, die jeder mit einem anderen Text belegt werden können. Wer lieber ein wenig mehr Fehlertoleranz bei der Eingabe hätte, kann diese Zeile komplett entfernen.

; Panic button
ScrollLock::
StopPlaying := true
return

Auch hier sagt es der Kommentar schon: es ist der Panikknopf oder Notfallschalter.
Was tun, wenn mal irgend etwas schief geht? Ein automatisierter Ablauf, wenn erstmal gestartet, läuft munter weiter und sendet seine Eingaben an die gerade aktive Anwendung. Gerade auch während der Feineinstellung des Timings für den automatischen Ablauf, ist dieser Knopf sehr hilfreich. Drückt man ihn, so wird am Ende der gerade aktiven Schlafphase der Ablauf unterbrochen. In diesem Fall ist die Rollen-Taste dieser Notaus-Taster. Ich bin mir durchaus bewußt, daß es Anwendungen gibt, in denen diese Taste sinnvoll eingesetzt werden kann. Da ich solche Anwendungen aber so gut wie nie einsetze, war diese Taste die erste Wahl für diese Funktion - zumindest nachdem ich feststellen mußte, daß es mit der Pause-Taste aus unerfindlichen Gründen nicht funktioniert. Prinzipiell ist (sollte) jede Taste oder Tastenkombination dafür geeignet (sein). Wem die Rollen-Taste dafür nicht gefällt, muß in der AutoHotkey-Anleitung die Bezeichnung seiner gewünschten Taste nachschlagen.

Der nächste Block ist das Äquivalent zu den alten Aliaseinträgen. Entgegen der obigen Aussage zu Kommentaren in Skripten sieht man hier, daß doch nicht jedes Semikolon einen Kommentar einleitet. Es kommt auch noch auf das Drumherum an. Das Semikolon ist also hier immer Bestandteil des Hotstrings. Dies einfach aus Gründen der Analogie zu den Aliaseinträgen in "Der Herr der Ringe Online", die immer mit einem Semikolon beginnen müssen. Letztlich ist die Wahl des Namens für einen Hotstring völlig frei, es müssen insbesondere keine fortlaufenden Nummern vergeben werden. Es ist lediglich eine von mir eingeführte Konvention, die ich als sinnvoll erachte und mit der ich in der Vergangenheit sehr gut spielen konnte.

Nun kommen wir zum eigentlichen Kern der Sache, dem automatisierten Ablauf.

::;spiel<name>::
StopPlaying := false
SendInput /spielen <datei>{Enter}
Sleep <n>
if StopPlaying
return
Goto Lied<Name>
return

::;singe<name>::
StopPlaying := false
Lied<Name>:
SendInput {Esc 2}{Enter}<Text>{Enter}
Sleep <n>
if StopPlaying
return
.
.
.
SendInput {Esc 2}{Enter}<Text>{Enter}
return

Zunächst einmal ist zu beachten, daß hier ein Hotstring alleine in einer Zeile steht. Auf diese Weise werden einem Hotstring mehrere Aktionen zugeordnet und nicht nur ersetzender Text wie im Abschnitt darüber. Wie zu erkennen, existieren 2 solcher Hotstrings. Der erste (;spiel<name>) ist für das Abspielen der zum Lied gehörenden ABC-Datei und springt dann zur Routine für den Gesang (;singe<name>), die die Zeilen des Liedes zeitlich gesteuert ausgibt. Zuallererst wird einmal der Panikknopf zurückgesetzt, danach die Datei abgespielt und nach Verklingen der einleitenden Noten des Liedes der Gesang begonnen, sofern nicht zwischenzeitlich der Panikknopf gedrückt wurde. Wie unschwer zu vermuten, ist die Anweisung "Sleep" zuständig für den zeitlichen Ablauf. Die Angabe der abzuwartenden Zeit erfolgt in Millisekunden. Eine Pause von 3 Sekunden wird also durch die Angabe "Sleep 3000" erreicht. Auf jede Sleep-Anweisung folgt die Prüfung des Panikknopfs. Wurde dieser gedrückt, wird der automatische Ablauf beendet.
Die drei Zeilen

Sleep <n>
if StopPlaying
return

sind also eine feste Abfolge, die zwischen je zwei Zeilen Gesang stehen müssen. Wer auf den Panikknopf verzichten will, kommt natürlich auch mit der Sleep-Anweisung alleine zwischen zwei Gesangszeilen aus.
Die eigentliche Arbeit, die mit der Erstellung des automatisierten Ablaufs einhergeht, steckt selbstverständlich in der Ermittlung der Ns für die einzelnen Sleep-Anweisungen. Im ersten Anlauf benutze ich dafür immer den ABC-Player und notiere mir die Zeiten für jede Zeile des Liedes, es geht aber auch direkt im Spiel mit Uhr oder bei besonders Begabten vielleicht rein nach Gefühl. Ein Probelauf im Spiel vor dem ersten Vortrag sollte aber immer sein. Stellt man dabei unschöne Synchronisationsfehler fest, kann man mit dem Panikknopf jederzeit aussteigen und das Skript entsprechend anpassen.

Nun kommen wir noch zu der Zeile im Skript, die für das eigentliche Singen verantwortlich ist:

SendInput {Esc 2}{Enter}<Text>{Enter}

Die Zeile erscheint unnötig kompliziert, und das ist sie auch. Sie ist in dieser Form speziell auf die Gegebenheiten des Spiels "Der Herr der Ringe Online" zugeschnitten. Für andere Spiele müssen hier entsprechende Anpassungen vorgenommen werden, und auch wenn Turbine einmal Änderungen am Spielclient vornehmen sollte, die dessen Reaktionsverhalten ändern, muß hier nachgebessert werden, falls es zu Problemen kommt. Dazu will ich die einzelnen Tastendrücke, die gesendet werden, etwas näher erläutern.

  • {Esc 2}
    schließt alle möglicherweise geöffneten Dialogfenster und deselektiert eine vorhandene Auswahl
  • {Enter}
    aktiviert das Chatfenster
  • <Text>
    der Text, der ausgegeben werden soll
  • {Enter}
    schließt die Eingabe ab und sorgt dafür, daß der Text im Spiel abgesendet wird

Der eigentliche Kniff für "Der Herr der Ringe Online" liegt in dem zweifachen Escape ganz am Anfang. Dies sorgt für einen definierten Zustand, in dem das folgende Enter ganz sicher das Chatfenster aktiviert. Zumindest theoretisch, aber in über 99% der Fälle auch praktisch. Trotzdem habe ich es bei einem Testlauf tatsächlich mal geschafft, daß der Chat nicht aktiviert wurde und plötzlich alle möglichen Fenster aufgingen. Wie ich das geschafft habe, ist mir aber immer noch ein Rätsel. Im Normalfall, also ohne Störungen im Ablauf, führt es dazu, daß vor Ausgabe des Textes das Systemmenü geöffnet und wieder geschlossen wird. Das geschieht allerdings so schnell, daß man davon gar nichts mitbekommt. Sollte aber mal jemand beispielsweise mit einer Handelsanfrage dazwischenfunken, dann ist dieses Vorgehen eine gute Vorsichtsmaßnahme. Man muß nun lediglich noch darauf achten, daß im Chatfenster ein Reiter mit dem gewünschten Ausgabekanal ausgewählt ist. Die Ausgabe des Textes kann natürlich auch noch um entsprechende Angaben für den Ausgabekanal ergänzt werden. So führt ein vorangestelltes "/sagen" dazu, daß der Text immer im /sagen landet, unabhängig davon welcher Ausgabekanal im Chat gerade ausgewählt sein sollte.
Man kann für jedes Lied ein eigenes Skript erstellen und diese alle parallel laufen lassen oder man packt alle Lieder in ein einziges Skript. Im letzten Fall darf die Definition des Panikknopfs nur einmal im Skript vorhanden sein.

Trennlinie

Ein fertiges Beispiel

Da alle Theorie grau ist, stelle ich hier auch noch eine fertige Datei zur Verfügung. Es handelt sich dabei um eins meiner ersten Lieder in "Der Herr der Ringe Online" und um eins meiner wenigen mit eigens komponierter Melodie. Und damit auch ja nichts schief geht, folgt jetzt eine Schritt-für-Schritt-Anleitung:

  1. AutoHotkey herunterladen und installieren
  2. das Skript und die ABC-Datei herunterladen
  3. die ABC-Datei ins Musikverzeichnis des Spiels verschieben
  4. das Skript ausführen
  5. ins Spiel einloggen
  6. ein Instrument ausrüsten
  7. in den Musikmodus wechseln
  8. im Chat ";spielauenland" eingeben (ohne die Anführungszeichen)

Shahn Gomeli T.B. Trennlinie Impressum