Für Scripter: Info über Sprachausgabe und Soundsamples

Hier ist der ideale Ort um über Scripts und Mods für X²: Die Bedrohung zu diskutieren.

Moderators: Scripting / Modding Moderators, Moderatoren für Deutsches X-Forum

User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Für Scripter: Info über Sprachausgabe und Soundsamples

Post by SpaceTycoon »

Hi all!

ich habe mich in letzter Zeit ein wenig mit den Scriptbefehlen im Bereich "Audio Commands" des Scripteditors beschäftigt. Und Entsprechendes (Sprachausgaben) nun schon in meine Scripte der Tarnvorrichtung ST1 und der Navigationssoftware ST1 eingebaut.

Ein bischen mehr Sound und/oder Sprache an geeigneten Stellen bereichert das Spiel ja durchaus. Daher will ich hier meine "Forschungsergebnisse" mit Euch teilen.

1. Sprachausgabe
Hierfür ist nur der seit Version 1.4 neu hinzugekommene Befehl
<RetVar/IF/START>speak text:page=... wirklich geeignet.
Die Befehle "send audio message" und "send incoming message" können nur mit den vier Audios ([IncomingTransmission.Message], [IncomingTransmission.Greeting], usw.) die unter den Konstanten zu finden sind, verwendet werden. "Play Sample"-Befehle sind nur für die kleinen Geräusche (wav-Dateien) verwendbar.
Der Befehl "speak text" kann mit oder ohne einer Variablenbelegung aufgerufen werden oder aber mit dem Präfix START.
Hier gibt es folgenden Unterschied:
Mit Präfix START läuft das Script ohne Unterbrechung weiter, während die Sprachnachricht abgespielt wird.
Mit (oder ohne) Returnvariable bleibt das Script bis Ende der Sprachnachricht 'stehen' und läuft dann erst weiter. Weist man eine Variable zu, so enthält diese nur TRUE oder FALSE.
In der Sprach-Datei 490001.xml sind folgende Page-IDs für den Befehl "speak text" interessant, weil diese in der AudioDatei \mov\00149.dat (kann im Windows Media-Player 9 abgespielt werden) in gesprochener Form vorhanden sind:
  • Page ID 7 - Die Sektornamen
    Page ID 9 - Gesprochene Buchstaben A bis Z
    Page ID 12 - Gesprochene griechische Buchstaben Alpha, Beta, etc.
    Page ID 13 - Worte und Sätze (können zusammengesetzt werden!)
    Page ID 17 - Alle Produkte, Schiffe, Fabriken und ihre Texterklärung
    Page ID 1901 - Einige kurze Sätze (in der Story verwendet)
Beispiele:

Code: Select all

001   START speak text: page=13 id=130 priority=10
002   return null
Boardcomputer spricht den Satz "Bitte erteilen sie einen neuen Steuerbefehl", der unter Page-ID 13/Text-ID 130 hinterlegt ist. Durch Präfix START wird sofort der Befehl "return null" ausgeführt und das Script beendet, auch wenn der Computer noch spricht.

Code: Select all

001   $AudioMessage = speak text: page=13 id=130 priority=10
002   return null
Wie zuvor, aber erst wird der Text gesprochen und in der Variable "$AudioMessage" landet TRUE oder FALSE, je nachdem ob der Text erfolgreich gesprochen wurde oder nicht. Erst nach Abschluß der Sprachausgabe wird "return null" ausgeführt und das Script beendet.

Code: Select all

001   $AudioMessage = speak text: page=17 id=2133 priority=10
002   START speak text: page=13 id=24 priority=10
003   return null
Bordcomputer spricht "Triebwerkstuning nicht installiert". Das Wort "Triebwerkstuning" ist 17-2133, "nicht installiert" ist 13-24. So lassen sich aus den vorhandenen Sprachtexten neue Sätze bilden. In Zeile 001 wartet das Script bis zum Abschluß des Wortes "Triebwerkstuning". Sonst würden sich die beiden Sprachausgaben gegenseitig 'überschreiben'. Weil anschließend nicht mehr gewartet werden muß, kann in Zeile 002 dann mit Präfix START gearbeitet werden um parallel zur Sprache das Script weiter laufen zu lassen.
Allerdings ist diese Methode nicht ganz sauber. Schöner ist es, für Sprachausgaben, die aus verschiedenen Teilen zusammengesetzt sind, wie folgt zu arbeiten:

1. Erstellen (oder erweitern) einer eigenen Sprach-xml im Ordner /t. Beispiel-> Datei 498765.xml mit Inhalt:
  • <?xml version="1.0" encoding="UTF-8" ?>
    <language id="49">
    <page id="8765" title="Scriptmeldungen" descr="Sprachnachrichten an den Spieler">
    <t id="1001">{17,2133}{13,24}</t>
    </page>
    </language>
2. Aufruf des Sprachtextes aus dieser Sprachdatei im Script:

Code: Select all

