Files
Sprinter-SDCC/applications/PoP/roomtest/NEXT_SESSION.md
T
snark13 b5951c9b5c Зацеп за кромку нижнего ряда: do_fall пускает ряд до 3 + check_grab в midair
Уровень 7, комната 14: спуск с ряда 0 на ряд 2 через зацеп (повис на кромке
кнопки (0,2), отпустил, взялся за (2,2)) не работал ни при какой фазе и
задержке — Кид пролетал мимо и разгонялся до fall_y = 33, после чего окно
зацепа закрыто уже по скорости.

Корень: do_fall не давал curr_row выйти за 2, а check_grab целится в тайл
ряда curr_row-1 — то есть ряд 2 своей комнаты становится целью только при
curr_row == 3.  В оригинале (seg005:0030) inc_curr_row безусловный, а
get_tile для ряда 3 уходит по links.down (find_room_of_tile, seg006:005D).

- pop_map.c do_fall: inc_curr_row теперь 2 -> 3; ветка «достиг y_land»
  гейтится по curr_row <= 2 (при ряде 3 ни in_wall, ни land звать нельзя —
  тайлов своей комнаты там нет, а до y_land[4] дело не доходит: комнату
  меняет check_leave_below на y >= 211).
- pop_map.c check_action: восстановлена ветка ACT_MIDAIR (кадры 102..105,
  seg006:0619) — первые четыре кадра падения, где fall_y ещё не разогнан,
  зацеп не работал вовсе.  Отсюда же «иногда цепляется, иногда нет».
- tests-host/t_grab.c: регресс grab_below_room_edge_window_exists — сцена
  комнаты 14 + переход в 15 по pop_fell_out.  До фикса ни одного зацепа,
  после — окно из 8 фаз X при задержках 0..5 кадров; проверяется и
  играбельность (зацеп при «отпустил и сразу зажал Shift»).
- roomtest.c + pop_guard.h: чит-навигация ставит Кида на верхний ряд в
  комнате 14 уровня 7 (GRAB_DOWN_LEVEL/ROOM) — снизу этот спуск не проверить.
  Общее правило (снизу вверх) не тронуто: в верхнем ряду пола чаще нет и Кид
  проваливается сразу после телепорта.

Проверено: tests-host 5/5 (55 в [grab]), size-check OK, живьём в MAME —
Кид повис на кромке (2,2): frame=91 y=55 row=0 room=15.

Доски: GRAB-BELOW-ROOM в BUGS_CLOSED, GRAB-KBD-TIMING в BUGS_OPEN (отложен
пользователем до готовности всех уровней), план L7-FEATHER в TASKS_OPEN.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 11:58:17 +03:00

