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:
@@ -1401,6 +1401,55 @@ N навык M» — отдельная надобность, если пона
|
|||||||
`../docs/ideas_backlog.md` (оба дают доли процента кадра).
|
`../docs/ideas_backlog.md` (оба дают доли процента кадра).
|
||||||
- **OPT-1** (хирургический редрой шва) — решено НЕ делать, стоимость
|
- **OPT-1** (хирургический редрой шва) — решено НЕ делать, стоимость
|
||||||
транзиентная; разбор в [`BUGS_CLOSED.md`](../../PoP/roomtest/BUGS_CLOSED.md).
|
транзиентная; разбор в [`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 КБ на кадр и запись на диск
|
||||||
|
посреди игры.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
# План: перевод управления на раскладку `keys.txt`
|
# План: перевод управления на раскладку `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. Здесь
|
Целевая раскладка — [`keys.txt`](keys.txt), она же раскладка SDLPoP. Здесь
|
||||||
разобрано, что у нас уже есть, что стоит не на той клавише и каких функций
|
разобрано, что у нас уже есть, что стоит не на той клавише и каких функций
|
||||||
нет вовсе, плюс порядок работ. Кода этот документ не меняет.
|
нет вовсе, плюс порядок работ. Кода этот документ не меняет.
|
||||||
|
|||||||
Reference in New Issue
Block a user