ec1f384688
Обход уровней после оптимизации фаз: уровни 1 и 2 пройдены, критичных багов не осталось. Найденное по дороге закрыто и перечислено в шапке TASKS_OPEN.md, чтобы регресс-база была видна одним взглядом. README раньше читы не перечислял вовсе. Теперь у бессмертия явно записано главное ограничение — работает ТОЛЬКО с мечом в руке — и почему оно не косметическое: кадры seq_74 все с мечом, и подмена смерти на эту анимацию оставляла Кида в стойке при sword == 0, где у control() нет ни одной ветки. На физику (падения/пики/чомперы) бессмертие действует всегда. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
72 lines
5.1 KiB
Markdown
72 lines
5.1 KiB
Markdown
# 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-07)
|
||
|
||
**Уровни 1 и 2 приняты** (пользователь прошёл все комнаты обоих, крупных
|
||
багов нет): комнаты и переходы, Kid (анимация, управление, коллизия/падение,
|
||
зацеп/подтягивание/спуск, окклюзия), кнопки и ворота, пики, проваливающиеся
|
||
полы, дверь уровня и переход на следующий уровень, меч и бой, стражи с ИИ,
|
||
HP и зелья, чекпойнт уровня 3.
|
||
|
||
Уровень 3 играется, но не принят: нет **чомперов** и **скелета**. Не сделано
|
||
вовсе: звук, таймер/HUD времени, меню и сохранения.
|
||
|
||
**Что берём в работу сейчас — [`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).
|