Доки: план меню (рендер, restart без подтверждения), QSAVE закрыт

menu_settings_plan.md:
- §10 переписан: выбран Вариант A — текстовые строки + собственный
  растровый рендерер в новом банке; референс SDLPoP (hc_small_font /
  hc_font — один рендерер, два шрифта); шрифт как ассет из паковщика,
  прототип MS4 — системный CP866 ZG; двуязычность eng/rus через пару
  (таблица строк CP866, файл шрифта)
- Restart Level / Restart Game выполняются сразу, без подтверждения
  (§3, §8, из §11 убраны диалоги RESTART *?)
- §13 MS4: текстовый рендерер + два шрифта; §14: host-тест рендерера

quicksave_plan.md: статус «РЕАЛИЗОВАНО и проверено в MAME»
(v0.6-pop-quicksave), документ оставлен справочником по формату 'POPQ'

TASKS_OPEN/TASKS_CLOSED: запись QSAVE переехала в закрытые с полным
протоколом; docs/README.md аннотации обновлены
This commit is contained in:
2026-08-22 12:45:01 +03:00
parent f4b4852d51
commit 7fd7f28ffc
5 changed files with 159 additions and 48 deletions
+27
View File
@@ -11,6 +11,33 @@
---
## QuickSave
<a id="qsave"></a>
### QSAVE. QuickSave / QuickLoad — **РЕАЛИЗОВАНО И ПРОВЕРЕНО 2026-08-22** (коммит f4b4852, тэг v0.6-pop-quicksave)
F6/F9 в roomtest. Формат снимка `'POPQ'` v3: заголовок
{P,O,P,Q,ver=3,level,reserved}, payload всех игровых переменных (Kid/Guard
через qs_char, HP, fight seed, читы speed/immortal/sound с range-валидацией
на загрузке), хвост = размер payload + XOR-контрольная сумма (старший байт =
инвертированный XOR). Носитель — файл на HDD: транзакционная запись
`unlink POP.NEW → bank_save_file → rename SAV→BAK → rename NEW→SAV`
с откатом; загрузка пробует POP.SAV, потом POP.BAK; при другом уровне —
`pop_next_level+pop_level_switch`. Сериализация через резидентные W0-примитивы
`pop_qs_*` (паттерн request-flag + `pop_qsave_process()` на границе кадра вне
Char-окон); сериализаторы добавлены в pop_map/pop_loose_mob/pop_trob/
pop_guard_ai с восстановлением инвариантов (mobs_live, trob_drawn, redraw).
Дабл-буфер закрыт `pop_qsave_restore_room()`: полная перезагрузка комнаты +
перерисовка ОБЕИХ страниц + инвалидация кэшей спрайтов и HP. Три ГСЧ
(`pop_t_seed`, `trob_seed`, `pop_fight_seed`) — все в payload.
Файловое I/O — новые `bank_load_file`/`bank_save_file` libc (без правила W3).
Критерий приёмки выполнен: сохранить, выйти по ESC, запустить заново,
загрузить — оказались там же; проверено в MAME. Полный разбор и формат —
[`../docs/quicksave_plan.md`](../docs/quicksave_plan.md) (теперь справочник).
---
## Уровни: спецсобытия
<a id="l8-mouse"></a>
+5 -30
View File
@@ -1090,37 +1090,12 @@ SPIKE-BAKED, а до того — мерцание плиты, ради кото
раскладки в `tests-host/README.md`).
### <a id="qsave"></a>QSAVE. QuickSave / QuickLoad
### <a id="qsave"></a>QSAVE. QuickSave / QuickLoad — ЗАКРЫТА 2026-08-22
> **План целиком — [`../docs/quicksave_plan.md`](../docs/quicksave_plan.md)**
> (разбор SDLPoP, инвентаризация нашего состояния, формат снимка, порядок
> восстановления, разбиение на шаги QS1…QS6, риски). Изучено 2026-08-17,
> **код не начат.**
Оговорка, с которой начинается план: **в оригинале 1989 года этого нет
вовсе**, QuickSave — enhancement SDLPoP (`seg000.c`, `USE_QUICKSAVE`,
F6/F9). Значит повторяем не букву, а устройство.
Что взять у SDLPoP без изменений: снимок — плоский список полей, один обход
на запись и на чтение (`#define process(x)`), совместимость держится
строкой версии и ничем больше; клавиша только взводит флаг, работа идёт
**между кадрами**; состояние ОТРИСОВКИ не сохраняется вовсе — комната
перерисовывается с нуля.
Чем наш случай тяжелее: уровень лежит в EMM-странице, а не в ОЗУ;
`room_modif`/`trobs``static` в банковом `pop_trob.c` (нужны
сериализаторы); ГСЧ у нас **три** (`pop_t_seed`, `trob_seed`,
`pop_fight_seed`), и пропуск любого даст «загрузилось, но играется иначе»;
и главное — **дабл-буфер**: перерисовать после загрузки надо ОБЕ страницы,
иначе старая картинка мигнёт через кадр.
Носитель — **файл** (`QUICKSAVE.SAV`, ≈1,9 КБ), EMM-страница отвергнута:
она не переживает рестарт программы, а именно рестарт — тот случай, ради
которого QuickSave и нужен (сцену каскада на 13/23 воспроизводит только
`ESC` → запуск заново). Мгновенный EMM-слот остаётся необязательным QS6.
**Критерий приёмки:** сохранить, выйти по `ESC`, запустить roomtest заново,
загрузить — и оказаться там же.
**Закрыта** (F6/F9, POP.SAV + POP.BAK, коммит f4b4852, тэг v0.6-pop-quicksave).
Протокол и устройство — [`TASKS_CLOSED.md`](TASKS_CLOSED.md#qsave);
формат снимка и разбор SDLPoP —
[`../docs/quicksave_plan.md`](../docs/quicksave_plan.md).
### <a id="l1-speed"></a>L1-SPEED. Игра идёт быстрее оригинала (найдено 2026-08-01) — ЗАКРЫТА 2026-08-19