Музыка: озвучена вся заставка, тайминги сведены со шкалой оригинала
Добавлены треки 54 (тема титров), 50/53/52 (три реплики сцены с принцессой и Джафаром) — заставка звучит целиком, как в оригинале. pop_music: два слота EMM. Реплики идут встык, паузы под загрузку нет, поэтому следующая читается в НЕ играющий слот, а play подменяет резидентную таблицу страниц. Своей копии таблицы слот не держит — её хранит блок EMM. Плюс постраничная загрузка (load_begin/load_step): страница стоит 33 мс, четверть логического кадра сцены, и подкачка посреди анимации не видна. Тайминги: все длительности сцен — в тиках оригинала (60 Гц), перевод в кадры луча делает POP_T60. Пока сцены были немыми, разбег в 20 % был незаметен; с музыкой реплика кончалась раньше картинки. Переведены титры, история, хвост после PV и пейсинг самой PV-сцены. Паузы, которые оригинал отмеряет концом сэмпла, теперь равны реальной длине наших записей: конец m50 на тике 846, вход Джафара 1046, уход 2073, конец сцены 2500 (было 1959). Fade перед PV сдвинут так, чтобы полная темнота наступала в тот же момент трека, что у SDLPoP: их fade длиннее нашего на 123 тика, наш полосовой переход длиннее на 16. Финальная сцена: убраны песочные часы — end_sequence_anim не трогает hourglass_state, а reset_cutscene его обнулил. Уровень пройден, время больше не идёт. Проверено в MAME: цепочка 54 -> 55 -> 50 -> 53 -> 52 отыгрывается целиком, интро доходит до демо-режима. Host-тесты: 15 наборов. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -707,9 +707,9 @@ DOS-версии** — `applications/PoP/PoP1_DOS_music` (flac/mp3/ogg/ogg_MT-32
|
||||
|
||||
### Что сделано
|
||||
|
||||
`toolchain/pop_pack_music.py` -> куски `MUS\m<id>_<nn>.bin` по 16 КБ
|
||||
(bank_load_file читает файл только целиком и только в одну страницу) +
|
||||
каталог `pop_music_tbl.h`. Длина трека хранится **порциями по 128 байт**,
|
||||
`toolchain/pop_pack_music.py` -> один файл `MUS\m<id>.bin` на трек
|
||||
(читается порциями по 16 КБ из одного открытого fd) + каталог
|
||||
`pop_music_tbl.h`. Длина трека хранится **порциями по 128 байт**,
|
||||
а не байтами: 169 КБ в uint16 не влезает, 1350 блоков — легко.
|
||||
|
||||
`pop_music.c` (банк 9) грузит трек в EMM и ставит курсор; насос
|
||||
@@ -791,3 +791,57 @@ _io_page_w3 = saved;
|
||||
|
||||
Бонус: в W3 нет стаба восстановления окна, который в W0 занимал начало
|
||||
страницы, — звуковые страницы можно использовать целиком.
|
||||
|
||||
## 6. ВСЯ ЗАСТАВКА ОЗВУЧЕНА (2026-08-25)
|
||||
|
||||
К `story_1_absence` добавлены остальные четыре трека заставки:
|
||||
**54** intro_theme (титры), **50** story_2_princess, **53**
|
||||
story_3_Jaffar_enters, **52** story_4_Jaffar_leaves (сцена с принцессой).
|
||||
`MUS_IDS` в Makefile — 50 52 53 54 55, всего 1056 КБ на образе.
|
||||
|
||||
### Два слота вместо одного
|
||||
|
||||
Реплики оригинала идут ВСТЫК: следующая начинается там, где кончилась
|
||||
предыдущая, паузы под загрузку нет. Поэтому `pop_music` держит два слота
|
||||
EMM: `pop_music_load*` всегда пишет в НЕ играющий, `pop_music_play`
|
||||
подменяет резидентную таблицу страниц и отпускает прошлый слот. Своей
|
||||
копии таблицы слот не хранит — её и так держит блок EMM, `mem_get_page`
|
||||
отдаёт номер по индексу (иначе −40 байт W2 у игры, а там их нет).
|
||||
|
||||
Плюс **постраничная загрузка**: `pop_music_load_begin` / `_load_step`
|
||||
читают по одной странице за вызов. Страница стоит 33 мс — четверть
|
||||
логического кадра заставки (133 мс), поэтому подкачка следующей реплики
|
||||
прямо посреди анимации не видна. Кто может позволить себе паузу (титры,
|
||||
чёрный экран между сценами) — зовёт прежний `pop_music_load`.
|
||||
|
||||
### Тайминги приведены к шкале оригинала
|
||||
|
||||
Все длительности сцен взяты из SDLPoP в его тиках (60 Гц), а ждём мы
|
||||
кадрами луча (~50 Гц). Пока сцены были немыми, разбег в 20 % не был
|
||||
виден; с музыкой он слышен сразу — реплика кончается раньше картинки.
|
||||
Введён `POP_T60(t)` (pop_cutscene.h), и на него переведены титры,
|
||||
`intro_before_pv`, хвост после PV и пейсинг самой PV-сцены (счётчик
|
||||
потраченных кадров луча против `POP_T60(tick)`, вместо прежних жёстких
|
||||
четырёх кадров на логический).
|
||||
|
||||
**Паузы-реплики.** Там, где оригинал ждёт конца сэмпла, у нас теперь
|
||||
стоит реальная длина нашей записи: m50 — 831 тик, m53 — 985. Отсюда
|
||||
новая шкала PV: конец m50 на 846, вход Джафара (m53) на 1046, уход
|
||||
(m52) на 2073, конец сцены 2500 тиков (было 1959).
|
||||
|
||||
**Fade перед PV** (вопрос пользователя: наш fade короче, 4 ступени против
|
||||
64). Совпасть должен момент полной темноты, считая от пуска m55:
|
||||
у SDLPoP это 80 (transition) + 600 (wait) + 128 (fade_out_2: 0x40 шагов
|
||||
по 2 тика); у нас переход занимает 80 кадров луча = 96 тиков, а fade —
|
||||
5 тиков. Отсюда `WAIT = 80 + 600 + 128 − 96 − 5 = 707` тиков. Дальше и
|
||||
там и там экран уже чёрный, а трек доигрывает: этой паузой заставка и
|
||||
стыкуется с PV.
|
||||
|
||||
**Музыка переживает смену сцен.** m54 звучит с титров и до первого
|
||||
экрана истории (`pop_intro_show` больше не глушит CBL на входе), m52
|
||||
начинается в PV и доигрывает уже на экране «свадьбы» — как seg000:2051.
|
||||
|
||||
Проверено в MAME: цепочка 54 → 55 → 50 → 53 → 52 отыгрывается целиком,
|
||||
курсор `pop_mus_id` меняется ровно на своих кадрах, интро доходит до
|
||||
демо-режима. Слуховая проверка (нет ли хрипа от диска при играющей
|
||||
музыке) — за пользователем.
|
||||
|
||||
Reference in New Issue
Block a user