Signal-driven save architecture for multi-level runtime state, crash-safe restoration, and update-proof compatibility.
Complex interactive worlds generate massive amounts of interconnected state data. Every placed object, modified tile, and system interaction must persist perfectly across save/load cycles, level transitions, and unexpected shutdowns.
I needed a robust architecture that could handle partial state updates, maintain data integrity, and scale with world complexity without creating tight dependencies between systems — while avoiding the version fragility that breaks save games after updates.
Inspired by Jan Thomä's guide on save compatibility in Godot.
Systems contribute save data voluntarily when signaled. Eliminates tight coupling and supports dynamic object creation.
Objects reconstruct themselves from save data using their own logic. No centralized object knowledge required.
All changes save to memory first. File I/O only on explicit actions, preventing corruption from crashes.
Handles complex scenarios across scene boundaries. Automatically manages level transitions without data loss.
Uses Godot's Resource format with automatic property handling. Missing properties default gracefully, path remapping handles moved assets.
Solves the production problem where game updates invalidate player save files.Memory buffer prevents save corruption during unexpected shutdowns. Changes batched and written to disk on explicit save actions only.
Critical for games with long play sessions where progress loss would be devastating.Manual object tracking, brittle save states, data loss during level transitions. Limited to single-level persistence with complex restoration logic that broke when game structure changed.
Automatic multi-level persistence, robust object restoration, seamless level transitions. Complete data integrity with self-repairing save system that survives game updates and unexpected crashes.
C#, Godot Resource System, Git