Files
Sprinter-SDCC/applications/PoP/roomtest/README.md
T
snark13 ec1f384688 Уровень 2 принят; в README — оговорка, что иммортал только в бою
Обход уровней после оптимизации фаз: уровни 1 и 2 пройдены, критичных
багов не осталось.  Найденное по дороге закрыто и перечислено в шапке
TASKS_OPEN.md, чтобы регресс-база была видна одним взглядом.

README раньше читы не перечислял вовсе.  Теперь у бессмертия явно записано
главное ограничение — работает ТОЛЬКО с мечом в руке — и почему оно не
косметическое: кадры seq_74 все с мечом, и подмена смерти на эту анимацию
оставляла Кида в стойке при sword == 0, где у control() нет ни одной ветки.
На физику (падения/пики/чомперы) бессмертие действует всегда.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 22:42:06 +03:00

72 lines
5.1 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-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).