beasty-save-system / changelog.md
Changelog
All notable changes to Beasty Save System. This project follows Semantic Versioning.
1.1.0 — 2026-08-06
Added
- Pluggable storage backends: saves can go to a database instead of a local file. Local files remain
the default and are unchanged; custom backends implement
IBeastySaveStorage. - Firebase modules — Firestore (
firestore), Realtime Database (realtime-db) and automatic anonymous sign-in — compiled only when the Firebase SDK is present. Saves are stored per user. - The editor keeps the
BEASTY_HAS_FIREBASE_*scripting defines in sync automatically as the Firebase SDK appears or disappears from the project. - User identity seam:
IBeastyUserProvider/BeastySaveUsersdecide whose saves these are;ScopeByUseralso scopes local files per user. - JSON without files:
BeastySave.SaveToJson/LoadFromJsonandToJson/FromJson, for custom endpoints. SaveResult<T>: a typed result carrying a value, returned by the JSON/read APIs.- Async slot utilities:
ExistsAsync,DeleteAsync,ListSlotsAsync,ReadMetaAsync,RestoreBackupAsync,SaveAllNowAsync/LoadAllNowAsync. - New typed errors:
BackendRequiresAsync,BackendUnavailable,AuthRequired,NetworkError. - Save Mode on the Beasty Save Manager: Synchronous (default) or Asynchronous for the UnityEvent-friendly entry points. Cloud backends always run asynchronously.
- A proper inspector for the Beasty Save Manager: status card, the Storage and Save Mode decisions up front, everything else behind an Advanced settings foldout.
- The Save Manager window groups every setting by role (Backend, Location, Security, Reliability, Versioning, Logging), with contextual help.
- Load diagnostics at Verbose level; a load that applies nothing now warns instead of succeeding in silence.
- Firestore: a head document without a valid chunk count fails as typed Corrupt data, and Verbose logging says whether a snapshot came from the server or from the offline cache.
- Live Firebase test suite, compiled only when the Firebase SDK is installed.
Changed
- Load’s file-not-found error message names the slot instead of the file path.
BeastySave.GetFolderPath/GetSlotPathkeep describing the local-file layout only.BeastySaveManager.SaveAll/LoadAll/DeleteSlotroute to the asynchronous path automatically on async-only backends.
Fixed
- With the Beasty Console asset present,
BeastySaveLog.Warningsurfaces as a real console warning. - The demo object’s status label is wired to the save/load events, so a failed save or load in the demo scene reports itself.
Compatibility
- Compiles warning-free on every Unity 6 generation, including 6.5, which deprecated APIs the converters and scene lookups used; saves written by older versions still load across those changes.
1.0.0 — 2026-07-27
First public release.
Core
- Slot-based save/load, synchronous and awaitable, with a result object every call hands back.
- Its own JSON engine: no Newtonsoft, no external dependencies.
- Atomic writes (temp file + swap): a crash mid-write cannot leave a half-written slot.
- Per-slot
.bakbackups, and recovery from them when a slot is damaged; a corrupt slot is never rotated into the backup. - Slot names are validated: path separators,
.., rooted paths and reserved device names come back asInvalidArgumentinstead of writing outside the save folder. - Optional AES-256 encryption. Obfuscation, not real security: the key ships with the game.
Logging
- A Logging dropdown on
BeastySaveManager:Auto,On,Verbose,Off. - Saves, loads, deletes, restores and migrations say so, with size and timing; probing an empty slot stays silent.
- A slot that fails its checksum and is kept out of the backup rotation warns.
SaveResult.BytesWrittenandLoadResult.MigratedFrom, for your own UI.- One logger,
BeastySaveLog, with a pluggable sink. - Logs land in the Beasty Console window when that asset is in the project (detected by reflection), and in Unity’s console when it is not.
Scene state
BeastySaveable: capture the components you tick on an object — inactive objects and repeated component types included.- Runtime-spawned objects:
BeastySaveManager.Registerpins the id their data is filed under. - Strict loading is all-or-nothing across the whole scene; tolerant loading skips the offending field and keeps the rest.
- A stored value of the wrong type is reported, never silently replaced by the live one.
- Converter modules (audio, uGUI, particles, animation), each gated behind the Unity module it
needs. Restoring a
Slideror aToggledoes not fireonValueChanged.
Editor
- The internal test assembly compiles only when the
BEASTY_DEV_TOOLSscripting define is set.
Platforms
- Mono and IL2CPP (the reflection paths AOT builds tend to break are covered by a smoke scene).