Files
Sprinter-SDCC/applications/PoP/roomtest/README.md
T
snark13 a6666489c0 Уровень 7 прошёл предварительный тест
Найдено и закрыто по дороге: SPIKE-BAKED (980d48c), DIED-ON-BUTTON
(6feab5d).  Регресс после них: сцена 13/23 (каскад плит) отрабатывает
штатно, host-тесты 5106 проверок без расхождений — включая 1730 трасс
физики, которых касалось снятие раннего выхода для трупа.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 15:36:51 +03:00

75 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# roomtest
Живой прототип порта Prince of Persia: комната 1 уровня 1 отрисовывается
реальной композицией слоёв-тайлов, по ней бегает и прыгает Kid под
управлением с клавиатуры. Служит стендом для переноса механик движка
(анимация, коллизия, падение, зацеп, окклюзия, проваливающиеся полы) до их
выделения в переиспользуемый код.
Правила разработки и порядок слоёв рендера — [`CLAUDE.md`](CLAUDE.md).
## Быстрый старт
```
make # собрать roomtest.exe (ассеты упакуются автоматически)
make run # собрать, упаковать на дискету и запустить в MAME
```
Клавиши в запущенном тесте: ←/→ бег, ↓ присед, ↑+→ прыжок, Shift шаг,
ESC выход.
**Отладка рисования:**
- **SPACE** — тумблер дабл-буфера (в однобуфере баги рисования видны без
мерцания-через-кадр).
- **1** — заморозить кадр (`frozen`: tick/draw/flip пропускаются, картинка
стоит), **2** — снять заморозку и продолжить. Приём для разбора
транзиентных артефактов (тряска/падение loose, поза Kid): поймать
проблемный кадр на `1`, спокойно рассмотреть/снять пиксели — в т.ч.
удалённо из MAME MCP-моста, пока анимация стоит.
**Читы** (`pop_cheat.h`; в релизной сборке выключаются через `pop_cheats`):
- **I** — бессмертие Кида (toggle). **Работает ТОЛЬКО в бою, то есть с
мечом в руке.** Удар по безоружному Киду остаётся смертельным — ровно как
в оригинале (seg002 `hurt_by_sword`: *«Being hurt when not in fighting pose
means death»*, `take_hp(100)`). Ограничение не косметическое: анимация
«получил удар» (`seq_74`) состоит из кадров 150..179, которые ВСЕ с мечом,
и подмена смерти на неё оставляла Кида в боевой стойке при `sword == 0`
состоянии, для которого у диспетчера `control()` нет ни одной ветки, то
есть с намертво зависшим управлением
([BUG-CHEAT-IMM-1](BUGS_CLOSED.md#bug-cheat-imm-1)). На физику (падения,
пики, чомперы) бессмертие действует всегда, независимо от меча.
- **K** — убить стража, **S** — выдать меч, **Shift+L** — следующий уровень,
**+/−** — обход комнат.
Эталон вида комнаты — `../toolchain/1.1-2.png`.
## Модули
- `roomtest.c` — главный цикл (дабл-буфер, порядок tick/draw).
- `pop_bg.c` — фон комнаты композицией тайлов + fore-окклюзия + loose-полы.
- `pop_kid.c` — анимация/движение Kid (интерпретатор seqtbl).
- `pop_ctrl.c` — управление с клавиатуры (диспетчер control).
- `pop_map.c` — коллизия с картой, физика падения, loose-полы.
- `room1_data.h` — карта комнаты 1; `kid_data.h` — данные анимации Kid
(оба генерируются скриптами `../toolchain/`).
## Статус (2026-08-18)
**Уровни 1-3 приняты, 4-7 прошли предварительный тест.** Работает: комнаты и
переходы, Kid (анимация, управление, коллизия/падение, зацеп/подтягивание/
спуск, окклюзия), кнопки и ворота, пики, чомперы, проваливающиеся полы, дверь
уровня и переход на следующий, меч и бой, стражи с ИИ (включая скелета и
визиря), тень уровней 4/5/6, зеркало, HP и зелья, чекпойнты, дворцовый
тайлсет.
«Принят» = пользователь обошёл ВСЕ комнаты уровня; «предварительно пройден» =
прогон по сценарию. Разбивка по уровням с найденными багами —
[`TASKS_OPEN.md`](TASKS_OPEN.md). Не сделано вовсе: звук, таймер/HUD времени,
меню и сохранения ([QuickSave запланирован](TASKS_OPEN.md#qsave)).
**Что берём в работу сейчас — [`TASKS_OPEN.md`](TASKS_OPEN.md)** (сделанное с
протоколами замеров — [`TASKS_CLOSED.md`](TASKS_CLOSED.md)); открытые баги —
[`BUGS_OPEN.md`](BUGS_OPEN.md), закрытые с разбором корней —
[`BUGS_CLOSED.md`](BUGS_CLOSED.md); план следующих уровней —
[`../docs/levels_plan.md`](../docs/levels_plan.md).