WAV — Effetti sonori e collegamento dei banchi sonori
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
Metti un nuovo WAV in
sounds/(consigliati mono, 22050 Hz, 8 bit):mymod/sounds/cmdsel_grunt.wavAggiungi un nuovo evento in
gamedata/sound.tdf:[ARM_COM] { select1=cmdsel1; // Existing select2=cmdsel_grunt; // Your new line, randomly selected }Non serve alcuna modifica all'FBI: basta il riferimento esistente
SoundCategory=ARM_COM.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 permusic/*.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.tdfe dai campi sonori delle armi. - Interfaccia di TA: Kingdoms: i widget
.guifanno riferimento agli eventi sonori dell'interfaccia. - Glossario: categoria sonora (sound category).