Name | Type/Size | Info |
---|---|---|
byte0 | uint8 | The upper two bits represent the type of formID:
|
byte1 | uint8 | |
byte2 | uint8 |
Name | Type/Size | Info |
---|---|---|
magic | char[13] | Constant: 'TESV_SAVEGAME' |
headerSize | uint32 | Size of the header. |
header | Header | |
screenshotData | LE: uint8[3*shotWidth*shotHeight] SE: uint8[4*shotWidth*shotHeight] | For LE: RGB pixel data of the image. For SE: RGBA pixel data of the image. |
uncompressedLen | uint32 | Uncompressed length (SE only) |
compressedLen | uint32 | Compressed length (SE only) |
formVersion | uint8 | current as of LE 1.9 and SE 1.5.97 is 74. |
pluginInfoSize | uint32 | Size of the plugin information. |
pluginInfo | Plugin Info | |
lightPluginInfo | Light Plugin Info | Only for SE save games (and formVersion >= 78?). This contains info about ESL plugins. |
fileLocationTable | File Location Table | |
globalDataTable1 | Global Data[fileLocationTable.globalDataTable1Count] | Types 0 to 8. |
globalDataTable2 | Global Data[fileLocationTable.globalDataTable2Count] | Types 100 to 114. |
changeForms | Change Form[fileLocationTable.changeFormCount] | |
globalDataTable3 | Global Data[fileLocationTable.globalDataTable3Count] | Types 1000 to 1005. |
formIDArrayCount | uint32 | |
formIDArray | formID[formIDArrayCount] | Not to be confused with RefIDs. These are FormIDs, four bytes in length, little endian. |
visitedWorldspaceArrayCount | uint32 | |
visitedWorldspaceArray | formID[visitedWorldspaceArrayCount] | A list of the FormIDs of all worldspaces visited by the player. |
unknown3TableSize | uint32 | Size in bytes of unknown3Table. |
unknown3Table | Unknown 3 Table |
Name | Type/Size | Info |
---|---|---|
version | uint32 | Current LE version: 9, supported: 7 - 9, for SE it will be 12. Use this to determine whether or not the save file is for LE or SE. |
saveNumber | uint32 | Save number, used for default name of save file. Presumably this is a counter keeping track of the total number of saves you have made to date. |
playerName | wstring | |
playerLevel | uint32 | |
playerLocation | wstring | |
gameDate | wstring | In-game date at the time of saving. |
playerRaceEditorId | wstring | |
playerSex | uint16 |
|
playerCurExp | float32 | Experience gathered for level up. |
playerLvlUpExp | float32 | Experience required for level up. |
filetime | FILETIME | See the Microsoft Docs for more info on this type. |
shotWidth | uint32 | Screenshot width (in pixels). |
shotHeight | uint32 | Screenshot height (in pixels). |
compressionType | uint16 | (SE only)
If compression is present, everything after the compression lengths is compressed. |
Name | Type/Size | Info |
---|---|---|
pluginCount | uint8 | |
plugins | wstring[pluginCount] |
Name | Type/Size | Info |
---|---|---|
pluginCount | uint16 | |
plugins | wstring[pluginCount] |
Name | Type/Size | Info |
---|---|---|
formIDArrayCountOffset | uint32 | Absolute offset to the start of File.formIDArrayCount. |
unknownTable3Offset | uint32 | Absolute offset to the start of File.unknown3TableSize. |
globalDataTable1Offset | uint32 | Absolute offset to the start of File.globalDataTable1. |
globalDataTable2Offset | uint32 | Absolute offset to the start of File.globalDataTable2. |
changeFormsOffset | uint32 | Absolute offset to the start of File.changeForms. |
globalDataTable3Offset | uint32 | Absolute offset to the start of File.globalDataTable3. |
globalDataTable1Count | uint32 | The number of Global Data in File.globalDataTable1 (9). |
globalDataTable2Count | uint32 | The number of Global Data in File.globalDataTable2 (15). |
globalDataTable3Count | uint32 | The number of Global Data in File.globalDataTable3 (5 -- bugged). Note: This count is currently bugged (as of version 112) that it does not include type 1001 (Papyrus) in the count. This causes Skyrim to never read the final type in this table, which is typically type 1005 (Main), thankfully the bug is harmless since this type never has any data. |
changeFormCount | uint32 | |
unused | uint32[15] |
Name | Type/Size | Info |
---|---|---|
type | uint32 | |
length | uint32 | |
data | uint8[length] | Format of data depends on its type:
|
Name | Type/Size | Info |
---|---|---|
formID | RefID | |
changeFlags | uint32 | A combination of changeFlags that indicates which changes are included in the data. |
type | uint8 | Upper 2 bits represent the size of the data lengths:
Lower 6 bits represent the type of form:
|
version | uint8 | Current as of Skyrim 1.9 is 74. Older values (57, 64, 73) are also valid. |
length1 | depends on flags | Length of following data. |
length2 | depends on flags | If this value is non-zero, data is compressed. This value then represents the uncompressed length. |
data | uint8[length1] |
Name | Type/Size | Info |
---|---|---|
count | uint32 | |
unknown | wstring[count] |
Name | Type/Size | Info |
---|---|---|
byte0 | uint8 | The upper two bits represent the type of formID:
|
byte1 | uint8 | |
byte2 | uint8 |
Name | Type/Size | Info |
---|---|---|
magic | char[13] | Constant: 'TESV_SAVEGAME' |
headerSize | uint32 | Size of the header. |
header | Header | |
screenshotData | LE: uint8[3*shotWidth*shotHeight] SE: uint8[4*shotWidth*shotHeight] | For LE: RGB pixel data of the image. For SE: RGBA pixel data of the image. |
uncompressedLen | uint32 | Uncompressed length (SE only) |
compressedLen | uint32 | Compressed length (SE only) |
formVersion | uint8 | current as of LE 1.9 and SE 1.5.97 is 74. |
pluginInfoSize | uint32 | Size of the plugin information. |
pluginInfo | Plugin Info | |
lightPluginInfo | Light Plugin Info | Only for SE save games (and formVersion >= 78?). This contains info about ESL plugins. |
fileLocationTable | File Location Table | |
globalDataTable1 | Global Data[fileLocationTable.globalDataTable1Count] | Types 0 to 8. |
globalDataTable2 | Global Data[fileLocationTable.globalDataTable2Count] | Types 100 to 114. |
changeForms | Change Form[fileLocationTable.changeFormCount] | |
globalDataTable3 | Global Data[fileLocationTable.globalDataTable3Count] | Types 1000 to 1005. |
formIDArrayCount | uint32 | |
formIDArray | formID[formIDArrayCount] | Not to be confused with RefIDs. These are FormIDs, four bytes in length, little endian. |
visitedWorldspaceArrayCount | uint32 | |
visitedWorldspaceArray | formID[visitedWorldspaceArrayCount] | A list of the FormIDs of all worldspaces visited by the player. |
unknown3TableSize | uint32 | Size in bytes of unknown3Table. |
unknown3Table | Unknown 3 Table |
Name | Type/Size | Info |
---|---|---|
version | uint32 | Current LE version: 9, supported: 7 - 9, for SE it will be 12. Use this to determine whether or not the save file is for LE or SE. |
saveNumber | uint32 | Save number, used for default name of save file. Presumably this is a counter keeping track of the total number of saves you have made to date. |
playerName | wstring | |
playerLevel | uint32 | |
playerLocation | wstring | |
gameDate | wstring | In-game date at the time of saving. |
playerRaceEditorId | wstring | |
playerSex | uint16 |
|
playerCurExp | float32 | Experience gathered for level up. |
playerLvlUpExp | float32 | Experience required for level up. |
filetime | FILETIME | See the Microsoft Docs for more info on this type. |
shotWidth | uint32 | Screenshot width (in pixels). |
shotHeight | uint32 | Screenshot height (in pixels). |
compressionType | uint16 | (SE only)
If compression is present, everything after the compression lengths is compressed. |
Name | Type/Size | Info |
---|---|---|
pluginCount | uint8 | |
plugins | wstring[pluginCount] |
Name | Type/Size | Info |
---|---|---|
pluginCount | uint16 | |
plugins | wstring[pluginCount] |
Name | Type/Size | Info |
---|---|---|
formIDArrayCountOffset | uint32 | Absolute offset to the start of File.formIDArrayCount. |
unknownTable3Offset | uint32 | Absolute offset to the start of File.unknown3TableSize. |
globalDataTable1Offset | uint32 | Absolute offset to the start of File.globalDataTable1. |
globalDataTable2Offset | uint32 | Absolute offset to the start of File.globalDataTable2. |
changeFormsOffset | uint32 | Absolute offset to the start of File.changeForms. |
globalDataTable3Offset | uint32 | Absolute offset to the start of File.globalDataTable3. |
globalDataTable1Count | uint32 | The number of Global Data in File.globalDataTable1 (9). |
globalDataTable2Count | uint32 | The number of Global Data in File.globalDataTable2 (15). |
globalDataTable3Count | uint32 | The number of Global Data in File.globalDataTable3 (5 -- bugged). Note: This count is currently bugged (as of version 112) that it does not include type 1001 (Papyrus) in the count. This causes Skyrim to never read the final type in this table, which is typically type 1005 (Main), thankfully the bug is harmless since this type never has any data. |
changeFormCount | uint32 | |
unused | uint32[15] |
Name | Type/Size | Info |
---|---|---|
type | uint32 | |
length | uint32 | |
data | uint8[length] | Format of data depends on its type:
|
Name | Type/Size | Info |
---|---|---|
formID | RefID | |
changeFlags | uint32 | A combination of changeFlags that indicates which changes are included in the data. |
type | uint8 | Upper 2 bits represent the size of the data lengths:
Lower 6 bits represent the type of form:
|
version | uint8 | Current as of Skyrim 1.9 is 74. Older values (57, 64, 73) are also valid. |
length1 | depends on flags | Length of following data. |
length2 | depends on flags | If this value is non-zero, data is compressed. This value then represents the uncompressed length. |
data | uint8[length1] |
Name | Type/Size | Info |
---|---|---|
count | uint32 | |
unknown | wstring[count] |