Datasheet: Difference between revisions
imported>Leoetlino main field -> root field / mention pointer relocation |
imported>Leoetlino |
||
| 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.