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:
@@ -702,3 +702,42 @@ dir_56_none`. То есть стражи — такая же часть дан
|
||||
стоит колонкой правее тела, — врождённое свойство движка (один спрайт = один
|
||||
тайл при спрайте шире колонки). Сверено в 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`.
|
||||
|
||||
Reference in New Issue
Block a user