WAV: efectos de sonido y asignación de bancos de sonido
Fuente: coreprime/kbot @ 0ab97bf · Editar en GitHub
Los efectos de sonido de Total Annihilation (muestras de voz de las unidades, impactos de armas, clics de la interfaz) son archivos WAV PCM normales de 8 o 16 bits: el contenedor no tiene nada propio de TA. Lo interesante es la asignación: cómo los FBI de las unidades, los TDF de las armas y la interfaz global hacen llegar los nombres de archivo al bus de sonido a través de tres capas de indirección.
Tip
Pruébalo tú mismo.
# 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
En disco: es WAV, sin más
Los archivos WAV están en sounds/. Siguen el formato RIFF WAVE
estándar: cualquier cosa que reproduzca WAV reproduce estos. kbot no los
analiza como un formato propio; el explorador se los pasa al elemento
<audio> del navegador.
Codificación habitual en los archivos que distribuyó Cavedog:
| Propiedad | Valor |
|---|---|
| Frecuencia de muestreo | 22 050 Hz (la mayoría), 11 025 Hz (algunos clics de la interfaz) |
| Profundidad de bits | PCM de 8 bits sin signo |
| Canales | Mono |
| Duración | 0,1–3 segundos |
| Tamaño del archivo | 5 KB – 200 KB |
De vez en cuando, los mods distribuyen muestras estéreo de 16 bits; el motor las acepta, pero cuestan más memoria.
Las tres capas de la asignación
Averiguar «qué suena cuando se selecciona el Arm Commander» sigue esta cadena:
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
Capa 1: SoundCategory en el FBI
El FBI de una unidad nombra una categoría:
[UNITINFO]
{
UnitName=ARMCOM;
SoundCategory=ARM_COM; // ← points at [ARM_COM] in sound.tdf
...
}
Las categorías se comparten entre unidades: todas las variantes del Arm Commander, o todos los K-bots de Arm, apuntan a la misma categoría para que las voces de selección sean coherentes dentro de un bando.
Capa 2: gamedata/sound.tdf
El TDF asigna los eventos del motor a nombres de archivo WAV dentro de una categoría:
[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;
}
Fíjate en el sufijo 1 de la mayoría de los nombres de evento. Cada
evento puede tener una familia de opciones: la clave simple (select) y
las claves numeradas select1, select2, select3, …; el motor elige
una al azar para dar variedad. Si solo está definido select1, suena
siempre la misma frase.
TA 3.1c lee, para cada evento, la clave simple si existe, y después
KEY1, KEY2, … hasta el primer número que falte: con
select1=kbarmsel; select3=kbarmse2; solo suena kbarmsel, porque el
select2 que falta cierra la lista. (Que falte la clave simple no
detiene las numeradas). Un valor vacío es una opción silenciosa. Las
claves que no son ninguno de los eventos de abajo no suenan nunca.
Capa 3: sounds/<name>.wav
El valor del TDF es la raíz del nombre (sin la extensión .wav). El
motor busca sounds/<stem>.wav en el sistema de archivos virtual.
Important
El sufijo .wav está implícito. Si escribes select1=cmdsel1.wav
en el TDF, el motor intentará encontrar sounds/cmdsel1.wav.wav y, sin
avisar, no reproducirá nada.
Claves de evento estándar
TA 3.1c lee 23 eventos de la categoría de sonido de una unidad, cada uno
como la clave simple más la familia numerada descrita arriba (ok,
ok1, ok2, …):
| Evento | Cuándo se dispara |
|---|---|
select |
Se selecciona la unidad. |
underattack |
La unidad recibe daño. |
activate / deactivate |
Interruptor de encendido/apagado (radar, interferidor, fortificaciones). |
ok |
Se acepta la orden. |
arrived |
La unidad termina un movimiento. |
cant |
Se rechaza la orden (terreno, cola de construcción, etc.). |
unitcomplete |
La unidad termina de construirse. |
build |
El constructor empieza a construir. |
repair |
El constructor empieza a reparar. |
working |
El constructor está recuperando o resucitando. |
load / unload |
El transporte recoge / suelta una unidad. |
cloak / uncloak |
La unidad se camufla / deja de estar camuflada (los comandantes). |
capture |
El comandante o una unidad capaz de capturar empieza a capturar. |
count5 … count0 |
Pasos de la cuenta atrás de autodestrucción. |
canceldestruct |
Se cancela la autodestrucción. |
Cada clave puede tener su entrada KEYtext correspondiente
(select1text) con el subtítulo de la frase. Las demás claves de la
categoría se ignoran.
El visor de unidades y el sandbox de KBot Studio siguen las mismas
reglas: los metadatos de la unidad (/api/studio/unit/{name}) llevan
exactamente las claves que el juego reproduce para estos eventos, y cada
evento reproduce al azar una de sus claves.
Sonidos de la interfaz: allsound.tdf
Los eventos de la interfaz (clics de botones, transiciones de menú,
cortinillas musicales del final de la partida) se asignan con claves de la
misma manera, pero están en secciones del estilo [GLOBAL_*] de
gamedata/allsound.tdf:
[BIGBUTTON] { sound=butmain1; }
[SMLBUTTON] { sound=button1; }
[SKIRMISH] { sound=butnskir; }
[BGM] { sound=drone2; } // Background music ID
Los archivos .gui de los menús hacen referencia a estas secciones por
su nombre. Para cambiar el sonido del clic del botón «Skirmish» solo
tienes que editar este TDF; no hay que tocar ningún .gui.
Sonidos de las armas
Los TDF de armas (TDF) llevan directamente sus propias claves de sonido, sin capa de indirección:
[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
}
Se aplica la misma búsqueda sounds/<stem>.wav. Los sonidos de las
armas se ajustan por disparo: si cambias el arma de una unidad, también
tendrás que reajustar los niveles de sonido en el TDF del arma.
Ejemplo desarrollado: añadir una voz de selección nueva
Deja un WAV nuevo en
sounds/(se recomienda mono, 22 050 Hz, 8 bits):mymod/sounds/cmdsel_grunt.wavAñade un evento nuevo en
gamedata/sound.tdf:[ARM_COM] { select1=cmdsel1; // Existing select2=cmdsel_grunt; // Your new line, randomly selected }No hace falta cambiar el FBI: basta con la referencia
SoundCategory=ARM_COMque ya existe.Empaqueta y prueba:
kbot hpi pack ./mymod --target mymod.ufo
Ahora el motor alternará entre cmdsel1.wav y cmdsel_grunt.wav cuando
se seleccione al comandante.
Tamaños habituales
| Recurso | Rango observado en los recursos de Cavedog |
|---|---|
| Frase de voz de una unidad | 5–60 KB |
| Impacto de arma | 5–30 KB |
| Explosión | 30–120 KB |
| Bucle de música | 100 KB – 1 MB |
gamedata/sound.tdf |
~20 KB (más de 300 categorías) |
gamedata/allsound.tdf |
~6 KB |
Escollos
Warning
Un WAV que falta no suena, pero no da error. Escribe mal
select1=cmsdel1 (letras cambiadas de sitio) y el motor, sin más, no
reproducirá nada al seleccionar: ni mensaje en el registro ni sonido de
reserva. Prueba siempre en el juego los sonidos que cambies.
- La extensión
.wavestá implícita: no la escribas nunca en el valor del TDF. - La frecuencia de muestreo importa. Los sonidos que no están a 8 kHz / 11,025 kHz / 22,05 kHz / 44,1 kHz pueden entrecortarse en las vías de hardware de la época de Windows 9x que todavía usan algunos motores de la versión comercial. 22 050 Hz mono es el valor seguro por defecto.
- El motor mezcla los WAV estéreo a mono. No distribuyas estéreo salvo que tengas una razón espacial concreta.
- MP3 en
sounds/: el motor ignora aquí los MP3. El reproductor de música tiene una vía de código aparte paramusic/*.mp3. - Cavedog distribuye algunos WAV en PCM de 16 bits y con frecuencias de muestreo extrañas (p. ej., 7000 Hz): siguen funcionando, pero si estás creando herramientas que suponen 22 050/8/mono, tropezarás con ellos.
Véase también
- TDF: el formato que usan
sound.tdf,allsound.tdfy los campos de sonido de las armas. - Interfaz de TA: Kingdoms: los widgets
.guihacen referencia a eventos de sonido de la interfaz. - Glosario: sound category.