Реплики сцены с принцессой: вернуть подкачку в кадр

Регрессия 4086dde: тот коммит перенёс шаг постраничной подкачки «в паузу
кадра» — внутрь цикла ожидания тика насоса — и одновременно ввёл защиту от
промотки (snd_want подтягивается к snd_done). Вместе это убило подкачку:
паузы в этой сцене почти нет, цикл ожидания выходит сразу, шаг не
вызывается. Реплики Джафара не успевали загрузиться к своему тику,
pop_music_play() молча ничего не делал, и после первой реплики сцена шла
в тишине.

Замер в MAME (адреса статиков pop_music.c — от public _pop_mus_page по
смещениям из .sym): до фикса ld_next стоял на нуле 20 секунд при активной
загрузке; после — 11 страниц из 11, mus_ready=1, и звучат все три реплики
m50 → m53 → m52.

Фикс: один безусловный load_step в кадре сцены; шаг в паузе оставлен, он
бесплатный, когда время есть.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-26 17:00:16 +03:00
parent a3c5c600da
commit 747783c422
3 changed files with 54 additions and 34 deletions
+36
View File
@@ -3593,3 +3593,39 @@ FIRST_LEVEL`. Рестарт ТОГО ЖЕ уровня (смерть, чекп
пишет. Всё, что нарисовано текстом, обязано рисоваться ПОСЛЕ перехода, иначе
переезжает только фон (так вышла пустая таблица рекордов, см.
[HOF-ENTRY](TASKS_CLOSED.md#hof-entry)).
---
<a id="pv-music-stall"></a>
## PV-MUSIC-STALL. В сцене с принцессой звучала только первая реплика — **ЗАКРЫТ 2026-08-26**
**Симптом (пользователь).** «Музыка после открытия двери для входа Джафара
пропала» — дальше сцена шла в тишине до конца: не звучали ни реплика входа
Джафара (m53), ни его ухода (m52).
**Корень.** Регрессия коммита `4086dde` («убрана промотка кадров»). До него
шаг постраничной подкачки стоял БЕЗУСЛОВНО в теле кадра сцены (плюс там же
вызывался `pop_music_service`). Тот коммит перенёс шаг «в паузу кадра» —
внутрь цикла ожидания тика насоса — и одновременно ввёл правильную защиту от
промотки (`if (snd_done > snd_want) snd_want = snd_done`). Вместе это и убило
подкачку: пауза в этой сцене почти не выпадает, цикл ожидания выходит сразу,
и шаг не вызывается.
**Замер, который это показал** (адреса статиков `pop_music.c` вычислены от
public `_pop_mus_page` по смещениям из `.sym`):
| | до фикса | после фикса |
|---|---|---|
| `ld_next` (прочитано страниц m53) | **0** за 20 с | **11 из 11** |
| `mus_ready` | 0 | 1 |
| что звучит | только m50 | m50 → m53 → m52 |
**Фикс.** Один безусловный `pop_music_load_step()` в кадре сцены (шаг в паузе
оставлен: он бесплатный, когда время есть). Страница стоит 33 мс против
кадра сцены в 100-133 мс, а шкала работает по факту прошедшего времени,
поэтому сцена от этого не разъезжается.
**Ловушка отладки, стоившая ложного диагноза.** Пока машина стоит на
брейкпоинте, значения в памяти застывают — картина «`busy=0` при `next=3` из
20» выглядела как обрыв чтения с ошибкой, хотя это был просто стоп-кадр.
Прежде чем толковать значения, проверять `status`: `state=run` или `stop`.