SprPoP: KEYS-D, KEYS-R и KEYS-F12 — на доску отложенного

Три остатка плана keys_plan.md записаны в TASKS_OPEN.md с полным разбором,
чтобы не выводить его заново.

KEYS-D (осмотр соседних комнат) — главное, что стоит помнить: у SDLPoP это
три строки, потому что там drawn_room влияет ТОЛЬКО на отрисовку, а физика
ходит через get_tile(room, col, row) с явной комнатой.  У нас наоборот —
карта коллизий грузится для ОТРИСОВАННОЙ комнаты: room_fg, lcol_fg,
rcol_fg, above_fg, below_fg это ОДИН комплект на программу.  Уведи cur_room
к соседу, не трогая kid_room, и Кид считает столкновения по чужим тайлам.
Задел под расхождение уже стоит (kid_room отдельной переменной,
update_kid_render_dx со сдвигом ±140), но enter_room_side пишет обе разом —
это незакрытая часть S3 straddle.

Записаны оба пути с ценой: честный (правка ядра, дни) и смотровой режим с
остановкой игры (150-250 байт, часы) — плюс что главный риск не в
отрисовке, а в возврате.

KEYS-R (воскрешение) — четыре места, которые обязаны знать про окно
неуязвимости, со ссылками на seg-код.

KEYS-F12 (скриншот) — «возможно, когда-то», по пометке пользователя.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-27 15:38:22 +03:00
parent f8e96c0495
commit 659071838d
2 changed files with 55 additions and 0 deletions
+49
View File
@@ -1401,6 +1401,55 @@ N навык M» — отдельная надобность, если пона
`../docs/ideas_backlog.md` (оба дают доли процента кадра).
- **OPT-1** (хирургический редрой шва) — решено НЕ делать, стоимость
транзиентная; разбор в [`BUGS_CLOSED.md`](../../PoP/roomtest/BUGS_CLOSED.md).
- **KEYS-D — осмотр соседних комнат** (`H`/`J`/`U`/`N` + `Ctrl+B`, фаза D
плана [`keys_plan.md`](keys_plan.md)). Отложено 2026-08-27 по решению
пользователя: полезно игроку, но дорого.
**Почему дорого.** У SDLPoP это три строки, потому что там `drawn_room`
влияет ТОЛЬКО на отрисовку, а физика ходит через `get_tile(room, col,
row)` с явной комнатой. У нас наоборот: карта коллизий загружается для
ОТРИСОВАННОЙ комнаты — `room_fg`, `lcol_fg`, `rcol_fg`, `above_fg`,
`below_fg` — это ОДИН комплект на программу, и описывает он `cur_room`
(видно в `pop_qsave_restore_room`). Уведи `cur_room` к соседу, не трогая
`kid_room`, — и Кид начнёт считать столкновения по чужим тайлам:
провалится сквозь пол или упрётся в воздух.
Задел уже стоит: `kid_room` заведён отдельно, `update_kid_render_dx()`
умеет сдвигать спрайт на ±140 при расхождении. Но `enter_room_side()`
пишет обе переменные разом — это и есть незакрытая часть S3 straddle
([`room_model_plan.md`](room_model_plan.md)).
**Два пути.** (1) Честный, как в оригинале: игра идёт, пока смотришь.
Требует развести владельца карты коллизий — правка ядра, дни работы и
риск для того, что уже работает. (2) Смотровой режим С ОСТАНОВКОЙ игры:
пока ничто не тикает, рассогласование не проявляется. Нужна третья,
облегчённая «нарисовать комнату, не трогая состояние»: `enter_room_side`
попутно делает `pop_guard_leave`/`pop_loose_leave_room`, а
`pop_qsave_restore_room` перетирает карту и зовёт `pop_loose_reset`.
Оценка — 150-250 байт в банк 8 и несколько часов с проверкой.
Рекомендация: путь (2) плюс запись в `impl_diff.md` (у нас смотровой
режим останавливает игру, у оригинала — нет). Главный риск не в
отрисовке, а в ВОЗВРАТЕ: оставить движок с чужой картой или подтёртой
историей heal — класс багов из memory `pop_seam_room_model`.
Обходной путь, который уже работает: `Ctrl++` / `Ctrl+` — телепорт по
номеру комнаты. Задачу разбора багов он закрывает, задачу игрока
«подсмотреть» — нет.
- **KEYS-R — воскрешение Кида** (`R`, остаток фазы C). Отложено
2026-08-27. Не ещё один чит, а правка модели смерти: SDLPoP ставит
`resurrect_time = 20` и `Kid.alive = -1`, после чего об этом обязаны
знать четыре места — убывание счётчика (`seg003:512`), пропуск пик и
челюстей (`seg000:1245`), пропуск урона мечом (`seg000:876`),
восстановление позы в `play_kid` (`seg006:1352`: `loadkid`, полное HP,
стойка, `Char.x += 8`, `set_start_pos`). То есть окно неуязвимости,
размазанное по кадровой цепочке, и оно задевает гейт «мёртв», про
который предупреждает memory `pop_level_restart_scope`. Наш
`Char.alive` использует конвенцию оригинала (`-1` жив), так что
портируется, — но точечно и с проверкой каждого гейта.
- **KEYS-F12 — скриншот в файл** (фаза E). Помечено пользователем как
«возможно, когда-то в следующих версиях»: 80 КБ на кадр и запись на диск
посреди игры.
---
+6
View File
@@ -1,5 +1,11 @@
# План: перевод управления на раскладку `keys.txt`
> **Состояние на 2026-08-27.** Фазы **A** и **B** сделаны (коммит 76f02e7),
> фаза **C** — три чита из четырёх (f8e96c0). Отложены и записаны на доску
> [`TASKS_OPEN.md`](TASKS_OPEN.md): `KEYS-R` (воскрешение), `KEYS-D` (осмотр
> соседних комнат), `KEYS-F12` (скриншот). Итоговая раскладка, включая наши
> сверхштатные клавиши, — в [`keys.txt`](keys.txt).
Целевая раскладка — [`keys.txt`](keys.txt), она же раскладка SDLPoP. Здесь
разобрано, что у нас уже есть, что стоит не на той клавише и каких функций
нет вовсе, плюс порядок работ. Кода этот документ не меняет.