Files
snark13 8b30dc20c8 roomtest: loose-полы — тряска (knock), падение с окклюзией, фикс дабл-буфера
Проваливающиеся полы в 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>
2026-07-20 15:27:47 +03:00

6.4 KiB
Raw Permalink Blame History

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) — ЕДИНСТВЕННЫЙ авторитетный источник того, как оригинальный движок это делает. Правило без исключений:

  1. Перед реализацией ЛЮБОЙ функции (движение, коллизия, окклюзия, падение, loose-полы, стражники, отрисовка, тайминги, любые числовые константы) — СНАЧАЛА найди и прочитай соответствующий код в SDLPoP/src/, и портируй по нему. Не пиши по памяти, не выводи логику «из общих соображений», не угадывай значения — это источник багов, которые потом ловятся в MAME часами.
  2. По любому вопросу «как в оригинале должно быть» (что окклюдит что, в каком порядке слои, когда меняется тайл, какая скорость/задержка, что делает такой-то кадр анимации) — ответ ищи в SDLPoP/src/, а не строй гипотезу. Если в SDLPoP не нашёл — это повод копать дальше в исходнике, а не додумывать.
  3. Расхождение нашей реализации с 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/.

Каноническая спецификация форматов .DATdocs/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 — квирки упаковки ассетов.