PoP roomtest: дверь уровня — непрозрачные куски + финальный кадр на 2-ю страницу
Два дефекта открытой двери: 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 <noreply@anthropic.com>
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user