diff --git a/applications/PoP/roomtest/pop_trob.c b/applications/PoP/roomtest/pop_trob.c index 2a322e0..0986d59 100644 --- a/applications/PoP/roomtest/pop_trob.c +++ b/applications/PoP/roomtest/pop_trob.c @@ -177,6 +177,27 @@ void pop_trob_anim_room(uint8_t room) __banked } else if (code == TILE_SWORD) { /* start_anim_sword (seg007:087C): случайная фаза счётчика блеска. */ mod[i] = (uint8_t)(trob_prandom(0xFF) & 0x1F); + /* trob_drawn обязан описывать то, что НАРИСУЕТ полная отрисовка + * комнаты, а она идёт ПОСЛЕ этой функции и берёт ЖИВОЙ modif. + * Обнулять его (как делает pop_trob_room_changed для всех тайлов) + * тут нельзя: если случайная фаза попала ровно на 1, комната + * рисуется С БЛЕСКОМ, а trob_drawn говорит «блеска нет» — и на + * следующем кадре счётчик уходит с 1, sig снова 0, СОВПАДАЕТ со + * стоячим trob_drawn, и перерисовка НЕ помечается. Блеск остаётся + * запечённым в фон до конца периода: animate_sword считает вниз и + * выдаёт новый период 0x28..0x67, то есть до 103 логических кадров + * ≈ 6 секунд. Вероятность ровно 1/32 на вход в комнату — отсюда + * «редко воспроизводится» (найдено пользователем 2026-08-17, + * уровень 1 комната 15). Проверено ПРИНУДИТЕЛЬНО: со временной + * подменой фазы на mod[i] = 1 баг ловится на КАЖДОМ входе в + * комнату, а с этой строкой не ловится ни на одном. + * + * У КНОПКИ той же дыры нет, хотя механизм общий: её признак — + * ДЛИТЕЛЬНОЕ состояние (нажата/нет), и рассогласование само + * исправляется на первой же смене. У блеска признак — одиночная + * вспышка в ОДНОМ кадре из 40..103, и пропущенная смена стоит + * целого периода. */ + trob_drawn[i] = (uint8_t)(mod[i] == 1); pop_add_trob(room, i, 1); } }