applications/PoP: порт Prince of Persia — PoC (roomtest) + пайплайн
Порт PoP на Sprinter. Текущий PoC — applications/PoP/roomtest/: комната 1 (фон-композиция тайлов) + Kid с управлением на raw-клавиатуре и коллизией с картой. - roomtest — pop_bg (фон), pop_kid (спрайты Kid, column-major флип, seqtbl-анимация), pop_ctrl (порт control() PoP на held-state kbd_raw), pop_map (коллизия seg004/005: бег/стоп у стены, падение/приземление, отскок seq_47, вертикальный прыжок K4.1). MEMORY=small (DATA сразу за CODE, ~23КБ кода не лезет в huge). - toolchain (PoP) — pop_pack_kid/pop_pack_bg/render_room/extract — распаковка res-графики MSDOS в атласы + композиция комнат. - toolchain/ (корень) — make_hdd.sh (быстрый HDD-тест вместо FDD), png_strip.py / room_compose.py (ассет-пайплайн). - docs — PORT_PLAN, KID_PLAN, форматы ресурсов (Apple II / MSDOS / DAT). - bgtest/coltest/poc — ранние PoC (фон, коллизия, первый прототип). .gitignore: build-артефакты applications/*/*/*; исключены внешние референс-репозитории (SDLPoP/mininim/PR/Apple-II — свои git-клоны) и оригинальные game-данные MSDOS/ (копирайт, только для реверса форматов). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
# bgtest — мини-тест атласов статического фона PoP (Шаг 2, до порта room.c).
|
||||
# Проверяет загрузку .atl + палитру + прямую адресацию + прозрачность.
|
||||
#
|
||||
# --memory huge (как poc): atlas_load/gfx_blit трогают W3; huge кладёт
|
||||
# CODE в W1, DATA/BSS в W2 — без банков. --gfx 256 подлинкует bgi256.
|
||||
#
|
||||
# Данные фона генерит toolchain/pop_pack_bg.py в ../poc/res/bg/.
|
||||
|
||||
PROJ_ROOT := $(abspath $(CURDIR)/../../..)
|
||||
EXAMPLE := bgtest
|
||||
MEMORY ?= huge
|
||||
EXTRA_FLAGS ?= --gfx 256
|
||||
|
||||
BG_DIR := $(CURDIR)/../poc/res/bg
|
||||
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_bg.pal
|
||||
|
||||
EXTRA_DATA := $(BG_DATA)
|
||||
include $(PROJ_ROOT)/app.mk
|
||||
|
||||
# Ассеты фона: пересобрать пакером, если исходники поменялись.
|
||||
$(BG_DATA): $(PROJ_ROOT)/applications/PoP/toolchain/pop_pack_bg.py \
|
||||
$(PROJ_ROOT)/applications/PoP/toolchain/render_room.py
|
||||
cd $(PROJ_ROOT)/applications/PoP/toolchain && python3 pop_pack_bg.py
|
||||
|
||||
$(EXAMPLE).exe: $(BG_DATA)
|
||||
@@ -0,0 +1,112 @@
|
||||
/*
|
||||
* bgtest.c — мини-тест атласов статического фона PoP (Шаг 2 порта, ДО
|
||||
* порта room.c). Проверяет на MAME: загрузку 7 .atl, палитру pop_bg.pal,
|
||||
* ПРЯМУЮ адресацию (id -> страница/idx без remap-таблиц) и прозрачность
|
||||
* (индекс 0xFF). Рисует сетку репрезентативных спрайтов на цветной
|
||||
* заливке — прозрачные области должны показать фон.
|
||||
*
|
||||
* Раскладка из toolchain/pop_pack_bg.py (см. pop_bg_atlas.h):
|
||||
* ENV фон id N -> env[N>>5], idx N&31 ; WALL/FORE idx = id.
|
||||
*/
|
||||
#include <graphics.h>
|
||||
#include <gfx.h>
|
||||
#include <sprite.h>
|
||||
#include <conio.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/* Имена файлов — плоская ФС диска (make_disk кладёт по basename). */
|
||||
static const char *const ENV_ATL[5] = {
|
||||
"pop_env0.atl", "pop_env1.atl", "pop_env2.atl",
|
||||
"pop_env3.atl", "pop_env4.atl"
|
||||
};
|
||||
|
||||
static atlas_t env[5];
|
||||
static atlas_t wall_a;
|
||||
static atlas_t fore_a;
|
||||
|
||||
/* Блит одного спрайта ленты idx атласа a в (x,y): страница атласа в W0,
|
||||
* gfx_blit читает w/h из getimage-заголовка ленты (в W0). */
|
||||
static void put(atlas_t *a, unsigned char idx, int x, int y)
|
||||
{
|
||||
const void *img = atlas_image(a, idx);
|
||||
gfx_w0_map(a->page);
|
||||
gfx_blit(x, y, img);
|
||||
gfx_w0_unmap();
|
||||
}
|
||||
|
||||
static void put_env(unsigned char id, int x, int y)
|
||||
{
|
||||
put(&env[id >> 5], (unsigned char)(id & 31), x, y);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Загрузка всех 7 атласов (env0..4 + wall + fore). */
|
||||
for (i = 0; i < 5; i++) {
|
||||
if (atlas_load(&env[i], ENV_ATL[i]) != 0) {
|
||||
printf("atlas_load %s failed\n", ENV_ATL[i]);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if (atlas_load(&wall_a, "pop_wall.atl") != 0) { puts("wall atl fail"); return 1; }
|
||||
if (atlas_load(&fore_a, "pop_fore.atl") != 0) { puts("fore atl fail"); return 1; }
|
||||
|
||||
initgraph();
|
||||
gfx_set_draw_page(0);
|
||||
gfx_set_visible_page(0);
|
||||
if (gfx_pal_fload(0, "pop_bg.pal") < 0)
|
||||
gfx_pal_fload(0, "a:\\pop_bg.pal");
|
||||
/* Свой яркий фон-индекс (вне 0x50..0x6F, занятых графикой) — чтобы
|
||||
* прозрачные (0xFF) области спрайтов были ЯВНО видны. */
|
||||
#define BG_IDX 0x20
|
||||
gfx_pal_set(0, BG_IDX, 120, 0, 90); /* r,g,b — тёмно-пурпурный */
|
||||
gfx_pal_sync();
|
||||
|
||||
setfillstyle(SOLID_FILL, BG_IDX);
|
||||
bar(0, 0, 319, 255);
|
||||
setcolor(WHITE);
|
||||
outtextxy(2, 2, "PoP bg atlas test");
|
||||
|
||||
/* Прозрачный блит: банк не пишет 0xFF (фон проступает). */
|
||||
gfx_set_bank(GFX_BANK_TRANSPARENT);
|
||||
|
||||
/* --- Стены (chtab_7): нижние грани 7/9/5/3, основные 8/10/6/4 --- */
|
||||
put(&wall_a, 3, 4, 20); put(&wall_a, 5, 40, 20);
|
||||
put(&wall_a, 7, 76, 20); put(&wall_a, 9, 112, 20);
|
||||
put(&wall_a, 4, 4, 90); put(&wall_a, 6, 40, 90);
|
||||
put(&wall_a, 8, 76, 90); put(&wall_a, 10, 112, 90);
|
||||
/* декали-марки стен 14..17 */
|
||||
put(&wall_a, 14, 150, 20); put(&wall_a, 15, 168, 20);
|
||||
put(&wall_a, 16, 186, 20); put(&wall_a, 17, 204, 20);
|
||||
|
||||
/* --- Столб: база 92, боковая грань 93, фронт 95 (fore) --- */
|
||||
put_env(92, 4, 160);
|
||||
put_env(93, 40, 160);
|
||||
put(&fore_a, 95, 76, 160);
|
||||
|
||||
/* --- Пол: база 41, правый треуг. 42, низ 43; силуэт 44/45 --- */
|
||||
put_env(41, 150, 120);
|
||||
put_env(42, 190, 120);
|
||||
put_env(44, 230, 120);
|
||||
put_env(45, 260, 120);
|
||||
|
||||
/* --- Решётка-окно 126, дебрис 97/98, слайсы ворот 52/53 --- */
|
||||
put_env(126, 150, 160);
|
||||
put_env(97, 190, 160);
|
||||
put_env(52, 230, 160);
|
||||
put_env(53, 250, 160);
|
||||
|
||||
gfx_set_bank(GFX_BANK_NORMAL);
|
||||
/* Держим картинку на экране до нажатия (не полагаемся на блокирующий
|
||||
* getch — в автотесте клавиш нет, крутимся до таймаута MAME). */
|
||||
while (!kbhit())
|
||||
gfx_wait_vsync();
|
||||
|
||||
closegraph();
|
||||
for (i = 0; i < 5; i++) atlas_free(&env[i]);
|
||||
atlas_free(&wall_a);
|
||||
atlas_free(&fore_a);
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user