SprPoP: Restart Game возвращал заставку без музыки и вешал её на титуле
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 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DSYUpuaQpKr48kBav2iiV4
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
#include <sprite.h> /* 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);
|
||||
}
|
||||
|
||||
/* ТРЕК В РАБОТЕ — заявка лежит, идёт загрузка или он звучит.
|
||||
|
||||
Reference in New Issue
Block a user