Разгрузка W1: смена уровня и служебный слой — в банк 8

_main занимал 3658 байт резидента, и добрая половина этого — события «раз
в партию». Вынесены целиком:

- pop_level_change — смена уровня (катсцена, гашение, загрузка, палитра,
  звук): 61 строка, наружу осталось одно условие и вызов;
- pop_frame_ui — меню, F10 и QuickSave/Load: 58 строк, плюс туда же уехали
  edge-состояния клавиш и сами коды клавиш (снаружи они больше не нужны).

_CODE 24102 -> 23626, запас W2 вырос с 86 до 559 байт.

Заодно три правки по замечаниям:

- затемнение фона под меню считалось числом «2», а шкала ступеней выросла
  с 4 до 32 — фон почти не гас. Теперь доля от шкалы (POP_PAL_DIM_BLACK/2);
  тем же прошлись по остаткам pop_pal_apply(4);
- в катсценах персонажи появлялись только после fade in: первый кадр
  рисуется ПОД чёрной палитрой, и картинка проявляется целиком, вместе с
  актёрами (cut_scene_8/9/12_short/ending, pre_room_animated,
  intro_pv_animated);
- отладочная полоса по умолчанию выключена.

Host-тесты: 15 наборов. Проверено в MAME: меню открывается и закрывается,
фон под ним затемнён, полосы нет.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-26 11:42:56 +03:00
parent f66fd0e1b6
commit 0b15ed7b8f
7 changed files with 251 additions and 134 deletions
+38 -10
View File
@@ -721,6 +721,7 @@ static int intro_pv_animated(void)
uint8_t star_phase[6] = { 1, 1, 1, 1, 1, 1 };
uint8_t sand_frame = 0;
uint8_t flash_done = 0;
uint8_t faded_in = 0;
uint8_t flash;
intro_skip_t skip;
int result = -1;
@@ -753,7 +754,9 @@ static int intro_pv_animated(void)
if (bad) return -1;
}
pop_pal_fade_in(INTRO_FADE);
/* Проявление — ПОСЛЕ первого нарисованного кадра (см. ниже в цикле):
* иначе две секунды fade идут по пустой комнате, а принцесса возникает
* уже на свету. */
/* Актёрские атласы в EMM; дальше по сцене диск трогает только подкачка
* следующей реплики — по одной странице за кадр (pop_music_load_step).
* Полноэкранная accel-копия кадра насосу не мешает: leaf режет DI
@@ -838,6 +841,9 @@ static int intro_pv_animated(void)
torch_right, sand_frame, flash,
render_tick);
pop_sfx_tick(); /* как в оригинале — в конце отрисовки кадра */
/* Первый кадр собран под чёрной палитрой — теперь проявляем его
* целиком, вместе с принцессой и факелами. */
if (!faded_in) { faded_in = 1; pop_pal_fade_in(INTRO_FADE); }
pop_music_service(); /* заявки на музыку из сцены (эффект без оцифровки) */
/* Страницу следующей реплики читаем ЗДЕСЬ, до досыпания кадра:
* 33 мс диска укладываются в паузу логического кадра (133 мс) и
@@ -940,7 +946,6 @@ static int pre_room_animated(uint8_t picture, uint8_t state, uint8_t frames)
}
pop_screen_present(1);
pop_pal_fade_in(INTRO_FADE);
result = 0;
full.x = 0; full.y = 0; full.w = GFX_WIDTH; full.h = GFX_HEIGHT;
intro_skip_begin(&skip);
@@ -968,6 +973,9 @@ static int pre_room_animated(uint8_t picture, uint8_t state, uint8_t frames)
/* Первый тик уже потрачен на commit: ещё четыре = 5/50 с. */
for (hold = 1; hold < 5; hold++) gfx_wait_vsync();
/* Проявляем ПОСЛЕ первого кадра: иначе две секунды fade идут по
* пустой комнате, а часы и пламя возникают уже на свету. */
if (frame == 0) pop_pal_fade_in(INTRO_FADE);
torch_left = (uint8_t)((torch_left + 1) % 9);
torch_right = (uint8_t)((torch_right + 1) % 9);
sand = (uint8_t)((sand + 1) % 3);
@@ -1332,8 +1340,13 @@ static int cut_scene_8(void)
cut_kid_init(CHARID_24_MOUSE, 144, 167, 106);
/* princess_crouching (seg001:024D): сидит и гладит мышь. */
cut_shad_init(131, 169, 110);
pop_pal_fade_in(INTRO_FADE);
aborted = cut_run(20, 1);
/* ПЕРВЫЙ КАДР — ДО ПРОЯВЛЕНИЯ. fade_in занимает две секунды, и всё это
* время на экране была бы пустая комната: персонажи появляются только с
* первым кадром цикла. Рисуем его при ещё чёрной палитре — тогда
* картинка проявляется целиком, вместе с актёрами. */
aborted = cut_run(1, 1);
if (!aborted) pop_pal_fade_in(INTRO_FADE);
if (!aborted) aborted = cut_run(19, 1);
if (!aborted) {
cut_kid_seq(107); /* мышь встаёт и уходит */
aborted = cut_run(20, 1);
@@ -1356,10 +1369,15 @@ static int cut_scene_9(void)
/* princess_stand (seg001:026A) — поза PV1, лицом вправо. */
cut_shad_init(144, 169, 94);
Guard.direction = 0;
pop_pal_fade_in(INTRO_FADE);
/* ПЕРВЫЙ КАДР — ДО ПРОЯВЛЕНИЯ. fade_in занимает две секунды, и всё это
* время на экране была бы пустая комната: персонажи появляются только с
* первым кадром цикла. Рисуем его при ещё чёрной палитре — тогда
* картинка проявляется целиком, вместе с актёрами. */
aborted = cut_run(1, 0); /* мышь ещё за кадром */
if (!aborted) pop_pal_fade_in(INTRO_FADE);
/* init_mouse_go (seg001:022A): мышь вбегает справа. */
cut_kid_init(CHARID_24_MOUSE, 199, 167, 105);
aborted = cut_run(5, 1);
if (!aborted) aborted = cut_run(5, 1);
if (!aborted) {
cut_shad_seq(112); /* принцесса приседает */
aborted = cut_run(9, 1);
@@ -1383,8 +1401,13 @@ static int cut_scene_12_short(void)
if (cut_begin(pre_hourglass_state()) != 0) return -1;
/* init_princess_x156 (seg001:0230) = init_princess + x = 156. */
cut_shad_init(156, 166, 94);
pop_pal_fade_in(INTRO_FADE);
aborted = cut_run(2, 0);
/* ПЕРВЫЙ КАДР — ДО ПРОЯВЛЕНИЯ. fade_in занимает две секунды, и всё это
* время на экране была бы пустая комната: персонажи появляются только с
* первым кадром цикла. Рисуем его при ещё чёрной палитре — тогда
* картинка проявляется целиком, вместе с актёрами. */
aborted = cut_run(1, 0);
if (!aborted) pop_pal_fade_in(INTRO_FADE);
if (!aborted) aborted = cut_run(1, 0);
if (!aborted) {
cut_shad_seq(98); /* princess turn around [PV1] */
aborted = cut_run(24, 0);
@@ -1406,9 +1429,14 @@ static int cut_ending(void)
/* init_ending_princess (seg001:0251) + init_ending_kid (seg001:0287). */
cut_shad_init(136, 164, 109);
cut_kid_init(CHARID_0_KID, 198, 164, 1);
pop_pal_fade_in(INTRO_FADE);
/* ПЕРВЫЙ КАДР — ДО ПРОЯВЛЕНИЯ. fade_in занимает две секунды, и всё это
* время на экране была бы пустая комната: персонажи появляются только с
* первым кадром цикла. Рисуем его при ещё чёрной палитре — тогда
* картинка проявляется целиком, вместе с актёрами. */
aborted = cut_run(1, 1);
if (!aborted) pop_pal_fade_in(INTRO_FADE);
pop_sfx_play(26); /* «arrived to princess» */
aborted = cut_run(8, 1);
if (!aborted) aborted = cut_run(7, 1);
if (!aborted) {
cut_shad_seq(108); /* поворот и объятие */
aborted = cut_run(5, 1);