5348feb5f4
Доска отставала от кода на три задачи — планировать по ней было нельзя. Сверка проведена грепом по исходникам, а не по записям: - L4-MIRROR ЗАКРЫТА: шаги 1-5 сделаны и проверены пользователем в MAME (зеркало в атласе, постановка тайла, отражение, прыжок сквозь зеркало с рождением тени, левый клип тени). Протокол с разбором решений — в архиве; - L3-CHOMP и L3-SKEL закрыты ещё 2026-08-08/07 (коммитыdc0bd47,4d4323f,db4106a,1461ed5), на доске значились как предстоящие; - тайлсет palace (шаг 2 levels_plan) в коде есть целиком — pop_bg_load(type), pal_*.atl, дворцовый wall_pattern, решётки 25-29 и в tile_table, и в коллизии (tile_is_floor совпадает с seg006:0628); - в GUARD-PHYS остаток пересобран по факту: check_chomped_guard сделан, скелет в check_guard_fallout сделан, ветки ТЕНИ нет — она уехала в L5-SHADOW. Приёмки: по решению пользователя уровни 1-4 приняты SMOKE-тестами, полные обходы всех комнат делаются по готовности ВСЕХ уровней — L3-PASS/L4-PASS как отдельные задачи отменены, вместо них политика приёмок в архиве. Новая цель — уровень 5. Инвентарь res2005.bin: НИ ОДНОГО нового тайла, всё портировано на уровнях 1-4. Единственная новая механика — спецсобытие «тень крадёт зелье» (комната 24): заведена задача L5-SHADOW с портом по SDLPoP (check_shadow / do_init_shad / do_auto_moves + shad_drink_move / autocontrol_shadow_level5 + ветка тени в check_guard_fallout), включая готовые константы и то, что у нас уже есть под это. Заведён MIRROR-FG-STALE (низкий): place_mirror пишет тайл в данные уровня, но не в снимок room_fg, по которому работает коллизия — если зеркало поставлено, пока игрок В комнате 4, оно невидимо для коллизии (тень не родится). В обычном прохождении недостижимо: дверь выхода в другой комнате. Записан точный сценарий воспроизведения читом ROOMNAV и фикс на несколько строк. Правило «в _OPEN только незакрытое» теперь выполняется буквально: - bug_list.md → BUGS_OPEN.md, bug_closed.md → BUGS_CLOSED.md (ссылки обновлены во всех документах и в комментарии pop_trob.c); - из TASKS_OPEN убраны блоки закрытых задач (L3-CHOMP, L3-SKEL, L3-PASS, L4-MIRROR, DRAW-CHAR), справка по связности комнат уехала в архив; - из BUGS_OPEN убраны 8 строк таблицы закрытых багов, закрытый T-2 (уехал в BUGS_CLOSED) и раздел «уровень 3 — неначатые задачи» (обе записи закрыты); сводная таблица пересобрана по реально открытым записям. Все внутренние ссылки проверены скриптом: битых якорей 0. make size-check OK (65 программ), tests-host 5/5. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
115 lines
8.7 KiB
Markdown
115 lines
8.7 KiB
Markdown
# Точка входа для следующей сессии (обновлено 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.
|