Тайлсет дворца: палитра применялась до kid.pal и затиралась ею
Симптом (эталон 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 <noreply@anthropic.com>
This commit is contained in:
@@ -35,6 +35,9 @@
|
|||||||
* трогает W3; проверенный порядок). Палитру pop_bg.pal грузит ПРИЛОЖЕНИЕ
|
* трогает W3; проверенный порядок). Палитру pop_bg.pal грузит ПРИЛОЖЕНИЕ
|
||||||
* после initgraph (gfx_pal_fload). 0 — OK, -1 — ошибка. */
|
* после initgraph (gfx_pal_fload). 0 — OK, -1 — ошибка. */
|
||||||
int pop_bg_load(uint8_t set) __banked; /* 0 подземелье, 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-страницы атласов. */
|
/* Освободить EMM-страницы атласов. */
|
||||||
void pop_bg_free(void) __banked;
|
void pop_bg_free(void) __banked;
|
||||||
|
|||||||
@@ -96,6 +96,17 @@ int pop_bg_load(uint8_t set) __banked
|
|||||||
return bg_load_tile_pal(pop_tile_pal[set]);
|
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
|
void pop_bg_free(void) __banked
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|||||||
@@ -512,6 +512,11 @@ int main(void)
|
|||||||
if (gfx_pal_fload(0, "KID\\kid.pal") < 0) /* единая игровая палитра */
|
if (gfx_pal_fload(0, "KID\\kid.pal") < 0) /* единая игровая палитра */
|
||||||
gfx_pal_fload(0, "a:\\kid.pal");
|
gfx_pal_fload(0, "a:\\kid.pal");
|
||||||
gfx_pal_sync(); /* палитра 0 -> плоскость 1 */
|
gfx_pal_sync(); /* палитра 0 -> плоскость 1 */
|
||||||
|
/* kid.pal — ЕДИНАЯ игровая палитра, собранная из VDUNGEON, и она только
|
||||||
|
* что затёрла слоты тайлсета. Возвращаем цвета текущего набора: на
|
||||||
|
* дворцовых уровнях без этого рисуется дворцовая геометрия подземельными
|
||||||
|
* красками (сине-серое вместо песочного). */
|
||||||
|
pop_bg_pal_apply();
|
||||||
|
|
||||||
/* Фон комнаты рисуется в ОБЕ графические страницы: у каждой своя
|
/* Фон комнаты рисуется в ОБЕ графические страницы: у каждой своя
|
||||||
* ОЗУ-копия/видео-ОЗУ, а heal берёт чистый фон из ОЗУ-копии ТОЙ
|
* ОЗУ-копия/видео-ОЗУ, а heal берёт чистый фон из ОЗУ-копии ТОЙ
|
||||||
|
|||||||
Reference in New Issue
Block a user