/*
 * atlas — тест W0-атласов (sprite.h: atlas_load/atlas_image/
 * atlas_sprite_init + спрайтовый движок с полем page).
 *
 * atlas.atl (генерят gen_frames.py + mkatlas.py):
 *   лента 0: 16×16, 4 кадра вертикально — кадр k: заливка 0x10+k,
 *            рамка 0x04, углы 0xFF (прозрачные);
 *   лента 1: 24×24, 2 кадра — заливка 0x20+k, рамка 0x0E.
 *
 * Стадии:
 *   A  atlas_load: count == 2.
 *   B  каталог/W0: getimage-заголовок ленты 0 (w=16, h=64) читается
 *      через указатель atlas_image при gfx_w0_map — проверка, что
 *      офсеты каталога и данные легли по своим W0-адресам.
 *   C  движок: 3 спрайта из двух лент (кадры 0/2 ленты 0, кадр 1
 *      ленты 1) на зелёном фоне — sprite_update сам мапит страницу.
 *      Экран write-only → корректность пикселей проверяется скриншотом/
 *      read_vram: (108,68)=0x10, (148,68)=0x12, (188,72)=0x21,
 *      угол (100,60)=0x02 (фон сквозь прозрачный угол).
 *
 * Запуск через MAME-мост; Enter между стадиями.
 */
#include <stdio.h>
#include <graphics.h>
#include <gfx.h>
#include <sprite.h>

static atlas_t  at;
static sprite_t sp[3];

int main(void)
{
    const uint8_t *im;
    uint8_t okA, okB, okC;

    puts("ATLAS: .atl load + W0 sprite engine");

    /* ---- A: загрузка ------------------------------------------------ */
    if (atlas_load(&at, "atlas.atl") != 0 &&
        atlas_load(&at, "a:\\atlas.atl") != 0) {
        puts("A atlas_load: FAIL (open/format)");
        return 1;
    }
    okA = (at.count == 2);
    printf("A load: %s (page=%u count=%u)\n",
           okA ? "PASS" : "FAIL", at.page, at.count);

    /* ---- B: каталог + данные по W0-адресам -------------------------- */
    im = (const uint8_t *)atlas_image(&at, 0);
    gfx_w0_map(at.page);
    okB = (im[0] == 16 && im[1] == 0 && im[2] == 64 && im[3] == 0) &&
          (im[4] == 0xFF) &&            /* угол кадра 0 — прозрачный */
          (im[4 + 17] == 0x10);         /* (1,1) кадра 0 — заливка   */
    gfx_w0_unmap();
    printf("B W0 dir/data: %s (img=%04x)\n",
           okB ? "PASS" : "FAIL", (unsigned)im);
    puts("Enter -> gfx");
    (void)getchar();

    /* ---- C: движок со спрайтами из атласа --------------------------- */
    initgraph();
    cleardevice();
    setfillstyle(SOLID_FILL, GREEN);
    bar(90, 50, 220, 100);

    atlas_sprite_init(&sp[0], &at, 0);          /* лента 0, кадр 0     */
    sp[0].x = 100; sp[0].y = 60;
    sprite_show(&sp[0]);

    atlas_sprite_init(&sp[1], &at, 0);          /* лента 0, кадр 2     */
    sp[1].x = 140; sp[1].y = 60;
    sprite_frame(&sp[1], 0, 2 * 16);
    sprite_show(&sp[1]);

    atlas_sprite_init(&sp[2], &at, 1);          /* лента 1, кадр 1     */
    sp[2].x = 180; sp[2].y = 60;
    sprite_frame(&sp[2], 0, 24);
    sprite_show(&sp[2]);

    sprite_update(sp, 3);

    /* ESTEX снова доступен: sprite_update вернул страницу ядра DSS. */
    okC = 1;                    /* пиксели — скриншотом/read_vram      */
    setcolor(WHITE);
    outtextxy(4, 4,   "ATLAS: 3 sprites from .atl page (W0)");
    outtextxy(4, 200, okA && okB ? "A/B PASS; C: check pixels"
                                 : "A/B FAIL");
    outtextxy(4, 210, "Enter to exit");
    (void)getchar();

    closegraph();
    printf("done (A=%u B=%u C=%u)\n", okA, okB, okC);
    return 0;
}
