BYML: Difference between revisions

2,529 bytes added ,  1 year ago
Updated file format to version 7 for TotK
imported>Leoetlino
(add ACNH and v4 info)
(Updated file format to version 7 for TotK)
 
(One intermediate revision by one other user not shown)
Line 18: Line 18:
| align="center" | 0x02
| align="center" | 0x02
| align="center" | 2
| align="center" | 2
| Version 0x0002 in ''Breath of the Wild''. 1, 3 and 4 are also valid version numbers.
| Version 2 in ''Breath of the Wild'', Versions 4 to 7 in ''Tears of the Kingdom''. 1 and 3 are also valid version numbers.
|-
|-
| align="center" | 0x04
| align="center" | 0x04
Line 30: Line 30:
| align="center" | 0x0c
| align="center" | 0x0c
| align="center" | 4
| align="center" | 4
| Offset to the root node, relative to start. May be 0 if the document is totally empty. Must be either an array node (0xc0) or a hash node (0xc1).
| Offset to the root node, relative to start. May be 0 if the document is totally empty. Must be either an array node (0xc0) or one of the hash nodes (0x20, 0x21 or 0xc1).
|}
|}


Line 42: Line 42:
! width="63%" | Description
! width="63%" | Description
! width="10%" | Version
! width="10%" | Version
|-
| align="center" | 0x20
| align="center" | Container
| Plain hash. Node is a mapping from 32-bit hashes to other nodes.
| 7+
|-
| align="center" | 0x21
| align="center" | Container
| Value hash. Node is a mapping from 32-bit hashes to other nodes and a second 4 byte value.
| 7+
|-
|-
| align="center" | 0xA0
| align="center" | 0xA0
Line 49: Line 59:
|-
|-
| align="center" | 0xA1
| align="center" | 0xA1
| align="center" | Container
| align="center" | Value (Special)
| Binary data.
| Binary data.
| 4+
| 4+
|-
| align="center" | 0xA2
| align="center" | Value (Special)
| File data. Node contains the binary data of another file.
| 5+
|-
|-
| align="center" | 0xC0
| align="center" | 0xC0
Line 60: Line 75:
| align="center" | 0xC1
| align="center" | 0xC1
| align="center" | Container
| align="center" | Container
| Hash. Node is a mapping from strings in the hash key table to other nodes.
| String hash. Node is a mapping from strings in the hash key table to other nodes.
| 2+
| 2+
|-
|-
Line 115: Line 130:
For string nodes, this encoding is simply a four byte index into the string table respectively.
For string nodes, this encoding is simply a four byte index into the string table respectively.


For special value nodes, the value is an offset to a 64 bit integer / floating-point number relative to the start of the file.
For special value nodes, the value is an offset relative to the start of the file.
 
==== 0x20 - Hash Node ====
 
Hash / dictionary nodes are used to encode name value collections. Entries must sorted by their hash value.
 
{| class="wikitable"
! align="center" | Offset
! align="center" | Size
! Description
|-
| align="center" | 0x00
| align="center" | 1
| 0x20 node type.
|-
| align="center" | 0x01
| align="center" | 3
| Number of entries in dictionary.
|-
| align="center" | 0x04
| align="center" | 8*N
| Dictionary entries.
|-
| align="center" | 0x04+8*N
| align="center" | 1*N
| Array of N types, on for each entry in the dictionary. This is padded to 4 bytes.
|}
 
Each entry in the dictionary has the following structure.
 
{| class="wikitable"
! align="center" width="5%" | Offset
! align="center" width="3%" | Size
! width="90%" | Description
|-
| align="center" | 0x00
| align="center" | 4
| Hash. A 32-bit hash of the key.
|-
| align="center" | 0x04
| align="center" | 4
| Value. For regular value nodes, this is the 4 byte node value. For other nodes, this is a 4 byte offset to the node relative to the start of the file.
|}
 
==== 0x21 - Value Hash Node ====
 
This type is the similar to the hash node with the addition of a 4-byte value in each dictionary entry.
 
{| class="wikitable"
! align="center" width="5%" | Offset
! align="center" width="3%" | Size
! width="90%" | Description
|-
| align="center" | 0x00
| align="center" | 4
| Value. For regular value nodes, this is the 4 byte node value. For other nodes, this is a 4 byte offset to the node relative to the start of the file.
|-
| align="center" | 0x04
| align="center" | 4
| Hash. A 32-bit hash of the key.
|-
| align="center" | 0x08
| align="center" | 4
| Unknown. Always 0 in ''Tears of the Kingdom''.
|}


==== 0xA1 - Binary Data Node ====
==== 0xA1 - Binary Data Node ====
Line 130: Line 209:
| align="center" | variable
| align="center" | variable
| Data
| Data
|}
==== 0xA2 - File Node ====
{| class="wikitable"
! align="center" | Offset
! align="center" | Size
! Description
|-
| align="center" | 0x00
| align="center" | 4
| File length
|-
| align="center" | 0x04
| align="center" | 4
| Unknown. Always 0x1000.
|-
| align="center" | 0x08
| align="center" | variable
| File data
|}
|}


Line 158: Line 256:
N’ is N rounded up to the nearest multiple of 4.
N’ is N rounded up to the nearest multiple of 4.


==== 0xC1 - Hash Node ====
==== 0xC1 - String Hash Node ====


Hash / dictionary nodes are used to encode name value collections. Entries must be lexicographically sorted<ref>Nintendo's BYML library performs a binary search when looking up items by key in a hash node.</ref>.
Hash / dictionary nodes are used to encode name value collections. Entries must be lexicographically sorted<ref>Nintendo's BYML library performs a binary search when looking up items by key in a hash node.</ref>.
Line 247: Line 345:
* [[Bquestpack|.bquestpack]]
* [[Bquestpack|.bquestpack]]
* [[BYML|.byml]]
* [[BYML|.byml]]
* [[BYML|.byaml]]
* [[Mubin|.mubin]]
* [[Mubin|.mubin]]
TotK has added the following extensions:
* .bgyml


== Tools ==
== Tools ==
2

edits