Files
Sprinter-SDCC/applications/PoP/roomtest
snark13 3dbad6120c PoP roomtest: страж — спрайты, таблица кадров и появление в комнате
Шаги 1-2 из плана стражей:

1. Спрайты (chtab_5_guard, база 750).  Новый упаковщик pop_pack_guard.py:
   data/GUARD/res751..784 -> GUARD\g0..g4.atl (5 EMM-страниц, адресация
   id>>3 / id&7, как у Kid).  Палитра берётся НЕ из PNG, а из res10.bin
   (guard_palettes: 7 палитр по 16 цветов, 6-бит) по level.guards_color —
   на уровне 1 у обоих стражей color = 2; группа слотов 0x90..0x9F
   добавлена в общий kid.pal.

2. Таблица кадров стража у оригинала СВОЯ (frame_tbl_guard, seg006:372,
   41 запись) и индексируется как frame + add_frame - 149, где add_frame
   = 70 для кадров 102..106.  Она дописана в kid_data.bin (3515 -> 3720 Б,
   смещение в KID_BIN_GFRAMES_OFF); pop_kid получил pop_kid_data_frame()
   — чтение кадра из ЛЮБОЙ таблицы страницы данных.

3. Появление: pop_level_guard() читает guards_tile/dir/color/skill из
   уровня, pop_guard_enter() ставит стража по enter_guard (seg002:0112) +
   pos_guards (seg003): row из тайла, y = y_land[row+1], x из колонки,
   charid = guard, sword сложен, alive = -1, HP = 3.  Отрисовка
   pop_guard_draw() — та же математика, что kid_draw (load_frame_to_obj +
   calc_screen_x_coord), но атлас стража и своя таблица кадров; heal по
   странице дабл-буфера, как у Kid.

Интерпретатора последовательностей у стража ПОКА НЕТ: кадр ставится
напрямую (166 = frame_166_stand_inactive, что и даёт seq_77 при входе в
комнату).  play_seq для произвольного персонажа + ИИ — следующая фаза.

Проверено в MAME: в комнате 3 страж появляется на своём месте (ряд 1,
кол 7) и рисуется; цвета совпадают с эталонным рендером спрайта в
палитре color=2.

ВНИМАНИЕ по памяти: куча W2 просела до 805 Б (было 2349).  Перед ИИ
стражей нужен шаг 5 плана (данные: room_modif 720 Б, dl1/dl2 512 Б,
_kbdraw_down 512 Б) либо вынос кода отрисовки стража в резидент W3.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 21:57:38 +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.