Проваливающиеся полы в roomtest (порт SDLPoP seg007/seg008), проверено в MAME: - Падающий кусок (mob): правый край env-42 (w=26, доходит до mob_x+57) теперь полностью покрыт heal-коридором (MOB_W 56->64) — убран тёмный хвост-тень на полу 2,7 ПОСЛЕ падения. - Окклюзия правого куска во ВРЕМЯ падения: после отрисовки плиты перерисовывается сосед-пол draw_tile(row,col+1) в том же кадре — край прячется за полом 2,7 (порт redraw_at_cur_mob: set_redraw_full+1). - Тряска от сотрясения (knock): seqtbl-команды KNOCK_DOWN/UP в play_seq -> флаг knock -> do_knock(ряд) трясёт loose ряда из покоя (modif=0x80). KNOCK_DOWN в land-seq (приземление) и runcyc (footstep). - Фикс «бесконечной тряски» (дабл-буфер): при завершении тряски (0x84->0) перерисовать покойный кадр плиты на ОБЕИХ страницах (loose_rest, 2 кадра) — иначе на одной странице застревает дрожащий кадр правой грани (живёт в тайлах col и col+1) -> мерцание через флип. Инфраструктура/документация: - app.mk: цель `make hdd` (упаковка в D: для MCP-моста MAME). - docs: POP-DAT-FormatSpecifications.pdf/.txt как каноническая спецификация форматов ресурсов; ссылки в README/MSDOS_RESOURCE_FORMAT. - README.md/CLAUDE.md для applications/PoP и roomtest (правило «SDLPoP — источник истины», порядок слоёв, режим отладки freeze 1/2). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
6.4 KiB
Prince of Persia → ZX Sprinter — правила подпроекта
Порт Prince of Persia (DOS/Apple II) на Sprinter Sp2000 поверх нашего
sprinter-cc / libc / libbgi. Действуют правила корневого
CLAUDE.md (сборка, libc, ABI, MAME-автотест); ниже — только специфика PoP.
Общение и комментарии — на русском.
Главное правило: SDLPoP — источник истины. Сначала читай, потом кодь
SDLPoP/src/ (github.com/NagyD/SDLPoP, GPLv3) — ЕДИНСТВЕННЫЙ авторитетный
источник того, как оригинальный движок это делает. Правило без исключений:
- Перед реализацией ЛЮБОЙ функции (движение, коллизия, окклюзия,
падение, loose-полы, стражники, отрисовка, тайминги, любые числовые
константы) — СНАЧАЛА найди и прочитай соответствующий код в
SDLPoP/src/, и портируй по нему. Не пиши по памяти, не выводи логику «из общих соображений», не угадывай значения — это источник багов, которые потом ловятся в MAME часами. - По любому вопросу «как в оригинале должно быть» (что окклюдит что,
в каком порядке слои, когда меняется тайл, какая скорость/задержка,
что делает такой-то кадр анимации) — ответ ищи в
SDLPoP/src/, а не строй гипотезу. Если в SDLPoP не нашёл — это повод копать дальше в исходнике, а не додумывать. - Расхождение нашей реализации с SDLPoP — по умолчанию баг у нас, пока не доказано обратное (наша платформа/ABI требует отличия — тогда явно зафиксировать почему в комментарии).
Карта сегментов: seg005 control-диспетчер, seg006 play_kid/коллизия/
seqtbl, seg007 mob/loose/падающие объекты, seg008 отрисовка тайлов/
слои/окклюзия, seg009 чтение ресурсов. Слои окклюзии у нас = слои SDLPoP.
См. memory pop_check_sdlpop_first.
Вторичные референсы (когда в SDLPoP непонятно/нужен другой ракурс):
Prince-of-Persia-Apple-II/— оригинальный 6502-исходник 1989 (Мехнер).PR/(github.com/NagyD/PR, GPLv2) — Princed Resources.mininim/— независимая реализация.
Все эти папки — справочник логики/структур/констант и источник ассетов, но НЕ код для копирования (лицензии несовместимы, наш ABI другой): читаем и переписываем под наш движок, а не вставляем куски.
Ассеты
Готовые распакованные VGA-256 ассеты (то, что нужно под 320×256×256) —
SDLPoP/data/ (res<id>.png/.pal/.bin). Брать оттуда, а НЕ писать свой
декодер DOS .DAT. Локальные .DAT — в MSDOS/.
Каноническая спецификация форматов .DAT — docs/POP-DAT-FormatSpecifications.pdf
(грепаемая копия — docs/POP-DAT-FormatSpecifications.txt): первоисточник
Princed для DAT v1.0 (контейнер/индекс/чек-сумма, кодеки RLE/LZG, палитры,
формат уровней, звук), на нём построены и SDLPoP, и Princed Resources. Наши
разборы (docs/MSDOS_RESOURCE_FORMAT.md / docs/APPLEII_RESOURCE_FORMAT.md /
docs/README.md) — практические заметки/сверки; при расхождении источник
истины — спецификация. Формат уровня почти идентичен в Apple II и DOS.
Упаковка ассетов под Sprinter (атласы .atl, палитра) — python-скрипты в
toolchain/ (render_room.py, pop_pack_bg.py, pop_pack_kid.py,
pop_extract_kid_data.py). Их дёргают Makefile'ы тестов.
Структура папки
docs/— планы и форматы:PORT_PLAN.md(общий план фаз),KID_PLAN.md,double_buffer_plan.md,loose_floors_plan.md, форматы ресурсов. Начинать чтение отсюда.roomtest/— активная разработка: комната 1 + Kid (анимация, ввод, коллизия, падение, зацеп, fore-окклюзия, loose-полы). СвойCLAUDE.md.poc/— ранний proof-of-concept (снег/атлас/kbd_raw); ассеты вpoc/res/.bgtest/,coltest/— отдельные проверки фона/коллизии.toolchain/— python-упаковщики ассетов + эталонные PNG (1.1-2.png).SDLPoP/,PR/,Prince-of-Persia-Apple-II/,mininim/,MSDOS/— референсы/оригинальные данные (см. выше).
Ключевые архитектурные решения (memory/)
pop_port_project— общий статус порта.pop_banking_architecture— будущее: big+BANK_W1, графику нельзя в W3, один файл = один банк = прямые вызовы, main резидентен.pop_background_strategy— фон = композиция тайлов в рантайме (вариант 3).pop_kid_plan/pop_hang_state/pop_fore_layer/pop_fall_debug_baseline— этапы Kid.kbd_raw_fifo_drain— held-state клавиатуры (единственный принципиальный пробел движка, закрыт<kbd_raw.h>): вычерпывать FIFO SIO циклом.png_strip_padding_tradeoff,pop_tile_atlas_palette_merge— квирки упаковки ассетов.