Катсцены: fade длиной как в оригинале, музыка дослушивается до уровня

ДЛИТЕЛЬНОСТЬ. fade_in_1/fade_out_1 у оригинала — 64 шага палитры по два
тика, то есть 128 тиков = 2,13 с каждый; сцена перед уровнем 2 идёт с ними
около семи секунд. Наши четыре кадра укладывались в восемь сотых секунды,
и сцена выходила втрое короче. INTRO_FADE и TITLE_FADE теперь POP_T60(128).

Ступеней яркости стало восемь вместо четырёх (7/8, 3/4, 5/8, 1/2, 3/8,
1/4, 1/8, 0 — каждая парой сдвигов, умножения на Z80 не нужно): растянуть
четыре ступени на две секунды значило бы получить четыре скачка яркости.

МУЗЫКА. Прошлый коммит отдавал трек доигрывать уже в игре — так делает
оригинал. На слух вышло хуже: музыка спотыкается, потому что загрузка
уровня не даёт насосу долить блок вовремя (у DOS-версии такой проблемы
нет). Дослушиваем под чёрным экраном, до отрисовки уровня — тем более что
следующий load_intro у оригинала всё равно начинается с ожидания тишины
(seg001:681). Пропуск сцены обрывает и музыку.

Заодно: WAIT перед PV пересчитан (584 вместо 707 — наш fade больше не
короче), а тема титров пускается ПОСЛЕ fade_in, как в show_title.

Host-тесты: 15 наборов. Проверено в MAME: плавное появление титров.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-26 09:47:16 +03:00
parent 4a939e42f8
commit 0db4f94707
6 changed files with 128 additions and 48 deletions
+28 -16
View File
@@ -152,13 +152,35 @@ void pop_ui_palette_snapshot(void) __banked
/* Из одного исходного снимка приготовить обе экранные палитры. Умножения
* нет: шкала 1/4, 1/2, 3/4 на 8-битном значении не должна тащить делитель
* в постоянно вызываемый (во время fade) путь. */
/* ВОСЕМЬ СТУПЕНЕЙ, а не четыре. Fade у оригинала идёт 64 шагами по два
* тика — 2,13 с плавного затухания; наши четыре ступени укладывались в
* доли секунды и выглядели как моргание, а растянуть их по времени значило
* получить четыре заметных скачка яркости. Восемь ступеней собираются
* пáрой сдвигов каждая (умножения на Z80 не нужно), а по времени их
* распределяет вызывающий (pop_ui_fade_*).
*
* dim_step: 0 — исходная, 8 — чёрная. */
static uint8_t dim_value(uint8_t v, uint8_t step)
{
switch (step) {
case 1: return (uint8_t)(v - (v >> 3)); /* 7/8 */
case 2: return (uint8_t)((v >> 1) + (v >> 2)); /* 3/4 */
case 3: return (uint8_t)((v >> 1) + (v >> 3)); /* 5/8 */
case 4: return (uint8_t)(v >> 1); /* 1/2 */
case 5: return (uint8_t)((v >> 2) + (v >> 3)); /* 3/8 */
case 6: return (uint8_t)(v >> 2); /* 1/4 */
case 7: return (uint8_t)(v >> 3); /* 1/8 */
default: return 0; /* 8 и выше */
}
}
void pop_ui_palette_dim(uint8_t dim_step, uint8_t keep_ui) __banked
{
uint8_t chunk, i, start;
uint8_t *buf = pop_pal_buf;
if (!font_ready) return;
if (dim_step > 4) dim_step = 4;
if (dim_step > POP_PAL_DIM_BLACK) dim_step = POP_PAL_DIM_BLACK;
for (chunk = 0; chunk < 4; chunk++) {
start = (uint8_t)(chunk << 6);
snapshot_chunk(chunk, buf, 0);
@@ -167,19 +189,9 @@ void pop_ui_palette_dim(uint8_t dim_step, uint8_t keep_ui) __banked
uint8_t idx = (uint8_t)(start + i);
uint16_t p = (uint16_t)i * 4u;
if (keep_ui && idx >= 0x37 && idx <= 0x3F) continue;
if (dim_step == 1) {
buf[p] = (uint8_t)((buf[p] >> 1) + (buf[p] >> 2));
buf[p + 1] = (uint8_t)((buf[p + 1] >> 1) +
(buf[p + 1] >> 2));
buf[p + 2] = (uint8_t)((buf[p + 2] >> 1) +
(buf[p + 2] >> 2));
} else if (dim_step == 2) {
buf[p] >>= 1; buf[p + 1] >>= 1; buf[p + 2] >>= 1;
} else if (dim_step == 3) {
buf[p] >>= 2; buf[p + 1] >>= 2; buf[p + 2] >>= 2;
} else {
buf[p] = buf[p + 1] = buf[p + 2] = 0;
}
buf[p] = dim_value(buf[p], dim_step);
buf[p + 1] = dim_value(buf[p + 1], dim_step);
buf[p + 2] = dim_value(buf[p + 2], dim_step);
}
}
gfx_pal_load(0, start, 64, buf);
@@ -214,7 +226,7 @@ void pop_ui_fade_out(uint8_t steps) __banked
if (!steps) return;
pop_ui_palette_snapshot();
for (i = 1; i <= steps; i++) {
uint8_t step = (uint8_t)((uint16_t)i * 4u / steps);
uint8_t step = (uint8_t)((uint16_t)i * POP_PAL_DIM_BLACK / steps);
pop_ui_palette_dim(step, 0);
gfx_wait_vsync();
}
@@ -225,7 +237,7 @@ void pop_ui_fade_in(uint8_t steps) __banked
uint8_t i;
if (!steps) { pop_ui_palette_restore(); return; }
for (i = steps; i > 0; i--) {
uint8_t step = (uint8_t)((uint16_t)(i - 1) * 4u / steps);
uint8_t step = (uint8_t)((uint16_t)(i - 1) * POP_PAL_DIM_BLACK / steps);
pop_ui_palette_dim(step, 0);
gfx_wait_vsync();
}