From d0ac4b1c2a16dda1417181e09c7434730b50b716 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Wed, 19 Aug 2026 18:50:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=B0=D1=81=D0=BA=D0=B0=D0=B4=20=D1=83?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BD=D1=8F=2013=20=D0=BD=D0=B5=20=D0=BF?= =?UTF-8?q?=D0=B0=D0=B4=D0=B0=D0=BB:=20=D0=B2=20=D0=B3=D0=B5=D0=B9=D1=82?= =?UTF-8?q?=D0=B5=20P5=20=D0=BF=D1=80=D0=BE=D0=BF=D1=83=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=20=D1=88=D0=B5=D1=81=D1=82=D0=BE=D0=B5=20=D0=BC=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=BE=20=D0=B2=D0=B7=D0=B2=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Нашёл пользователь на прогоне 13/23: плиты потолка трясутся, но не падают. Причина — моя ошибка в P5. Гейт loose_any снимается циклом по факту прохода без живых фаз, а взводиться обязан у КАЖДОЙ записи фазы. Я пометил пять мест и пропустил шестое: check_fall_flo, который на уровне 13 раздаёт плитам-потолкам отложенный старт (0xF0..0xFF). В результате фаза записывалась, а цикл её не досчитывал — ровно тот отказ, который я сам описал в комментарии к loose_any: «ложный ноль стоит застывшей навсегда плиты». Исправлено, и в шапку loose_any добавлено предупреждение с этим случаем: добавляя новое место записи фазы, добавляй и взвод. Замер 13/23 после исправления (максимумы по секциям, 2367 кадров): эталон сейчас работа 913 848 911 862 синяя 159 810 149 106 зелёная 440 418 436 494 циан 393 000 382 770 Период: 3 растра в 2341 кадре, 4 в 23, 5 в 2 — как в эталоне. Зелёная по-прежнему выше растрового кадра (436 494 против 430 000). Урок для процесса: сцену 13/23 надо прогонять после КАЖДОЙ правки loose-механики, а не только когда меняешь её сознательно. Хост-тесты этот отказ не поймали: phys_loose_gate_survives_room_change проверяет возврат в комнату, а не отложенный старт уровня 13. Co-Authored-By: Claude Opus 5 --- applications/PoP/roomtest/pop_map.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/applications/PoP/roomtest/pop_map.c b/applications/PoP/roomtest/pop_map.c index 4843edb..04f3cb9 100644 --- a/applications/PoP/roomtest/pop_map.c +++ b/applications/PoP/roomtest/pop_map.c @@ -2227,9 +2227,14 @@ uint8_t pop_loose_modif[30]; /* публично: читает pop_bg п * позициям всё равно отрабатывают: замер 11/15 — 9 852 такта на комнату, * где loose-плит нет вовсе. * - * Ставится ПРИ ВЗВОДЕ фазы — все пять мест записи ненулевого значения лежат + * Ставится ПРИ ВЗВОДЕ фазы — все ШЕСТЬ мест записи ненулевого значения лежат * в этом файле (make_loose_fall, ветка потолка в check_press, do_knock для - * обоих рядов, восстановление из room_modif в pop_loose_reset). Снимает его + * обоих рядов, восстановление из room_modif в pop_loose_reset и раздача + * отложенного старта в check_fall_flo — уровень 13). + * + * ИМЕННО ЗДЕСЬ УЖЕ ОШИБЛИСЬ ОДИН РАЗ: check_fall_flo забыли, и каскад + * уровня 13 перестал падать — плиты дрожали и застывали. Добавляя новое + * место записи фазы, добавляй и взвод. Снимает его * САМ цикл, когда прошёл оба массива и не встретил ни одной ненулевой фазы. * * Асимметрия намеренная: ложная единица стоит одного холостого прохода, @@ -2596,6 +2601,12 @@ void pop_check_fall_flo(void) __banked if ((int8_t)pop_ceil_modif[col] > 0) continue; pop_ceil_modif[col] = (uint8_t)(-(int8_t)(pop_prandom(&loose_seed, 255) & 0x0F) - 1); + loose_any = 1; /* ШЕСТОЕ место взвода гейта — см. loose_any. + * Пропуск именно здесь стоил каскада на + * уровне 13: плиты получали отложенный + * старт, но цикл их не досчитывал, и они + * дрожали, не падая (нашёл пользователь + * 2026-08-19). */ pop_set_redraw_above(col, POP_RDA_CEIL, 1); } }