Profile/Need for Speed Hot Pursuit
This section lists the game-specific headers, footers and protections on the savegame. See the section on the profile page for per-platform protections.
All platforms
A 4 byte header specifying the length of the database is the first field in the save. All pointers in the database are relative to offset 4 in the file because of this. After the database is 0x47000 bytes of null data. Additional data follows on PC.
PC
The database is followed by 1024 characters storing the login token. The token is followed by a chunk of length 0x10. If nobody is logged in, this is null. If an account is logged in, this stores a 32-bit integer with value 2
, 4 bytes of padding, and a 64-bit integer (or 32-bit with 4 bytes padding) which is presumably the account ID.
After this is a 128-bit hash used for savegame validation. Without recalculating the hash, saves cannot be modified. The algorithm used is currently unknown.
PC (Remastered)
The database is followed by a space character (0x20), then the same 128-bit hash as is used in the original PC game. No padding is present.
Other platforms
No game-specific headers, footers or protections are present on other platforms.
Row definitions
Row definitions define the fields, or columns, used in each table. With different schema versions, new row definitions may be added and existing ones may be altered or removed.
Although row definitions are best read programmatically with the rest of the database, the structures they define are provided in a subpage for those who want to read them manually.
Row definitions |
Structures
Mud::Db
32-bit
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x1 | uint8_t | muFormatVersion | Always 2 | |
0x1 | 0x3 | Padding | |||
0x4 | 0x4 | uint32_t | muSchemaVersion | Schema version | 1 on PC and 360, 5 on PS3 |
0x8 | 0x100 | uint8_t[256] | mauReserved | ||
0x108 | 0x4 | ArrayList<Table, 200>* | mTables | Database tables | Always 0x180 |
0x10C | 0x8 | Allocator | mPageAllocator | Database allocation |
64-bit
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x1 | uint8_t | muFormatVersion | Always 2 | |
0x1 | 0x3 | Padding | |||
0x4 | 0x4 | uint32_t | muSchemaVersion | Schema version | 8 in HPR |
0x8 | 0x100 | uint8_t[256] | mauReserved | ||
0x108 | 0x8 | ArrayList<Table, 200>* | mTables | Database tables | Always 0x180 |
0x110 | 0xC | Allocator | mPageAllocator | Database allocation |
Mud::Table
32-bit
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0xD | char[13] | macName | Table name | |
0xD | 0x3 | Padding | |||
0x10 | 0x178 | RowDef | mRowDef | Row | |
0x188 | 0x4 | Page* | mpFirstPage | ||
0x18C | 0x4 | Allocator* | mpAllocator | Always 0x10C | |
0x190 | 0xB8 | uint8_t[184] | mauDefaultRow | Default values | Data length is same as row size |
64-bit
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0xD | char[13] | macName | Table name | |
0xD | 0x3 | Padding | |||
0x10 | 0x178 | RowDef | mRowDef | Row | |
0x188 | 0x8 | Page* | mpFirstPage | ||
0x190 | 0x8 | Allocator* | mpAllocator | Always 0x110 | |
0x198 | 0xB8 | uint8_t[184] | mauDefaultRow | Default values | Data length is same as row size |
Mud::RowDef
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x2 | uint16_t | mRowSize | Number of columns | |
0x2 | 0x2 | Padding | |||
0x4 | 0x174 | ColumnList | mColumns | Columns |
Mud::Column
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0xD | char[13] | macName | Name | |
0xD | 0x1 | uint8_t | muType | Field type | See type |
0xE | 0x2 | uint16_t | muRowOffset | Offset in structure |
Mud::Page
32-bit
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x10 | Header | mHeader | ||
0x10 | 0xEC | uint8_t[236] | mBody | ||
0xFC | 0x4 | Footer | mFooter |
64-bit
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x18 | Header | mHeader | ||
0x18 | 0xE4 | uint8_t[228] | mBody | ||
0xFC | 0x4 | Footer | mFooter |
Mud::Page::Header
32-bit
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x4 | Page* | mpNext | Next node | |
0x4 | 0x4 | Table* | mpTable | Type | |
0x8 | 0x2 | uint16_t | muNextAllocation | Length | |
0xA | 0x2 | Padding | |||
0xC | 0x4 | uint32_t | muSentinelPre |
64-bit
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x8 | Page* | mpNext | Next node | |
0x8 | 0x8 | Table* | mpTable | Type | |
0x10 | 0x2 | uint16_t | muNextAllocation | Length | |
0x12 | 0x2 | padding | |||
0x14 | 0x4 | uint32_t | muSentinelPre |
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x4 | uint32_t | muSentinelPost |
Mud::Allocator
32-bit
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x4 | Page* | mpaPages | Always 0x1CA00 | |
0x4 | 0x4 | int32_t | miNumPages | Always 0x236 |
64-bit
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x8 | Page* | mpaPages | Always 0x1D080 | |
0x8 | 0x4 | int32_t | miNumPages | Always 0x22F |
Typedefs
Mud::RowDef::ColumnList
Name | Type | Length | Comments |
---|---|---|---|
ColumnList | MudArrayList<Column, 23>::type | 0x174 |
Mud::MudArrayList<Mud::Column, 23>::type
Name | Type | Length | Comments |
---|---|---|---|
type | ArrayList<Column, 23> | 0x174 |
Enumerations
Mud::EType
Name | Value | Comments |
---|---|---|
E_TYPE_INT32 | 0 | |
E_TYPE_FLOAT | 1 | |
E_TYPE_INT16 | 2 | |
E_TYPE_INT8 | 3 | |
E_TYPE_INT64 | 4 | |
E_TYPE_BOOL | 5 | |
E_TYPE_UINT8 | 6 | |
E_TYPE_UINT16 | 7 | |
E_TYPE_UINT32 | 8 | |
E_TYPE_UINT64 | 9 | |
E_TYPE_STRING | 10 | |
E_TYPE_COUNT | 11 |