Tutte le pagine dei formati ↓
Grafica e media

WAV — Effetti sonori e collegamento dei banchi sonori

Fonte: coreprime/kbot @ 0ab97bf · Modifica su GitHub

Gli effetti sonori di Total Annihilation (campioni vocali delle unità, impatti delle armi, clic dell'interfaccia) sono normalissimi file WAV PCM a 8 / 16 bit: il contenitore non ha nulla di specifico di TA. La parte interessante è il collegamento: come gli FBI delle unità, i TDF delle armi e l'interfaccia globale instradano i nomi dei file verso il bus audio attraverso tre livelli di indirezione.

Tip

Provalo tu stesso.

# 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

Su disco: è solo WAV

I file WAV stanno in sounds/. Seguono il formato standard RIFF WAVE: qualsiasi programma che riproduce i WAV riproduce anche questi. kbot non li analizza come un formato personalizzato; l'esploratore li passa all'elemento <audio> del browser.

Codifica tipica nei file distribuiti da Cavedog:

Proprietà Valore
Frequenza di campionamento 22050 Hz (la maggior parte), 11025 Hz (alcuni clic dell'interfaccia)
Profondità di bit PCM a 8 bit senza segno
Canali Mono
Durata 0,1–3 secondi
Dimensione del file 5 KB – 200 KB

Le mod a volte distribuiscono campioni stereo a 16 bit; il motore li accetta, ma occupano più memoria.


I tre livelli del collegamento

Per scoprire "che cosa suona quando viene selezionato l'Arm Commander" si segue questa catena:

   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

Livello 1 — SoundCategory nell'FBI

L'FBI di un'unità nomina una categoria:

[UNITINFO]
{
    UnitName=ARMCOM;
    SoundCategory=ARM_COM;     // ← points at [ARM_COM] in sound.tdf
    ...
}

Le categorie sono condivise tra le unità: ogni variante dell'Arm Commander, o ogni K-bot Arm, punta alla stessa categoria, così le voci di selezione restano coerenti all'interno di una fazione.

Livello 2 — gamedata/sound.tdf

Il TDF associa gli eventi del motore ai nomi dei file WAV all'interno di una categoria:

[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;
}

Nota il suffisso 1 sulla maggior parte dei nomi di evento. Ogni evento può avere una famiglia di alternative: la chiave semplice (select) e le chiavi numerate select1, select2, select3, …; il motore ne sceglie una a caso per dare varietà. Se è definita solo select1, ogni volta suona la stessa battuta.

Per ogni evento TA 3.1c legge la chiave semplice, se presente, poi KEY1, KEY2, … fino al primo numero mancante: con select1=kbarmsel; select3=kbarmse2; suona sempre e solo kbarmsel, perché il select2 mancante chiude la lista. (Una chiave semplice mancante non ferma quelle numerate.) Un valore vuoto è un'alternativa silenziosa. Le chiavi che non sono uno degli eventi elencati più sotto non vengono mai riprodotte.

Livello 3 — sounds/<name>.wav

Il valore nel TDF è la radice del nome (senza l'estensione .wav). Il motore cerca sounds/<stem>.wav nel filesystem virtuale.

Important

Il suffisso .wav è implicito. Se nel TDF scrivi select1=cmdsel1.wav, il motore cercherà sounds/cmdsel1.wav.wav e in silenzio non riprodurrà nulla.


Chiavi di evento standard

TA 3.1c legge 23 eventi dalla categoria sonora di un'unità, ciascuno come chiave semplice più la famiglia numerata descritta sopra (ok, ok1, ok2, …):

Evento Quando scatta
select L'unità viene selezionata.
underattack L'unità subisce danni.
activate / deactivate Interruttore acceso/spento (radar, disturbatore, fortificazioni).
ok Ordine accettato.
arrived L'unità completa uno spostamento.
cant Ordine rifiutato (terreno, coda di costruzione, ecc.).
unitcomplete La costruzione dell'unità è terminata.
build Il costruttore comincia a costruire.
repair Il costruttore comincia a riparare.
working Il costruttore sta recuperando/resuscitando.
load / unload Il trasporto carica / scarica un'unità.
cloak / uncloak L'unità si occulta / esce dall'occultamento (i comandanti).
capture Il comandante o un'unità capace di catturare comincia una cattura.
count5 … count0 Scatti del conto alla rovescia dell'autodistruzione.
canceldestruct Autodistruzione annullata.

Ogni chiave può avere una voce KEYtext corrispondente (select1text) con il sottotitolo della battuta. Le altre chiavi della categoria vengono ignorate.

Il visualizzatore di unità e la sandbox di KBot Studio seguono le stesse regole: i metadati dell'unità (/api/studio/unit/{name}) contengono esattamente le chiavi che il gioco riproduce per questi eventi, e ogni evento riproduce a caso una delle sue chiavi.


Suoni dell'interfaccia — allsound.tdf

Gli eventi dell'interfaccia (clic dei pulsanti, transizioni dei menu, brevi jingle di fine partita) usano le stesse chiavi, ma stanno in sezioni in stile [GLOBAL_*] di gamedata/allsound.tdf:

[BIGBUTTON]   { sound=butmain1; }
[SMLBUTTON]   { sound=button1;  }
[SKIRMISH]    { sound=butnskir; }
[BGM]         { sound=drone2;   }   // Background music ID

Queste sezioni sono richiamate per nome dai file .gui dei menu. Per cambiare il suono del clic del pulsante "Skirmish" ti basta modificare questo TDF, senza toccare alcun .gui.


Suoni delle armi

I TDF delle armi (TDF) contengono direttamente le proprie chiavi sonore, senza un livello di indirezione:

[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
}

Vale la stessa ricerca sounds/<stem>.wav. I suoni delle armi sono tarati colpo per colpo: se cambi l'arma di un'unità, dovrai ritarare anche i livelli sonori nel TDF dell'arma.


Esempio svolto — aggiungere una nuova voce di selezione

  1. Metti un nuovo WAV in sounds/ (consigliati mono, 22050 Hz, 8 bit):

    mymod/sounds/cmdsel_grunt.wav
  2. Aggiungi un nuovo evento in gamedata/sound.tdf:

    [ARM_COM]
    {
        select1=cmdsel1;       // Existing
        select2=cmdsel_grunt;  // Your new line, randomly selected
    }
  3. Non serve alcuna modifica all'FBI: basta il riferimento esistente SoundCategory=ARM_COM.

  4. Impacchetta e prova:

    kbot hpi pack ./mymod --target mymod.ufo

Ora, quando il comandante viene selezionato, il motore alternerà cmdsel1.wav e cmdsel_grunt.wav.


Dimensioni tipiche

Elemento Intervallo osservato negli asset di Cavedog
Battuta vocale di un'unità 5–60 KB
Impatto di un'arma 5–30 KB
Esplosione 30–120 KB
Loop musicale 100 KB – 1 MB
gamedata/sound.tdf ~20 KB (oltre 300 categorie)
gamedata/allsound.tdf ~6 KB

Insidie

Warning

Un WAV mancante produce silenzio, non un errore. Scrivi male select1=cmsdel1 (lettere invertite) e alla selezione il motore semplicemente non riproduce nulla: nessun messaggio di log, nessun ripiego. Prova sempre nel gioco i suoni modificati.

  • L'estensione .wav è implicita: non scriverla mai nel valore del TDF.
  • La frequenza di campionamento conta. I suoni riprodotti a frequenze diverse da 8 kHz / 11,025 kHz / 22,05 kHz / 44,1 kHz possono balbettare sui percorsi hardware dell'epoca di Windows 9x che alcuni motori originali usano ancora. 22050 Hz mono è il valore predefinito sicuro.
  • I WAV stereo vengono ridotti a mono dal motore. Non distribuire file stereo a meno che tu non abbia una ragione spaziale precisa.
  • MP3 in sounds/: qui il motore ignora gli MP3. Il lettore musicale ha un percorso di codice separato per music/*.mp3.
  • Cavedog distribuisce alcuni WAV in PCM a 16 bit e con frequenze di campionamento bizzarre (ad es. 7000 Hz): funzionano comunque, ma se stai costruendo strumenti che presuppongono 22050/8/mono ci inciamperai.

Vedi anche

  • TDF: il formato usato da sound.tdf, allsound.tdf e dai campi sonori delle armi.
  • Interfaccia di TA: Kingdoms: i widget .gui fanno riferimento agli eventi sonori dell'interfaccia.
  • Glossario: categoria sonora (sound category).