09f32ce834
Уровень 11 комната 14 проверена пользователем визуально после варианта B — порядок падающего куска, соседней плиты и Кида корректен. На 10 и 12 багов не найдено. HEAL-WIDTH и G8 сведены как две половины одной темы: G8 про ширину ЗАПЕЧКИ соседнего тайла (60 вместо 28 нужных, плюс draw_tile соседа дважды на пометку), HEAL-WIDTH про ширину HEAL'ов (64 вместо фактических 58/57). Оговорка из G8 перенесена: 60 = 32 свой тайл + 28 собственный свес, для запечки самого тайла это минимум, сужать можно только пометку СОСЕДА. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
75 lines
5.4 KiB
Markdown
75 lines
5.4 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-18)
|
||
|
||
**Уровни 1-3 приняты, 4-12 прошли предварительный тест.** Работает: комнаты и
|
||
переходы, 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).
|