Разгрузка 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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user