/*
 * roomtest.c — проверка порта статического фона (Шаг 3): рисует комнату 1
 * уровня 1 реальной композицией слоёв (pop_bg.c) и держит на экране.
 * Сверять на MAME с эталоном applications/PoP/toolchain/1.1-2.png.
 */
#include <graphics.h>
#include <gfx.h>
#include <sprite.h>
#include <conio.h>
#include <stdio.h>
#include <kbd_raw.h>
#include "pop_bg.h"
#include "pop_kid.h"
#include "pop_ctrl.h"
#include "pop_map.h"
#include "room1_data.h"

/* seq_2_stand (types.h seqids) — Kid стоит, ждёт ввода. */
#define SEQ_STAND 2

int main(void)
{
    /* Дабл-буфер: front — видимая страница, back — куда рисуем.  dbuf=1
     * по умолчанию (без мерцания); SPACE переключает в однобуфер для
     * отладки багов рисования (edge по sp_prev, чтоб не дёргать). */
    uint8_t pg, front = 0, back, dbuf = 1, sp_prev = 0;

    if (pop_bg_load() != 0) {          /* атласы — ДО initgraph */
        puts("pop_bg_load failed");
        return 1;
    }
    if (pop_kid_load(28) != 0) {       /* ВСЕ страницы: бег+стоп+разворот+присед+прыжок */
        puts("kid atlas load failed");
        return 1;
    }

    initgraph();
    gfx_set_visible_page(0);
    if (gfx_pal_fload(0, "kid.pal") < 0)   /* единая игровая палитра */
        gfx_pal_fload(0, "a:\\kid.pal");
    gfx_pal_sync();                        /* палитра 0 -> плоскость 1 */

    /* Фон комнаты рисуется в ОБЕ графические страницы: у каждой своя
     * ОЗУ-копия/видео-ОЗУ, а heal берёт чистый фон из ОЗУ-копии ТОЙ
     * страницы, в которую рисуем.  Дальше каждый тик восстанавливаем
     * ТОЛЬКО прямоугольник Кида (kid_heal), а не весь экран. */
    for (pg = 0; pg < 2; pg++) {
        gfx_set_draw_page(pg);
        setfillstyle(SOLID_FILL, BLACK);
        bar(0, 0, 319, 255);
        pop_room_draw(1, room1_fg, room1_bg, leftcol_fg, leftcol_bg);
    }
    gfx_set_draw_page(0);

    /* K2b: Kid стоит на уступе (row1), управляется с клавиатуры.
     * ←/→ бег, ↓ присед, ↑+→ прыжок с места, Shift шаг (K3).  ESC — выход. */
    pop_map_set(room1_fg);             /* карта для коллизии/падения (K3) */
    kid_init(SEQ_STAND, 1, 1, 0);
    kid_draw();
    pop_fore_over_kid(kid_fp_obj_x(), kid_fp_obj_y(),
                      kid_fp_width(), kid_fp_height(), Kid.direction, Kid.frame);

    if (pop_ctrl_init() != 0) {        /* raw-канал клавиатуры (забирает ввод у DSS) */
        closegraph();
        puts("kbd_raw open failed");
        return 1;
    }

    while (!kbd_raw_down(KBD_ESC)) {
        /* SPACE — тумблер дабл-буфера (edge, чтоб одно нажатие = один
         * переключ).  Выключение возвращает показ на страницу 0. */
        uint8_t sp = kbd_raw_down(KBD_SPACE);
        if (sp && !sp_prev) {
            dbuf ^= 1;
            if (!dbuf) {
                gfx_set_visible_page(0);
                front = 0;
            }
        }
        sp_prev = sp;

        /* Рисуем в СКРЫТУЮ страницу (при dbuf); в однобуфере — в 0. */
        back = dbuf ? (uint8_t)(front ^ 1) : 0;
        gfx_set_draw_page(back);

        pop_ctrl_tick();               /* ввод -> control(): смена seq */
        kid_heal();                    /* стереть прошлый кадр ЭТОЙ страницы */
        kid_tick();                    /* play_seq: следующий кадр */
        pop_phys_tick();               /* K3: падение/приземление/стена */
        if (pop_fell_out) {            /* упал за низ комнаты — сброс на старт */
            pop_fell_out = 0;
            kid_init(SEQ_STAND, 1, 1, 0);
        }
        kid_draw();                    /* нарисовать новый кадр */
        pop_fore_over_kid(kid_fp_obj_x(), kid_fp_obj_y(),
                          kid_fp_width(), kid_fp_height(), Kid.direction, Kid.frame);

        /* Пейсинг 3 кадра, затем tear-free флип на vblank: draw уже
         * сделан (скрытая страница), wait_vsync ловит начало кадра,
         * set_visible_page переключает во время бланка (gfx.h паттерн). */
        gfx_wait_vsync();
        gfx_wait_vsync();
        gfx_wait_vsync();
        if (dbuf) {
            gfx_set_visible_page(back);
            front = back;
        }
    }

    pop_ctrl_close();
    closegraph();
    pop_bg_free();
    pop_kid_free();
    return 0;
}
