[Tool] Beliebig langsam lesen ohne Sprachausgabe (B.lang.loS)
Sumpfkrautjunkies Redefix beherrscht die Aufgabe die dieses Tool behandelt mindestens genauso gut und ist besser benutzbar. Ich empfehle daher Redefix anstelle von B.lang.los zu nutzen.
Bei einer Mod ohne Sprachausgabe kommt man mit dem Untertitel lesen manchmal kaum hinterher. Daher habe ich mir ein Programm geschrieben, das mir hilft Dateien ohne Sprachausgabe mit stillen Wave-Dateien einer geeigneten Länge zu verknüpfen. Dies veranlasst Gothic die Untertitel solange anzuzeigen wie die stille Wave-Datei eben dauert.
Auf Anfrage hab ich mich nun hingesetzt und das Programm für dritte benutzbar gemacht und mit einer kurzen Dokumentation versehen.
Code:
//#############################################################//
// ___ _ _ ___ //
// ( _`\ (_ ) (_ ) ( _`\ //
// | (_) ) | | _ _ ___ __ | | _ | (_(_) //
// | _ <' | | /'_` )' _ `\ /'_ `\ | | /'_`\ `\__ \ //
// | (_) ) _ | | ( (_| | ( ) |( (_) | _ | | ( (_) )( )_) | //
// (____/'(_)(___)`\__,_)_) (_)`\__ |(_)(___)`\___/'`\____) //
// ( )_) | //
// \___/' //
//#############################################################//
//--------------------------------------
// B.lang.loS? Was ist das?
//--------------------------------------
B.lang.loS ist ein Werkzeug, das Gothic Untertiteldateien bearbeitet.
Denjenigen Dialogeinheiten (im Folgenden Output Units, OU), für die
keine Sprachausgabe existiert, werden stille Wavedateien einer geeigneten
Länge zuordnet, die sich an der Anzahl der Zeichen in der OU orientiert.
//--------------------------------------
// Warum braucht man das?
//--------------------------------------
Normalerweise bleibt ein Untertitel solange angezeigt, wie die
zugehörige Sprachausgabe dauert. Das ist sinnvoll.
Allerdings gibt es Mods, die keine Sprachausgabe mitliefern,
in diesem Fall wird die Anzeigedauer anderweitig bestimmt.
Leider hat Gothic ein schlecht eingestelltes Verfahren um diese
Zeitdauer zu bestimmen. Oftmals verschwinden Untertitel bevor der
Spieler sie zu Ende lesen konnte. Von den Scripten aus kann man da
nicht viel machen. Was man aber machen kann, ist Gothic eine
Sprachausgabe vorzutäuschen indem auch unvertonte Output Units
mit Wave-Dateien verknüpft werden. Wenn diese Wave-Dateien
still sind, bekommt der Spieler davon nicht mit.
Hier setzt B.lang.loS an:
B.lang.loS durchsucht die Untertitelbibliothek von Gothic ("*.CSL")
und assoziert Dateien, für die keine Sprachausgabe existiert
abhängig vom Länge der Textzeile mit wave Dateien eines bestimmten Musters.
//--------------------------------------
// Genaue Funktionsweise:
//--------------------------------------
Zunächst sucht B.lang.loS nach wave Dateien in einem vorgegebenen
Verzeichnis (siehe config.ini -> SpeechFilePath). Diese Information wird
genutzt um zwischen OUs mit Sprachausgabe und solche ohne Sprachausgabe
zu unterscheiden.
Anschließend durchsucht B.lang.loS die angegebene Untertitelbibliothek
(siehe config.ini -> CSLPath). Für jede OU, für die keine Sprachausgabe
existiert und die außerdem nicht "SVM_" im Namen trägt, wird eine neue
wave-Datei eingetragen und zwar:
[silenceDiaPrefix]_[X].wav
wobei [silenceDiaPrefix] in der config.ini frei gewählt werden kann
und [X] die für diese Datei berechnete Anzeigedauer in Sekunden ist.
Dieses X berechnet sich auf folgende Art:
X = L / [charsPerSecond]
wobei L die Länge dieses Untertitels in Zeichen ist und [charsPerSecond]
die in der config.ini einstellbare Anzahl von Zeichen, die ein Spieler
in einer Sekunde vermutlich lesen kann. X wird stets aufgerundet.
Dabei wird X niemals über den Wert [maximumLength] steigen. Dieser Parameter
ist ebenfalls in der config.ini Datei konfigurierbar. [maximumLength] ist
also eine obere Schranke, falls die oben genannte Formel etwas größeres
als [maximumLength] liefert wird X trotzdem nur auf [maximumLength] gesetzt.
Die veränderte CSL Datei wird im selben Ordner wird die Quelldatei abgelegt.
//--------------------------------------
// Benutzung von B.lang.loS:
//--------------------------------------
Die *.CSL Datei kann mit dem Spacer oder zum Beispiel mit Sumpfkrautjunkies
Programm "Redefix" erstellt werden. An ihr kommt man bei der Untertitel-
erstellung kaum vorbei, wenn man nicht gerade mit dem Gothic Sourcer arbeitet.
Ist diese Datei einmal vorhandenn, muss vor dem Ausführen von B.lang.loS
noch die config.ini im selben Ordner angepasst werden.
Ist dies geschehen, kann das Programm gestartet werden.
Die erstellte .CSL Datei kann anschließend von Gothic verarbeitet werden
(vorher sollte man sie geeignet umbenennen).
Dabei entsteht die .BIN Datei, die ins Modarchiv gehört.
Fragen kann ich gerne im Releasethread beantworten. Ich hoffe das Tool
hilft dir weiter und ist nicht allzu schwer zu verstehen.
Viele Grüße
Sekti
Kurzes Beispiel für Leute, die mal eine CSL Datei aufgemacht haben: Vorher:
Code:
[% zCCSBlock 0 8701]
blockName=string:DIA_VEL_ANDRE_ALBRECHT_17
numOfBlocks=int:1
subBlock0=float:0
[% zCCSAtomicBlock 0 8702]
[% oCMsgConversation:oCNpcMessage:zCEventMessage 0 8703]
subType=enum:0
text=string:Das verstehe ich nicht! Was kann denn noch unmittelbarer sein, als eine Bedrohung durch die Orks?
name=string:DIA_VEL_ANDRE_ALBRECHT_17.WAV
[]
[]
[]
Nachher:
Code:
[% zCCSBlock 0 8701]
blockName=string:DIA_VEL_ANDRE_ALBRECHT_17
numOfBlocks=int:1
subBlock0=float:0
[% zCCSAtomicBlock 0 8702]
[% oCMsgConversation:oCNpcMessage:zCEventMessage 0 8703]
subType=enum:0
text=string:Das verstehe ich nicht! Was kann denn noch unmittelbarer sein, als eine Bedrohung durch die Orks?
name=string:DIA_SILENCE_7.WAV
[]
[]
[]
Das Programm ist relativ gut konfigurierbar (das heißt man kann in gewissen grenzen beeinflussen wie sich im obigen Beispiel die Zahl 7, das heißt die 7 Sekunden Stille für diese Datei berechnen).
Ich hoffe ich kann damit zumindest mal Lonewulf helfen, wenns noch mehr gibt, umso besser.
Hö?
Ist das dafür da, damit die Textboxen nicht zu schnell verschwinden, wenn es keine Sprachausgabe gibt?
Bei mir ist das immer so, wenn es keine Sprache gibt bleibt die Dialogbox so lange stehen bis ich sie wegklicke...
Oder halluziniere ich? (Dabei hab ich das schon öfters bewusst erlebt und fand es immer sehr intelligent gelöst)
Dazu ist es.
Allerdings scheinst du immer recht schnell zu klicken, bzw. du liest so schnell, dass du dann halt weiter klickst, ohne weiter zu warten.
Bei langen Untertitelzeilen kann das aber mal nicht klappen (man ist zu langsam mit dem Lesen) und dann sind die Untertitel nunmal weg, bevor man zuende gelesen hat, da das Spiel eben nicht ewig auf einen Mausklick wartet.
Oparilames nachdem er seinen Gesellenbrief erhalten hat:
»Das war's mit dir, du Mistvieh!«
Es gibt in Constants.d die Konstante VIEW_TIME_PER_CHAR, in der die Zeit eingetragen wird, die Dialogfenster offen bleben, wenn keine Sprachausgabe existiert.
Das Tool hilft halt, die Anzeigezeit einzeln anzupassen.
Besagte Konstanze scheint jedoch nicht benutzt zu werden, zumindest hat Lonewulf das hier erzählt, woraufhin der Bedarf für so ein Tool das vermutlich erste Mal öffentlich ausgesprochen worden ist.
Das Programm passt halt die .wav-Dateibezeichnunen an (die AI_Output-Aufrufe für den Text bleiben dabei ja gleich) und schreibt glaube ich auch die benötigten Sound-Datein, die x-Sekunden lang "Nichts" abspielen und somit die Anzeigedauer überrumpeln.
Oparilames nachdem er seinen Gesellenbrief erhalten hat:
»Das war's mit dir, du Mistvieh!«
Hö?
Ist das dafür da, damit die Textboxen nicht zu schnell verschwinden, wenn es keine Sprachausgabe gibt?
Genau!
Bei mir ist das immer so, wenn es keine Sprache gibt bleibt die Dialogbox so lange stehen bis ich sie wegklicke...
Oder halluziniere ich? (Dabei hab ich das schon öfters bewusst erlebt und fand es immer sehr intelligent gelöst)
Zitat von Marthog
Es gibt in Constants.d die Konstante VIEW_TIME_PER_CHAR, in der die Zeit eingetragen wird, die Dialogfenster offen bleben, wenn keine Sprachausgabe existiert.
Das Tool hilft halt, die Anzeigezeit einzeln anzupassen.
Wie Opa sagt: Die Konstante wird vom Spiel nicht benutzt.
Die Anzeigezeit wird auf blöde Art berechnet:
Zunächst mal wird viel zu viel Zeit veranschlagt für eine Menge Text. ABER: Es gibt ein Maximum von 8 Sekunden, sobald das erreicht ist, wird der Untertitel trotzdem nur 8 Sekunden angezeigt.
Wenn man also dazu neigt kurze Untertitel zu machen, werden die Wartezeiten tendenziell zu lang sein, wenn man sehr lange Untertitel macht, werden sie eher zu kurz sein.
Zitat von Oparilames
Besagte Konstanze scheint jedoch nicht benutzt zu werden, zumindest hat Lonewulf das hier erzählt, woraufhin der Bedarf für so ein Tool das vermutlich erste Mal öffentlich ausgesprochen worden ist.
Das Programm passt halt die .wav-Dateibezeichnunen an (die AI_Output-Aufrufe für den Text bleiben dabei ja gleich) und schreibt glaube ich auch die benötigten Sound-Datein, die x-Sekunden lang "Nichts" abspielen und somit die Anzeigedauer überrumpeln.
Die Sounddateien werden von dem Tool nicht erzeugt, aber es liegt ein passender Satz Dateien bei für Länge von 1 bis 30 Sekunden.
Ich konnte das Tool zum Beispiel für die Englische Velaya Version gebrauchen. Nicht jeder, der Velaya auf Englisch spielt ist ein Muttersprachler, außerdem hat Velaya tendenziell lange Untertitel. Entsprechend gabs Stress beim mitlesen, den ich so für die Spieler abgemildert habe.
Auch zum Testen kann das nützlich sein, wenn man auf Rechtschreibfehler lesen möchte. Dazu kann man sich die Zeit einfach so hochstellen, dass es immer ausreicht (und wenn man fertig ist den Untertitel wegklicken).
B.lang.loS... jungs, ihr habt die geilsten einfälle was programmnamen angeht, echt! ADOUSADS, Stampfer, B.lang.loS, Dia-DEPP... oh maaaaaaan, wie geil! Das ringt mir immer einen lachanfall ab!
So und nun zum ernsten *crm crm*
ich finde das Tool praktisch, weil mir echt immer die "Zeilen davonlaufen". So hat man endlich mal genug Zeit zum lesen.
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
B.lang.loS... jungs, ihr habt die geilsten einfälle was programmnamen angeht, echt! ADOUSADS, Stampfer, B.lang.loS, Dia-DEPP... oh maaaaaaan, wie geil! Das ringt mir immer einen lachanfall ab!
So und nun zum ernsten *crm crm*
ich finde das Tool praktisch, weil mir echt immer die "Zeilen davonlaufen". So hat man endlich mal genug Zeit zum lesen.
Na, sooo lustig ist es nun auch mal wieder nicht.
@topic: Ich finde die Idee grundsätzlich nicht schlecht, aber man wird es halt nicht oft nutzen können.
@topic: Ich finde die Idee grundsätzlich nicht schlecht, aber man wird es halt nicht oft nutzen können.
In welcher Sprache ist es eigentlich geschrieben?
Ist in Delphi geschrieben. Wenn Interesse am Quellcode besteht, kann ich den auch noch hochladen.
Dass es wenige Leute brauchen werden ist klar. Ich habe es wie gesagt für mich geschrieben, und jetzt nur veröffentlicht, weil sich abzeichnet, dass es evtl. auch bei Returning Verwendung dafür geben könnte.
Eine andere Sache wo es nützlich wäre (ohne die Entwickler gefragt zu haben): Nox Corvi! Für die Latein-Texte wärs sicher auch gut, wenn sie nicht gleich wieder verschwinden.
Wow, das ging ja schneller als erwartet, erst mal ein ganz großes Dankeschön von mir.
Hab´s gerade mal kurz angetestet und die Voreinstellung scheint schon ganz passrecht zu sein.
Das der Parameter "baseLength" nach deiner Aussage in der config.ini "nicht sonderlich praktisch" ist glaube ich eher nicht, denn nach dem erste Eindruck waren gerade die sehr kurzen Dialoge jetzt sehr fix, wogegen ich bei den richtig langen Dialogen am Ende manchmal noch ein klein wenig Zeit hatte.
Folgt nach einem langen Dialog ein sehr Kurzer, und man lässt nach dem durchlesen des Langen den Blick kurz verträumt in der Landschaft schweifen muss man aufpassen das der darauf folgende Kurze nicht schon wieder weg ist bevor man die Augen drauf justiert hat.
Daher scheint der Parameter "baseLength" sich ganz gut als allgemeiner Reaktionszeit-Aufschlag zu eignen.
Folgendes Bild zeigt die Dialogverteilung mit der Standardeinstellung (nur die Dialoge zu denen aus DNDR kein Dialogfile existiert) [Bild: attachment.php?attachmentid=28108&d=1266662449&thumb=1]
Im Bereich 14 bis 19 Sekunden befinden sich zwar nur zwei Dutzend Dialoge, aber da wären die meisten mit der von Gothic vorgegebenen Maximalzeit kaum bis zur Hälfte vorgedrungen.
Ist in Delphi geschrieben. Wenn Interesse am Quellcode besteht, kann ich den auch noch hochladen.
Dass es wenige Leute brauchen werden ist klar. Ich habe es wie gesagt für mich geschrieben, und jetzt nur veröffentlicht, weil sich abzeichnet, dass es evtl. auch bei Returning Verwendung dafür geben könnte.
Eine andere Sache wo es nützlich wäre (ohne die Entwickler gefragt zu haben): Nox Corvi! Für die Latein-Texte wärs sicher auch gut, wenn sie nicht gleich wieder verschwinden.
Achso, Delphi. Da entrinnt mir leider nur ein "schade", da ich selbst mich "nur" mit C# und C++ befasse.
Naja, hätte mir den Quellcode gern mal angeschaut.
Trotzdem schönes Tool.!
Naja, hätte mir den Quellcode gern mal angeschaut.
Kannst du gerne tun.
Ist nicht weiter kompliziert (das Programm ist kleiner als Readme und Config ). Ich habe den Quelltext mal angehängt. Beide enthaltenen Dateien sind Textdateien. RecSearch.pas enthält eine Hilfsroutine, die ich benötige, um alle Dateien in einem Verzeichnis zu finden. Project1.dpr ist das (nicht sinnvoll benannte) Hauptprogramm.
Ist nicht weiter kompliziert (das Programm ist kleiner als Readme und Config ). Ich habe den Quelltext mal angehängt. Beide enthaltenen Dateien sind Textdateien. RecSearch.pas enthält eine Hilfsroutine, die ich benötige, um alle Dateien in einem Verzeichnis zu finden. Project1.dpr ist das (nicht sinnvoll benannte) Hauptprogramm.
Auch wenn ich mich mit Pascal und Delphi nie wirklich auseinandergesetzt habe, kann ich es mir ja mal anschauen. ^^