Files
Sprinter-SDCC/applications/PoP/roomtest
snark13 7ae691b070 Fore потолка поверх падающей плиты: в разборе пометок не было ряда -1
Найдено пользователем (2026-08-17, уровень 1 комната 6): падающая плита
(-1,5) перекрывает собой кромку потолка (-1,6), чего физически быть не может.

Дыра архитектурная: pop_fore_needed обходил только ряды 0..2, ряда -1 в
переднем слое не было вовсе.

Сверено с оригиналом.  redraw_needed_tiles (seg008:1B06) обходит ряды 2,1,0, а
ПОТОМ отдельным проходом ряд 2 комнаты сверху (redraw_needed_above), и его
draw_tile_fore кладёт куски в FOREtable.  Падающая плита идёт в MIDtable
(draw_mobs).  draw_tables рисует back -> mid -> fore (seg008:1373), поэтому у
оригинала кромка потолка оказывается поверх плиты сама собой.

Порт:

- pop_fore_needed: проход по ряду -1 добавлен и идёт ПОСЛЕДНИМ, как в
  оригинале.  Свой набор пометок (rdfa/rdfa_pending) — как и у самих
  перерисовок ряда -1 (rda_*), это отдельный проход, а не 11-я колонка;
- новый лист pop_ceil_fore_tile_b (pop_bg.c) — тот же redraw_needed_above,
  что уже рисовался над персонажем (ceil_over_kid_tile), плюс окно клипа
  ровно на полосу столбца и ov_mark (полоса идёт банком без тени, на второй
  странице её восстановит pop_fore_heal);
- mob_mark_neighbour помечает ряд -1, пока кусок достаёт до кромки.  Кромка
  живёт в трёх верхних строках поля (dby = 2 при клипе по POP_YOFF), спрайт
  куска занимает mob_y-16 .. mob_y, отсюда условие mob_y <= 18 — три кадра
  после отрыва (y = 2, 5, 11 при ускорении 3).  Помечаются ОБА столбца,
  которые кусок накрывает по x (mob_x .. mob_x+62 = col и col+1); именно
  поэтому страдал сосед.

По бюджету работа появляется только в эти три кадра на кусок и попадает в
циановую фазу, где сейчас запас (270 тыс. из 400 тыс.).  Замер на ур.13 —
следующим шагом.

8 наборов tests-host зелёные.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 17:17:04 +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/).

Статус (2026-08-07)

Уровни 1 и 2 приняты (пользователь прошёл все комнаты обоих, крупных багов нет): комнаты и переходы, Kid (анимация, управление, коллизия/падение, зацеп/подтягивание/спуск, окклюзия), кнопки и ворота, пики, проваливающиеся полы, дверь уровня и переход на следующий уровень, меч и бой, стражи с ИИ, HP и зелья, чекпойнт уровня 3.

Уровень 3 играется, но не принят: нет чомперов и скелета. Не сделано вовсе: звук, таймер/HUD времени, меню и сохранения.

Что берём в работу сейчас — TASKS_OPEN.md (сделанное с протоколами замеров — TASKS_CLOSED.md); открытые баги — BUGS_OPEN.md, закрытые с разбором корней — BUGS_CLOSED.md; план следующих уровней — ../docs/levels_plan.md.