21f978d441
Отказ от room1_data.h: уровень читается из сырого blueprnt DAT 1.0 (applications/PoP/SDLPoP/data/LEVELS/res2001.bin, формат — Table 6 POP-DAT). - pop_level.c/.h: уровень грузится ОДИН раз в отдельную EMM-страницу (данные с offset 0x100, ISR-стаб в первых байтах — страница безопасна для W0-маппинга, как атласы). pop_room_load(room) извлекает комнату в массивы приложения (W2): fg[30] (тайл-код = байт & 0x1F, верхние биты-модификаторы пока отброшены, как делал render_room.py), bg[30] (raw) + срезы соседей для кромок — правый столбец left-комнаты (leftcol), верхний ряд down-комнаты (belowrow). pop_room_link() — связи для будущих переходов (L2/L3). - Рабочая копия ТЕКУЩЕЙ комнаты — в обычной памяти (W2, мутабельная: loose→ empty); страница уровня маппится в W0 только на время извлечения. - Проверено в MAME: комната 1 рисуется идентично. Данные сверены байт-в-байт (fg&0x1F, bg raw, leftcol из room5 совпали); belowrow теперь из реального room2 (links.down=2), а не из прежнего частично-выдуманного хардкода. - Память (small): DATA до 0xA260, стек от 0xBFFF — запас ~7.5КБ; EMM-страница уровня вне W1/W2. NB: res2001.bin берётся из клона SDLPoP (data/ в .gitignore) — как и генерация атласов через pop_pack_bg.py; в наш репозиторий сырой уровень не тащим. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
49 lines
3.0 KiB
C
49 lines
3.0 KiB
C
/*
|
||
* 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 <stdint.h>
|
||
|
||
/* Загрузить уровень из файла в 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 *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);
|
||
|
||
/* Стартовая позиция уровня (блок @2112): комната / поза / направление. */
|
||
uint8_t pop_level_start_room(void);
|
||
uint8_t pop_level_start_pos(void);
|
||
int8_t pop_level_start_dir(void);
|
||
|
||
#endif
|