Save files

From Satisfactory Wiki
Jump to: navigation, search

Save File Location[edit | edit source]

For both Steam and Epic Games version, the save files are located in:
%localappdata%\FactoryGame\Saved\SaveGames\<your id>
or
C:\Users\<your Windows username>\AppData\Local\FactoryGame\Saved\SaveGames\<your id>
Take note the Steam ID and Epic ID may not be the same. To share save files across platform, simply copy over the save files.

  • If you cannot find your steam save folder (probably because you have owned the game in Epic and just bought the Steam copy recently), first start a new game with Steam, then save the new game. You should now be able to see your steam save folder beside epic. The steam ID is usually shorter than the Epic ID. The folder location is stated above.

Save editing[edit | edit source]

Save files can be edited using online tools such as Satisfactory Interactive Map. See here.

Cloud sync[edit | edit source]

Example of a sync conflict dialog on Steam

If playing on Epic Games or Steam and the Cloud Sync is enabled, a notification may sometime appears when the player:

  • Switches the game version between experimental and stable
  • Copies over the save game across different platforms
  • Continues a game at different machine

And you will be prompted to either upload your save file to the cloud or download the save file from the cloud to your PC.

Unless you are playing across multiple PC, always choose upload your save file to the cloud to avoid losing your progress. And always backup your saves!

Save File Format[edit | edit source]

This page is a work in progress.

This page describes the save file format. These values and structures were determined by opening save files using a hex editor.

Data is stored in Little Endian encoding.

Starting with Save Version 21, the body of the file is compressed in chunks. See Compressed Save File Format below.

Multiple times throughout the file you will see templates like {1} used, which means it uses the value of that field for its size or other math.

Note that all strings are null-terminated, so you almost always want to read all strings of their length - 1.

The length of the string is determined by the previous Int32. A negative length means that the String is encoded in UTF16.

General Save Structure[edit | edit source]

Length (in bytes) Type Description
0x4 Int32 Save Header Version
0x4 Int32 Save Version
0x4 Int32 Build Version
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String World type
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String World properties
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String Session Name
0x4 Int32 Play Time (seconds)
0x8 Int64 Save Date (Number of Ticks, See Microsoft Docs for details)
0x1 Byte Session Visibility
0x4 Int32 World Object Count {1}
{1} * N Array
Length (in bytes) Type Description
0x4 Int32 World Object Type
N - 0x4 World Object Data (Look Below)
0x4 Int32 World Object Property Count {2}
{2} * N Array
Length (in bytes) Type Description
N World Object Property Data (Look Below)
0x4 Int32 World Collected Object Count {3}
{3} * N Array
Length (in bytes) Type Description
N World Collected Object Data (Look Below)

World Object Data[edit | edit source]

Length (in bytes) Type Description
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String Name
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String Property Type
0x4 Int32 Value Length
0x4 Int32 Index (if object has multiple of the same key)
πŸ‘…πŸ‘… πŸ‘…πŸ‘…πŸ‘… Data of the property

Here is a generic property type format, each property then has a descendant with extras.

Property[edit | edit source]

Length (in bytes) Type Description
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String Name
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String Property Type
0x4 Int32 Value Length
0x4 Int32 Index (if object has multiple of the same key)
πŸ‘…πŸ‘… πŸ‘…πŸ‘…πŸ‘… Data of the property

This generic property type is used for primitive types like integers, floats, strings, booleans, etc.

ObjectProperty[edit | edit source]

Length (in bytes) Type Description
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String Name
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String Property Type (ObjectProperty)
0x4 Int32 Value Length
0x4 Int32 Index (if object has multiple of the same key)
0x4 Int32 Quantity
πŸ‘… πŸ‘… Data of the property

ArrayProperty[edit | edit source]

Length (in bytes) Type Description
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String Name
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String Property Type (ArrayProperty)
0x4 Int32 Value Length
0x4 Int32 Index (if object has multiple of the same key)
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String Element Property Type
0x4 Int32 Number of Elements
πŸ‘… πŸ‘… Array of Elements

StructProperty[edit | edit source]

Length (in bytes) Type Description
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String Name
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String Property Type (StructProperty)
0x4 Int32 Value Length
0x4 Int32 Index (if object has multiple of the same key)
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String Structure (Class) Type
N * ??? Array?
Length (in bytes) Type Description
0x4 Int32 πŸ‘‡
πŸ‘… String Key Name
0x4 Int32 πŸ‘‡
πŸ‘… String Value Type
Dynamic πŸ‘… Value

MapProperty[edit | edit source]

Length (in bytes) Type Description
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String Name
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String Property Type (MapProperty)
0x4 Int32 Value Length
0x4 Int32 Index (if object has multiple of the same key)
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String Key Property Type?
0x4 Int32 πŸ‘‡ (String length)
πŸ‘… String Value Property Type?
0x9 ??? ???
N * ??? Array?
Length (in bytes) Type Description
??? Key
??? Value

Compressed Save File Format[edit | edit source]

This section is a work in progress.

After reading the save file header and checking the save version is at least 21, the body is composed of a certain amount of compressed chunks. Each chunk has a 48 bytes header followed by a zlib compressed body.

Length (in bytes) Type Description
0x8 Int64 PACKAGE_FILE_TAG
0x8 Int64 Maximum chunk size (Default to 131072 in Unreal Engine)
0x8 Int64 Current chunk compressed length {1}
0x8 Int64 Current chunk uncompressed length
0x8 Int64 Current chunk compressed length {1}
0x8 Int64 Current chunk uncompressed length
{1} * N Zlib Zlib compressed chunk