114 lines
8.8 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.
# Точка входа для следующей сессии (обновлено 2026-08-12)
Файл для старта с чистого контекста: где всё стоит, что делать первым, какие
грабли уже собраны. Читать целиком — он короткий. Дальше по ссылкам:
`TASKS_OPEN.md` (доска), `BUGS_OPEN.md` (открытые баги), `CLAUDE.md`.
---
## 1. СЛЕДУЮЩАЯ ЗАДАЧА: зелье МЕДЛЕННОГО ПАДЕНИЯ (уровень 7, комната 1)
План готов и лежит в [`TASKS_OPEN.md#l7-feather`](TASKS_OPEN.md#l7-feather) —
шесть шагов с уже выписанными константами оригинала (ускорение 1 / потолок 4,
`SEQ_JMP_IF_FEATHER` → ветки `stepfloat`/`bumpfloat`, зелёная вспышка, зелёные
пузырьки, таймер 18,75 с). Начинать прямо с шага 1.
**Зацеп в падении — закрыт 2026-08-12**
([GRAB-BELOW-ROOM](BUGS_CLOSED.md#grab-below-room)). Оказалось, что зацеп
из падения был жив, а сломан был спуск через НИЖНЮЮ кромку комнаты (уровень 7,
комната 14): `do_fall` не пускал ряд персонажа до 3, и `check_grab` на этом
отрезке не звался ни разу. Плюс восстановлена ветка `ACT_MIDAIR` (кадры
102..105 — начало падения). Проверено хост-тестом `t_grab` и живьём в MAME.
Осталась ощущенческая часть — [GRAB-KBD-TIMING](BUGS_OPEN.md#grab-kbd-timing):
зацеп при входе на уровень 7 срабатывает менее стабильно, чем в оригинале
(подозрение на клавиатурный модуль и на общий темп игры, `L1-SPEED`).
**Решение пользователя: разбирать после того, как будут готовы все уровни.**
## 2. Состояние репозитория
Всё закоммичено, `main` чист. `tests-host`: 5 наборов проходят
(`[char] 65`, `[geom] 3144`, `[grab] 53`, `[phys] 1723`, `[wall] 1`).
`make size-check`: OK (65 программ, роста нет).
Коммиты 2026-08-11 (вечер):
| хеш | что |
|---|---|
| `abe4a83` | уровень 5: тень не дерётся, кнопка в шве, узор паласа после зелья |
| `740cc6d` | арка у ворот: спецслучай «Lattice + door A» (seg008:622) |
| `e4ef489` | L6-SHADOW: тень роняет решётку + кромка ряда ниже |
| `9ecea17` | уровень 6: переход на 7-й, портал, многокомнатное падение плиты |
Уровни 1-6 проходятся; всё, что пользователь ловил в этой сессии, закрыто и
разобрано в [`BUGS_CLOSED.md`](BUGS_CLOSED.md) (шесть записей за вечер).
## 3. Состояние окружения
- **MAME запущена с мостом**, но на её HDD сейчас лежат ТЕСТЫ libbgi
(`accop.exe`, `bgiimg.exe`), а не roomtest. Под roomtest пересобрать
образ: `make hdd` (или `make PROF_FLAGS="-DFIRST_LEVEL=5" hdd` — при смене
`FIRST_LEVEL` нужен `touch roomtest.c`, иначе не переедет), после чего
MAME **обязана** пройти полный рестарт (memory `mame_hdd_rebuild_restart`).
- **Остановка MAME — `mame/v306/bridge_cmd.sh 'cmd exit'`**, НЕ `kill`
(правило пользователя). `pkill -f` бывает не срабатывает, и остаются ДВА
инстанса, оба отвечающих на файловый IPC — тогда скриншоты приходят от
чужой машины. Проверять `pgrep -f mame.arm` после остановки.
- Прогон без MCP-инструментов: `bridge_cmd.sh 'cont'` → sleep ~45 с (бут
DSS) → `bridge_cmd.sh 'keyseq d:{ENTER}'``keyseq <имя>{ENTER}`
`snap /tmp/mame_snap/x.png`. **Имя .exe на образе — не длиннее 8 символов
(FAT 8.3) и БЕЗ подчёркивания** (`keyseq` не умеет `_`).
- **SDLPoP собран с отладочной информацией** (`-O0 -g3`); pkg-config на
машине нет, команда сборки — в истории этого файла (`git log -p`).
- **НЕ ПРИБРАНО:** в `SDLPoP/src/seg008.c` диагностический `fprintf` с меткой
`DBGMIRROR` в начале `add_objtable` (гейтится по `obj_type == 1 || == 4`).
## 4. Что сделано в libbgi и чем это полезно дальше
Блочные операции акселератора — полный набор AND/OR/XOR/NOT, строками и
колонками: `gfx_blit_op` / `gfx_blit_part_op`, `gfx_blit_cols_op` /
`gfx_blit_cols_part_wx_op` (клип-окно и флип — как у копирующих близнецов),
опкод патчится SMC. `putimage` лишился попиксельного пути целиком (закрыт
пункт 2d-1 `docs/TODO.md`). Регресс — `tests/accop` (10/10 PASS в MAME,
побайтно). Механика и три ловушки — memory `accel_block_ops`; главные:
операция читает ОЗУ-КОПИЮ экрана (не VRAM), а прозрачность `#FF` совместима
с AND/OR, но не с XOR.
**Вид тени (OR+XOR) отложен** до готовности всех уровней — разбор, замеры и
варианты в [`../docs/shadow_render.md`](../docs/shadow_render.md).
## 5. Остальное открытое
- **[FORE-DUP](BUGS_OPEN.md#fore-dup)** — передний слой тайла рисуется дважды
при перекрытии объектов (Кид+отражение всегда, Кид+соперник — весь ближний
бой). Картинку не портит, тратит такты. **Сначала замерить, потом
чинить** — окно клипа в своё время дало 3.2×.
- **[DIED-ON-BUTTON](BUGS_OPEN.md#died-on-button)** — `died_on_button`
(seg007:776) не портирован.
- **TORCH-ANIM-RIGHT** — под запечённым пламенем могут застыть пики/меч/зелье
справа от факела; на уровнях 1-4 такого соседства нет.
- **GUARD-PHYS ЗАКРЫТ** 2026-08-11: нажатие напольной кнопки НЕ-Кидом
проверено живьём на уровне 6 (тень встаёт на `closer` и роняет решётку).
- **[GATE-FORE-KID](BUGS_OPEN.md#gate-fore-kid)** — Кид в проёме ворот виден
поверх решётки; портирован только шовный случай.
- Долгие: `BUG-SPIKE-1`, `BUG-CHOMP-JUMP-1` (оба низкий приоритет),
`L3-COLOR`, `L1-SPEED` (игра на ~39 % быстрее оригинала), `TUNE-1`.
## 6. Грабли, собранные 2026-08-10/11
- **Не оценивать железо по своей же memory-заметке.** Заявил, что accel
умеет только копирование и XOR потребует ~25 % кадра на CPU — неверно,
поправил пользователь. Заметка описывала копирование, я принял её
неполноту за свойство железа. Проверять по драйверу MAME
(`mame/sources/MAME/src/mame/sinclair/sprinter.cpp`) и `docs/new/06-accel.md`.
- **lldb через FIFO — плохая идея.** Повторяющиеся `-o` при
`breakpoint command add` записываются НЕПОЛНЫМИ. **Работает надёжно:**
`fprintf(stderr, ...)` прямо в SDLPoP, пересборка (секунды) и чтение stdout.
- **`make` без `hdd` не обновляет образ MAME**, а `FIRST_LEVEL` живёт в
`roomtest.c` — при смене нужен `touch roomtest.c`.
- **Доска отставала от кода на три задачи** (`L3-CHOMP`, `L3-SKEL`, шаги 3/5
`L4-MIRROR` значились несделанными). Перед планированием — сверять
`TASKS_OPEN.md` с кодом грепом, а не верить записи.
- Диапазон `obj_x` = **416..695** (посчитан из `kid_data.bin`). Пригодится
всякий раз, когда нужна таблица по экранной X.