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

Флаг «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
+12 -3
View File
@@ -30,6 +30,7 @@
#define TILE_SWORD 0x16 /* меч-предмет на полу */
#define TILE_LEVELDOOR 0x10 /* левая половина двери уровня (на ней modif) */
#define TILE_CHOMP 0x12 /* чомпер (челюсти) */
#define TILE_WALL 0x14 /* стена (в модификаторе — флаг «без полоски») */
#define TILE_TORCH 0x13
#define TILE_TORCH_DEBRIS 0x1E
#define TILE_EMPTY 0x00 /* remove_loose: на месте провалившейся плиты */
@@ -91,10 +92,17 @@ uint8_t *pop_trob_modif(uint8_t room) __banked
* рядом с ними теряет смысл (ур. 2, комн. 13).
* loose -> 0: фаза тряски всегда начинается с нуля.
* зелье -> <<3: старшие биты = тип, младшие 3 = фаза пузырька.
* стена -> <<7: единственный бит уровня («без полоски», см. ниже)
* переезжает в СТАРШИЙ, где его и ищет отрисовка.
*
* Ветка стен (blue-line/связи кладки) НЕ портируется намеренно: у
* нас pop_bg считает связи по типам СОСЕДЕЙ прямо при отрисовке
* (wall_modifier), сохранённый модификатор стены не читается вовсе. */
* СВЯЗИ кладки (какая грань у стены слева/справа) из этого перевода
* намеренно выкинуты: у нас их считает pop_wall_modifier по типам
* СОСЕДЕЙ прямо при отрисовке. Но второй смысл модификатора стены
* авторский флаг «не рисовать синюю полоску на моей правой кромке»
* (noblue) — из соседей не выводится, он проставлен вручную в данных
* уровня. Без перевода отрисовка видела сырую единицу вместо 0x80,
* проверка `(mod & 0x80) == 0` проходила, и во дворце вылезал кусок
* узора на стене (BUG BLUELINE-NOBLUE, ур. 6 к. 1 тайл (2,3)). */
pop_level_access_begin();
for (i = 0; i < POP_ROOMTILES; i++) {
uint8_t *m = &room_modif[room - 1][i];
@@ -102,6 +110,7 @@ uint8_t *pop_trob_modif(uint8_t room) __banked
case TILE_GATE: *m = (uint8_t)((*m == 1) ? 188 : 0); break;
case TILE_LOOSE: *m = 0; break;
case TILE_POTION: *m = (uint8_t)(*m << 3); break;
case TILE_WALL: *m = (uint8_t)(*m << 7); break;
default: break;
}
}