/*
 * 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 <graphics.h>
#include <gfx.h>
#include <sprite.h>
#include <conio.h>
#include <stdio.h>

/* Имена файлов — плоская ФС диска (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;
}
