From 096517d8aa9afd9ef107c0ecb6f9256baee97f73 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Tue, 11 Aug 2026 16:22:04 +0300 Subject: [PATCH] =?UTF-8?q?MIRROR-FG-STALE=20=D0=B7=D0=B0=D0=BA=D1=80?= =?UTF-8?q?=D1=8B=D1=82=20=D0=BA=D0=B0=D0=BA=20=D0=9D=D0=95=20=D0=91=D0=90?= =?UTF-8?q?=D0=93=20(=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D0=B5=D0=BC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Прогон читом ROOMNAV: телепорт в комнату 4 сразу после нажатия кнопки — зеркала нет вовсе (тайл ставится в момент, когда дверь ДОРИСОВАЛА открытие, 43 тика анимации, телепорт успевает раньше); обычный вход в комнату — зеркало на месте и непроходимо, кроме правильного прыжка, то есть коллизия его видит. Сценария «постановка при игроке в комнате» в реальном прохождении нет: дверь выхода стоит не в комнате зеркала, а при входе комната и снимок room_fg берутся из данных уровня разом. Решение пользователя: телепорт по комнатам — отладочный режим, чинить нечего. Запись целиком уехала в BUGS_CLOSED.md вместе с протоколом и с указанием, чем лечить, если симптом всё же всплывёт на моде/уровне, где кнопка и зеркало в одной комнате. Co-Authored-By: Claude Opus 5 --- applications/PoP/roomtest/BUGS_CLOSED.md | 34 +++++++++++++++++++++ applications/PoP/roomtest/BUGS_OPEN.md | 36 ----------------------- applications/PoP/roomtest/NEXT_SESSION.md | 4 --- applications/PoP/roomtest/TASKS_CLOSED.md | 8 +++-- 4 files changed, 39 insertions(+), 43 deletions(-) diff --git a/applications/PoP/roomtest/BUGS_CLOSED.md b/applications/PoP/roomtest/BUGS_CLOSED.md index b206eef..436f934 100644 --- a/applications/PoP/roomtest/BUGS_CLOSED.md +++ b/applications/PoP/roomtest/BUGS_CLOSED.md @@ -2274,3 +2274,37 @@ draw_tile_anim(); <- СВОЯ графика тайла: челюсти Связь с T-1 сработала как и предсказано: пока Кида не перерисовываем, heal'а нет, стирать пики нечем. Но T-1 остаётся открытым — трогать пики безусловно мы всё ещё продолжаем, когда Кид рядом ДВИЖЕТСЯ. + +--- + + +## MIRROR-FG-STALE. Зеркало и снимок комнаты — **НЕ БАГ, закрыт 2026-08-11** + +Заводился как краевой случай от [L4-MIRROR](TASKS_CLOSED.md#l4-mirror): +`place_mirror` (`pop_trob.c`) пишет тайл зеркала в ДАННЫЕ УРОВНЯ +(`pop_level_set_tile`), а коллизия работает со СНИМКОМ комнаты `room_fg`, +который `pop_room_load` делает при входе в комнату. Опасение: если тайл +поставлен, пока игрок УЖЕ в комнате 4, снимок останется старым и зеркало +будет невидимо для коллизии — Кид пробежит сквозь него, тень не родится. + +**Проверка пользователем (2026-08-11), чит ROOMNAV:** нажал кнопку открытия +двери, телепортировался в комнату 4 — **зеркала не было вовсе**; вышел из +комнаты и вошёл обычным путём — зеркало появилось и **непроходимо, кроме +правильного прыжка**, то есть коллизия видит его корректно. + +**Вывод: сценария нет.** Тайл ставится в момент, когда дверь ДОРИСОВАЛА +открытие (`animate_leveldoor`, переход `pop_leveldoor_open` 0/2 → 1, 43 +тика анимации) — телепорт успевает раньше, поэтому «постановки при игроке в +комнате» в этом прогоне не случилось вообще. А при обычном входе комната +рисуется целиком из данных уровня и `room_fg` снимается заново — графика и +коллизия согласованы по построению. + +**Решение пользователя:** телепорт по комнатам — ОТЛАДОЧНЫЙ режим; в реальном +прохождении дверь выхода стоит не в комнате зеркала, игрок физически не может +быть там в момент постановки, и зеркало с тенью появляются всегда штатно. +Чинить нечего. + +**Если симптом всё же всплывёт** (например, появится мод/уровень, где кнопка +и зеркало в одной комнате): лечение — обновлять в `place_mirror` не только +данные уровня, но и живую карту (в `pop_map.c` уже есть внутренние точки +записи `g_fg[tilepos]`, нужна публичная «поставить тайл в текущей комнате»). diff --git a/applications/PoP/roomtest/BUGS_OPEN.md b/applications/PoP/roomtest/BUGS_OPEN.md index e431c6c..4e567a6 100644 --- a/applications/PoP/roomtest/BUGS_OPEN.md +++ b/applications/PoP/roomtest/BUGS_OPEN.md @@ -15,7 +15,6 @@ | ID | что | тип | статус | |----|-----|-----|--------| | [FORE-DUP](#fore-dup) | передний слой тайла рисуется дважды при перекрытии объектов | оптимизация | открыт: **сначала замерить**, потом чинить | -| [MIRROR-FG-STALE](#mirror-fg-stale) | зеркало поставлено, пока игрок В комнате 4 → коллизия его не видит | **низкий** (в обычном прохождении недостижимо) | открыт, фикс на несколько строк | | [DIED-ON-BUTTON](#died-on-button) | `died_on_button` (seg007:776) не портирован | порт | открыт | | [TORCH-ANIM-RIGHT](#torch-anim-right) | под запечённым пламенем застывают не только челюсти чомпера | **низкий** | открыт: на уровнях 1-4 такого соседства нет | | [T-1](#t-1) | пики перерисовываются безусловно | оптимизация | открыт | @@ -336,38 +335,3 @@ for (tile_row = x_top_row; tile_row <= char_bottom_row; ++tile_row) Если дубль мал — оставить как есть и закрыть запись. --- - - -## MIRROR-FG-STALE. Зеркало, поставленное при игроке В комнате 4, не попадает в коллизию - -Заведено 2026-08-11 как краевой случай, оставшийся открытым от -[L4-MIRROR](TASKS_CLOSED.md#l4-mirror) (шаг 2). **Низкий приоритет: в -обычном прохождении недостижимо** — дверь выхода уровня 4 стоит не в той -комнате, где зеркало, поэтому игрок физически не может быть в комнате 4 в -момент её открытия. - -**Причина (по коду, не по симптому).** `place_mirror` (`pop_trob.c`) пишет -тайл зеркала в ДАННЫЕ УРОВНЯ (`pop_level_set_tile` — страница уровня в W0) и, -если комната зеркала на экране, помечает тайл на перерисовку. А коллизия -работает не с данными уровня, а со СНИМКОМ комнаты `room_fg`, который -`pop_room_load` делает один раз при входе в комнату (`pop_map_set(room_fg)` -в `roomtest.c`). Снимок в этот момент не обновляется. - -**Что будет:** зеркало нарисуется (перерисовка тайла отработает), но для -коллизии его как бы нет — `wall_type` не вернёт «стена слева», а ветка -`is_obstacle` для прыжка сквозь зеркало не сработает. То есть Кид пробежит -сквозь зеркало насквозь и **тень не родится**, пока комнату не перезайти. - -**Сценарий проверки** (нужен чит `+`/`−` ROOMNAV, иначе не собрать): -1. уровень 4, нажать кнопку, открывающую дверь выхода; -2. **пока дверь анимируется** (43 тика ≈ 3.5 с) уйти читом в комнату 4; -3. дождаться, когда дверь дорисует открытие — зеркало появится на экране; -4. разбежаться справа налево и прыгнуть в зеркало. - - Ожидание при баге: Кид пролетает насквозь как через пустоту, тени нет. - - После выхода из комнаты и возврата в неё всё работает нормально. - -**Фикс — несколько строк:** в `place_mirror`, в ветке -`cur_room == MIRROR_ROOM`, обновить и живую карту, а не только данные уровня -(в `pop_map.c` уже есть внутренние точки записи `g_fg[tilepos] = ...`, -нужна публичная «поставить тайл в текущей комнате»). Делать вместе с любой -следующей правкой `pop_trob.c` — отдельного захода не стоит. diff --git a/applications/PoP/roomtest/NEXT_SESSION.md b/applications/PoP/roomtest/NEXT_SESSION.md index f9f0b56..46da50b 100644 --- a/applications/PoP/roomtest/NEXT_SESSION.md +++ b/applications/PoP/roomtest/NEXT_SESSION.md @@ -81,10 +81,6 @@ при перекрытии объектов (Кид+отражение всегда, Кид+соперник — весь ближний бой). Картинку не портит, тратит такты. **Сначала замерить, потом чинить** — окно клипа в своё время дало 3.2×. -- **[MIRROR-FG-STALE](BUGS_OPEN.md#mirror-fg-stale)** — зеркало, поставленное - пока игрок В комнате 4, не попадает в снимок `room_fg` и потому невидимо - для коллизии. В обычном прохождении недостижимо; фикс на несколько строк, - делать вместе со следующей правкой `pop_trob.c`. - **[DIED-ON-BUTTON](BUGS_OPEN.md#died-on-button)** — `died_on_button` (seg007:776) не портирован. - **TORCH-ANIM-RIGHT** — под запечённым пламенем могут застыть пики/меч/зелье diff --git a/applications/PoP/roomtest/TASKS_CLOSED.md b/applications/PoP/roomtest/TASKS_CLOSED.md index c6c1810..34d3deb 100644 --- a/applications/PoP/roomtest/TASKS_CLOSED.md +++ b/applications/PoP/roomtest/TASKS_CLOSED.md @@ -196,9 +196,11 @@ Разбор, замеры и варианты — [`../docs/shadow_render.md`](../docs/shadow_render.md); блочные операции акселератора под это в libbgi уже есть (`tests/accop`). -**Открытый краевой случай** — [MIRROR-FG-STALE](BUGS_OPEN.md#mirror-fg-stale): -`place_mirror` пишет тайл в данные уровня, но не в снимок комнаты `room_fg`, -по которому работает коллизия. +**Краевой случай проверен и закрыт как НЕ БАГ** — +[MIRROR-FG-STALE](BUGS_CLOSED.md#mirror-fg-stale): тайл ставится в момент, +когда дверь дорисовала открытие, а в реальном прохождении игрок в этот момент +в другой комнате; при обычном входе комната и снимок `room_fg` берутся из +данных уровня разом. ### L3-CHOMP. Чомперы — **СДЕЛАНЫ 2026-08-08**