SprPoP: автономное приложение, выделенное из roomtest

Порт PoP переехал в applications/SprPoP — приложение, которое собирается
само: код, оригинальные данные, конверторы ресурсов и сборка внутри одной
папки.  Наружу знает единственный путь — корень тулчейна (SPRINTER_ROOT,
по умолчанию ../..).  applications/PoP/roomtest ЗАМОРОЖЕНА и остаётся
архивом закрытых задач, багов и исполненных планов.

Скопировано из applications/PoP/roomtest@4b74478.  Перенос проверен
побайтово: собранный sprpop.exe совпал с roomtest.exe того же коммита,
все 39 дисковых ресурсов и все 16 генерируемых заголовков — тоже, host-
тесты зелёные (15/15).

Раскладка:
  src/           рукописный C (roomtest.c -> sprpop.c)
  gen/           генерируемые заголовки, в репозитории
  assets/orig/   оригинальные данные игры, вне репозитория (копирайт)
  assets/packed/ то, что ложится на диск, в раскладке диска
  tools/         конверторы; все пути — в одном tools/paths.py
  build/         выход: exe, каталоги ресурсов, hdd/, промежуточные atl/

Сборка ресурсов: assets/packed и gen — версионируемые ВХОДЫ, а не то, что
пересчитывается каждым make.  Автоматика построена на ОТСУТСТВИИ файла, а
не на таймстемпах: git не хранит времена, и в свежем клоне сравнение по
времени превращалось бы в лотерею.  Недостающий ресурс или заголовок
чинится сам, рекурсивным вызовом в ветку генерации.

Музыка собирается из любого из четырёх наборов записей (make music-mp3,
music-mt32, ...); набор входит в имя stamp'а, поэтому смена набора сама
делает музыку устаревшей.  Длины реплик больше не захардкожены: упаковщик
печатает их в gen/pop_music_ticks.h, и шкала сцены выражена через них —
иначе mt32 (реплики на 6% длиннее) молча ломал катсцену.

Тулчейн: в app.mk два обратносовместимых крючка (SRC_DIR/BUILD_DIR),
HDD_IMG стал ?=; команда сборки roomtest не изменилась.  Корневой
make host-tests переключён на SprPoP.

