Мышь уровня 8 + холодная половина главного цикла в банк 8

Спецсобытие уровня 8 (SDLPoP seg003:0545/0ABA, seg002:07EB): когда дверь
уровня открыта, а Кид остаётся в комнате 16, через 150 кадров приходит мышь,
пробегает справа налево по верхнему ряду, наступает на кнопку (0,7) —
решётка (0,3) открывается — и убегает.

Ассетов не потребовалось: кадры 186..188 идут по таблице Кида, их спрайты
(images 130..132) уже лежат в kid16.atl, отрисовка подхватывает мышь сама.

- guards.c: pop_check_mouse, autocontrol_mouse, ветки мыши в
  autocontrol_opponent / play_guard / check_can_guard_see_kid;
- pop_leveldoor_open стал word, как в оригинале (в него же считается
  задержка — байт переполнился бы через 255 кадров);
- leave_guard больше не записывает тень и мышь в данные уровня (seg002:02F5);
- полосы HP у мыши нет (seg000:1159);
- tests-host/t_mouse: 17 проверок, единственный набор с guards.c.

Разгрузка резидента (куча в huge упала до 879 Б): pop_start_level,
find_start_level_door, чит-навигация по комнатам и лейбл номера уехали в
roomtest_cold.c (--bank 8, n_banks = 8).  _CODE 25653 -> 24825, куча -> 1707 Б;
кадровый путь не тронут.

Проверено: tests-host 6/6, make size-check OK, живьём в MAME (мышь появилась,
нажала кнопку, решётка поехала вверх, мышь ушла).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-12 15:21:20 +03:00
parent af04a8141e
commit 361c9d9f78
17 changed files with 803 additions and 250 deletions
+35 -30
View File
@@ -1,4 +1,4 @@
# Точка входа для следующей сессии (обновлено 2026-08-12)
# Точка входа для следующей сессии (обновлено 2026-08-12, вечер)
Файл для старта с чистого контекста: где всё стоит, что делать первым, какие
грабли уже собраны. Читать целиком — он короткий. Дальше по ссылкам:
@@ -6,39 +6,37 @@
---
## 1. СЛЕДУЮЩАЯ ЗАДАЧА: живая проверка зелий в MAME
## 1. СЛЕДУЮЩАЯ ЗАДАЧА: smoke-прогон уровня 8
Код зелья медленного падения НАПИСАН (все шесть шагов плана
[`TASKS_OPEN.md#l7-feather`](TASKS_OPEN.md#l7-feather)) и закрыт хост-тестом,
но в MAME ещё не смотрелся. Проверить две сцены:
Зелья приняты пользователем (уровень 2 — «−HP», уровень 7 — перо), уровень 7
считается прошедшим smoke. Спецсобытие уровня 8 —
[L8-MOUSE](TASKS_CLOSED.md#l8-mouse) — **закрыто 2026-08-12**: мышь
портирована, покрыта хост-набором `t_mouse` (17 проверок) и проверена живьём в
MAME (появилась, нажала кнопку (0,7) комнаты 16, решётка (0,3) поехала вверх,
ушла и погасла). Новых тайлов уровень 8 не приносит вовсе.
- **уровень 7, комната 1** — зелье пера: зелёные пузырьки, зелёная вспышка
при питье, спуск в шахту заметно медленнее обычного и без урона;
- **уровень 2, комната 13, тайл (1,3)** — зелье «−HP»: пузырьки СИНИЕ (были
красные — цвет по типу зелья не был портирован вовсе), HP убавляется на
единицу, экран краснеет ровно один раз.
Осталось пройти сам уровень: он длинный, с возвратом через два чомпера
комнаты 4, и стражи там сильнее прежних — комната 5 держит **skill 7**
(максимум из встречавшихся), комнаты 12/22/24 — skill 2/3/3.
Заодно попадают под проверку `pop_flash_color` (жёлтый/красный/зелёный) и
атлас `pop_pot` (23 → 37 спрайтов: добавлены зелёный и синий наборы кадров
пузырька).
Правило появления мыши (сверено с оригиналом, детали в
[TASKS_CLOSED](TASKS_CLOSED.md#l8-mouse)): счётчик — сам `leveldoor_open`,
растёт только пока Кид в комнате 16, срабатывание ровно на 150, **второго
раза нет**; сбрасывает только рестарт уровня. Тупика это не создаёт — низом
через провал есть путь к двери уровня ценой 1 HP.
**Зацеп в падении — закрыт 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.
Резидент разгружен ([MEM-COLD1](TASKS_CLOSED.md#mem-cold1)): холодная половина
главного цикла уехала в **банк 8** (`roomtest_cold.c`), куча 879 → **1707 Б**.
Следующие кандидаты — [MEM-COLD2](TASKS_OPEN.md#mem-cold2).
Осталась ощущенческая часть — [GRAB-KBD-TIMING](BUGS_OPEN.md#grab-kbd-timing):
зацеп при входе на уровень 7 срабатывает менее стабильно, чем в оригинале
(подозрение на клавиатурный модуль и на общий темп игры, `L1-SPEED`).
**Решение пользователя: разбирать после того, как будут готовы все уровни.**
Ощущенческий хвост прежний — [GRAB-KBD-TIMING](BUGS_OPEN.md#grab-kbd-timing),
разбирается после готовности всех уровней (решение пользователя).
## 2. Состояние репозитория
Всё закоммичено, `main` чист. `tests-host`: 5 наборов проходят
(`[char] 65`, `[geom] 3144`, `[grab] 55`, `[phys] 1727`, `[wall] 1`).
`make size-check`: OK (65 программ, роста нет).
Всё закоммичено, `main` чист. `tests-host`: **6 наборов** проходят
(`[char] 65`, `[geom] 3144`, `[grab] 55`, `[mouse] 17`, `[phys] 1727`,
`[wall] 1`). `make size-check`: OK (65 программ, роста нет).
Коммиты 2026-08-12:
@@ -55,10 +53,17 @@
## 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`).
`-DFIRST_LEVEL=8`. **ПРАВИЛО ПОЛЬЗОВАТЕЛЯ: перед сборкой образа —
`make clean`, потом `make`, потом `make hdd`** (memory
`mame_build_clean_rule`). Без этого `make hdd` кладёт на диск ПРОШЛУЮ
сборку: `FIRST_LEVEL` живёт внутри `roomtest.c`, и без изменения исходника
make считает `.exe` актуальным — 2026-08-12 на этом уехал уровень 1 вместо
8, заметил пользователь. После пересборки образа MAME **обязана** пройти
полный рестарт (memory `mame_hdd_rebuild_restart`).
- Адреса состояния сместились после MEM-COLD1: брать из
`.sprinter-cc-roomtest/roomtest.map` заново (`cur_room` 0xA33D,
`pop_leveldoor_open` 0xA34C, `Kid` 0xA3B1, `Guard` 0xA759 — на сборку
2026-08-12). Мост: `setmem ADDR HEXBYTES` (не `write`), `mem ADDR N`.
- **Остановка MAME — `mame/v306/bridge_cmd.sh 'cmd exit'`**, НЕ `kill`
(правило пользователя). `pkill -f` бывает не срабатывает, и остаются ДВА
инстанса, оба отвечающих на файловый IPC — тогда скриншоты приходят от