diff --git a/applications/PoP/poc/res/bg/pop_env1.atl b/applications/PoP/poc/res/bg/pop_env1.atl index 223d82a..ce90322 100644 Binary files a/applications/PoP/poc/res/bg/pop_env1.atl and b/applications/PoP/poc/res/bg/pop_env1.atl differ diff --git a/applications/PoP/poc/res/bg/pop_env3.atl b/applications/PoP/poc/res/bg/pop_env3.atl index b14185e..02a97ae 100644 Binary files a/applications/PoP/poc/res/bg/pop_env3.atl and b/applications/PoP/poc/res/bg/pop_env3.atl differ diff --git a/applications/PoP/poc/res/bg/pop_env4.atl b/applications/PoP/poc/res/bg/pop_env4.atl index 61a02ee..d426803 100644 Binary files a/applications/PoP/poc/res/bg/pop_env4.atl and b/applications/PoP/poc/res/bg/pop_env4.atl differ diff --git a/applications/PoP/roomtest/pop_trob.c b/applications/PoP/roomtest/pop_trob.c index 28dd56b..dea400e 100644 --- a/applications/PoP/roomtest/pop_trob.c +++ b/applications/PoP/roomtest/pop_trob.c @@ -49,6 +49,12 @@ static uint8_t trob_drawn[POP_ROOMTILES]; * кадре 430 080, то есть ~12 % кадра на пустой проход. */ static uint8_t rest_pending; +/* Дверь уровня: отложенный редрой ВТОРОЙ страницы дабл-буфера. Створка + * анимируется покадрово в back-страницу, поэтому последний кадр анимации + * попадает только на одну из двух страниц — вторая застревает на шаг раньше + * и дверь «дрожит» через кадр. ldoor_pos = tilepos ПРАВОЙ половины. */ +static uint8_t ldoor_rest, ldoor_pos; + /* prandom (seg009.c:321, 32-бит LCG) — нужен для стартовой фазы факела и * выбора следующего кадра пламени. */ static unsigned long trob_seed; @@ -66,6 +72,7 @@ void pop_trob_reset(void) for (i = 0; i < POP_NROOMS; i++) room_seen[i] = 0; for (i = 0; i < POP_ROOMTILES; i++) { spike_rest[i] = 0; button_rest[i] = 0; trob_drawn[i] = 0; } rest_pending = 0; + ldoor_rest = 0; trobs_count = 0; } @@ -111,6 +118,7 @@ void pop_trob_room_changed(void) uint8_t i; for (i = 0; i < POP_ROOMTILES; i++) { spike_rest[i] = 0; button_rest[i] = 0; trob_drawn[i] = 0; } rest_pending = 0; + ldoor_rest = 0; } /* anim_tile_modif (seg000:0B12) — при входе в комнату завести анимации её @@ -380,6 +388,10 @@ void pop_process_trobs(uint8_t cur_room) } rest_pending = left; } + if (ldoor_rest) { /* доложить финальный кадр створки на 2-ю страницу */ + pop_leveldoor_redraw(ldoor_pos / 10, ldoor_pos % 10); + ldoor_rest--; + } if (trobs_count == 0) return; @@ -477,7 +489,12 @@ void pop_process_trobs(uint8_t cur_room) * kid_heal вернул бы из фона закрытую створку. Куски двери * непрозрачны, поэтому wipe не нужен. */ uint8_t trow = tp / 10, tcol = tp % 10; - if (tcol + 1 < 10) pop_leveldoor_redraw(trow, tcol + 1); + if (tcol + 1 < 10) { + pop_leveldoor_redraw(trow, tcol + 1); + /* Анимация кончилась — этот кадр лёг только на ОДНУ страницу; + * повторить его на второй, иначе дверь дрожит через кадр. */ + if (type < 0) { ldoor_pos = (uint8_t)(tp + 1); ldoor_rest = 1; } + } } if (room == cur_room && code == TILE_SWORD) { /* МЕЧ — редрой только на смене видимого кадра (блеск = modif==1): diff --git a/applications/PoP/toolchain/pop_pack_bg.py b/applications/PoP/toolchain/pop_pack_bg.py index a62aa66..b4dcdc7 100644 --- a/applications/PoP/toolchain/pop_pack_bg.py +++ b/applications/PoP/toolchain/pop_pack_bg.py @@ -83,10 +83,6 @@ STUCK_ENV_IDS = {35, 36} # curr_tile==15 && tile_left==0 && level_type==0 → id 148 вместо базы 147). # render_room этой ветки не знает, поэтому добавляем явно. OPENER_NOFLOOR_ENV_IDS = {148} -# Дверь уровня (draw_leveldoor, seg008:1D29): решётка створки (33 — слайс 4px, -# 34 — верх), лестница за ней (99 — низ, 144 — марш). render_room.py -# draw_leveldoor не реализует, поэтому в автосбор эти id не попадают. -LEVELDOOR_ENV_IDS = {33, 34, 99, 144} # ---- chtab_1 (flame/sword/potion), база ресурса 150, папка PRINCE ---- # Зелье (seg008 draw_tile_fore/draw_tile_anim): склянка id 12 (малая) / 13 @@ -167,7 +163,15 @@ def collect_used(): # поверх того, что сзади, а у нас 0 -> 0xFF делал её прозрачной, и сквозь неё # просвечивал Kid (спуск/подъём у кромки кнопки). 43/36 полностью непрозрачны — # для них флаг ничего не меняет, оставлены для полноты списка. -NO_TRANSP_ENV_IDS = {36, 43, 73, 74, 96, 149} +# Дверь уровня (draw_leveldoor, seg008:1D29): решётка створки (33 — слайс 4px, +# 34 — верх), лестница за ней (99 — низ, 144 — марш). render_room.py +# draw_leveldoor не реализует, поэтому в автосбор эти id не попадают. +LEVELDOOR_ENV_IDS = {33, 34, 99, 144} + +# Куски двери уровня (draw_leveldoor) оригинал рисует blitters_0_no_transp: +# марш лестницы 144 обязан ЗАКРАШИВАТЬ поднявшуюся створку, иначе слева от +# лестницы сквозь него видна решётка (0 -> 0xFF делал фон спрайта прозрачным). +NO_TRANSP_ENV_IDS = {36, 43, 73, 74, 96, 149} | LEVELDOOR_ENV_IDS def load_indexed(chtab, id, opaque=False):