001   load text: id=8765
002   START speak text: page=8765 id=1001 priority=10
003   return null
Ebenfalls spricht "Betty" (der Bordcomputer) wieder "Triebwerkstuning nicht installiert". Jedoch weniger abgehackt und die parallele schriftliche Ausgabe auf dem Bildschirm ist ebenfalls nicht mehr geteilt. Der Befehl "load text" in Zeile 001 muß nicht jedesmal wieder benutzt werden! Normalerweise wird dieser Befehl in einem init- oder setup-Script nur einmal beim Laden des Spieles ausgeführt um die Sprachdatei 498765.xml (die Nummer ist nur ein Beispiel) in den Speicher zu laden. Auf deren Page-ID's und Text-IDs kann dann von allen Scripten aus zugegriffen werden.

Ich denke, das dürfte genügen um schöne Sprachausgaben in die Scripte 'zaubern' zu können. Ein bischen selber experimentieren kann auch nicht schaden :)

Die Befehle "send audio message" und "send incoming message" sind im MSCI-Handbuch (siehe Bonusdownloads) schon ausreichend erklärt. Damit lassen sich leider nur die vier Sprachtexte unter den Konstanten ausgeben, wie bereits oben beschrieben. Daher halte ich mich damit hier nicht weiter auf. Das Gleiche gilt für den Befehl "play sample:incoming transmission".


2. Geräusche
Zur Ausgabe von Geräuschen dient der Befehl "play sample <Var/Number>". Die Geräusche, die man ausgeben kann sind im MSCI-Handbuch unter Anhang A2 (Seite 91 folgende) aufgeführt. Folgender Code gibt beispielsweise das Geräusch des Mineralienscanners aus:

Code: Select all

001   play sample 966
002   return null
Leider sind die Geräusche oft sehr kurz und sehr leise. Auch ist man eigentlich auf diese Geräusche der MSCI-Liste festgelegt.
Nein, doch nicht! Es gibt Abhilfe :mrgreen:
Mit folgendem Code ist das Geräusch 966 (Mineralienscanner) nicht nur viel lauter, sondern auch noch länger:

Code: Select all

001   $A = 10
002   while $A > 0
003    play sample 966
004    dec $A = 
005   end
006   return null
Das heißt, man muß den play sample Befehl nur in einer Schleife laufen lassen und schon ist das Ergebnis wirklich ansprechend. Und nicht nur ein kurzes, leises "PlinkPloink" :)
Ich hatte mit verschiedensten Schleifenlängen ($A=60, usw.) und den verschiedensten Geräuschen (Nummern im MSCI-Handbuch) experimentiert. Je nach Länge der Schleife hörten sich dieselben Geräusche sogar ziemlich unterschiedlich an. So kommt man also durch die Schleifenlänge auch noch an andere Geräusche als die vorgegebenen.
Der Sound wird immer noch ausgegeben, wenn die Schleife schon lange durchlaufen ist und im Script schon längst die nächsten Befehle abgearbeitet werden...

Auch hier denke ich, das sollte reichen, um wirklich nette Geräusche in Scripten zu produzieren. Für weiteres muß jeder damit selber nun mal experimentieren. :)
XFile
Posts: 270
Joined: Wed, 2. Mar 05, 21:56
x2

Post by XFile »

Super Arbeit! Hab mich schon gefragt wie man die ganzen Texte aus der 00149.dat abspielen kann.
Lin Kuei Ominae
Posts: 712
Joined: Fri, 9. Apr 04, 23:46
x2

Post by Lin Kuei Ominae »

im zuge des Projekt Privatjacht das nun draussen ist, würde mich interessieren, ob es auch möglich ist, das nur in speziellen Räumen (modifzierte Geschützkanzeln) spezielle sounds abgespielt werden.
z.B. wäre es toll wenn die Blitze in unserem Generatorraum auch wirklich ein Blitzgeräusch abgeben.

Ist sowas möglich?
Der kürzeste X2 Witz
Schreit ein Borone: Hilfe ich ertrinke!
Die dümmsten Unfälle im X Universum
ein Teladi biss sich auf die Zunge! Seitdem hat er einen Sprachfehler und lissssspelt.

Mod: Privatjacht
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

Lin Kuei Ominae wrote:im zuge des Projekt Privatjacht das nun draussen ist, würde mich interessieren, ob es auch möglich ist, das nur in speziellen Räumen (modifzierte Geschützkanzeln) spezielle sounds abgespielt werden.
z.B. wäre es toll wenn die Blitze in unserem Generatorraum auch wirklich ein Blitzgeräusch abgeben.
Ist sowas möglich?
Sollte möglich sein. Über bedingte Verzweigung
  • (if dies
    ...tue das
    else
    ...tue etwas anderes
    end)
ist vieles möglich.
Zum Beispiel lasse ich in meinem Script "Navigationssoftware" die Sprache nur für den Spieler selbst ausgeben, wenn das Script auf einem anderen Schiff läuft, bleibts still.
XFile
Posts: 270
Joined: Wed, 2. Mar 05, 21:56
x2

Post by XFile »

Nun,
1. Man bräuchte einen Befehl, welcher zurückgibt welches Turret der Spieler gerade "anschaut".

2. Man müsste mit einer endlosschlaufe dies überprüfen lassen, obendrein nicht alle 2min sondern innerhalb von einigen millisekunden. Dies würde enorme Sytemressourcen fressen und ist daher nicht wirklich sinnvoll.

Tut mit leid, aber zumindest mit einer Schleife wird das nix.... :cry:

Return to “X²: Die Bedrohung - Scripts und Modding”