/* * bgtest.c — мини-тест атласов статического фона PoP (Шаг 2 порта, ДО * порта room.c). Проверяет на MAME: загрузку 7 .atl, палитру pop_bg.pal, * ПРЯМУЮ адресацию (id -> страница/idx без remap-таблиц) и прозрачность * (индекс 0xFF). Рисует сетку репрезентативных спрайтов на цветной * заливке — прозрачные области должны показать фон. * * Раскладка из toolchain/pop_pack_bg.py (см. pop_bg_atlas.h): * ENV фон id N -> env[N>>5], idx N&31 ; WALL/FORE idx = id. */ #include #include #include #include #include /* Имена файлов — плоская ФС диска (make_disk кладёт по basename). */ static const char *const ENV_ATL[5] = { "pop_env0.atl", "pop_env1.atl", "pop_env2.atl", "pop_env3.atl", "pop_env4.atl" }; static atlas_t env[5]; static atlas_t wall_a; static atlas_t fore_a; /* Блит одного спрайта ленты idx атласа a в (x,y): страница атласа в W0, * gfx_blit читает w/h из getimage-заголовка ленты (в W0). */ static void put(atlas_t *a, unsigned char idx, int x, int y) { const void *img = atlas_image(a, idx); gfx_w0_map(a->page); gfx_blit(x, y, img); gfx_w0_unmap(); } static void put_env(unsigned char id, int x, int y) { put(&env[id >> 5], (unsigned char)(id & 31), x, y); } int main(void) { int i; /* Загрузка всех 7 атласов (env0..4 + wall + fore). */ for (i = 0; i < 5; i++) { if (atlas_load(&env[i], ENV_ATL[i]) != 0) { printf("atlas_load %s failed\n", ENV_ATL[i]); return 1; } } if (atlas_load(&wall_a, "pop_wall.atl") != 0) { puts("wall atl fail"); return 1; } if (atlas_load(&fore_a, "pop_fore.atl") != 0) { puts("fore atl fail"); return 1; } initgraph(); gfx_set_draw_page(0); gfx_set_visible_page(0); if (gfx_pal_fload(0, "pop_bg.pal") < 0) gfx_pal_fload(0, "a:\\pop_bg.pal"); /* Свой яркий фон-индекс (вне 0x50..0x6F, занятых графикой) — чтобы * прозрачные (0xFF) области спрайтов были ЯВНО видны. */ #define BG_IDX 0x20 gfx_pal_set(0, BG_IDX, 120, 0, 90); /* r,g,b — тёмно-пурпурный */ gfx_pal_sync(); setfillstyle(SOLID_FILL, BG_IDX); bar(0, 0, 319, 255); setcolor(WHITE); outtextxy(2, 2, "PoP bg atlas test"); /* Прозрачный блит: банк не пишет 0xFF (фон проступает). */ gfx_set_bank(GFX_BANK_TRANSPARENT); /* --- Стены (chtab_7): нижние грани 7/9/5/3, основные 8/10/6/4 --- */ put(&wall_a, 3, 4, 20); put(&wall_a, 5, 40, 20); put(&wall_a, 7, 76, 20); put(&wall_a, 9, 112, 20); put(&wall_a, 4, 4, 90); put(&wall_a, 6, 40, 90); put(&wall_a, 8, 76, 90); put(&wall_a, 10, 112, 90); /* декали-марки стен 14..17 */ put(&wall_a, 14, 150, 20); put(&wall_a, 15, 168, 20); put(&wall_a, 16, 186, 20); put(&wall_a, 17, 204, 20); /* --- Столб: база 92, боковая грань 93, фронт 95 (fore) --- */ put_env(92, 4, 160); put_env(93, 40, 160); put(&fore_a, 95, 76, 160); /* --- Пол: база 41, правый треуг. 42, низ 43; силуэт 44/45 --- */ put_env(41, 150, 120); put_env(42, 190, 120); put_env(44, 230, 120); put_env(45, 260, 120); /* --- Решётка-окно 126, дебрис 97/98, слайсы ворот 52/53 --- */ put_env(126, 150, 160); put_env(97, 190, 160); put_env(52, 230, 160); put_env(53, 250, 160); gfx_set_bank(GFX_BANK_NORMAL); /* Держим картинку на экране до нажатия (не полагаемся на блокирующий * getch — в автотесте клавиш нет, крутимся до таймаута MAME). */ while (!kbhit()) gfx_wait_vsync(); closegraph(); for (i = 0; i < 5; i++) atlas_free(&env[i]); atlas_free(&wall_a); atlas_free(&fore_a); return 0; }