\Users\<your Windows username>\AppData\Local\FactoryGame\Saved\SaveGames\{YOUR ID}
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 files can be edited using online tools such as Satisfactory Interactive Map. See here.
Cloud sync[]
If playing on Epic Games or Steam and the Cloud Sync is enabled, a notification may sometimes appear 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 back up your saves!
As of Patch 0.6.1.3 (Early Access Build 202470, released on September 28, 2022), the produced save file header has version 10, the save version is 30 and the editor object version is 40. For these versions, this format description should be correct, but may not be complete: It is possible that not all potential structures were present in the analyzed save files.
Basic data types[]
There are five basic types that are used to compose more elaborated structures in the save files:
Byte[]
A single 8-bit byte that represents a signed integer between -128 and 127.
Int[]
Four consecutive bytes in little-endian order that represent a signed integer between -2,147,483,648 and 2,147,483,647.
Long[]
Eight consecutive bytes in little-endian order that represent a signed integer between -9,223,372,036,854,775,808 and 9,223,372,036,854,775,807.
Float[]
Four consecutive bytes in little-endian order that represent a signed floating-point number with single precision, according to the binary32 format of IEEE 754.
String[]
A variable-length byte sequence of UTF-encoded characters, null-terminated:
number of bytes
description
example
notes
4
string length in bytes, including null-termination bytes
A length of zero represents the empty string and occupies just these four bytes. A positve length means that the characters are encoded in UTF-8. A negative length means that the characters are encoded in UTF-16 little-endian, without a byte-order mark. In this case, the given negative length has to be multiplied by minus two to get the number of bytes the rest of the string occupies (including the two bytes for null-termination).
Composite data types[]
Using the basic data types defined above, a save file has two top-level structures: a SaveFileHeader and a SaveFileBody. These are composed of different intermediate data types themselves.
These composite data types are documented below. A data type is a list of ordered fields, each field is a row in the table of the data type. So, for example: The SaveFileHeader begins with an Int (four bytes) that represents the save header version. This is followed by another Int (the next four bytes) that represents the save version and so on.
SaveFileHeader[]
basic data type
description
example
notes
Int
save header version
10
for a version list see the header SaveCustomVersion.h in the Community resources
Int
save version
30
for a version list see the header FGSaveManagerInterface.h in the Community resources
a unique identifier (GUID) for this save, for analytics purposes
CompressedSaveFileBody[]
Directly after the save file header, the save file body begins with a list of zlib-compressed chunks. Each compressed chunk has this format:
basic data type
description
example
notes
Int
unreal engine package signature
2,653,586,369
always the magic number "9E2A83C1" in hex (not really an Int as defined above, more like a four byte unsigned integer)
Int
padding
0
Int
maximum chunk size
131,072
in number of bytes, always 128 * 1,024
Int
padding
0
Int
compressed size
3,814
in number of bytes
Int
padding
0
Int
uncompressed size
131,072
in number of bytes
Int
padding
0
Int
compressed size
3,814
this is a repeat of the above data
Int
padding
0
Int
uncompressed size
131,072
this is a repeat of the above data
Int
padding
0
N/A
compressed bytes of the chunk
N/A
number of bytes: see "compressed size" above
SaveFileBody[]
The save file body is the concatenation of the uncompressed chunks. The body mainly consists of a list of sublevels and the persistent level.
basic data type
description
example
notes
Int
uncompressed size
90,103,391
in number of bytes, for the whole body
Int
sublevel count
107
the number of sublevels that follow - does not include the persistent level
Array[Level]
levels
N/A
sublevels and the persistent level. There is one more level than the sublevel count above, the last entry being the persistent level (See SCIM). For the format of one Level, see below
Int
object references count
218
the count of some old object references, can be ignored according to SCIM
Array[Object Reference]
object references
N/A
a list of object references, can also be ignored. for the format of one such ObjectReference, see below
Level[]
Each level has a list of game objects (actors and components), preceded by a list of headers for these objects.
the name of the sublevel. if this is the persistent level, the field is absent
Int
object header and collectables size
21,499,825
in number of bytes
Int
object header count
86,644
the number of headers that follow
Array[Object Header]
object headers
N/A
for the format of one ObjectHeader, see below
Int
collectables count
223
the number of collectable objects that follow (e.g. Power Slugs)
N/A
collectables
N/A
a list of object references, for the format of one such ObjectReference, see below
Int
objects size
92,259
in number of bytes, for all game objects in that level (actors and components)
Int
object count
504
should be the same as the number of object headers above
Array[Object]
objects
N/A
the additional data for each of the object headers above. for the format of objects, see below (ActorObject or ComponentObject, depending on the header type the object belongs to)
Int
second collectables count
223
the number of collectables in the second list that follows. can be igonred, since the collectables should be exactly the same as above
N/A
second collectables
N/A
a list of object references, for the format of one such ObjectReference, see below. can also be ignored
ObjectHeader[]
basic data type
description
example
notes
Int
header type
1
this is a header for an actor object, 0 would be a component header
ActorHeader | ComponentHeader
the bytes of the header
N/A
either an ActorHeader or a ComponentHeader, see below
the number of components this actor has (e.g. a Constructor has an input inventory)
N/A
components
N/A
a list of object references, for the format of one such ObjectReference, see below
N/A
properties
N/A
a list of properties, see PropertyList below
N/A
trailing bytes
N/A
some actors have trailing bytes that contain additional information or are just padding zeros. for interpreting this data, see existing save file parsers like SCIM
ComponentObject[]
basic data type
description
example
notes
Int
size
194,584
the number of bytes this ComponentObject has, including trailing bytes. Some components only have their header information, so this size could be zero
Array[Property]
properties
N/A
a list of properties, see PropertyList below
N/A
trailing bytes
N/A
some components have trailing bytes that contain additional information or are just padding zeros. for interpreting this data, see existing save file parsers like SCIM
Properties contain very different types of information. Every property has a name, which has the basic data type String.
PropertyList[]
Zero, one or multiple properties concatenated form a PropertyList. The special property named "None" marks the end of a PropertyList. All other properties in a PropertyList also have a type, which has the basic data type String. After the "name" and the "type" strings, the type-specific part begins. For these, see the following "...Property" descriptions.
ArrayProperty[]
basic data type
description
example
notes
Int
size
112
the number of bytes this property has, starting after the first padding
a list of values, according to the stated element type and number of elements. although the types are named like the other "...Property" structures here, most are actually simpler:
"ByteProperty": a single Byte per element
"EnumProperty": a single String per element
"InterfaceProperty" or "ObjectProperty": two Strings per element, "level name" and "path name"
"IntProperty": a single Int per element
"StructProperty" as element type in this context has more fields per element:
basic data type
description
example
notes
String
name
"mStops"
String
type
"StructProperty"
seems to be always this value
Int
size
1234
the number of bytes the payload of these StructProperty array elements have, starting after the "UUID" and the one byte padding below
Int
padding
0
String
element type
"TimeTableStop"
the type of elements in the payload of these StructProperty array elements
Int
?
N/A
"UUID": most of the time, these four Ints are zeros like in a padding - but sometimes they are not. semantics unclear, could be some sort of UUID
Int
?
N/A
Int
?
N/A
Int
?
N/A
Byte
padding
0
N/A
typed data
N/A
the list of elements with the actual payload of the property, see "TypedData" below for one such element
BoolProperty[]
basic data type
description
example
notes
Int
padding
0
Int
index
0
seems to always be zero
Byte
the boolean value
1
zero is considered "false", everything else is "true"
Byte
padding
0
ByteProperty[]
basic data type
description
example
notes
Int
size
17
the number of bytes this property has, starting after the padding
Int
index
0
seems to always be zero
String
type
"EGamePhase"
semantics unclear, why is it not just a byte?
Byte
padding
0
Byte or String
the byte value
"EGP_LateGame"
the actual value of this property. if type is "None", then its just a Byte, otherwise a String
EnumProperty[]
basic data type
description
example
notes
Int
size
34
the number of bytes this property has, starting after the padding
Int
index
0
seems to always be zero
String
type
"EIntroTutorialSteps"
semantics unclear
Byte
padding
0
String
the enum value
"EIntroTutorialSteps::ITS_DONE"
the actual value of this property
FloatProperty[]
basic data type
description
example
notes
Int
size
4
the number of bytes this property has, starting after the padding
Int
index
0
seems to always be zero
Byte
padding
0
Float
the float value
0.37677494
the actual value of this property
IntProperty[]
basic data type
description
example
notes
Int
size
4
the number of bytes this property has, starting after the padding
Int
index
0
seems to always be zero
Byte
padding
0
Int
the int value
10
the actual value of this property
Int64Property[]
basic data type
description
example
notes
Int
size
8
the number of bytes this property has, starting after the padding
Int
index
0
seems to always be zero
Byte
padding
0
Long
the long value
2,830,424,080
the actual value of this property
MapProperty[]
basic data type
description
example
notes
Int
size
370
the number of bytes this property has, starting after the padding
Int
index
0
seems to always be zero
String
key type
"ObjectProperty"
the type the keys of this map have
String
value type
"IntProperty"
the type the values of this map have
Byte
padding
0
Int
mode type
0
semantics unclear, seems to be always 0, but does not seem to be a simple padding
Int
number of elements
4
the number of key-value pairs in this map
N/A
map elements
N/A
a list of key-value pairs, according to the stated types and number of pairs. although the types are named like the other "...Property" structures here, they are actually simpler:
the key type seems to be always "ObjectProperty", which in this context is two Strings per key-value pair, "level name" and "path name"
the value types seem to always be one of these:
"ByteProperty": a single Byte per key-value pair
"IntProperty": a single Int per key-value pair
"StructProperty": a list of properties per key-value pair, see "PropertyList" above for one of this list
NameProperty[]
basic data type
description
example
notes
Int
size
17
the number of bytes this property has, starting after the padding
Int
index
0
seems to always be zero
Byte
padding
0
String
the string value
"Rocky Desert"
the actual value of this property
ObjectProperty[]
basic data type
description
example
notes
Int
size
104
the number of bytes this property has, starting after the padding
the number of bytes this property has, starting after the first padding
Int
index
0
seems to always be zero
String
type
"StructProperty"
the type of the elements in this set
Byte
padding
0
Int
padding
0
Int
length
436
the number of elements in this set
N/A
set elements
N/A
a list of values, according to the stated element type and number of elements. e.g. for the "mRemovalLocations" property of "/Script/FactoryGame.FGFoliageRemoval", each removal location element is of type "StructProperty". The actual location element is simpler than the StructProperty described below, since a location is just x/y/z, each of basic data type Float.
StrProperty[]
basic data type
description
example
notes
Int
size
9
the number of bytes this property has, starting after the padding
Int
index
0
seems to always be zero
Byte
padding
0
String
the string value
"Name"
the actual value of this property
StructProperty[]
basic data type
description
example
notes
Int
size
387
the number of bytes this property has, starting after the padding
Int
index
0
seems to always be zero
String
type
"TrainDockingRuleSet"
the type of structure this property's payload represents. if it is "InventoryItem", the structure has an addtional overhead of 42 bytes, compared to the stated size (because in the TypedData below, there is an addtional property of this size - see below in "TypedData" / "InventoryItem")
Long
padding
0
Long
padding
0
Byte
padding
0
N/A
typed data
N/A
the actual payload of the property, see "TypedData" below
TextProperty[]
basic data type
description
example
notes
Int
size
34
the number of bytes this property has, starting after the padding
Int
index
0
seems to always be zero
Byte
padding
0
Int
flags
18
semantics unclear
Byte
history type
-1
semantics unclear, seems to be always -1
int
is text culture invariant?
1
semantics unclear, seems to be always 1 (as a boolean, this would be "true", sincei it is not zero)
String
the text value
"my fancy train station"
the actual value of this property
TypedData[]
As part of an element in an ArrayProperty or "standalone" as the payload of a StructProperty, several custom types can occur. Note that the actual type is stated beforehand as a String, with a gap of 17 bytes to this structure. By default, the TypedData is just a PropertyList (see above), but there are some special structures:
Creative Mode can be enabled by editing a save file, with third-party tools providing a GUI interface for doing so. Much like the 4-player limit for multiplayer, that there is no interface to change this option within the Satisfactory client indicates that this feature is unsupported.