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 зброї.
Розібраний приклад — додавання нової репліки під час виділення
Покладіть новий WAV у
sounds/(рекомендовано моно, 22050 Гц, 8 бітів):mymod/sounds/cmdsel_grunt.wavДодайте нову подію в
gamedata/sound.tdf:[ARM_COM] { select1=cmdsel1; // Existing select2=cmdsel_grunt; // Your new line, randomly selected }Змінювати FBI не потрібно — наявного посилання
SoundCategory=ARM_COMдосить.Запакуйте й перевірте:
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.