Files
Sprinter-SDCC/applications/PoP/roomtest/README.md
T
snark13 09f32ce834 Уровни 10-12 прошли предварительный тест; HEAL-WIDTH связан с G8
Уровень 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>
2026-08-19 00:00:23 +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-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).