Зелёная фаза: записана идея G8 — пометка соседа узкой полосой

Идея пользователя 2026-08-17.  При падении плиты помечаются ДВА тайла, и
сосед перезапекается ЦЕЛИКОМ и ПОВТОРНО (draw_tile для него зовётся дважды),
хотя потревожили у него только левые 28 px — там, куда свисает правая грань
упавшего тайла.

В записи разведено, что 60 = 32 свой тайл + 28 СОБСТВЕННЫЙ свес (сужать
нельзя), и сузить можно только пометку «изменился мой ЛЕВЫЙ сосед».  Плюс три
условия: pop_floor_bake общая (кнопка/зеркало/предмет/щебень) и нужен
отдельный вход; вертикальные диапазоны двух запечек НЕ совпадают (20 строк
против 39), поэтому просто снять вторую пометку нельзя; ширину полосы брать
по максимальному свесу.

Брать ПОСЛЕ обхода всех уровней — решение пользователя.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-17 18:50:56 +03:00
parent dd40c24e7a
commit aa845c0362
+46 -1
View File
@@ -181,7 +181,52 @@ BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1), проверять придётся пр
Остаётся `mob_tick_one` (~4 500 на кусок = 27 000 на кадр) — то же лечение
file-scope, что у `draw_tile`.
### G8. Снять временную оснастку
### G8. Пометка соседа — узкой полосой, а не полным тайлом (идея пользователя)
**Ожидание: заметное, но не мерено. Взять ПОСЛЕ обхода всех уровней**
(решение пользователя 2026-08-17: пока идёт отлов багов слоёв, каждая правка
добавляет переменных в картину).
Когда плита (1,8) падает, помечаются ДВА тайла:
| пометка | что делает |
|---|---|
| `(1,8)``RD_LOOSE_GONE` | бар 40 на своём x, бар 32 на соседе, `draw_tile(1,8)` + `draw_tile(1,9)` |
| `(1,9)``RD_FLOOR` | бар **60** на x соседа, `draw_tile(1,9)` ЕЩЁ РАЗ |
То есть сосед перезапекается ЦЕЛИКОМ и ПОВТОРНО, хотя потревожили у него
только левые 28 пикселей — там, куда свисает правая грань упавшего тайла.
`draw_tile(1,9)` при этом вызывается дважды на одну пометку.
Что такое эти числа (чтобы не сузить лишнего):
- **60 = 32 свой тайл + 28 СОБСТВЕННЫЙ свес.** Правая грань пола (кадр 42,
26 px) рисуется в клетке соседа с `x+32`, занимая `x+32..x+57`. Для запечки
САМОГО тайла 60 уже минимальны — сужать их нельзя;
- сузить можно только тот случай, когда тайл помечен ПОТОМУ ЧТО ИЗМЕНИЛСЯ ЕГО
ЛЕВЫЙ СОСЕД: тогда нужна полоса 28 px у левого края, а не весь тайл.
Почему выигрыш не символический: `pop_floor_bake` стоит **179 914** тактов,
из них 105 500 — сами блиты. Узкая полоса срезала бы и площадь бара
(60×39 → 28×39), и часть блитов — окно клипа там теперь стоит обязательным
(см. §4), так что отсев достаётся даром.
**Условия, из-за которых это не «просто уменьшить число»:**
1. `pop_floor_bake` — ОБЩАЯ функция: её же зовут кнопка (`pop_button_redraw`),
зеркало, подобранный предмет и щебень на месте посадки. Там меняется сам
тайл и 60 нужны целиком. Значит нужен отдельный вход (напр.
`pop_floor_bake_edge(row, col)`) или параметр-прямоугольник — именно под
пометку «изменился мой левый сосед».
2. Прежде чем выкидывать вторую пометку целиком, сверить ВЕРТИКАЛЬНЫЕ
диапазоны: `pop_loose_bake_empty` кроет `63*row+46 .. +65` (20 строк), а
`pop_floor_bake``yb+26 .. yb+64` (39 строк). То есть сосед покрыт
ВТОРЫМ баром не полностью, и просто снять пометку нельзя.
3. Ширина полосы = свес ЛЕВОГО тайла, а он зависит от типа тайла (у loose это
8 px по комментарию в `pop_loose_bake_empty`, у пола 26). Брать по
максимуму (28) — безопасно.
### G9. Снять временную оснастку
Шесть `pop_dbg_b1..b6` внутри `pop_blit_b` — ~400 такта на блит; при 15
блитах зелёной это 6 000 на кадр. Плюс `pop_dbg_kind`/`m16` (2 вызова на