e36828ae6e
Порт levels_plan.md §2 (шаг 1) — машинерия смены уровня целиком. - Номер уровня стал состоянием: pop_current_level (порт current_level), pop_next_level больше не флаг, а НОМЕР; главный цикл срабатывает по расхождению next != current (порт play_level_2, seg003:0386). - pop_level_load_num(n): LEVELS\res20NN.bin (fallback a:\), старая EMM-страница отпускается только после успешной загрузки новой. На диск кладутся все 15 уровней (34 КБ). - Потабличные различия (data.h:840..848) — таблицы по 16 в pop_level.c: tbl_entry_pose, tbl_guard_hp (HP стража ушло из хардкода 3), tbl_guard_type (−1 = стражей на уровне нет), tbl_level_type. - find_start_level_door (seg003:02E6): на уровне 2 стартовый тайл — правая половина двери уровня, без modif=43 + add_trob(...,3) Кид материализуется внутри глухой створки. Тип 3 = дверь захлопывается за спиной, как в оригинале. - HP через уровень: hitp_beg_lev (seg003) — рестарт уровня откатывает HP к нему, пройденный уровень подтягивает его к hitp_max. Заодно большая склянка add_life (тип зелья 2: +1 к потолку HP до 10) — на уровне 2 она есть, комната 20. - have_sword = level >= 2 (play_level, seg003:106). - Чит Shift+L — следующий уровень (seg000:698). Проверено в MAME: уровень 1 → Shift+L → уровень 2 (комната 5, новые для нас тайлы 8/9 «большая колонна» на месте, дверь захлопнута, HP 3) → влево в комнату 4 со стражем → Shift+L → уровень 3. Вход в стартовую дверь уровня 2 по Up не срабатывает — как и должно (start_room-гард). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
79 lines
5.4 KiB
Makefile
79 lines
5.4 KiB
Makefile
# 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_draw.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
|
|
# ВСЕ уровни игры (res2001..res2015, по 2305 Б = 34 КБ на всех): переход
|
|
# уровень→уровень и чит Shift+L требуют, чтобы файл следующего лежал на
|
|
# диске. res2000 — демо-уровень, в скоуп не входит.
|
|
LVL_NUMS := 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
|
|
LVL_DATA := $(foreach n,$(LVL_NUMS),$(LVL_DIR)/res20$(n).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)) \
|
|
$(foreach f,$(LVL_DATA),LEVELS:$(f))
|
|
|
|
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_draw.c _pop_draw.h 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)
|