SprPoP: единые часы в сцене с Джафаром + конец уровня ждёт свою мелодию
1. СЦЕНА С ДЖАФАРОМ — ОДНИ ЧАСЫ, КАДРЫ ЛУЧА. Было две шкалы, и выбор между ними делался гонкой на старте сцены: одна выборка pop_snd_tick через кадр, «успел ли диск раскрутить звук». От прогона к прогону сцена шла то по тикам насоса CBL, то по кадрам луча, и кода реплики приходилась каждый раз на другое место картинки (наблюдение пользователя). Насос был нужен потому, что кадр рисовался дольше своего интервала; теперь отрисовка разложена по интервалам (pv_restore_bg), и счёт кадров честен — ветка насоса убрана целиком. 2. ПОДКАЧКА ТРЕКА — ПОЛСТРАНИЦЫ ЗА ШАГ (pop_music_load_step). 8 КБ ≈ 16 мс влезают в кадровый интервал, целая страница (33 мс) не влезала и растягивала кадр сцены. В сцене шаг остаётся безусловным (иначе реплики не успевали грузиться, memory pv_music_stall_regression) и оплачивается ровно одним интервалом. 3. КОНЕЦ УРОВНЯ ЖДЁТ МЕЛОДИЮ. Оригинал (seg003:387, play_level_2) не сменяет уровень, пока `check_sound_playing()`: экран пройденного уровня живёт с анимацией факелов, пока звучит трек. Мы уходили на смену сразу и обрывали мелодию на первых нотах. Теперь ждём большего из двух: pop_music_busy() и счётчика pop_endmus_left по длине записи (gen/pop_music_ticks.h) — второе нужно потому, что при ВЫКЛЮЧЕННОЙ музыке busy ложен, а оригинал выдерживает паузу и молча. Стартовый уровень возвращён на 1 (отладочный LEVEL=14 был только для замера). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -26,6 +26,8 @@ extern int8_t knock;
|
||||
* пройден». Читает и обнуляет главный цикл. Пока уровень один, поэтому
|
||||
* там рестарт того же уровня; загрузка следующего — levels_plan.md. */
|
||||
extern uint8_t pop_next_level;
|
||||
/* Задержка смены уровня на время мелодии конца (см. pop_kid.c). */
|
||||
extern uint8_t pop_endmus_left;
|
||||
|
||||
/* Загрузить npages атласов Kid (kid0..kid{npages-1}.atl). ДО initgraph.
|
||||
* 0 — OK, -1 — ошибка. */
|
||||
|
||||
Reference in New Issue
Block a user