Разгрузка 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
+32
View File
@@ -1206,6 +1206,38 @@ N навык M» — отдельная надобность, если пона
Фазы З1..З5 и список «проверить артефактом до кодинга» — в доке.
### <a id="mob-spr-emm"></a>MOB-SPR-EMM. Композит падающего куска — в EMM (1284 Б W2)
`mob_spr` (`pop_room.c`) — самый крупный буфер в W2: 4 + 64*20 байт под
композит падающей плиты. Это половина нынешнего дефицита W2.
**В БАНК ЕГО ПЕРЕНЕСТИ НЕЛЬЗЯ** (разобрано 2026-08-26). Цепочка рисования
`pop_room` (банк 7) -> `pop_mem_b` (банк 5) -> `blit_b_clip` (резидент), и
трамплин на `pop_mem_b` переключает W3. Указатель на данные банка 7 после
этого показывает на страницу банка 5: блит нарисует мусор, причём молча.
`--bank-data` вдобавок действует на весь модуль, а `mobs` из того же файла
читают снаружи.
**ЧТО РАБОТАЕТ — EMM-страница с маппингом в W0.** W0 не переключают ни
трамплин (он трогает только W3), ни звуковой ISR (насос живёт в W3), значит
адрес `0x0000+off` валиден и в банке 7, и в банке 5, и в резиденте — ровно
как у атласных спрайтов, которые тем же блитом и рисуются. `blit_b_clip`
окно не трогает, маппингом занимается вызывающий.
**Цена.** `mob_spr_build` читает три части через `gfx_w0_map(a->page)`, а
приёмник должен быть в том же окне — держать оба нельзя. Сборку придётся
вести построчно: строка части в 64-байтовый буфер на стеке, перемаппить
окно, записать. Вызывается это лишь на смену тайлсета. Плюс
`gfx_w0_map`/`unmap` вокруг каждого куска — около 1350 тактов, при шести
кусках меньше 2 % кадра.
**Чем подтверждать.** Падающие плиты в комнате 1.2 и каскад уровня 13:
ошибка проявится не крашем, а мусором на месте куска.
**Дешёвая половинчатая мера** (если 1284 Б не нужны целиком): буфер объявлен
с запасом 64x20, фактический композит около 58x19 — точные константы дают
~180 байт без единого риска.
### <a id="pal-arc"></a>PAL-ARC. Палитры — в архив своей группы (полишинг)
Файлов палитр в игре шесть: `KID\kid.pal` (1024 Б), `PV\story.pal`,