/* * pop_pal.c — владелец порядка «load logical palette -> apply brightness». * * Снимок физически хранит pop_ui (в хвосте FONT.ATL), потому что только тот * модуль владеет страницей шрифта. Здесь остаётся политика: kid.pal всегда * дополняют живые слоты тайлсета и Тени, а file-load никогда не считается * показом яркого кадра сам по себе. */ #include #include #include #include "pop_bg.h" #include "pop_shadow.h" #include "pop_guard.h" #include "pop_pal.h" #include "pop_ui.h" /* POP_COL_OUTSIDE */ static void pal_file_load(const char *path, const char *fallback) { if (gfx_pal_fload(0, path) < 0) gfx_pal_fload(0, fallback); gfx_pal_sync(); pop_ui_palette_snapshot(); } void pop_pal_black(void) __banked { pop_ui_palette_black(); } void pop_pal_snapshot(void) __banked { pop_ui_palette_snapshot(); } void pop_pal_apply(uint8_t fade) __banked { pop_ui_palette_dim(fade, 0); } void pop_pal_fade_out(uint8_t steps) __banked { pop_ui_fade_out(steps); } void pop_pal_fade_in(uint8_t steps) __banked { pop_ui_fade_in(steps); } /* Слот «вне игрового поля» (POP_COL_OUTSIDE) — всегда ЧЁРНЫЙ. * * Это ещё один ДИНАМИЧЕСКИЙ слот поверх файловой палитры: kid.pal содержит * все 256 записей и кладёт в единицу свой цвет, а нам она нужна чёрной — * иначе борта и полоса HP станут цветными. Ставим после каждого * file-load, рядом с тайлсетом/Тенью/соперником (см. pop_pal_game_load). */ void pop_pal_outside_apply(void) __banked { gfx_pal_set(0, POP_COL_OUTSIDE, 0, 0, 0); gfx_pal_set(1, POP_COL_OUTSIDE, 0, 0, 0); } void pop_pal_flash_white(uint8_t on) __banked { uint8_t color = on ? 255 : 0; gfx_pal_set(0, 0, color, color, color); gfx_pal_set(1, 0, color, color, color); } void pop_pal_menu_dim(uint8_t fade) __banked { pop_ui_palette_dim(fade, 1); } void pop_pal_game_load(void) __banked { pal_file_load("KID\\kid.pal", "a:\\kid.pal"); /* kid.pal содержит все 256 записей и намеренно затирает эти три * динамических диапазона (тайлсет, Тень, набор соперника). * Восстановить их надо ДО snapshot. */ pop_bg_pal_apply(); pop_shadow_pal_apply(); pop_guard_pal_apply(); pop_pal_outside_apply(); pop_ui_palette_snapshot(); } void pop_pal_level_load(uint8_t full) __banked { if (full) { pop_pal_game_load(); return; } /* При обычной границе уровня меняются только env/wall и набор соперника. */ pop_bg_pal_apply(); pop_guard_pal_apply(); pop_pal_outside_apply(); pop_ui_palette_snapshot(); } void pop_pal_title_load(void) __banked { pal_file_load("TITLE\\title.pal", "a:\\title.pal"); } void pop_pal_story_load(void) __banked { pal_file_load("PV\\story.pal", "a:\\story.pal"); } void pop_pal_pv_load(void) __banked { pal_file_load("PV\\pv.pal", "a:\\pv.pal"); }