Files
Sprinter-SDCC/applications/PoP/roomtest
snark13 fb495ace42 PoP roomtest: вспышка фона стробом + красная вспышка урона (+ урон падения)
1. Жёлтая вспышка подъёма меча была ОДНОЙ длинной заливкой.  В оригинале
   (seg003:0AFC flash_if_hurt / remove_flash_if_hurt) цвет ставится и
   СНИМАЕТСЯ в том же кадре — пока идёт flash_time, видно быстрый строб
   «жёлтый/чёрный».  У нас теперь так же: цвет ставится в кадре и
   снимается после ПЕРВОГО gfx_wait_vsync из трёх (≈20 мс жёлтого,
   40 мс чёрного — близко к оригинальным 2 тикам таймера).

2. Красной вспышки при потере HP не было вовсе.  Порт второй ветки
   flash_if_hurt: если flash_time не активен, но в этом кадре hitp_delta<0
   — do_flash(color_12_brightred) ровно на кадр.  У нас триггер —
   pop_kid_hurt (он же рисует «брызги»).

3. Чтобы вспышке было от чего срабатывать, портирован урон падения из
   land() (seg005), которого у нас не было: <22 — мягко, <33 — −1 HP и
   seq_20 (2 этажа), иначе take_hp(100) + seq_22_crushed (насмерть).
   ВНИМАНИЕ: это меняет геймплей — падение с 2 этажей теперь отнимает HP,
   с 3+ убивает (как в оригинале).

Проверено в MAME: pop_flash_time тикает 5→3→1→0 (строб), падение с ряда 0
на ряд 2 даёт hitp_curr 3→2 и кадр 109 (medium land).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 17:40:52 +03:00
..

roomtest

Живой прототип порта Prince of Persia: комната 1 уровня 1 отрисовывается реальной композицией слоёв-тайлов, по ней бегает и прыгает Kid под управлением с клавиатуры. Служит стендом для переноса механик движка (анимация, коллизия, падение, зацеп, окклюзия, проваливающиеся полы) до их выделения в переиспользуемый код.

Правила разработки и порядок слоёв рендера — CLAUDE.md.

Быстрый старт

make        # собрать roomtest.exe (ассеты упакуются автоматически)
make run    # собрать, упаковать на дискету и запустить в MAME

Клавиши в запущенном тесте: ←/→ бег, ↓ присед, ↑+→ прыжок, Shift шаг, ESC выход.

Отладка рисования:

  • SPACE — тумблер дабл-буфера (в однобуфере баги рисования видны без мерцания-через-кадр).
  • 1 — заморозить кадр (frozen: tick/draw/flip пропускаются, картинка стоит), 2 — снять заморозку и продолжить. Приём для разбора транзиентных артефактов (тряска/падение loose, поза Kid): поймать проблемный кадр на 1, спокойно рассмотреть/снять пиксели — в т.ч. удалённо из MAME MCP-моста, пока анимация стоит.

Эталон вида комнаты — ../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/).

Статус

Готово и проверено в MAME: статический фон комнаты 1; Kid — анимация, управление, коллизия/падение, зацеп/подтягивание/спуск, fore-окклюзия пола/стены над Kid. В работе: проваливающиеся полы (loose floors) — см. ../docs/loose_floors_plan.md.