Todas las páginas de formatos ↓
Gráficos y multimedia

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

  1. Deja un WAV nuevo en sounds/ (se recomienda mono, 22 050 Hz, 8 bits):

    mymod/sounds/cmdsel_grunt.wav
  2. Añade un evento nuevo en gamedata/sound.tdf:

    [ARM_COM]
    {
        select1=cmdsel1;       // Existing
        select2=cmdsel_grunt;  // Your new line, randomly selected
    }
  3. No hace falta cambiar el FBI: basta con la referencia SoundCategory=ARM_COM que ya existe.

  4. 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 .wav está 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 para music/*.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.tdf y los campos de sonido de las armas.
  • Interfaz de TA: Kingdoms: los widgets .gui hacen referencia a eventos de sonido de la interfaz.
  • Glosario: sound category.