# Точка входа для следующей сессии (обновлено 2026-08-11) Файл для старта с чистого контекста: где всё стоит, что делать первым, какие грабли уже собраны. Читать целиком — он короткий. Дальше по ссылкам: `TASKS_OPEN.md` (доска), `BUGS_OPEN.md` (открытые баги), `CLAUDE.md`. --- ## 1. СЛЕДУЮЩАЯ ЗАДАЧА: [L5-SHADOW](TASKS_OPEN.md#l5-shadow) — уровень 5 Уровни 1-4 приняты **smoke-тестами**; полные обходы всех комнат делаются по готовности ВСЕХ уровней ([политика приёмок](TASKS_CLOSED.md#pass-policy), решение пользователя 2026-08-11) — отдельных `L3-PASS`/`L4-PASS` больше нет. Уровень 5 **не приносит ни одного нового тайла** (инвентарь `res2005.bin` сверен: всё уже есть с уровней 1-4). Вся работа — одно спецсобытие: тень появляется в комнате 24, ждёт открытия двери, идёт к зелью, **выпивает его** и уходит за левый край; боя нет. Писать: `do_auto_moves` + таблица `shad_drink_move`, `do_init_shad`, ветку `check_shadow` для уровня 5, `autocontrol_shadow_level5`, плюс ветку ТЕНИ в `check_guard_fallout`. Всё расписано по SDLPoP прямо в задаче, включая готовые константы. Опора: механизм «спецсобытие порождает персонажа в слоте соперника» уже отработан на скелете (`pop_check_skel`), а сама тень как `charid_1_shadow` заведена на уровне 4. ## 2. Состояние репозитория Всё закоммичено, `main` чист. `tests-host`: 5 наборов проходят (`[char] 65`, `[geom] 3144`, `[grab] 53`, `[phys] 1723`, `[wall] 1`). `make size-check`: OK (65 программ, роста нет). Коммиты 2026-08-11: | хеш | что | |---|---| | `a823e7e` | libbgi: блочные AND/OR/XOR акселератора (строками и колонками) | | `860468f` | libbgi: NOT_PUT тоже через акселератор + `docs/shadow_render.md` | | `c0075c7` | NEXT_SESSION: op-блиты сделаны, вид тени отложен | Накануне (2026-08-10) закрыт `L4-MIRROR`: шаги 1-5 + фикс fore-прохода над отражением; протокол — [`TASKS_CLOSED.md`](TASKS_CLOSED.md#l4-mirror). ## 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×. - **[MIRROR-FG-STALE](BUGS_OPEN.md#mirror-fg-stale)** — зеркало, поставленное пока игрок В комнате 4, не попадает в снимок `room_fg` и потому невидимо для коллизии. В обычном прохождении недостижимо; фикс на несколько строк, делать вместе со следующей правкой `pop_trob.c`. - **[DIED-ON-BUTTON](BUGS_OPEN.md#died-on-button)** — `died_on_button` (seg007:776) не портирован. - **TORCH-ANIM-RIGHT** — под запечённым пламенем могут застыть пики/меч/зелье справа от факела; на уровнях 1-4 такого соседства нет. - **[GUARD-PHYS](TASKS_OPEN.md#guard-phys)** — остаток: ветка тени в `check_guard_fallout` (уходит в L5-SHADOW) и живая проверка стража, нажимающего напольную кнопку. - Долгие: `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.