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. |
|||
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) |