A Rust library for working with Satisfactory save files. Most of the credit goes to the Satisfactory Calculator Interactive Map and the Satisfactory Wiki.
Any and all assets, tradements, and registered trademarks belonging to the Satisfactory game are the exclusive property of Coffee Stain Studios. This project is in no way affiliated with or endorsed by Coffee Stain Studios.
The Satisfactory .sav
file comes from Unreal Engine*, which provides a
default implementation for saving and loading games provided game developers
provide a SaveGame
class/classes. Because game developers can provide almost
any arbitrary variables to be stored in the save file, the parsed format likely
widely varies from game-to-game. However, provided the default save game
implementation is used, the underlying algorithm for serializing the chosen
data should be the same.
The default save file format is reminiscent of many others, where an unencoded header at the beginning contains some meta information about the data stored in the body. The entire save file is not blanket-encoded in some other format (e.g. JSON) but rather as plain bytes.
* Satisfactory is currently built using UE 5.
The header contains metadata about the save itself as well as the game, probably to do validation and display saves on the game UI without needing to load the entire file's contents.
The docs contain the header fields in the order which they appear (i.e. the
save_header_version
is the first 4 bytes, the save_file_version
is the next
4 bytes, and so on).
The body begins the very next byte after the last header field. The body is split into chunks and each chunk itself has a small header and a zlib-compressed payload. This library does not retain or return information about these chunks as their purpose is merely to reduce the overall file size. There is no padding between chunks and their contents should be decompressed first and then concatenated to produce the whole body. There is no more data after the body, i.e. the last chunk's payload should be the EOF.