Подгонка тайминга катсцены с принцессой (PV_MAGIC_LEAD): сцена
render-bound и идёт ~49 тиков/с вместо 60, из-за чего кода реплики
приходила раньше молнии.  Это обход, а не лечение; разбор с замерами —
docs/BUGS_OPEN.md, записи SND-PACE-DEAD, PV-RENDER-BOUND, MUS-LEFT-TEAR.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-27 12:12:28 +03:00
parent 4b74478d19
commit 31b82661eb
235 changed files with 51293 additions and 10 deletions
+69
View File
@@ -0,0 +1,69 @@
# `SprPoP/docs` — индекс
Актуальность на 2026-08-26 (перенос из `applications/PoP/roomtest`).
Сюда взято только то, что ещё читают. Исполненные планы остались архивом
в `../../PoP/docs/`, закрытые задачи и баги — в `../../PoP/roomtest/`.
## Входные точки
| Документ | О чём |
|----------|-------|
| [`TASKS_OPEN.md`](TASKS_OPEN.md) | **Что берётся в работу сейчас** — начинать отсюда |
| [`BUGS_OPEN.md`](BUGS_OPEN.md) | Открытые баги и незакрытые оптимизации |
| [`impl_diff.md`](impl_diff.md) | **Осознанные расхождения с SDLPoP**: где сделано не дословно и почему. Новое расхождение — записью сюда, а не только комментарием в коде |
| [`keys.txt`](keys.txt) | **Целевая раскладка управления**, к которой подгоняем SprPoP |
## Производительность
| Документ | О чём |
|----------|-------|
| [`perf_registry.md`](perf_registry.md) | **Реестр оптимизаций**: всё отложенное одним списком |
| [`perf_backlog.md`](perf_backlog.md) | Отложенная оптимизация отрисовки + **как мерить** (wait-state'ы, границы кадра) |
| [`perf_green_phase.md`](perf_green_phase.md) | ЗЕЛЁНАЯ фаза (слой фона): раскладка тактов, способы ускорения G1..G6, журнал правок |
| [`perf_cyan_phase.md`](perf_cyan_phase.md) | ЦИАН фаза (персонажи + передний слой): раскладка тактов, C1..C7, журнал правок |
| [`perf_l11_room15.md`](perf_l11_room15.md) | Сцена и замер: факел + чомпер + страж (ур.11 к.15) |
| [`perf_l13_room23.md`](perf_l13_room23.md) | Сцена и метод замера кадра: каскад плит (ур.13 к.23), зонды, канал `clog` |
| [`resident_budget.md`](resident_budget.md) | Бюджет резидента W1/W2: как мерить и как освобождать |
| [`layout_plan_v2.md`](layout_plan_v2.md) | Раскладка кода по окнам/банкам/страницам + замеры скорости отрисовки |
## Движок и содержание игры
| Документ | О чём |
|----------|-------|
| [`full_game_plan.md`](full_game_plan.md) | Полноценная игра: автомат состояний, title/intro, demo, таймер, cutscenes, ending, Hall of Fame |
| [`levels_plan.md`](levels_plan.md) | Уровни: загрузка, переходы, тайлсеты, читы |
| [`levels_12_15_plan.md`](levels_12_15_plan.md) | Уровни 12/13 (тень, Джафар, падающие плиты) + что такое 14/15 и 0 |
| [`midtable_analysis.md`](midtable_analysis.md) | Слои отрисовки: back/mid/fore и objtable в оригинале, чего стоит порт |
| [`room_model_plan.md`](room_model_plan.md) | `kid_room ≠ drawn_room` (straddle): сделан S1, остальное впереди |
| [`quicksave_plan.md`](quicksave_plan.md) | QuickSave/QuickLoad (реализовано): формат снимка `POPQ` v3 — справочник |
| [`menu_settings_plan.md`](menu_settings_plan.md) | Pause menu и Settings, `POP.CFG`, VANILLA и задел под ENHANCED |
| [`palette_plan.md`](palette_plan.md) | Карта всех 256 слотов палитры + механика fade |
| [`status_line_text.md`](status_line_text.md) | Строка HP как статус-строка: инвентаризация ВСЕХ текстов SDLPoP |
| [`sound_plan.md`](sound_plan.md) | Звук через CBL: разбор и архитектура |
| [`shadow_render.md`](shadow_render.md) | Вид Тени (OR+XOR) — отложено: почему XOR несовместим с прозрачностью `#FF` |
| [`roomnav_skip.md`](roomnav_skip.md) | Комнаты для отладочного телепорта `+`/``: какие пропускать и почему |
| [`host_tests_plan.md`](host_tests_plan.md) | Модульные тесты движка под ucsim_z80: два шва, регрессии, дифф против SDLPoP |
## Справочники по оригиналу
| Документ | О чём |
|----------|-------|
| [`PORT_PLAN.md`](PORT_PLAN.md) | Общая карта фаз со статусами; §6 модель движения, §10 режим памяти |
| [`KID_PLAN.md`](KID_PLAN.md) | Модель персонажа: `char_type`, `actions_*`, устройство `play_seq` |
| [`gates_spikes_plan.md`](gates_spikes_plan.md) | Раскладка объектов по комнатам, декод `LINKLOC`/`LINKMAP`, ссылки на seg-код |
| [`PoP/POP-DAT-FormatSpecifications.pdf`](PoP/POP-DAT-FormatSpecifications.pdf) | **Каноническая спецификация форматов `.DAT`** (грепаемая копия — `.txt`) |
| [`PoP/MSDOS_RESOURCE_FORMAT.md`](PoP/MSDOS_RESOURCE_FORMAT.md) | Наш разбор ресурсов MS-DOS-версии |
| [`PoP/APPLEII_RESOURCE_FORMAT.md`](PoP/APPLEII_RESOURCE_FORMAT.md) | Наш разбор ресурсов Apple II |
## Заделы
| Документ | О чём |
|----------|-------|
| [`ideas_backlog.md`](ideas_backlog.md) | Осознанно отложенные гипотезы (мышь, PRNG) |
| [`prng_alternatives.md`](prng_alternatives.md) | Запасные генераторы, если упрёмся в бюджет кадра |
## Не переносилось
Исполнено целиком, лежит в `../../PoP/docs/`: `frame_pacing_plan.md`
(фиксированный логический кадр), `l9_invert_plan.md` (зелье переворота),
`shadow_atlas_plan.md` (запечка атласа Тени).