diff options
| author | Valentin Popov <valentin@popov.link> | 2026-07-18 19:10:26 +0300 |
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2026-07-18 19:10:26 +0300 |
| commit | b7a102caa7aab396469d69878a05e0b6c089c810 (patch) | |
| tree | b7be340276b56c057884eb4461030d6eb287f4ea /docs/appendices/saves-campaign.md | |
| parent | 35531075148e3d6ee3875510308ab30709649bb5 (diff) | |
| download | fparkan-b7a102caa7aab396469d69878a05e0b6c089c810.tar.xz fparkan-b7a102caa7aab396469d69878a05e0b6c089c810.zip | |
docs: reconcile Notion knowledge gaps
Diffstat (limited to 'docs/appendices/saves-campaign.md')
| -rw-r--r-- | docs/appendices/saves-campaign.md | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/docs/appendices/saves-campaign.md b/docs/appendices/saves-campaign.md new file mode 100644 index 0000000..f0b2d48 --- /dev/null +++ b/docs/appendices/saves-campaign.md @@ -0,0 +1,50 @@ +# Кампания, сохранения и восстановление сессии + +## Известная файловая поверхность + +Demo содержит `MISSIONS/dispatcher.ini` и `SAVE/saveslots.cfg`. +`dispatcher.ini` хранит campaign progression (в demo — `[COMPLETE]`), а +`saveslots.cfg` — ordered UI-метаданные slots, не полный snapshot мира. +В Части 2 slots 1 и 7 помечены занятыми без соответствующего payload; поэтому +проверяются независимо: наличие metadata record, физического файла и +format/version/integrity payload. + +Campaign различает существование миссии, её доступность, старт, успешное или +неуспешное завершение и уже применённый результат. Обработка одного +mission-complete event идемпотентна. Пустой slot и повреждённый существующий +payload — разные состояния. + +## Контракт standalone save + +Полный snapshot сохраняет campaign/mission context, time/pause/step phase, +stable object IDs, ownership, transforms, lifecycle/properties/cross-links, +world changes, Behavior/Control/AI/research/economy state, script variables/IP/ +timers, authoritative RNG, gameplay-relevant FX и queued messages. Camera/UI +можно сохранить как presentation context; GPU/audio handles и draw buffers +восстанавливаются, а не сериализуются. + +Снимок разрешён только после calculation и deferred operations, вне queue +traversal, после применённых network messages и до чтения mutable state +renderer-ом. Native pointers, vtable/allocator addresses и resource mapping +pointers запрещены: ссылки идут через stable IDs и resource keys. + +Новый формат — versioned chunks (`WORLD`, `OBJECTS`, `BEHAVIOR`, `PHYSICS`, +`AI`, `SCRIPT`, `RESEARCH`, `RNG`, `CAMERA_UI`, optional network) с magic, +format/profile/content fingerprint, size и checksum. Неизвестный optional +chunk пропускается; required chunk блокирует load. Это дизайн FParkan, не +утверждение о binary format оригинала. + +Запись транзакционна: временный файл → повторное чтение/checksum → fs sync → +атомарная замена payload → обновление slot metadata. Загрузка создаёт mission +и objects без публикации, восстанавливает IDs/cross-links/controllers/RNG, +регистрирует их, валидирует и только затем разрешает следующий tick. + +## Проверки и граница + +`save -> load` обязан давать тот же canonical state hash, OriginalObjectId, +cross-links и продолжение RNG. Corrupt required chunk не публикует частичный +мир; crash при записи не уничтожает старый slot; completion event идемпотентен. + +Для native format нужны controlled original saves, binary diffs и trace +serializer-а. До этого FParkan может иметь совместимую семантику собственных +saves, но не заявляет byte/network interoperability с оригинальными файлами. |
