# roomtest — проверка порта статического фона PoP (Шаг 3): реальная
# композиция слоёв (pop_bg.c) для комнаты 1.  --memory huge --gfx 256.

PROJ_ROOT   := $(abspath $(CURDIR)/../../..)
EXAMPLE     := roomtest
# small: W1+W2 как единое 32КБ-пространство, DATA сразу за CODE (иначе
# CODE ~23КБ переполняет W1 и лезет в фиксированный DATA@0x8000 в huge).
MEMORY      ?= huge        # small-раскладка + банки кода в W3 (стражи)
# Резидента --w3 БОЛЬШЕ НЕТ: отрисовка уехала в БАНК 2 (pop_bg + pop_gdraw
# в одной странице — вызовы между ними прямые, если функция не помечена
# __banked).  Так снято главное ограничение резидента: из банка его было
# не достать ни прямо, ни транзитивно, а банк→банк работает (трамплин
# сохраняет страницу окна на СТЕКЕ, проверено вложенной цепочкой
# банк1→банк2→банк1 в MAME 2026-07-30).  Теперь в банки можно уводить и
# логику, которая рисует.  См. docs/layout_plan_v2.md §2, memory
# sdcc_banked_call_rules.
EXTRA_FLAGS ?= --gfx 256 --bank 2=pop_bg.c --bank 4=pop_gdraw.c --bank 3=pop_map.c --bank 1=guards.c $(PROF_FLAGS)
# Профилирование полосами бордюра (см. PROF() в roomtest.c) — ВКЛЮЧЕНО по
# умолчанию, пока идёт работа с производительностью; make PROF=0 выключает.
# Каждая фаза кадра красит бордюр в свой цвет, высота полосы на скриншоте
# MAME = время фазы в растровых строках.
PROF        ?= 1
PROF_FLAGS  := -DPROF_BORDER=$(PROF)
EXTRA_SRCS  := pop_state.c pop_kid.c pop_ctrl.c pop_level.c pop_trob.c pop_redraw.c pop_geom.c pop_guard.c

BG_DIR      := $(CURDIR)/../poc/res/bg
KID_DIR     := $(CURDIR)/../poc/res/kid
LVL_DIR     := $(CURDIR)/../SDLPoP/data/LEVELS
LVL_DATA    := $(LVL_DIR)/res2001.bin
BG_DATA     := $(BG_DIR)/pop_env0.atl $(BG_DIR)/pop_env1.atl $(BG_DIR)/pop_env2.atl \
               $(BG_DIR)/pop_env3.atl $(BG_DIR)/pop_env4.atl \
               $(BG_DIR)/pop_wall.atl $(BG_DIR)/pop_fore.atl \
               $(BG_DIR)/pop_pot.atl
# ВСЕ 28 страниц Kid — иначе кадры торможения/разворота/приседа (image>23)
# не рисуются (kid_draw пропускает незагруженную страницу).  Палитра —
# ЕДИНАЯ игровая (env+wall+kid).
KID_PAGES   := $(foreach n,0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27,$(KID_DIR)/kid$(n).atl)
KID_DATA    := $(KID_PAGES) $(KID_DIR)/kid.pal $(KID_DIR)/sword.atl
# Таблицы анимации (кадры+seqtbl) — отдельный бинарь в EMM-странице, его
# делает pop_extract_kid_data.py (не упаковщик спрайтов) — своё правило ниже.
KID_BIN     := $(KID_DIR)/kid_data.bin
GUARD_DIR   := $(CURDIR)/../poc/res/guard
GUARD_DATA  := $(GUARD_DIR)/g0.atl $(GUARD_DIR)/g1.atl $(GUARD_DIR)/g2.atl \
               $(GUARD_DIR)/g3.atl $(GUARD_DIR)/g4.atl

EXTRA_DATA  := $(BG_DATA) $(KID_DATA) $(KID_BIN) $(GUARD_DATA) $(LVL_DATA)
include $(PROJ_ROOT)/app.mk

# Образ HDD для MAME: ресурсы раскладываются ПО КАТАЛОГАМ (8.3, как в DSS),
# чтобы корень диска не зарастал десятками .atl.
#   BG\     — фон (env/wall/fore/pot)
#   KID\    — персонаж (kid0..27, палитра, меч, таблицы анимации)
#   GUARD\  — стражи (появятся здесь же)
#   LEVELS\ — уровни
hdd: $(EXAMPLE).exe
	$(PROJ_ROOT)/toolchain/make_hdd.sh $(PROJ_ROOT)/mame/v306/IMG/test_hdd.chd \
	  $(EXAMPLE).exe \
	  $(foreach f,$(BG_DATA),BG:$(f)) \
	  $(foreach f,$(KID_DATA) $(KID_BIN),KID:$(f)) \
	  $(foreach f,$(GUARD_DATA),GUARD:$(f)) \
	  LEVELS:$(LVL_DATA)

TC := $(PROJ_ROOT)/applications/PoP/toolchain
$(BG_DATA): $(TC)/pop_pack_bg.py $(TC)/render_room.py
	cd $(TC) && python3 pop_pack_bg.py
$(GUARD_DATA): $(TC)/pop_pack_guard.py
	cd $(TC) && python3 pop_pack_guard.py

$(KID_DATA): $(TC)/pop_pack_kid.py $(TC)/pop_pack_bg.py
	cd $(TC) && python3 pop_pack_kid.py
kid_data.h $(KID_BIN): $(TC)/pop_extract_kid_data.py
	cd $(TC) && python3 pop_extract_kid_data.py

$(EXAMPLE).exe: guards.c pop_guard.c pop_guard.h pop_gdraw.c pop_state.c pop_state.h pop_cheat.h pop_bg.c pop_bg.h pop_geom.c pop_geom.h pop_redraw.c pop_redraw.h pop_kid.c pop_kid.h pop_ctrl.c pop_ctrl.h pop_map.c pop_map.h pop_level.c pop_level.h pop_trob.c pop_trob.h kid_data.h $(BG_DATA) $(KID_DATA) $(KID_BIN) $(LVL_DATA)
