MIRROR-FG-STALE закрыт как НЕ БАГ (проверено пользователем)

Прогон читом ROOMNAV: телепорт в комнату 4 сразу после нажатия кнопки —
зеркала нет вовсе (тайл ставится в момент, когда дверь ДОРИСОВАЛА открытие,
43 тика анимации, телепорт успевает раньше); обычный вход в комнату —
зеркало на месте и непроходимо, кроме правильного прыжка, то есть коллизия
его видит.  Сценария «постановка при игроке в комнате» в реальном
прохождении нет: дверь выхода стоит не в комнате зеркала, а при входе
комната и снимок room_fg берутся из данных уровня разом.

Решение пользователя: телепорт по комнатам — отладочный режим, чинить нечего.
Запись целиком уехала в BUGS_CLOSED.md вместе с протоколом и с указанием, чем
лечить, если симптом всё же всплывёт на моде/уровне, где кнопка и зеркало в
одной комнате.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-11 16:22:04 +03:00
parent 5348feb5f4
commit 096517d8aa
4 changed files with 39 additions and 43 deletions
+34
View File
@@ -2274,3 +2274,37 @@ draw_tile_anim(); <- СВОЯ графика тайла: челюсти
Связь с T-1 сработала как и предсказано: пока Кида не перерисовываем, heal'а Связь с T-1 сработала как и предсказано: пока Кида не перерисовываем, heal'а
нет, стирать пики нечем. Но T-1 остаётся открытым — трогать пики нет, стирать пики нечем. Но T-1 остаётся открытым — трогать пики
безусловно мы всё ещё продолжаем, когда Кид рядом ДВИЖЕТСЯ. безусловно мы всё ещё продолжаем, когда Кид рядом ДВИЖЕТСЯ.
---
<a id="mirror-fg-stale"></a>
## 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]`, нужна публичная «поставить тайл в текущей комнате»).
-36
View File
@@ -15,7 +15,6 @@
| ID | что | тип | статус | | ID | что | тип | статус |
|----|-----|-----|--------| |----|-----|-----|--------|
| [FORE-DUP](#fore-dup) | передний слой тайла рисуется дважды при перекрытии объектов | оптимизация | открыт: **сначала замерить**, потом чинить | | [FORE-DUP](#fore-dup) | передний слой тайла рисуется дважды при перекрытии объектов | оптимизация | открыт: **сначала замерить**, потом чинить |
| [MIRROR-FG-STALE](#mirror-fg-stale) | зеркало поставлено, пока игрок В комнате 4 → коллизия его не видит | **низкий** (в обычном прохождении недостижимо) | открыт, фикс на несколько строк |
| [DIED-ON-BUTTON](#died-on-button) | `died_on_button` (seg007:776) не портирован | порт | открыт | | [DIED-ON-BUTTON](#died-on-button) | `died_on_button` (seg007:776) не портирован | порт | открыт |
| [TORCH-ANIM-RIGHT](#torch-anim-right) | под запечённым пламенем застывают не только челюсти чомпера | **низкий** | открыт: на уровнях 1-4 такого соседства нет | | [TORCH-ANIM-RIGHT](#torch-anim-right) | под запечённым пламенем застывают не только челюсти чомпера | **низкий** | открыт: на уровнях 1-4 такого соседства нет |
| [T-1](#t-1) | пики перерисовываются безусловно | оптимизация | открыт | | [T-1](#t-1) | пики перерисовываются безусловно | оптимизация | открыт |
@@ -336,38 +335,3 @@ for (tile_row = x_top_row; tile_row <= char_bottom_row; ++tile_row)
Если дубль мал — оставить как есть и закрыть запись. Если дубль мал — оставить как есть и закрыть запись.
--- ---
<a id="mirror-fg-stale"></a>
## 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` — отдельного захода не стоит.
@@ -81,10 +81,6 @@
при перекрытии объектов (Кид+отражение всегда, Кид+соперник — весь ближний при перекрытии объектов (Кид+отражение всегда, Кид+соперник — весь ближний
бой). Картинку не портит, тратит такты. **Сначала замерить, потом бой). Картинку не портит, тратит такты. **Сначала замерить, потом
чинить** — окно клипа в своё время дало 3.2×. чинить** — окно клипа в своё время дало 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` - **[DIED-ON-BUTTON](BUGS_OPEN.md#died-on-button)** — `died_on_button`
(seg007:776) не портирован. (seg007:776) не портирован.
- **TORCH-ANIM-RIGHT** — под запечённым пламенем могут застыть пики/меч/зелье - **TORCH-ANIM-RIGHT** — под запечённым пламенем могут застыть пики/меч/зелье
+5 -3
View File
@@ -196,9 +196,11 @@
Разбор, замеры и варианты — [`../docs/shadow_render.md`](../docs/shadow_render.md); Разбор, замеры и варианты — [`../docs/shadow_render.md`](../docs/shadow_render.md);
блочные операции акселератора под это в libbgi уже есть (`tests/accop`). блочные операции акселератора под это в 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` берутся из
данных уровня разом.
<a id="l3-chomp"></a> <a id="l3-chomp"></a>
### L3-CHOMP. Чомперы — **СДЕЛАНЫ 2026-08-08** ### L3-CHOMP. Чомперы — **СДЕЛАНЫ 2026-08-08**