docs: BUG-LOOSE-2 закрыт — проверено вручную

Падающий кусок теперь привязан к своей комнате и долетает после ухода Кида;
подтверждено живым прогоном.  Автоматикой гонка не воспроизводилась — мост
MAME шлёт нажатия рывками, и «уйти раньше, чем долетит плита» через него не
набиралось; это отмечено в записи вместе с указанием, что кейс стоит первым
в плане host-тестов.

Вторая волна прогона уровня 1 закрыта целиком: BUG-KBD-4, BUG-RESPAWN-2,
BUG-DRAWORDER-1, BUG-LOOSE-2.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Александр Петров
2026-08-03 23:04:13 +03:00
parent a89b8b30c6
commit f63751edce
2 changed files with 44 additions and 41 deletions
+39
View File
@@ -702,3 +702,42 @@ dir_56_none`. То есть стражи — такая же часть дан
стоит колонкой правее тела, — врождённое свойство движка (один спрайт = один стоит колонкой правее тела, — врождённое свойство движка (один спрайт = один
тайл при спрайте шире колонки). Сверено в SDLPoP: там так же. Подробности — в тайл при спрайте шире колонки). Сверено в SDLPoP: там так же. Подробности — в
разделе «НЕ БАГИ» выше. разделе «НЕ БАГИ» выше.
<a id="bug-loose-2"></a>
## 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`.
+5 -41
View File
@@ -16,16 +16,14 @@ BUG-DEATH-1 (смерть от меча), BUG-GATE-ANIM-1 (анимация во
`bumped_floor`). Клавиатурный BUG-KBD-3 доведён до конца во второй волне `bumped_floor`). Клавиатурный BUG-KBD-3 доведён до конца во второй волне
(см. ниже); из первой волны открытым остался косметический BUG-SEAM-DRAW-1. (см. ниже); из первой волны открытым остался косметический BUG-SEAM-DRAW-1.
Ревизия **2026-08-03, вечер** (вторая волна с прогона): четыре наблюдения Ревизия **2026-08-03, вечер** (вторая волна с прогона): все четыре наблюдения
BUG-KBD-4 (фантомный отжим Shift), BUG-RESPAWN-2 (стражи не оживают) и закрыты — BUG-KBD-4 (фантомный отжим Shift), BUG-RESPAWN-2 (стражи не оживают),
BUG-DRAWORDER-1 (Кид поверх тела стража) **закрыты**; у последнего остался BUG-DRAWORDER-1 (Кид поверх тела стража) и BUG-LOOSE-2 (осколки только от одной
артефакт «ноги поверх головы», сверенный с SDLPoP и записанный в «НЕ БАГИ». из двух плит). У BUG-DRAWORDER-1 остался артефакт «ноги поверх головы»,
BUG-LOOSE-2 (осколки только от одной из двух плит) — **исправлен по SDLPoP, но сверенный с SDLPoP и записанный в «НЕ БАГИ».
гонка автоматикой не воспроизведена** (см. таблицу ниже).
| ID | что | тип | статус | | ID | что | тип | статус |
|----|-----|-----|--------| |----|-----|-----|--------|
| [BUG-LOOSE-2](#bug-loose-2) | осколки только от одной из двух падающих плит (комната 12) | Minor | фикс есть, **гонка не воспроизведена** |
| [BUG-SEAM-DRAW-1](#bug-seam-draw-1) | у решётки на шве экран переключается, а Кид в шве НЕ рисуется | Minor | открыт | | [BUG-SEAM-DRAW-1](#bug-seam-draw-1) | у решётки на шве экран переключается, а Кид в шве НЕ рисуется | Minor | открыт |
| [T-1](#t-1) | пики перерисовываются безусловно | оптимизация | открыт | | [T-1](#t-1) | пики перерисовываются безусловно | оптимизация | открыт |
| [T-2](#t-2) | Кид перерисовывается в покое | оптимизация | открыт | | [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 не «отваливается»; если однажды залипнет — снимается первым же нажатием стрелки | | 17 | **[BUG-KBD-4]** долго играть Shift+стрелка, много тапов подряд | Shift не «отваливается»; если однажды залипнет — снимается первым же нажатием стрелки |
| 18 | **[BUG-RESPAWN-2]** убить стража (комнаты 3/21), умереть, вернуться в ту же комнату | страж снова жив, стоит на исходном тайле, HP полные | | 18 | **[BUG-RESPAWN-2]** убить стража (комнаты 3/21), умереть, вернуться в ту же комнату | страж снова жив, стоит на исходном тайле, HP полные |
@@ -79,37 +74,6 @@ BUG-LOOSE-2 (осколки только от одной из двух плит)
# Открытые баги уровня 1 # Открытые баги уровня 1
<a id="bug-loose-2"></a>
## 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 таблицы выше.
<a id="bug-seam-draw-1"></a> <a id="bug-seam-draw-1"></a>
## BUG-SEAM-DRAW-1. Кид, упершийся в решётку на шве, не рисуется ## BUG-SEAM-DRAW-1. Кид, упершийся в решётку на шве, не рисуется