Datasheet: Difference between revisions
imported>Leoetlino (main field -> root field / mention pointer relocation) |
imported>Leoetlino (→Value) |
||
Line 135: | Line 135: | ||
=== Value === | === Value === | ||
A value is simply serialized data for the structure formed of root fields. | |||
{| class="wikitable" | {| class="wikitable" | ||
|+Field data serialization | |+Field data serialization | ||
Line 161: | Line 163: | ||
|<code>struct { const char* data; u32 length; }</code> (aligned to 0x10 bytes) | |<code>struct { const char* data; u32 length; }</code> (aligned to 0x10 bytes) | ||
|} | |} | ||
== Usage in ''Link's Awakening'' == | == Usage in ''Link's Awakening'' == |
Revision as of 18:58, 7 April 2020
File format | |
---|---|
Magic | gsht |
Endianness | little |
Version | 1 |
This article is about the file format in general. For actual values, check the game RomFS. |
GSHT (G?sheet) is a custom Grezzo binary serialization file format that is used to store structured, strongly typed data. GSHT documents are called datasheets.
A datasheet contains structure type information followed by arrays of structures. Optionally, one of the structure fields may be declared as a key field, in which case the contents are a dictionary rather than a array.
Format
Documents are little endian and their sizes are always 0x10-byte aligned.
Pointers are encoded as absolute offsets and relocated when the document is loaded by the game.
Header
Offset | Type | Description |
---|---|---|
0x0 | char[4] | Magic (GSHT or gsht )
|
0x4 | int | Version (must be 1) |
0xC | u8 | Bool type size (must be 1) |
0xD | u8 | Pointer size (must be 8) |
0xE | u8 | ?[check] |
0x10 | const char* | Name |
0x18 | u32 | Number of root fields |
0x1C | u32 | Number of fields in total |
0x20 | Value* | Values |
0x28 | u32 | Number of values |
0x2C | u32 | Value size |
Field
enum class Type : u16 {
Struct = 0,
Bool = 1,
Int = 2,
Float = 3,
String = 4,
};
enum class Flag : u16 {
IsNullable = 1 << 0,
IsArray = 1 << 1,
IsKey = 1 << 2,
b3 = 1 << 3,
IsEnum = 1 << 4,
b5 = 1 << 5,
};
Offset | Type | Description |
---|---|---|
0x0 | const char* | Name (must be non-null) |
0x8 | const char* | Type name |
0x10 | Field::Type | Type |
0x11 | u8 | ?[check] |
0x12 | Field::Flag | Flags |
0x14 | u16 | Value offset |
0x16 | u16 | Value blob size |
0x18 | u16 | Value size |
0x1A | u16 | Structure field count |
0x20 | Field* | Structure fields |
0x28 | Field* | Parent (filled in during parsing; always 0xdeadbeefdeadbeef when serialized) |
Fields must be properly aligned to 0x30 byte boundaries.
Key fields cannot be arrays or Nullable types.
Key fields must be of type String or Int.
Value
A value is simply serialized data for the structure formed of root fields.
Type | Serialized data format |
---|---|
Nullable<T> (non-strings) | struct { T* data; } (nullptr if no value)
|
Array<T> | struct { T* data; u32 size; } (aligned to 0x10 bytes[check])
|
Struct | struct { Fields...; }
|
Bool | bool (1-byte) |
Int | s32 |
Float | f32 |
String | struct { const char* data; u32 length; } (aligned to 0x10 bytes)
|
Usage in Link's Awakening
Datasheets are extensively used to configure game logic and to store miscellaneous data. They are located in rom:/region_common/datasheets and their file extension is .gsheet.
Text versions of datasheets are available in the leoetlino/la-re-notes repository on GitHub.