Alle Formatseiten ↓
Grafik und Medien

WAV – Soundeffekte und Verdrahtung der Soundbanks

Aus coreprime/kbot @ 0ab97bf · Auf GitHub bearbeiten

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

  1. Leg eine neue WAV in sounds/ (empfohlen: Mono, 22.050 Hz, 8 Bit):

    mymod/sounds/cmdsel_grunt.wav
  2. Füge in gamedata/sound.tdf ein neues Ereignis hinzu:

    [ARM_COM]
    {
        select1=cmdsel1;       // Existing
        select2=cmdsel_grunt;  // Your new line, randomly selected
    }
  3. An der FBI ist nichts zu ändern – der vorhandene Verweis SoundCategory=ARM_COM genügt.

  4. 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 .wav ist 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ür music/*.mp3 einen 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.tdf und den Soundfeldern der Waffen.
  • Oberfläche von TA: Kingdoms – .gui-Widgets verweisen auf Sound-Ereignisse der Oberfläche.
  • Glossar – sound category.