diff --git a/applications/PoP/poc/res/bg/pal_env0.atl b/applications/PoP/poc/res/bg/pal_env0.atl
index 5d57118..81f2970 100644
Binary files a/applications/PoP/poc/res/bg/pal_env0.atl and b/applications/PoP/poc/res/bg/pal_env0.atl differ
diff --git a/applications/PoP/poc/res/bg/pop_env0.atl b/applications/PoP/poc/res/bg/pop_env0.atl
index 5d57118..81f2970 100644
Binary files a/applications/PoP/poc/res/bg/pop_env0.atl and b/applications/PoP/poc/res/bg/pop_env0.atl differ
diff --git a/applications/PoP/roomtest/BUGS_CLOSED.md b/applications/PoP/roomtest/BUGS_CLOSED.md
index e9ef845..e8c1534 100644
--- a/applications/PoP/roomtest/BUGS_CLOSED.md
+++ b/applications/PoP/roomtest/BUGS_CLOSED.md
@@ -2421,3 +2421,43 @@ if ((Guard.charid != charid_1_shadow || current_level == 12) && ...
персонажа). Константа `SHADOW_FIGHT_LEVEL` в `pop_guard.h`.
**Проверено (пользователь, 2026-08-11):** тень выпивает и уходит, боя нет.
+
+---
+
+
+## BUG-LATTICE-DOORTOP. Чёрная дыра на месте арки у ворот — ЗАКРЫТ
+
+**Наблюдение (пользователь, 2026-08-11).** Уровень 5, комната 12, тайл
+(0,9): чёрный квадрат вместо арки.
+
+**Корень.** `draw_tile_base` (seg008:622) начинается со СПЕЦСЛУЧАЯ, которого
+у нас не было:
+
+```c
+if (tile_left == tiles_26_lattice_down && curr_tile == tiles_12_doortop) {
+ id = 6; // Lattice + door A
+ ybottom += 3;
+}
+```
+
+У `doortop` своей базы нет (`base_id == 0`), поэтому рядом с аркой пара
+«арка + верх двери» рисуется ОДНИМ спрайтом 6, опущенным на 3 px. Без
+ветки тайл не рисовал ничего, кроме полоски `bottom_id` 85 (32×4).
+
+**Фикс.** Ветка добавлена в `pop_room.c` (draw_tile) И в
+`toolchain/render_room.py` — последнее обязательно: `pop_pack_bg.py`
+собирает атлас по обходу `render_room`, поэтому без правки скрипта спрайт 6
+просто не попал бы в `pop_env*.atl` (см. memory `pop_atlas_dynamic_ids`).
+
+**Как найдено — методика, годная для любого «не так нарисовано»:**
+
+1. `./prince megahit --screenshot-level` в SDLPoP рисует карту ВСЕГО
+ уровня (комнаты разложены по `roomxs`/`roomys`, клетка 320×192).
+2. Вырезать нужную комнату и совместить со снимком MAME перебором смещения
+ (у нас совпало на `crop(101, 50, +640, +192)`, масштаб 2×1).
+3. Разница по порогу яркости даёт карту расхождений: до фикса — белый
+ прямоугольник ровно в (0,9) и 1892 пикселя, после — 995 (Кид, факел,
+ статус-полоса, то есть динамика).
+4. Что именно рисует оригинал в тайле — трасса `POP_TRACE_BT=1` (печать в
+ `add_backtable`, `src/seg008.c`, выводит room/row/col/id/размер). Она
+ сразу показала `id=6 w=32 h=63` рядом со «своим» `id=85 w=32 h=4`.
diff --git a/applications/PoP/roomtest/pop_room.c b/applications/PoP/roomtest/pop_room.c
index 215225f..8a57840 100644
--- a/applications/PoP/roomtest/pop_room.c
+++ b/applications/PoP/roomtest/pop_room.c
@@ -384,13 +384,23 @@ static void draw_tile(int row, int col)
* рисует (draw_tile_aboveroom) — только нижние/правые грани. --- */
if (row >= 0) {
uint8_t base_id = t->base_id;
- if (code == 11) /* loose: левая грань (анимир.) */
+ int base_yb = dmy;
+ if (lcode == 26 && code == 12) {
+ /* «Lattice + door A» (seg008:622): у doortop своей базы нет
+ * (base_id 0), и когда слева от него стоит арка (lattice_down),
+ * пара рисуется ОДНИМ спрайтом 6, опущенным на 3 px. Без этой
+ * ветки на месте тайла оставалась чёрная дыра — уровень 5,
+ * комната 12, тайл (0,9) (BUG-LATTICE-DOORTOP). */
+ base_id = 6;
+ base_yb += 3;
+ }
+ else if (code == 11) /* loose: левая грань (анимир.) */
base_id = POP_LOOSE_FRAM_LEFT[pop_loose_frame(pop_loose_modif[row * 10 + col])];
else if (code == 0x0F && lcode == 0 && !PALACE) /* opener, слева пусто */
base_id = 148; /* левая половина без пола — только */
/* подземелье (seg008:628) */
if (base_id)
- pop_env_b(base_id, x, t->base_y + dmy);
+ pop_env_b(base_id, x, t->base_y + base_yb);
}
/* --- draw_tile_anim (seg008.c:0B2B) — левый кадр выдвинутых пик в
diff --git a/applications/PoP/toolchain/render_room.py b/applications/PoP/toolchain/render_room.py
index 93cd8bb..87a41fb 100755
--- a/applications/PoP/toolchain/render_room.py
+++ b/applications/PoP/toolchain/render_room.py
@@ -647,11 +647,18 @@ def draw_tile(canvas, room, drawn_row, col, left_edge_code=20):
# ---- draw_tile_base (seg008.c:611) ----
base_id = t[0]
base_y = t[2]
- if code == 11: # loose floor: базовая (верхняя) часть = loose_fram_left[0] = 41
+ ybottom = draw_main_y
+ if left_code == 0x1A and code == 0x0C:
+ # seg008:622 «Lattice + door A»: у doortop своей базы нет (base_id 0),
+ # и рядом с аркой (lattice_down слева) он рисуется ОДНИМ спрайтом 6,
+ # опущенным на 3 px. Без этой ветки на месте тайла чёрная дыра.
+ base_id = 6
+ ybottom += 3
+ elif code == 11: # loose floor: базовая (верхняя) часть = loose_fram_left[0] = 41
base_id = 41
img = load_sprite(base_id, reason=f"base({TILE_NAMES.get(code,'?')})")
if img:
- blit(canvas, img, x, base_y + draw_main_y - img.height + 1)
+ blit(canvas, img, x, base_y + ybottom - img.height + 1)
# ---- draw_tile_anim ---- (spike/potion/chomper animated) skipped