# Точка входа для следующей сессии (обновлено 2026-08-12) Файл для старта с чистого контекста: где всё стоит, что делать первым, какие грабли уже собраны. Читать целиком — он короткий. Дальше по ссылкам: `TASKS_OPEN.md` (доска), `BUGS_OPEN.md` (открытые баги), `CLAUDE.md`. --- ## 1. СЛЕДУЮЩАЯ ЗАДАЧА: живая проверка зелий в MAME Код зелья медленного падения НАПИСАН (все шесть шагов плана [`TASKS_OPEN.md#l7-feather`](TASKS_OPEN.md#l7-feather)) и закрыт хост-тестом, но в MAME ещё не смотрелся. Проверить две сцены: - **уровень 7, комната 1** — зелье пера: зелёные пузырьки, зелёная вспышка при питье, спуск в шахту заметно медленнее обычного и без урона; - **уровень 2, комната 13, тайл (1,3)** — зелье «−HP»: пузырьки СИНИЕ (были красные — цвет по типу зелья не был портирован вовсе), HP убавляется на единицу, экран краснеет ровно один раз. Заодно попадают под проверку `pop_flash_color` (жёлтый/красный/зелёный) и атлас `pop_pot` (23 → 37 спрайтов: добавлены зелёный и синий наборы кадров пузырька). **Зацеп в падении — закрыт 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] 55`, `[phys] 1727`, `[wall] 1`). `make size-check`: OK (65 программ, роста нет). Коммиты 2026-08-12: | хеш | что | |---|---| | `b5951c9` | зацеп за кромку нижнего ряда: `do_fall` пускает ряд до 3 + `check_grab` в midair | | `d7d18ae` | зелье медленного падения (перо) + цвет пузырьков по типу зелья | Раньше (2026-08-11, вечер): `abe4a83` уровень 5, `740cc6d` арка у ворот, `e4ef489` L6-SHADOW, `9ecea17` уровень 6 → 7. Уровни 1-6 проходятся. ## 3. Состояние окружения - **MAME запущена с мостом**, на HDD — roomtest, собранный с `-DFIRST_LEVEL=7`. Пересобрать образ: `make hdd` (или `make PROF_FLAGS="-DPROF_BORDER=1 -DFIRST_LEVEL=N" 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-инструментов: запустить `run_bridge.sh` → **sleep 6** → `bridge_cmd.sh 'cont'` → **sleep 8** → `keyseq d:{ENTER}` → `keyseq roomtest{ENTER}` → `snap <путь>.png`. Тайминги — правило пользователя, длиннее ставить не надо. **Имя .exe на образе — не длиннее 8 символов (FAT 8.3) и БЕЗ подчёркивания** (`keyseq` не умеет `_`). - **Вести игру из моста — по обратной связи из памяти, а не по скриншотам**: `mem 0xA46A 10` = `pop_char_t` Кида, `mem 0xA3F7 1` = номер комнаты (адреса из `.sprinter-cc-roomtest/roomtest.map`+`.sym`). Полный рецепт (удержания, чит-навигация, тайминги нажатий) — memory `mame_mcp_bridge`. - **MCP-инструменты `mame-z80` не поднимались**: сервер падал на `ModuleNotFoundError: mcp.server.fastmcp` — вышел `mcp` 2.0, где FastMCP переехал. В `~/.claude.json` зафиксировано `--with "mcp<2"`; подхватится при следующем СТАРТЕ сессии Claude (внутри текущей — нет). - **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-12 - **Тест, который «проходит» и на сломанном коде, ничего не стоит.** Первая версия регресса на спуск-зацеп засчитывала ЛЮБОЙ вис — а Кид на первых кадрах падения цепляется обратно за ту же верхнюю кромку. Признак цели обязан быть позиционным. Проверять новый регресс откатом фикса — обязательно. - **`action == 3` (midair) — это не только падение**: кадры спуска `seq_68` тоже идут с ним. Ждать «начала падения» по одному `action` нельзя. - **Клавиши, зажатые из моста, переживают точечный `release`**: плагин переустанавливает удержания каждый кадр, и после серии `hold` осталось 6 незакрытых входов — у пользователя «Кид ходит как с зажатым Shift». Заканчивать работу с вводом только `pause` + `cont` (release_all). - **Чит-навигация `+`/`−` теряет нажатия и роняет Кида** из комнат без пола: уровень 7 из комнаты 17 всегда сваливается в 1, и кольцо `−` до комнаты 14 не доходит никогда. Ходить циклом с проверкой номера комнаты. ## Грабли 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.