Финальная тема won: кольцевой стриминг с диска
Последний неозвученный кусок игры. 115 секунд и 1,2 МБ в память не влезают никак, поэтому тема играется кольцом из шести страниц (96 КБ = 9 с): насос идёт по кругу, а pop_music_service дочитывает файл в те страницы, которые насос уже прошёл. Страница звучит 1,5 с и читается 33 мс — запас сорокакратный; дистанция считается без отдельных счётчиков, потому что страница это ровно 128 блоков насоса. Три вещи, всплывшие при живой проверке: - кольцо обязано сниматься при любом обычном запуске трека, иначе следующая тема играет по кругу первых шести страниц (поймано на титрах сразу после победы); - живые сцены комнаты принцессы теперь открывают CBL сами (cut_begin): pop_ending_show глушит звук первым действием, и «arrived to princess» не звучал вовсе; - тема дослушивается до конца с возможностью прервать клавишей — как seg001:637. У оригинала там стоит ввод имени в таблицу рекордов; когда он появится, ожидание переедет за него (задача HOF-ENTRY). Проверено в MAME на сборке LEVEL=14: после встречи с принцессой звучит тема победы (id 56, кольцо 6), курсор уходит далеко за размер кольца — подкачка успевает. Host-тесты: 15 наборов. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
#include "pop_timer.h"
|
||||
#include "pop_pal.h"
|
||||
#include "pop_ui.h"
|
||||
#include "pop_music.h" /* подкачка потоковой темы победы */
|
||||
#include "pop_hof.h"
|
||||
|
||||
#define HOF_COUNT 5
|
||||
@@ -260,10 +261,15 @@ static void hof_draw(uint8_t edit_row)
|
||||
pop_screen_present(page);
|
||||
}
|
||||
|
||||
/* Ожидания на экране рекордов держат ПОТОКОВУЮ музыку: победная тема
|
||||
* (1,2 МБ) играет кольцом страниц, и дочитывать её надо всё время, пока
|
||||
* игрок смотрит таблицу — иначе насос догонит загрузчик и пойдёт по
|
||||
* кругу старыми данными. */
|
||||
static void hof_wait_release(void)
|
||||
{
|
||||
while (kbd_raw_any_down()) {
|
||||
kbd_raw_sync();
|
||||
pop_music_service();
|
||||
gfx_wait_vsync();
|
||||
}
|
||||
}
|
||||
@@ -340,6 +346,7 @@ void pop_hof_show(void) __banked
|
||||
hof_wait_release();
|
||||
while (!kbd_raw_any_down()) {
|
||||
kbd_raw_sync();
|
||||
pop_music_service();
|
||||
gfx_wait_vsync();
|
||||
}
|
||||
hof_wait_release();
|
||||
@@ -363,6 +370,7 @@ void pop_hof_show_title(void) __banked
|
||||
hof_wait_release();
|
||||
while (!kbd_raw_any_down()) {
|
||||
kbd_raw_sync();
|
||||
pop_music_service();
|
||||
gfx_wait_vsync();
|
||||
}
|
||||
hof_wait_release();
|
||||
|
||||
Reference in New Issue
Block a user