From 1214785a56b78a4c063f08e9b1dc12c7dcdb340b Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Wed, 29 Jul 2026 18:18:01 +0300 Subject: [PATCH] =?UTF-8?q?PoP=20roomtest:=20=D0=B4=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=8C=20=D1=83=D1=80=D0=BE=D0=B2=D0=BD=D1=8F=20=E2=80=94=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=BF=D1=80=D0=BE=D0=B7=D1=80=D0=B0=D1=87=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20=D0=BA=D1=83=D1=81=D0=BA=D0=B8=20+=20=D1=84?= =?UTF-8?q?=D0=B8=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=B4=D1=80=20=D0=BD=D0=B0=202-=D1=8E=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=86=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Два дефекта открытой двери: 1. Слева от лестницы оставалась поднявшаяся решётка. Оригинал рисует ВСЕ куски двери blitters_0_no_transp, а наш упаковщик по умолчанию гонит пиксель 0 в 0xFF (ключ прозрачности) — марш лестницы 144 переставал закрашивать створку под собой. Добавил LEVELDOOR_ENV_IDS в NO_TRANSP_ENV_IDS (тот же приём, что для 43/73/74/96/149). 2. Дверь дрожала через кадр: створка анимируется в back-страницу, и ПОСЛЕДНИЙ кадр анимации ложился только на одну из двух страниц, вторая застревала на шаг раньше. Добавлен отложенный редрой (ldoor_rest) — повтор финального кадра на второй странице, как spike_rest/button_rest. Проверено в MAME с заморозкой кадра: обе страницы в области двери побайтово одинаковы, слева от лестницы чистый чёрный фон. Co-Authored-By: Claude Opus 5 --- applications/PoP/poc/res/bg/pop_env1.atl | Bin 13481 -> 13481 bytes applications/PoP/poc/res/bg/pop_env3.atl | Bin 5200 -> 5200 bytes applications/PoP/poc/res/bg/pop_env4.atl | Bin 11283 -> 11283 bytes applications/PoP/roomtest/pop_trob.c | 19 ++++++++++++++++++- applications/PoP/toolchain/pop_pack_bg.py | 14 +++++++++----- 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/applications/PoP/poc/res/bg/pop_env1.atl b/applications/PoP/poc/res/bg/pop_env1.atl index 223d82a3202a380c55967c337710b8b7902be76b..ce903220da26f7f36e597899efcc1cf68d9f18b9 100644 GIT binary patch delta 52 XcmZ3PxiWLZ4rcWL;=tzn%%=QZGoLa506(Y({{R30 diff --git a/applications/PoP/poc/res/bg/pop_env3.atl b/applications/PoP/poc/res/bg/pop_env3.atl index b14185e3345ee7f243fe740a98112653c50aa086..02a97ae48982d694c7a26a2172a3bdb39e4254f4 100644 GIT binary patch delta 53 vcmcbhaY18)94lJ@7))NsD$fxT5*H8RfjE;LSXo#=Trekrm2LBM)}4F+%~TMu delta 47 zcmcbhaY18)94qtx|Nkcoh$u{UU}a&Bi-)iiSlO83;wKA=$WKmS<=8x(btfMHpYsp5 diff --git a/applications/PoP/poc/res/bg/pop_env4.atl b/applications/PoP/poc/res/bg/pop_env4.atl index 61a02ee1abee70121e65504eed54bc84ca007c7b..d426803a17cdb0e031eb0c7778fef8f25f3a806e 100644 GIT binary patch delta 733 zcmbOnF*#yGl9kqKg+H5KLtepu1rJY_b$Tl3l?N+av^0#Gs;LlM5Avfx#`p6dVj<3I$+*$%0Da zgG9JcMN}v*9^HkL1C_-E(1n45l6;TBF0o?!q 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):