From 1dc89b0f26c9410b94d9c10200e6a386922e7e14 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Wed, 29 Jul 2026 21:42:16 +0300 Subject: [PATCH] =?UTF-8?q?PoP=20roomtest:=20=D1=80=D0=B5=D1=81=D1=83?= =?UTF-8?q?=D1=80=D1=81=D1=8B=20=D0=BF=D0=BE=20=D0=BA=D0=B0=D1=82=D0=B0?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B0=D0=BC=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B7?= =?UTF-8?q?=D0=B0=20(BG/KID/LEVELS),=20=D1=86=D0=B5=D0=BB=D1=8C=20make=20h?= =?UTF-8?q?dd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Все .atl лежали в корне диска рядом с exe — с атласами стражей корень зарос бы окончательно. Теперь ресурсы разложены по каталогам (8.3, как принято в DSS): BG\ фон (env0..4, wall, fore, pot) KID\ персонаж (kid0..27, kid.pal, sword, kid_data.bin) GUARD\ стражи (появятся здесь) LEVELS\ уровни (res2001.bin) make_hdd.sh принимает аргумент вида КАТАЛОГ:файл — создаёт каталог на образе и кладёт файл туда; без префикса файл идёт в корень. В Makefile roomtest появилась цель `make hdd`, которая собирает образ с этой раскладкой (раньше команда набиралась руками на 15 строк). Проверено в MAME: DSS открывает пути вида KID\kid0.atl — комната рисуется, Kid и факелы на месте, то есть все атласы, палитра, таблицы анимации и уровень грузятся из подкаталогов. Co-Authored-By: Claude Opus 5 --- applications/PoP/roomtest/Makefile | 13 +++++++++++++ applications/PoP/roomtest/pop_bg.c | 13 ++++++++----- applications/PoP/roomtest/pop_kid.c | 12 ++++++------ applications/PoP/roomtest/roomtest.c | 6 +++--- toolchain/make_hdd.sh | 15 +++++++++++++-- 5 files changed, 43 insertions(+), 16 deletions(-) diff --git a/applications/PoP/roomtest/Makefile b/applications/PoP/roomtest/Makefile index 2ad0b66..3a46ca8 100644 --- a/applications/PoP/roomtest/Makefile +++ b/applications/PoP/roomtest/Makefile @@ -34,6 +34,19 @@ KID_BIN := $(KID_DIR)/kid_data.bin EXTRA_DATA := $(BG_DATA) $(KID_DATA) $(KID_BIN) $(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)) \ + 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 diff --git a/applications/PoP/roomtest/pop_bg.c b/applications/PoP/roomtest/pop_bg.c index 96d59d8..3bd60c5 100644 --- a/applications/PoP/roomtest/pop_bg.c +++ b/applications/PoP/roomtest/pop_bg.c @@ -25,8 +25,11 @@ static atlas_t fore_at; static atlas_t pot_at; /* chtab_1: зелья (склянка + пузырёк) */ static const char *const ENV_ATL[5] = { - "pop_env0.atl", "pop_env1.atl", "pop_env2.atl", - "pop_env3.atl", "pop_env4.atl" + /* Ресурсы разложены по каталогам образа (8.3, как в DSS): BG — фон, + * KID — персонаж, GUARD — стражи, LEVELS — уровни. Иначе корень диска + * зарастает десятками .atl. */ + "BG\\pop_env0.atl", "BG\\pop_env1.atl", "BG\\pop_env2.atl", + "BG\\pop_env3.atl", "BG\\pop_env4.atl" }; int pop_bg_load(void) @@ -34,9 +37,9 @@ int pop_bg_load(void) int i; for (i = 0; i < 5; i++) if (atlas_load(&env[i], ENV_ATL[i]) != 0) return -1; - if (atlas_load(&wall_at, "pop_wall.atl") != 0) return -1; - if (atlas_load(&fore_at, "pop_fore.atl") != 0) return -1; - if (atlas_load(&pot_at, "pop_pot.atl") != 0) return -1; + if (atlas_load(&wall_at, "BG\\pop_wall.atl") != 0) return -1; + if (atlas_load(&fore_at, "BG\\pop_fore.atl") != 0) return -1; + if (atlas_load(&pot_at, "BG\\pop_pot.atl") != 0) return -1; return 0; } diff --git a/applications/PoP/roomtest/pop_kid.c b/applications/PoP/roomtest/pop_kid.c index 7e2168a..ff0f5a1 100644 --- a/applications/PoP/roomtest/pop_kid.c +++ b/applications/PoP/roomtest/pop_kid.c @@ -41,7 +41,7 @@ static uint8_t sword_ok; int pop_sword_load(void) { - if (atlas_load(&swordp, "sword.atl") != 0) return -1; + if (atlas_load(&swordp, "KID\\sword.atl") != 0) return -1; sword_ok = 1; return 0; } @@ -49,11 +49,11 @@ int pop_sword_load(void) int pop_kid_load(uint8_t npages) { static const char *const names[KID_MAXPAGES] = { - "kid0.atl","kid1.atl","kid2.atl","kid3.atl","kid4.atl","kid5.atl", - "kid6.atl","kid7.atl","kid8.atl","kid9.atl","kid10.atl","kid11.atl", - "kid12.atl","kid13.atl","kid14.atl","kid15.atl","kid16.atl","kid17.atl", - "kid18.atl","kid19.atl","kid20.atl","kid21.atl","kid22.atl","kid23.atl", - "kid24.atl","kid25.atl","kid26.atl","kid27.atl" + "KID\\kid0.atl","KID\\kid1.atl","KID\\kid2.atl","KID\\kid3.atl","KID\\kid4.atl","KID\\kid5.atl", + "KID\\kid6.atl","KID\\kid7.atl","KID\\kid8.atl","KID\\kid9.atl","KID\\kid10.atl","KID\\kid11.atl", + "KID\\kid12.atl","KID\\kid13.atl","KID\\kid14.atl","KID\\kid15.atl","KID\\kid16.atl","KID\\kid17.atl", + "KID\\kid18.atl","KID\\kid19.atl","KID\\kid20.atl","KID\\kid21.atl","KID\\kid22.atl","KID\\kid23.atl", + "KID\\kid24.atl","KID\\kid25.atl","KID\\kid26.atl","KID\\kid27.atl" }; uint8_t i; if (npages > KID_MAXPAGES) npages = KID_MAXPAGES; diff --git a/applications/PoP/roomtest/roomtest.c b/applications/PoP/roomtest/roomtest.c index c0f2099..e83fab3 100644 --- a/applications/PoP/roomtest/roomtest.c +++ b/applications/PoP/roomtest/roomtest.c @@ -214,7 +214,7 @@ int main(void) } pop_cheats = 1; /* режим разработки: читы включены */ pop_guard_reset(); - if (pop_kid_data_load("kid_data.bin") != 0) { /* кадры+seqtbl в EMM-странице */ + if (pop_kid_data_load("KID\\kid_data.bin") != 0) { /* кадры+seqtbl в EMM-странице */ printf("kid_data.bin load failed\n"); return 1; } @@ -223,7 +223,7 @@ int main(void) puts("kid atlas load failed"); return 1; } - if (pop_level_load("res2001.bin") != 0 && /* сырой уровень 1 в EMM-страницу */ + if (pop_level_load("LEVELS\\res2001.bin") != 0 && /* сырой уровень 1 в EMM-страницу */ pop_level_load("a:\\res2001.bin") != 0) { puts("level load failed"); return 1; @@ -231,7 +231,7 @@ int main(void) initgraph(); gfx_set_visible_page(0); - if (gfx_pal_fload(0, "kid.pal") < 0) /* единая игровая палитра */ + if (gfx_pal_fload(0, "KID\\kid.pal") < 0) /* единая игровая палитра */ gfx_pal_fload(0, "a:\\kid.pal"); gfx_pal_sync(); /* палитра 0 -> плоскость 1 */ diff --git a/toolchain/make_hdd.sh b/toolchain/make_hdd.sh index 8578fc0..2b5f43c 100755 --- a/toolchain/make_hdd.sh +++ b/toolchain/make_hdd.sh @@ -11,6 +11,9 @@ # # Использование: # toolchain/make_hdd.sh mame/v306/IMG/test_hdd.chd prog.exe data1 data2 ... +# toolchain/make_hdd.sh out.chd prog.exe KID:kid0.atl GUARD:g0.atl ... +# — аргумент вида КАТАЛОГ:файл кладёт файл в подкаталог образа +# (каталог создаётся); без префикса файл идёт в корень. set -e if [ $# -lt 2 ]; then @@ -39,12 +42,20 @@ export MTOOLSRC="$MTC" MTOOLS_SKIP_CHECK=1 mpartition -I -c -t $CYLS -h $HEADS -s $SECS z: mformat z: +# Аргумент может быть либо файлом (кладём в корень), либо парой +# КАТАЛОГ:файл — тогда каталог создаётся на образе и файл кладётся туда. +# Имена на Sprinter/DSS — 8.3, каталоги тоже (KID, GUARD, BG, LEVELS...). for f in "$@"; do - mcopy -o "$f" z: + case "$f" in + *:*) dir="${f%%:*}"; src="${f#*:}" + mmd "z:/$dir" 2>/dev/null || true + mcopy -o "$src" "z:/$dir/" ;; + *) mcopy -o "$f" z: ;; + esac done echo "--- содержимое образа ---" -mdir z: +mdir -/ z: # RAW -> CHD (без сжатия = быстро; та же геометрия). chdman createhd -i "$RAW" -o "$OUT_CHD" -c none \