Тайлсет дворца: палитра применялась до 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:
2026-08-10 11:34:53 +03:00
parent 97929b55d3
commit 89400ff1d4
3 changed files with 19 additions and 0 deletions
+11
View File
@@ -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;