/* * pop_level.h — данные уровня PoP из сырого файла res200N.bin (Фаза L1). * * Уровень загружается ОДИН раз в отдельную EMM-страницу (как атласы: * данные с offset 0x100, ISR-стаб в первых байтах — страница безопасна * для маппинга в W0). Файл — сырой blueprnt DAT 1.0 (2305 байт, БЕЗ * checksum-байта; Table 6 спецификации POP-DAT): * foretable(fg) @0 backtable(bg) @720 door I/II @1440/1696 * links @1952 (24×{L,R,U,D}) start @2112 ... * Тайл-код = байт fg & 0x1F (верхние биты — модификатор, пока не нужны); * bg передаётся как есть. См. applications/PoP/docs/POP-DAT-* . * * Рабочая копия ТЕКУЩЕЙ комнаты живёт в обычной памяти (W2) у приложения * (мутабельная — loose→empty); pop_room_load извлекает её из страницы + * тонкие срезы соседей для кромок (правый столбец left-комнаты, верхний * ряд down-комнаты). Страница маппится в W0 только на время извлечения. */ #ifndef POP_LEVEL_H #define POP_LEVEL_H #include /* Загрузить уровень из файла в EMM-страницу. 0 — OK, -1 — ошибка * (open/alloc/размер). Звать ПОСЛЕ первого atlas_load (pop_bg_load) — * он снимает страницу ядра DSS для W0-unmap. */ int pop_level_load(const char *path); void pop_level_free(void); /* Извлечь комнату room (1..24) в массивы приложения (W2): * fg[30], bg[30] — тайлы комнаты (fg маскирован &0x1F, bg raw); * lcol_fg[3], lcol_bg[3] — правый столбец (col9) комнаты СЛЕВА (кромка * col0); нет комнаты → стена/0; * below_fg[10] — верхний ряд (row0) комнаты СНИЗУ («стена * вниз»); нет комнаты → стена. * 0 — OK, -1 — уровень не загружен / room вне диапазона. */ int pop_room_load(uint8_t room, uint8_t *fg, uint8_t *bg, uint8_t *lcol_fg, uint8_t *lcol_bg, uint8_t *rcol_fg, uint8_t *rcol_bg, uint8_t *below_fg); /* Связь комнаты по стороне (0=L,1=R,2=U,3=D) → номер соседней (1..24) или * 0, если стороны нет. Для переходов между комнатами (L2/L3). */ uint8_t pop_room_link(uint8_t room, uint8_t side); /* Ряд приземления падающего loose-куска в колонке col комнаты room: первый * НЕ-пустой тайл сверху вниз; возвращает его ряд, если это floor (→ debris), * иначе -1 (пролетел/крушение о стену). */ int8_t pop_room_col_landing(uint8_t room, uint8_t col); /* Стартовая позиция уровня (блок @2112): комната / поза / направление. */ uint8_t pop_level_start_room(void); uint8_t pop_level_start_pos(void); int8_t pop_level_start_dir(void); #endif