diff --git a/applications/PoP/roomtest/bug_closed.md b/applications/PoP/roomtest/bug_closed.md index ac5da13..774f619 100644 --- a/applications/PoP/roomtest/bug_closed.md +++ b/applications/PoP/roomtest/bug_closed.md @@ -702,3 +702,42 @@ dir_56_none`. То есть стражи — такая же часть дан стоит колонкой правее тела, — врождённое свойство движка (один спрайт = один тайл при спрайте шире колонки). Сверено в SDLPoP: там так же. Подробности — в разделе «НЕ БАГИ» выше. + + +## BUG-LOOSE-2. Осколки только от одной из двух падающих плит — **ЗАКРЫТ** + +**Симптом.** Комната 12, соседние падающие плиты (0,1) и (0,2): после +пробежки осколки появляются только на (1,2), на (1,1) — нет. В комнате 7 +(плиты 0,5/0,6 → 2,5/2,6) обе дают осколки. + +**Корень.** Гипотеза автора отчёта подтвердилась чтением кода: Кид уходит в +комнату 15 раньше, чем долетает плита (0,1). Наш падающий кусок был привязан +к ТЕКУЩЕЙ комнате — `pop_loose_reset()` на смене комнаты звал +`pop_loose_mob_reset()` и гасил всё, что ещё летит, а тайл под куском читался +из карты отрисованной комнаты. Кусок уничтожался, `loose_land` не случался, +щебень не клался. В комнате 7 обе плиты успевают сесть до ухода — потому там +и выглядело правильно. + +В оригинале `mobs[]` чистится ТОЛЬКО в `start_level` (seg003:88); `do_mobs` +(seg007:1063) прокручивает все куски независимо от `drawn_room`, `move_loose` +работает по `curmob.room`, а `redraw_at_cur_mob` (seg007:132C) сверяется с +`drawn_room` лишь для ОТРИСОВКИ. + +**Фикс.** У куска появилось поле `room` (`curmob.room`). На смене комнаты +зовётся `pop_loose_mob_room_changed()` — сбрасывает только heal-историю, а +полёт продолжается. Тайл читается через `mob_tile_at()` (своя комната — +`tile_code`, чужая — `pop_level_tile`). Приземление в покинутой комнате пишет +щебень прямо в данные уровня: сигнальная пара `pop_loose_landed`/ +`pop_debris_at` обслуживает только текущую комнату. Отрисовка и +`check_loose_fall_on_kid` (там оригинал начинает с `Char.room == curmob.room`) +— только для своей комнаты. Настоящий `mobs_count = 0` переехал в +`pop_start_level`. + +**Проверено вручную (2026-08-03).** Автоматикой гонку воспроизвести не +удалось: мост MAME шлёт нажатия рывками, и «уйти из комнаты раньше, чем +долетит плита» через него не набирается. Подтверждено живым прогоном. + +Это ровно тот случай, ради которого заведены host-тесты: на уровне логики +проверка занимает несколько строк — заспавнить кусок, сменить комнату, тикать +до приземления, проверить щебень в данных уровня. Стоит первым в +`../docs/host_tests_plan.md`. diff --git a/applications/PoP/roomtest/bug_list.md b/applications/PoP/roomtest/bug_list.md index 0f01af5..0840489 100644 --- a/applications/PoP/roomtest/bug_list.md +++ b/applications/PoP/roomtest/bug_list.md @@ -16,16 +16,14 @@ BUG-DEATH-1 (смерть от меча), BUG-GATE-ANIM-1 (анимация во `bumped_floor`). Клавиатурный BUG-KBD-3 доведён до конца во второй волне (см. ниже); из первой волны открытым остался косметический BUG-SEAM-DRAW-1. -Ревизия **2026-08-03, вечер** (вторая волна с прогона): четыре наблюдения → -BUG-KBD-4 (фантомный отжим Shift), BUG-RESPAWN-2 (стражи не оживают) и -BUG-DRAWORDER-1 (Кид поверх тела стража) — **закрыты**; у последнего остался -артефакт «ноги поверх головы», сверенный с SDLPoP и записанный в «НЕ БАГИ». -BUG-LOOSE-2 (осколки только от одной из двух плит) — **исправлен по SDLPoP, но -гонка автоматикой не воспроизведена** (см. таблицу ниже). +Ревизия **2026-08-03, вечер** (вторая волна с прогона): все четыре наблюдения +закрыты — BUG-KBD-4 (фантомный отжим Shift), BUG-RESPAWN-2 (стражи не оживают), +BUG-DRAWORDER-1 (Кид поверх тела стража) и BUG-LOOSE-2 (осколки только от одной +из двух плит). У BUG-DRAWORDER-1 остался артефакт «ноги поверх головы», +сверенный с SDLPoP и записанный в «НЕ БАГИ». | ID | что | тип | статус | |----|-----|-----|--------| -| [BUG-LOOSE-2](#bug-loose-2) | осколки только от одной из двух падающих плит (комната 12) | Minor | фикс есть, **гонка не воспроизведена** | | [BUG-SEAM-DRAW-1](#bug-seam-draw-1) | у решётки на шве экран переключается, а Кид в шве НЕ рисуется | Minor | открыт | | [T-1](#t-1) | пики перерисовываются безусловно | оптимизация | открыт | | [T-2](#t-2) | Кид перерисовывается в покое | оптимизация | открыт | @@ -64,9 +62,6 @@ BUG-LOOSE-2 (осколки только от одной из двух плит) | # | что проверить | ожидаемо | |---|---------------|----------| -| 14 | **[BUG-LOOSE-2]** комната 12: разбежаться по плитам (0,1)/(0,2) и уйти в 15 ДО того, как долетит вторая; вернуться | осколки на ОБОИХ — (1,1) и (1,2) | -| 15 | то же в комнате 7 (плиты 0,5/0,6 → 2,5/2,6) | не сломалось: по-прежнему двое осколков | -| 16 | плита, улетевшая из комнаты вниз, при возврате | лишнего щебня не появилось | | 17 | **[BUG-KBD-4]** долго играть Shift+стрелка, много тапов подряд | Shift не «отваливается»; если однажды залипнет — снимается первым же нажатием стрелки | | 18 | **[BUG-RESPAWN-2]** убить стража (комнаты 3/21), умереть, вернуться в ту же комнату | страж снова жив, стоит на исходном тайле, HP полные | @@ -79,37 +74,6 @@ BUG-LOOSE-2 (осколки только от одной из двух плит) # Открытые баги уровня 1 - -## BUG-LOOSE-2. Осколки только от одной из двух падающих плит - -**Симптом.** Комната 12, соседние падающие плиты (0,1) и (0,2): после -пробежки осколки появляются только на (1,2), на (1,1) — нет. В комнате 7 -(плиты 0,5/0,6 → 2,5/2,6) обе дают осколки. - -**Корень** (гипотеза автора отчёта подтвердилась чтением кода). Наш -падающий кусок был привязан к ТЕКУЩЕЙ комнате: `pop_loose_reset()` на смене -комнаты звал `pop_loose_mob_reset()` и гасил всё, что ещё летит, а тайл под -куском читался из карты отрисованной комнаты. Кид убегает в комнату 15 -раньше, чем долетает плита (0,1) — кусок уничтожается, `loose_land` не -случается, щебень не кладётся. В комнате 7 обе плиты успевают сесть до -ухода, поэтому там всё выглядело правильно. - -В оригинале `mobs[]` чистится ТОЛЬКО в `start_level` (seg003:88), `do_mobs` -(seg007:1063) прокручивает все куски независимо от `drawn_room`, `move_loose` -работает по `curmob.room`, а `redraw_at_cur_mob` (seg007:132C) сверяется с -`drawn_room` лишь для ОТРИСОВКИ. - -**Фикс.** У куска появилось поле `room` (`curmob.room`); на смене комнаты -зовётся `pop_loose_mob_room_changed()` — сбрасывает только heal-историю; -тайл читается через `mob_tile_at()` (своя комната — `tile_code`, чужая — -`pop_level_tile`); приземление в покинутой комнате пишет щебень прямо в -данные уровня; отрисовка и `check_loose_fall_on_kid` (там оригинал начинает с -`Char.room == curmob.room`) — только для своей комнаты. Настоящий -`mobs_count = 0` переехал в `pop_start_level`. - -**Не проверено.** Гонка «уйти из комнаты раньше, чем долетит плита» -автоматикой не воспроизведена. Ручной прогон — пп. 14–16 таблицы выше. - ## BUG-SEAM-DRAW-1. Кид, упершийся в решётку на шве, не рисуется