From 6176f6da3198474ebb7e089c912e4cab952fb4b3 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Wed, 2 Sep 2026 11:45:02 +0300 Subject: [PATCH] =?UTF-8?q?SprPoP:=20Restart=20Game=20=D0=B2=D0=BE=D0=B7?= =?UTF-8?q?=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D0=BB=20=D0=B7=D0=B0=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=B2=D0=BA=D1=83=20=D0=B1=D0=B5=D0=B7=20=D0=BC=D1=83?= =?UTF-8?q?=D0=B7=D1=8B=D0=BA=D0=B8=20=D0=B8=20=D0=B2=D0=B5=D1=88=D0=B0?= =?UTF-8?q?=D0=BB=20=D0=B5=D1=91=20=D0=BD=D0=B0=20=D1=82=D0=B8=D1=82=D1=83?= =?UTF-8?q?=D0=BB=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pop_boot_sound() был целиком под разовым флагом, а pop_sfx_start() стоял внутри него. До перестановки старта CBL открывал сам шаг 0 титров, и делал это КАЖДЫЙ раз; теперь второй вызов уходил по раннему return, а pop_title_show начинается с pop_sfx_pause() — значит после Restart Game насос оставался выключенным и заставка шла молча. Тем же корнем объясняется зависание: с закрытым CBL курсор трека не двигается, pop_mus_left не убывает, и ожидания «дослушать тему» в титрах и интро (while (pop_music_busy())) висели до нажатия клавиши — на экране Prince of Persia. - pop_boot_sound: под разовым флагом осталась только ЗАГРУЗКА (индекс звука, первая страница набора, индекс музыки, settings_apply); pop_sfx_start() зовётся всегда — он идемпотентен и уважает Ctrl+S; - pop_music_busy(): признак теперь «звучит», а не «есть курсор» — спрашивает и про открытый вывод (pop_snd_ok). Ждать неиграющую музыку нельзя в принципе, и эта строка закрывает весь класс подвисаний. Проверено в MAME: уровень 1 -> ESC -> RESTART GAME -> титул с музыкой (pop_snd_ok=1, курсор трека прошёл страницы 8..16, pop_mus_id=54), дальше последовательность сама уходит в сцену с принцессой. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01DSYUpuaQpKr48kBav2iiV4 --- applications/SprPoP/src/pop_music.c | 11 ++++++++++- applications/SprPoP/src/sprpop_cold.c | 25 +++++++++++++++++-------- 2 files changed, 27 insertions(+), 9 deletions(-) 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; }