diff --git a/applications/SprPoP/src/pop_music.c b/applications/SprPoP/src/pop_music.c index 714ba9e..8e3718f 100644 --- a/applications/SprPoP/src/pop_music.c +++ b/applications/SprPoP/src/pop_music.c @@ -17,6 +17,7 @@ #include /* gfx_w0_map/unmap — доступ к странице индекса */ #include "pop_music.h" #include "pop_sfx.h" +#include "_pop_sfx.h" /* pop_snd_ok — открыт ли вывод (см. pop_music_busy) */ #include "pop_app.h" /* POP_APP_DEMO — в демке музыки нет */ #include "_pop_file.h" @@ -454,7 +455,15 @@ void pop_music_service(void) __banked uint8_t pop_music_busy(void) __banked { - return (uint8_t)(pop_mus_left != 0); + /* «ЗВУЧИТ», А НЕ «ЕСТЬ КУРСОР». Курсор трека двигает насос CBL, и пока + * вывод закрыт (pop_sfx_pause на загрузке уровня, Ctrl+S, показ заставки + * после Restart Game) pop_mus_left не убывает НИКОГДА. Вызывающий, + * который ждёт конца мелодии, в этом состоянии висит вечно — ровно так + * заставка после Restart Game вставала на экране Prince of Persia + * (поймано пользователем 2026-09-02). Корень того случая был в другом + * (CBL не открывался заново, см. pop_boot_sound), но ждать неиграющую + * музыку нельзя в принципе, поэтому признак спрашивает и про вывод. */ + return (uint8_t)(pop_snd_ok && pop_mus_left != 0); } /* ТРЕК В РАБОТЕ — заявка лежит, идёт загрузка или он звучит. diff --git a/applications/SprPoP/src/sprpop_cold.c b/applications/SprPoP/src/sprpop_cold.c index 3ece899..15be564 100644 --- a/applications/SprPoP/src/sprpop_cold.c +++ b/applications/SprPoP/src/sprpop_cold.c @@ -1205,14 +1205,23 @@ int pop_boot(void) __banked * полсекунды, и лучше, чтобы она прошла под картинкой. */ int pop_boot_sound(void) __banked { - if (boot_sound_done) return 0; - boot_sound_done = 1; - (void)pop_sfx_init_begin(); /* эффектов может и не быть — не фатально */ - /* Индекс музыкального набора — одна страница EMM. Без него музыки не - * будет (pop_music_info вернёт -1 на любой трек), но игра работает: - * это необязательный ресурс, как и сами треки. */ - (void)pop_music_index_load(); - pop_settings_apply(1); /* CFG -> speed/cheats/CBL */ + if (!boot_sound_done) { + boot_sound_done = 1; + (void)pop_sfx_init_begin(); /* эффектов может и не быть — не фатально */ + /* Индекс музыкального набора — одна страница EMM. Без него музыки не + * будет (pop_music_info вернёт -1 на любой трек), но игра работает: + * это необязательный ресурс, как и сами треки. */ + (void)pop_music_index_load(); + pop_settings_apply(1); /* CFG -> speed/cheats/CBL */ + } + /* ОТКРЫТИЕ CBL — ВНЕ РАЗОВОГО ГАРДА, и это не мелочь. Загрузка нужна + * один раз за запуск, а вот вывод к моменту следующего показа заставки + * почти наверняка закрыт: pop_title_show начинается с pop_sfx_pause, да + * и уровень оставляет CBL закрытым. Пока start стоял под флагом, + * Restart Game приводил к заставке БЕЗ музыки (поймано пользователем + * 2026-09-02), а заодно подвешивал ожидания «дослушать тему»: с + * выключенным насосом pop_mus_left не убывает, и pop_music_busy() + * истинен вечно. Идемпотентно и уважает Ctrl+S (pop_snd_want). */ (void)pop_sfx_start(); return 0; }