Files
Sprinter-SDCC/applications/PoP
snark13 af5f0a4638 PoP roomtest: отрисовка стража в резидент W3 + fore-окклюзия + off-by-one спрайта
Разгрузка W1/W2 перед ИИ стражей (вариант 2 из двух обсуждённых).

1. pop_guard.c разделён по окнам: состояние/логика (Guard, HP, enter,
   kill, load_frame) остаются в W1/W2 — их обязан видеть банк guards.c;
   ОТРИСОВКА уехала в новый pop_gdraw.c, собираемый как --w3 (резидент).
   Правило границы: резидент = только то, что рисует и зовётся
   исключительно из главного цикла.  Кадр стража стал глобальным
   (pop_gframe): заполняет логика, читает резидент.

2. Страж не окклюдировался передними гранями тайлов — рисовался поверх
   столба.  В оригинале любой Char это запись midtable, а foretable
   рисуется после всех midtable (draw_tile_fore, seg008:690), т.е. столб
   перекрывает всех одинаково.  Футпринт персонажа выделен из
   pop_fore_over_kid в char_footprint(), поверх него добавлен
   pop_fore_over_char() — слой fore + полоса потолка, без оверлеев поз
   виса/полёта/подъёма (у стража их нет; появятся — портируем
   redraw_at_char2 общим кодом, а не догадками).

3. Упаковщик стража: тот же off-by-one, что уже ловили у Kid.
   load_chtab_from_file(id_chtab_5_guard, 750) даёт images[0] = res751,
   а рисование индексирует images[frame.image] — значит image=N это
   res(751+N), а не res(750+N).  Из-за сдвига frame_166_stand_inactive
   рисовался как res767 (выпад) вместо res768 (стойка).

Проверено в MAME: страж в комнатах 3 и 21 стоит в правильной позе;
окклюзия подтверждена патчем Guard.x в живой сессии — при заходе за
столб спрайт корректно срезается его передней гранью.

Память: _CODE 26 149 -> 25 703, куча W2 805 -> 1245 Б, резидент W3
11 656 -> 12 819 (свободно 3565 Б), банк 1 236/16384 Б.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 23:14:21 +03:00
..

Prince of Persia на ZX Sprinter

Порт Prince of Persia на компьютер Sprinter Sp2000 поверх нашего target-слоя SDCC (sprinter-cc / libc / libbgi). Цель — 320×256×256 (режим 0x81), VGA-256 ассеты оригинала переносятся почти впрямую.

Общий план и статус фаз — docs/PORT_PLAN.md. Правила работы для ИИ-сессий — CLAUDE.md.

Что где

Папка Назначение
roomtest/ Активная разработка. Комната 1 уровня 1 живой композицией тайлов + Kid: анимация (seqtbl), управление с клавиатуры, коллизия, падение, зацеп/подтягивание, fore-окклюзия, проваливающиеся полы. Свой README/CLAUDE.
docs/ Планы (PORT_PLAN, KID_PLAN, double_buffer_plan, loose_floors_plan) и разбор форматов ресурсов Apple II / DOS.
toolchain/ Python-упаковщики ассетов под Sprinter (рендер комнат, атласы тайлов/Kid, извлечение данных анимации) + эталонные скриншоты.
poc/ Ранний proof-of-concept (снег, атлас, raw-клавиатура). Ассеты в poc/res/.
bgtest/, coltest/ Точечные проверки фона и коллизии.
SDLPoP/, PR/, mininim/ Референсные реализации движка (GPL) — читаем логику/константы, НЕ копируем код. SDLPoP/data/ — источник распакованных VGA-ассетов.
Prince-of-Persia-Apple-II/ Оригинальный 6502-исходник 1989 г.
MSDOS/ Локальные .DAT-ресурсы DOS-версии.

Референсы = только справочник

SDLPoP/, PR/, mininim/, Prince-of-Persia-Apple-II/ используются как справочник структур/логики и как источник готовых ассетов — их код НЕ копируется в наш порт (лицензии несовместимы, ABI другой). Любая механика сверяется с SDLPoP/src/ до реализации.

Форматы ресурсов

Формат уровня почти идентичен в Apple II и DOS (2304 / 2305 байт, blueprnt). Графика различается принципиально, но брать распакованные PNG из SDLPoP/data/ практичнее, чем декодировать сырой .DAT. Подробности — docs/README.md.