/* * room.h — отрисовка комнаты из тайлов В РАНТАЙМЕ, через спрайтовые * атласы (см. пересмотр PORT_PLAN.md §4, 2026-07-15). * * Один атлас на ТИП тайла (0x00..0x1F) — лента из N вариантов * (кадр fw x fh, fw=ROOM_TILE_W, fh=высота ряда, где тип реально * стоит). Для типов, где backtable — настоящее состояние * (gate/tapestry/chomp/spike) — вариант = state; для остальных — * простой псевдослучайный выбор по позиции (свой приём, не алгоритм * оригинала — просто чтобы плитка не повторялась один-в-один). * * Загрузка "всей лентой — копии одной картинки" на старте, до * появления настоящих вариантов — нормальная стратегия: движок/API * не меняются, когда картинки заменятся на настоящие. * * Фаза 1 (PORT_PLAN.md §5): анимированные типы (факел/дверь/шипы/ * дробилка) НЕ рисуются вообще — просто не грузим для них атлас, * room_draw пропускает клетки без атласа. Анимация через отдельные * sprite_t поверх фона — Фаза 2, см. §7 плана. * * room_draw() зовётся ОДИН РАЗ при входе в комнату, не в игровом * цикле — бюджет кадра не затронут (gfx_w0_map/unmap на тайл — тоже * разовая цена, не per-frame). */ #ifndef ROOM_H #define ROOM_H #include #include /* atlas_t, atlas_load/free, atlas_image, gfx_w0_map/unmap */ #include "level.h" #define ROOM_TILE_W 32 /* ширина колонки, px (10 колонок = 320) */ /* Высоты рядов, px — измерено по реальным тайлам подземелья * (PORT_PLAN.md §3: ~20/60/62) — ПОДТВЕРДИТЬ при подготовке настоящих * ассетов, значения приблизительные. */ extern uint8_t room_row_h[ROOM_ROWS]; typedef struct { atlas_t at; uint8_t loaded; /* 0 = атласа нет — тип не рисуется */ } tile_atlas_t; /* Индекс — TILE_TYPE (0..31). */ extern tile_atlas_t tile_atlas[32]; /* Грузит "{dir}tileNN.atl" (hex TILE_TYPE, 2 знака, напр. "tile01.atl" * — Floor) — какие есть, те и грузятся. dir — префикс ПОДКЛЕИВАЕТСЯ * как есть (без добавления разделителя) — файлы на диске лежат ПЛОСКО * (см. соглашение других examples: "name.ext" либо "a:\\name.ext"), так что * dir обычно "" или "a:\\". Каждый файл — ОДНА лента (idx 0) из N * кадров fw=ROOM_TILE_W x fh=room_row_h[row] (row, где этот тип * реально стоит) — готовится toolchain/png_strip.py + * toolchain/mkatlas.py. Возврат: число загруженных (0..32). * * room.c — обычный HOME-файл, БЕЗ --bank (см. шапку room.c за * историей: банк в W3 конфликтовал с gfx_blit_part/atlas_load, * банк в W1 невозможен при CODE=W1 — трамплин сам уехал бы из W1; * после чистки sprintf() всё влезает в HOME без банка вообще). */ int tile_atlas_load(const char *dir); void tile_atlas_free(void); /* Нарисовать комнату (room 1..24) — только типы с загруженным * атласом; остальные клетки пропускаются (в т.ч. все анимированные * типы в Фазе 1 — атлас для них просто не грузится). */ void room_draw(level_t *lv, uint8_t room); #endif