Музыка по ходу игры: смерть, зелья, меч, конец уровня, катсцены
Звуки 24..43 в наборе оцифровки пустые — в оригинале это Adlib-музыка, и в digisnd её нет. На этом и построено подключение: pop_sfx_play для звука с нулевой длиной кладёт номер в pop_mus_req, а разбирает заявку pop_music_service() — один вызов на кадр из любого цикла (игра, интро, катсцена). Всё чтение с диска живёт там. Ждать полной загрузки джингла нельзя — это фриз посреди игры. Поэтому pop_music_stream читает первую страницу (33 мс) и сразу пускает трек: она звучит 1,5 с, а следующая читается те же 33 мс. Остальные доливаются по одной за кадр. Расставлено по местам оригинала: смерть (24/28/32), вступление первого уровня и тень шестого (25), сцены перед уровнями (27/35/40), встреча с Джафаром (29), зелья (30/33/39), время вышло (36), меч и смерть стража (37), смерть Джафара (43), конец уровня (41/32), встреча с принцессой (26). Темы «раз за уровень» сбрасывает pop_music_level_start. Упакован 21 трек (2,4 МБ). Не озвучен только финал: won — 115 с и 78 страниц EMM, ему нужен кольцевой стриминг (задача MUS-WON на доске). Проверено в MAME: вступительная тема первого уровня отыгрывается на старте (курсор дошёл до конца, id 25). Host-тесты: 15 наборов. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1330,6 +1330,7 @@ void pop_proc_get_object(void) __banked
|
||||
if (Char.charid != CHARID_0_KID) return;
|
||||
if (pickup_obj_type == -1) {
|
||||
pop_have_sword = 1; /* в оригинале have_sword = -1 */
|
||||
pop_sfx_play(37); /* победный трек «меч найден» */
|
||||
/* Вспышка фона: flash_color = color_14_brightyellow, flash_time = 8
|
||||
* (seg006 proc_get_object). do_flash = set_bg_attr(0, color) —
|
||||
* оригинал подменяет НУЛЕВУЮ запись палитры, т.е. вспыхивает всё
|
||||
@@ -1343,12 +1344,16 @@ void pop_proc_get_object(void) __banked
|
||||
switch (pickup_obj_type) {
|
||||
case 1: /* здоровье: +1 HP, красная вспышка */
|
||||
if (hitp_curr != hitp_max) {
|
||||
pop_sfx_stop(); /* seg006:1871 — stop_sounds */
|
||||
pop_sfx_play(33);
|
||||
hitp_delta = 1;
|
||||
pop_flash_color = POP_FLASH_RED;
|
||||
pop_flash_time = 2;
|
||||
}
|
||||
break;
|
||||
case 2: /* большая склянка: +1 к ПОТОЛКУ HP */
|
||||
pop_sfx_stop(); /* seg006:1878 — stop_sounds */
|
||||
pop_sfx_play(30);
|
||||
pop_kid_add_life();
|
||||
pop_flash_color = POP_FLASH_RED;
|
||||
pop_flash_time = 4; /* seg006:1878 — вспышка длиннее */
|
||||
@@ -1359,6 +1364,8 @@ void pop_proc_get_object(void) __banked
|
||||
* и играет sound_39_low_weight — по нему же меряет срок; у нас
|
||||
* срок задан кадрами (POP_FEATHER_FRAMES). */
|
||||
pop_feather = POP_FEATHER_FRAMES;
|
||||
pop_sfx_stop();
|
||||
pop_sfx_play(39); /* «низкий вес» — весь эффект */
|
||||
pop_flash_color = POP_FLASH_GREEN;
|
||||
pop_flash_time = 3;
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user