PLUGGY SAVEFILE FORMAT v1.6
Elys v1.0-1.5, haama v1.6


The first block of a Pluggy savefile is:

HEADER
Name
Type
Size
Info
SavefileTag
Char[10]
10
= "PluggySave"
SavefileVersion
Int32
4
= 0105000h (Version 1.6.0000) Versions post 1.6.0000 are not compatible with this file format

It is followed by several Record blocks.
There are 7 types of Record blocks: Plugin Records, String Records, Array Records, Name Records, ScreenInfo Record, HudS(Surface/Image) Records, HudT(text) Records
The first is always the Plugin Records.
Followed optionally by the String Records (if there was any String data to be saved).
Followed optionally by all the Array Records - one for each array. The ArrayRecord with the highest ArrayID is first saved then down to lowest ArrayID.
Followed optionally by the Name Records.
If there was any HudS or HudT data, the ScreenInfo Record will be included next, followed by the HudS and/or HudT Records (in that order).

 

PLUGIN RECORDS
Name
Type
Size
Info
RecordType Byte 1 = 0 (Plugin Records)
Count Int32 4 Plugins count including the master files.
The next part is Count times the following plugin subrecord.
EspID Byte 1 Plugin Index attribuated by Pluggy (prior to v1.2, the size was 4 bytes)
Index Byte 1 Plugin Index attribuated by Oblivion
NameLen Int32 4 Length of the plugin filename
Name Char[NameLen] NameLen Plugin filename

 

STRING RECORDS
Name
Type
Size
Info
RecordType Byte 1 = 1 (String Records)
Count Int32 4 Strings count.

The next part is Count times the following string subrecord.
The string with the highest StringID is the first saved then down to the lowest StringID

StringID Int32 4 String ID
EspID Byte 1 String EspID (prior to v1.2, the size was 4 bytes)
Flags Byte 1 String Flags (prior to v1.1, this field did not exist)
StringLen Int32 4 Length of the string
String Char[StringLen] StringLen The string value

 

ARRAY RECORDS
Name
Type
Size
Info
RecordType Byte 1 = 2 (Array Records)
ArrayID Int32 4 Array ID
EspID Byte 1 Array EspID (prior to v1.2, the size was 4 bytes)
Flags Byte 1 Array Flags (prior to v1.1, this field did not exist)
Size Int32 4 Array size
Count Int32 4 Array's subrecord count

The next part is Count times the following array subrecord.

Index Int32 4 Index
Type Byte 1 Integer = 0, Reference =1, Float =2
Data Int32 4 Value

 

NAME RECORDS
Name
Type
Size
Info
RecordType Byte 1 = 3 (Name Records)
Count Int32 4 Names count.
The next part is Count times the following name subrecord.
RefID Int32 4 Reference ID
NameLen Int32 4 Length of the name
Name Char[NameLen] NameLen name

 

SCREENINFO RECORD
Name
Type
Size
Info
RecordType Byte 1 = 4 (ScreenInfo Record)
Width Int32 4 Old screen width
Height Int32 4 Old screen height

 

HudS(Surface/Image) RECORDS
Name
Type
Size
Info
RecordType Byte 1 = 5 (HudS Records)
Count Int32 4 HudS count.
The next part is Count times the following HudS subrecord.
HudSID Int32 4 HudS ID
EspID Byte 1 HudS EspID
Flags Byte 1 HudS Flags
RootID Byte 1 HudS RootID
FileNameLen Int32 4 Length of the file name
String Char[StringLen] StringLen File name
Show Byte 1 When to show HudS (GameMode only, MenuMode only, etc.)
PosX Int32 4 HudS X Position
PosY Int32 4 HudS Y Position
Depth Int16 2 The depth/layer of HudS
ScaleX Int32 4 X Scale compared to the original HudS file
ScaleY Int32 4 Y Scale compared to the orginal HudS file
Unused Int32 4 Unused
Alpha Byte 1 HudS Alpha level
Alignment Byte 1 Alignment (top-middle of screen, center, etc.) of HudS
AutoScale Byte 1 Whether HudS should auto-scale when the player changes resolution

 

HudT(Text) RECORDS
Name
Type
Size
Info
RecordType Byte 1 = 6 (HudT Records)
Count Int32 4 HudT count.
The next part is Count times the following HudT subrecord.
HudTID Int32 4 HudT ID
EspID Byte 1 HudT EspID
Flags Byte 1 HudT Flags
Show Byte 1 When to show HudT (GameMode only, MenuMode only, etc.)
PosX Int32 4 HudT X Position
PosY Int32 4 HudT Y Position
Depth Int16 2 The depth/layer of HudT
ScaleX Int32 4 X Scale compared to the original HudT
ScaleY Int32 4 Y Scale compared to the orginal HudT
Unused Int32 4 Unused
Alpha Byte 1 HudT Alpha level
Alignment Byte 1 Alignment (top-middle of screen, center, etc.) of HudT
AutoScale Byte 1 Whether HudT should auto-scale when the player changes resolution
Width Int32 4 HudT width
Height Int32 4 HudT height
Format Byte 1 Text format (left-justify, etc.)
FontNameLen Int32 4 Length of the font name
String Char[StringLen] StringLen Font name
TextLen Int32 4 Length of the HudT text
String Char[StringLen] StringLen Text
FontHeight Int32 4 Font height
FontWidth Int32 4 Font width
Weight Int16 2 Font boldness
Italic Byte 1 Italic
R Byte 1 Red
G Byte 1 Green
B Byte 1 Blue

 

The Record Blocks are followed by:

FOOTER
Name
Type
Size
Info
SaveGameTicks
UInt32
4
= number of GameTicks, as found in the .ess file (to double-check that the Pluggy co-save belongs to that .ess save)
EndControl
UInt32
4
= offset of EndControl in the savefile
Checksum
UInt32
4
CRC32 of all the savefile excepted these last 4 bytes (which contain this Checksum)