Катсцены: 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:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user