From 659071838dc0052889487202218f0963f4abc847 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Thu, 27 Aug 2026 15:38:22 +0300 Subject: [PATCH] =?UTF-8?q?SprPoP:=20KEYS-D,=20KEYS-R=20=D0=B8=20KEYS-F12?= =?UTF-8?q?=20=E2=80=94=20=D0=BD=D0=B0=20=D0=B4=D0=BE=D1=81=D0=BA=D1=83=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Три остатка плана 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 --- applications/SprPoP/docs/TASKS_OPEN.md | 49 ++++++++++++++++++++++++++ applications/SprPoP/docs/keys_plan.md | 6 ++++ 2 files changed, 55 insertions(+) diff --git a/applications/SprPoP/docs/TASKS_OPEN.md b/applications/SprPoP/docs/TASKS_OPEN.md index 0408060..4ff44bb 100644 --- a/applications/SprPoP/docs/TASKS_OPEN.md +++ b/applications/SprPoP/docs/TASKS_OPEN.md @@ -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 КБ на кадр и запись на диск + посреди игры. --- diff --git a/applications/SprPoP/docs/keys_plan.md b/applications/SprPoP/docs/keys_plan.md index 9608143..b92386b 100644 --- a/applications/SprPoP/docs/keys_plan.md +++ b/applications/SprPoP/docs/keys_plan.md @@ -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. Здесь разобрано, что у нас уже есть, что стоит не на той клавише и каких функций нет вовсе, плюс порядок работ. Кода этот документ не меняет.