Кусок узора на стене: модификатор стены не переводился при загрузке

Флаг «no blue» лежит в нулевом бите модификатора стены В ФАЙЛЕ уровня, а
отрисовка (как и оригинал) ищет его в СТАРШЕМ: load_alter_mod переводит
их сдвигом на 7.  Ветку стен мы пропускали намеренно — связи кладки
считаются по соседям, — но noblue из соседей не выводится.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-18 12:01:07 +03:00
parent 085a198c20
commit af4e64455e
2 changed files with 57 additions and 3 deletions
+45
View File
@@ -2864,3 +2864,48 @@ seg006:507). Выход из функции теперь один на обе
класс целиком, а не найденный путь. Ловушка на будущее, если симптом
всплывёт снова: `wp <адрес pop_cd[OPP].w>,4,w` — сработает на первой же
записи «чужой» ширины.
---
<a id="blueline-noblue"></a>
## BLUELINE-NOBLUE. Кусок синего узора на стене там, где оригинал его не рисует — ЗАКРЫТ 2026-08-18
**Наблюдение (пользователь, 2026-08-18).** Уровень 6, комната 1, тайл (2,3):
у правой кромки левого блока висит небольшой кусочек тёмно-синего узора,
которого в оригинале нет. Диагноз пользователя («первоначальная отрисовка
фона, фикс не должен повлиять на скорость») подтвердился полностью.
**Корень.** Полоску рисует `draw_tile_right` (`pop_room.c`, порт
seg008:0666) — её кладёт ПРАВЫЙ сосед стены:
```c
case tiles_20_wall:
if (tbl_level_type[current_level] && (modifier_left & 0x80) == 0)
add_backtable(chtab_6, 84 /*wall stripe*/, draw_xh + 3, 0, draw_main_y - 27, ...);
```
Проверка `& 0x80` у нас была, а вот значения, которое она проверяет, — нет.
Модификатор стены В ФАЙЛЕ уровня и В РАНТАЙМЕ у оригинала разные:
`load_alter_mod` (seg008:1216) переводит их при загрузке комнаты —
`*curr_tile_modif <<= 7`, то есть единственный бит уровня («no blue»,
авторский флаг «не рисовать полоску на моей правой кромке») переезжает в
СТАРШИЙ. Наш порт `load_alter_mod` (`pop_trob.c`) ветку стен пропускал
НАМЕРЕННО, и в комментарии это было записано: связи кладки мы считаем по
типам соседей (`pop_wall_modifier`), сохранённый модификатор стены «не
читается вовсе».
Ошибка в слове «вовсе»: у модификатора стены ДВА независимых смысла, и
из соседей выводится только один. `noblue` проставлен вручную в данных
уровня и не выводится ниоткуда. В комнате 1 уровня 6 стена (2,2) имеет в
файле модификатор 1, то есть ровно «без полоски»; без перевода отрисовка
видела сырую единицу, `(1 & 0x80) == 0` проходило — и полоска вылезала.
**Фикс.** `case TILE_WALL: *m = (uint8_t)(*m << 7);` в порте
`load_alter_mod`. Перевод одноразовый, при первом входе в комнату
(`room_seen`), — кадровый бюджет не трогает вообще; +24 байта в банке 6,
резидент не изменился.
**Проверка (MAME, уровень 6 комната 1).** Попиксельный диф скриншотов до и
после: изменения ровно в боксе `(344,199)-(358,206)`, 38 пикселей — сам
артефакт и ничего кроме. На подземных уровнях изменений нет по построению:
полоска целиком под `if (PALACE)`.