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 <sprite.h> /* gfx_w0_map/unmap — доступ к странице индекса */
|
||||||
#include "pop_music.h"
|
#include "pop_music.h"
|
||||||
#include "pop_sfx.h"
|
#include "pop_sfx.h"
|
||||||
|
#include "_pop_sfx.h" /* pop_snd_ok — открыт ли вывод (см. pop_music_busy) */
|
||||||
#include "pop_app.h" /* POP_APP_DEMO — в демке музыки нет */
|
#include "pop_app.h" /* POP_APP_DEMO — в демке музыки нет */
|
||||||
#include "_pop_file.h"
|
#include "_pop_file.h"
|
||||||
|
|
||||||
@@ -454,7 +455,15 @@ void pop_music_service(void) __banked
|
|||||||
|
|
||||||
uint8_t pop_music_busy(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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ТРЕК В РАБОТЕ — заявка лежит, идёт загрузка или он звучит.
|
/* ТРЕК В РАБОТЕ — заявка лежит, идёт загрузка или он звучит.
|
||||||
|
|||||||
@@ -1205,14 +1205,23 @@ int pop_boot(void) __banked
|
|||||||
* полсекунды, и лучше, чтобы она прошла под картинкой. */
|
* полсекунды, и лучше, чтобы она прошла под картинкой. */
|
||||||
int pop_boot_sound(void) __banked
|
int pop_boot_sound(void) __banked
|
||||||
{
|
{
|
||||||
if (boot_sound_done) return 0;
|
if (!boot_sound_done) {
|
||||||
boot_sound_done = 1;
|
boot_sound_done = 1;
|
||||||
(void)pop_sfx_init_begin(); /* эффектов может и не быть — не фатально */
|
(void)pop_sfx_init_begin(); /* эффектов может и не быть — не фатально */
|
||||||
/* Индекс музыкального набора — одна страница EMM. Без него музыки не
|
/* Индекс музыкального набора — одна страница EMM. Без него музыки не
|
||||||
* будет (pop_music_info вернёт -1 на любой трек), но игра работает:
|
* будет (pop_music_info вернёт -1 на любой трек), но игра работает:
|
||||||
* это необязательный ресурс, как и сами треки. */
|
* это необязательный ресурс, как и сами треки. */
|
||||||
(void)pop_music_index_load();
|
(void)pop_music_index_load();
|
||||||
pop_settings_apply(1); /* CFG -> speed/cheats/CBL */
|
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();
|
(void)pop_sfx_start();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user