From 89400ff1d4857e871d8ae1103f0506b166e91c37 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Mon, 10 Aug 2026 11:34:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B0=D0=B9=D0=BB=D1=81=D0=B5=D1=82=20?= =?UTF-8?q?=D0=B4=D0=B2=D0=BE=D1=80=D1=86=D0=B0:=20=D0=BF=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B0=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=8F=D0=BB=D0=B0=D1=81=D1=8C=20=D0=B4=D0=BE=20kid.pal=20?= =?UTF-8?q?=D0=B8=20=D0=B7=D0=B0=D1=82=D0=B8=D1=80=D0=B0=D0=BB=D0=B0=D1=81?= =?UTF-8?q?=D1=8C=20=D0=B5=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Симптом (эталон SDLPoP против нашего кадра, уровень 4): дворцовая геометрия рисовалась подземельными красками — сине-серые арки вместо песочных, бирюзовая дверь уровня вместо кремовой, сланцевый пол вместо коричнево-розового. Бирюза и зелень — это dungeon-слоты 0x5E (0,117,76) и 0x5F (0,165,157). Причина в порядке старта: атласы (и вместе с ними палитра тайлсета) грузятся ДО initgraph, потому что тот снимает DSS-страницу W0. А kid.pal — ЕДИНАЯ игровая палитра, собранная из VDUNGEON (pop_pack_kid.py build_palette), — читается ПОСЛЕ initgraph и затирает слоты 0x50..0x6F. pop_bg_pal_apply() возвращает 32 записи текущего набора; зовётся сразу за gfx_pal_sync(). На смене уровня палитра по-прежнему едет внутри pop_bg_load — там initgraph давно позади. Co-Authored-By: Claude Opus 5 --- applications/PoP/roomtest/pop_bg.h | 3 +++ applications/PoP/roomtest/pop_room.c | 11 +++++++++++ applications/PoP/roomtest/roomtest.c | 5 +++++ 3 files changed, 19 insertions(+) diff --git a/applications/PoP/roomtest/pop_bg.h b/applications/PoP/roomtest/pop_bg.h index c193ea0..8d60ca7 100644 --- a/applications/PoP/roomtest/pop_bg.h +++ b/applications/PoP/roomtest/pop_bg.h @@ -35,6 +35,9 @@ * трогает W3; проверенный порядок). Палитру pop_bg.pal грузит ПРИЛОЖЕНИЕ * после initgraph (gfx_pal_fload). 0 — OK, -1 — ошибка. */ int pop_bg_load(uint8_t set) __banked; /* 0 подземелье, 1 дворец */ +/* Пере-применить 32 записи палитры текущего тайлсета (env 0x50, wall 0x60). + * Звать после gfx_pal_fload(kid.pal): та собрана из VDUNGEON и затирает их. */ +int pop_bg_pal_apply(void) __banked; /* Освободить EMM-страницы атласов. */ void pop_bg_free(void) __banked; diff --git a/applications/PoP/roomtest/pop_room.c b/applications/PoP/roomtest/pop_room.c index f6cbc5b..e46812f 100644 --- a/applications/PoP/roomtest/pop_room.c +++ b/applications/PoP/roomtest/pop_room.c @@ -96,6 +96,17 @@ int pop_bg_load(uint8_t set) __banked return bg_load_tile_pal(pop_tile_pal[set]); } +/* Пере-применить палитру ТЕКУЩЕГО набора. Нужна отдельно от pop_bg_load + * из-за порядка старта: атласы грузятся ДО initgraph (тот снимает + * DSS-страницу W0), а общая игровая палитра kid.pal читается ПОСЛЕ него и + * затирает слоты 0x50..0x6F — она собрана из VDUNGEON + * (pop_pack_kid.py build_palette). Звать сразу за gfx_pal_fload. */ +int pop_bg_pal_apply(void) __banked +{ + if (bg_set == 0xFF) return -1; + return bg_load_tile_pal(pop_tile_pal[bg_set]); +} + void pop_bg_free(void) __banked { int i; diff --git a/applications/PoP/roomtest/roomtest.c b/applications/PoP/roomtest/roomtest.c index 476ad6f..6ed5c15 100644 --- a/applications/PoP/roomtest/roomtest.c +++ b/applications/PoP/roomtest/roomtest.c @@ -512,6 +512,11 @@ int main(void) if (gfx_pal_fload(0, "KID\\kid.pal") < 0) /* единая игровая палитра */ gfx_pal_fload(0, "a:\\kid.pal"); gfx_pal_sync(); /* палитра 0 -> плоскость 1 */ + /* kid.pal — ЕДИНАЯ игровая палитра, собранная из VDUNGEON, и она только + * что затёрла слоты тайлсета. Возвращаем цвета текущего набора: на + * дворцовых уровнях без этого рисуется дворцовая геометрия подземельными + * красками (сине-серое вместо песочного). */ + pop_bg_pal_apply(); /* Фон комнаты рисуется в ОБЕ графические страницы: у каждой своя * ОЗУ-копия/видео-ОЗУ, а heal берёт чистый фон из ОЗУ-копии ТОЙ