Усі сторінки форматів ↓
Графіка й медіа

WAV — звукові ефекти й підключення звукових банків

Джерело: coreprime/kbot @ 0ab97bf · Редагувати на GitHub

Звукові ефекти Total Annihilation (голосові семпли юнітів, влучання зброї, клацання в інтерфейсі) — це звичайні 8-бітні / 16-бітні файли PCM WAV: у контейнері немає нічого специфічного для TA. Цікаве тут — підключення: як FBI юнітів, TDF зброї й глобальний інтерфейс спрямовують імена файлів на звукову шину через три рівні непрямої адресації.

Tip

Спробуйте самі.

# 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

На диску: це просто WAV

Файли WAV містяться в sounds/. Вони відповідають стандартному формату RIFF WAVE — усе, що відтворює WAV, відтворить і їх. kbot не розбирає їх як окремий формат; оглядач передає їх елементу <audio> браузера.

Типове кодування у файлах, які постачала Cavedog:

Властивість Значення
Частота дискретизації 22050 Гц (більшість), 11025 Гц (деякі клацання інтерфейсу)
Розрядність 8-бітний беззнаковий PCM
Канали Моно
Тривалість 0,1–3 секунди
Розмір файлу 5 КБ – 200 КБ

Моди інколи постачають 16-бітні стереосемпли; рушій їх приймає, але вони займають більше пам'яті.


Три рівні підключення

Пошук відповіді на питання «що звучить, коли виділено Arm Commander» проходить таким ланцюжком:

   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

Рівень 1 — SoundCategory у FBI

FBI юніта називає категорію:

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

Категорії спільні для кількох юнітів: кожен варіант Arm Commander чи кожен K-bot Arm посилається на ту саму категорію, щоб голоси під час виділення лишалися однаковими в межах сторони.

Рівень 2 — gamedata/sound.tdf

Цей TDF прив'язує події рушія до імен файлів WAV у межах категорії:

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

Зверніть увагу на суфікс 1 у більшості імен подій. Кожна подія може мати цілу родину варіантів: простий ключ (select) і нумеровані ключі select1, select2, select3, …; для різноманітності рушій обирає один із них випадково. Якщо визначено лише select1, щоразу звучить та сама репліка.

Для кожної події TA 3.1c читає простий ключ, якщо він є, а потім KEY1, KEY2, … до першого пропущеного номера: із select1=kbarmsel; select3=kbarmse2; звучить лише kbarmsel, бо відсутній select2 завершує список. (Відсутній простий ключ не зупиняє нумерованих.) Порожнє значення — це варіант без звуку. Ключі, які не належать до перелічених нижче подій, ніколи не відтворюються.

Рівень 3 — sounds/<name>.wav

Значення в TDF — це основа імені (без розширення .wav). Рушій шукає sounds/<stem>.wav у віртуальній файловій системі.

Important

Суфікс .wav мається на увазі. Якщо записати в TDF select1=cmdsel1.wav, рушій шукатиме sounds/cmdsel1.wav.wav і мовчки нічого не відтворить.


Стандартні ключі подій

TA 3.1c читає зі звукової категорії юніта 23 події, кожну — як простий ключ плюс описану вище нумеровану родину (ok, ok1, ok2, …):

Подія Коли спрацьовує
select Юніт виділено.
underattack Юніт отримує шкоду.
activate / deactivate Перемикач увімк./вимк. (радар, глушник, укріплення).
ok Наказ прийнято.
arrived Юніт завершує переміщення.
cant Наказ відхилено (рельєф, черга будівництва тощо).
unitcomplete Будівництво юніта завершено.
build Будівельник починає будувати.
repair Будівельник починає ремонт.
working Будівельник переробляє/воскрешає.
load / unload Транспорт підбирає / висаджує юніт.
cloak / uncloak Юніт вмикає / вимикає маскування (командири).
capture Командир або юніт, здатний захоплювати, починає захоплення.
count5 … count0 Відлік до самознищення.
canceldestruct Самознищення скасовано.

Кожен ключ може мати відповідний запис KEYtext (select1text) із субтитром репліки. Інші ключі в категорії ігноруються.

Переглядач юнітів і пісочниця в KBot Studio дотримуються тих самих правил: метадані юніта (/api/studio/unit/{name}) містять рівно ті ключі, які гра відтворює для цих подій, і кожна подія відтворює випадковий зі своїх ключів.


Звуки інтерфейсу — allsound.tdf

Події інтерфейсу (клацання кнопок, переходи між меню, фінальні музичні акценти) прив'язуються так само, але містяться в секціях на кшталт [GLOBAL_*] у gamedata/allsound.tdf:

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

На ці секції за іменем посилаються файли меню .gui. Щоб змінити звук клацання кнопки «Skirmish», досить відредагувати цей TDF — .gui редагувати не потрібно.


Звуки зброї

TDF зброї (TDF) містять власні звукові ключі безпосередньо, без проміжного рівня:

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

Діє той самий пошук sounds/<stem>.wav. Звуки зброї налаштовано для кожного пострілу окремо — якщо ви змінюєте зброю юніта, доведеться заново налаштувати й рівні звуку в TDF зброї.


Розібраний приклад — додавання нової репліки під час виділення

  1. Покладіть новий WAV у sounds/ (рекомендовано моно, 22050 Гц, 8 бітів):

    mymod/sounds/cmdsel_grunt.wav
  2. Додайте нову подію в gamedata/sound.tdf:

    [ARM_COM]
    {
        select1=cmdsel1;       // Existing
        select2=cmdsel_grunt;  // Your new line, randomly selected
    }
  3. Змінювати FBI не потрібно — наявного посилання SoundCategory=ARM_COM досить.

  4. Запакуйте й перевірте:

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

Тепер під час виділення командира рушій чергуватиме cmdsel1.wav і cmdsel_grunt.wav.


Типові розміри

Ресурс Діапазон у ресурсах Cavedog
Голосова репліка юніта 5–60 КБ
Влучання зброї 5–30 КБ
Вибух 30–120 КБ
Музичний цикл 100 КБ – 1 МБ
gamedata/sound.tdf ~20 КБ (понад 300 категорій)
gamedata/allsound.tdf ~6 КБ

Підводні камені

Warning

Відсутній WAV — це тиша, а не помилка. Напишіть із помилкою select1=cmsdel1 (переставлені літери), і рушій просто нічого не відтворить під час виділення — ні повідомлення в журналі, ні запасного варіанта. Завжди перевіряйте змінені звуки в грі.

  • Розширення .wav мається на увазі — ніколи не пишіть його в значенні TDF.
  • Частота дискретизації має значення. Звуки з частотою, відмінною від 8 кГц / 11,025 кГц / 22,05 кГц / 44,1 кГц, можуть заїкатися на апаратних шляхах епохи Windows 9x, якими досі користуються деякі релізні рушії. Безпечне значення за замовчуванням — 22050 Гц моно.
  • Стерео-WAV рушій зводить до моно. Не постачайте стерео, якщо немає конкретної просторової причини.
  • MP3 у sounds/ — тут рушій ігнорує MP3. Музичний програвач має окремий шлях коду для music/*.mp3.
  • Cavedog постачає деякі WAV з 16-бітним PCM і дивними частотами дискретизації (наприклад, 7000 Гц) — вони працюють, але якщо ваші інструменти розраховують на 22050/8/моно, ви на них спіткнетеся.

Див. також

  • TDF — формат, який використовують sound.tdf, allsound.tdf і звукові поля зброї.
  • Інтерфейс TA: Kingdoms — віджети .gui посилаються на звукові події інтерфейсу.
  • Глосарій — sound category.