WAV – Soundeffekte und Verdrahtung der Soundbanks
Die Soundeffekte von Total Annihilation (Sprachsamples der Einheiten, Waffeneinschläge, Klicks der Oberfläche) sind ganz gewöhnliche PCM-WAV-Dateien mit 8 oder 16 Bit – am Container ist nichts TA-spezifisch. Interessant ist die Verdrahtung: wie die FBIs der Einheiten, die TDFs der Waffen und die globale Oberfläche Dateinamen über drei Stufen der Indirektion in den Soundbus leiten.
Tip
Probier es selbst.
# Play one directly
ls $(kbot ctx path)/sounds/ | head
afplay $(kbot ctx path)/sounds/cmdsel1.wav # macOS
aplay $(kbot ctx path)/sounds/cmdsel1.wav # Linux
# The web UI also previews WAV/MP3 inline
kbot mount $(kbot ctx path) --server
Auf der Platte: einfach WAV
WAV-Dateien liegen in sounds/. Sie folgen dem üblichen Format RIFF WAVE
– alles, was WAVs abspielt, spielt auch diese ab. kbot parst sie nicht als
eigenes Format; der Explorer reicht sie an das <audio>-Element des
Browsers weiter.
Typische Kodierung in den von Cavedog ausgelieferten Dateien:
| Eigenschaft | Wert |
|---|---|
| Abtastrate | 22.050 Hz (die meisten), 11.025 Hz (einige Klicks der Oberfläche) |
| Bittiefe | 8-Bit-PCM ohne Vorzeichen |
| Kanäle | Mono |
| Dauer | 0,1–3 Sekunden |
| Dateigröße | 5 KB – 200 KB |
Mods liefern gelegentlich Stereo-Samples mit 16 Bit aus; die Engine akzeptiert sie, aber sie kosten mehr Speicher.
Die drei Stufen der Verdrahtung
Die Frage „Was wird abgespielt, wenn der Arm Commander ausgewählt wird?“ folgt dieser Kette:
FBI gamedata/sound.tdf sounds/
┌─────────────┐ ┌───────────────────────┐ ┌──────────────┐
│ units/ │ │ [ARM_COM] │ │ cmdsel1.wav │
│ armcom.fbi │ │ { │ │ │
│ │ ──▶ │ select1=cmdsel1; │ ──▶│ │
│ Sound │ │ ok1=cmdok1; │ │ │
│ Category= │ │ ... │ │ │
│ ARM_COM; │ │ } │ │ │
└─────────────┘ └───────────────────────┘ └──────────────┘
1. FBI picks 2. sound.tdf maps 3. WAV file
a category event → filename on disk
Stufe 1 – SoundCategory in der FBI
Die FBI einer Einheit nennt eine Kategorie:
[UNITINFO]
{
UnitName=ARMCOM;
SoundCategory=ARM_COM; // ← points at [ARM_COM] in sound.tdf
...
}
Kategorien werden von mehreren Einheiten gemeinsam genutzt – jede Variante des Arm Commander oder jeder Arm-K-Bot zeigt auf dieselbe Kategorie, damit die Auswahlstimmen innerhalb einer Seite einheitlich bleiben.
Stufe 2 – gamedata/sound.tdf
Die TDF verknüpft innerhalb einer Kategorie Ereignisse der Engine mit WAV-Dateinamen:
[ARM_COM]
{
select1=cmdsel1; // Selecting the unit
ok1=cmdok1; // Movement order acknowledged
arrived1=cmdarvd1; // Reached destination
cant1=cantdo4; // Order rejected ("I can't do that")
underattack=warning1; // Took damage
count5=count1; // Commander self-destruct countdown (5)
count0=count6; // …countdown (now)
canceldestruct=cancel2;
}
Beachte das Suffix 1 bei den meisten Ereignisnamen. Jedes Ereignis
kann eine ganze Familie von Auswahlmöglichkeiten haben: den einfachen
Schlüssel (select) und die nummerierten Schlüssel select1, select2,
select3, …; die Engine wählt für Abwechslung zufällig einen davon. Ist
nur select1 definiert, wird jedes Mal dieselbe Zeile abgespielt.
TA 3.1c liest für jedes Ereignis den einfachen Schlüssel, falls
vorhanden, dann KEY1, KEY2, … bis zur ersten fehlenden Nummer: Bei
select1=kbarmsel; select3=kbarmse2; wird immer nur kbarmsel abgespielt,
weil das fehlende select2 die Liste beendet. (Ein fehlender einfacher
Schlüssel hält die nummerierten nicht auf.) Ein leerer Wert ist eine
stumme Auswahl. Schlüssel, die keinem der unten aufgeführten Ereignisse
entsprechen, werden nie abgespielt.
Stufe 3 – sounds/<name>.wav
Der Wert in der TDF ist der Stamm (ohne die Endung .wav). Die Engine
sucht sounds/<stem>.wav im virtuellen Dateisystem.
Important
Das Suffix .wav ist implizit. Schreibst du in die TDF
select1=cmdsel1.wav, sucht die Engine nach sounds/cmdsel1.wav.wav
und spielt stillschweigend nichts ab.
Standard-Ereignisschlüssel
TA 3.1c liest aus der Soundkategorie einer Einheit 23 Ereignisse, jedes
als einfachen Schlüssel plus die oben beschriebene nummerierte Familie
(ok, ok1, ok2, …):
| Ereignis | Wann es ausgelöst wird |
|---|---|
select |
Einheit ausgewählt. |
underattack |
Einheit nimmt Schaden. |
activate / deactivate |
Ein-/Aus-Schalter (Radar, Störsender, Befestigungen). |
ok |
Befehl angenommen. |
arrived |
Einheit beendet eine Bewegung. |
cant |
Befehl abgelehnt (Gelände, Bauliste usw.). |
unitcomplete |
Einheit fertig gebaut. |
build |
Baueinheit beginnt zu bauen. |
repair |
Baueinheit beginnt zu reparieren. |
working |
Baueinheit gewinnt zurück / lässt wiederauferstehen. |
load / unload |
Transporter nimmt eine Einheit auf / setzt sie ab. |
cloak / uncloak |
Einheit tarnt sich / enttarnt sich (die Commander). |
capture |
Commander bzw. übernahmefähige Einheit beginnt eine Übernahme. |
count5 … count0 |
Ticks des Selbstzerstörungs-Countdowns. |
canceldestruct |
Selbstzerstörung abgebrochen. |
Jeder Schlüssel kann einen passenden Eintrag KEYtext (select1text) mit
dem Untertitel der Zeile haben. Andere Schlüssel in der Kategorie werden
ignoriert.
Einheitenbetrachter und Sandbox von KBot Studio folgen denselben Regeln:
Die Metadaten der Einheit (/api/studio/unit/{name}) enthalten genau die
Schlüssel, die das Spiel für diese Ereignisse abspielt, und jedes Ereignis
spielt zufällig einen seiner Schlüssel ab.
Sounds der Oberfläche – allsound.tdf
Ereignisse der Oberfläche (Klicks auf Schaltflächen, Menüwechsel, Jingles
am Spielende) sind auf dieselbe Weise verschlüsselt, stehen aber in
Abschnitten im Stil von [GLOBAL_*] in gamedata/allsound.tdf:
[BIGBUTTON] { sound=butmain1; }
[SMLBUTTON] { sound=button1; }
[SKIRMISH] { sound=butnskir; }
[BGM] { sound=drone2; } // Background music ID
Diese Abschnitte werden von den .gui-Dateien der Menüs über den Namen
referenziert. Um den Klickton der Schaltfläche „Skirmish“ zu ändern,
musst du nur diese TDF bearbeiten – die .gui bleibt unberührt.
Waffensounds
Waffen-TDFs (TDF) enthalten ihre eigenen Soundschlüssel direkt, ohne Zwischenstufe:
[LIGHTLASER] {
...
soundstart=lasrmas1; // On fire
soundhit=lasrhit1; // On impact
soundwater=splshbig; // On water hit (overrides soundhit)
soundtrigger=1; // Play soundstart on each burst pulse, not just first
}
Es gilt dieselbe Suche nach sounds/<stem>.wav. Waffensounds sind pro
Schuss abgestimmt – wenn du die Waffe einer Einheit änderst, musst du auch
die Lautstärken in der Waffen-TDF neu abstimmen.
Beispiel im Detail – eine neue Auswahlstimme hinzufügen
Leg eine neue WAV in
sounds/(empfohlen: Mono, 22.050 Hz, 8 Bit):mymod/sounds/cmdsel_grunt.wavFüge in
gamedata/sound.tdfein neues Ereignis hinzu:[ARM_COM] { select1=cmdsel1; // Existing select2=cmdsel_grunt; // Your new line, randomly selected }An der FBI ist nichts zu ändern – der vorhandene Verweis
SoundCategory=ARM_COMgenügt.Packen und testen:
kbot hpi pack ./mymod --target mymod.ufo
Die Engine wechselt jetzt zwischen cmdsel1.wav und cmdsel_grunt.wav,
wenn der Commander ausgewählt wird.
Typische Größen
| Asset | Beobachteter Bereich in Cavedogs Assets |
|---|---|
| Sprachzeile einer Einheit | 5–60 KB |
| Waffeneinschlag | 5–30 KB |
| Explosion | 30–120 KB |
| Musikschleife | 100 KB – 1 MB |
gamedata/sound.tdf |
~20 KB (über 300 Kategorien) |
gamedata/allsound.tdf |
~6 KB |
Stolperfallen
Warning
Eine fehlende WAV ist stumm, kein Fehler. Vertipp dich bei
select1=cmsdel1 (vertauschte Buchstaben), und die Engine spielt bei der
Auswahl einfach nichts ab – keine Log-Meldung, kein Ersatz. Teste
geänderte Sounds immer im Spiel.
- Die Endung
.wavist implizit – schreib sie nie in den Wert der TDF. - Die Abtastrate spielt eine Rolle. Sounds, die nicht mit 8 kHz / 11,025 kHz / 22,05 kHz / 44,1 kHz abgespielt werden, können auf Hardwarepfaden aus der Zeit von Windows 9x stottern, die manche Engines der Verkaufsversion noch verwenden. 22.050 Hz Mono ist der sichere Standard.
- Stereo-WAVs werden von der Engine auf Mono heruntergemischt. Liefere kein Stereo aus, sofern du keinen besonderen räumlichen Grund dafür hast.
- MP3 in
sounds/– die Engine ignoriert MP3s hier. Der Musikplayer hat fürmusic/*.mp3einen eigenen Codepfad. - Cavedog liefert manche WAVs mit 16-Bit-PCM und seltsamen Abtastraten aus (z. B. 7.000 Hz) – sie funktionieren trotzdem, aber wenn du Werkzeuge baust, die von 22.050/8/Mono ausgehen, stolperst du darüber.
Siehe auch
- TDF – das Format von
sound.tdf,allsound.tdfund den Soundfeldern der Waffen. - Oberfläche von TA: Kingdoms –
.gui-Widgets verweisen auf Sound-Ereignisse der Oberfläche. - Glossar – sound category.