Тайлсет дворца: палитра применялась до 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 грузит ПРИЛОЖЕНИЕ
|
||||
* после 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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 берёт чистый фон из ОЗУ-копии ТОЙ
|
||||
|
||||
Reference in New Issue
Block a user