Difference between revisions of "MSBT (File Format)"
m (Added index + TXT2 formatting) |
|||
(9 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
− | + | '''MSBT files''' contains the game's text. The files have been used in many different games on the [[Wii]], [[3DS]] and [[Wii U]]. In [[Mario Kart 8]] the file has a main header (MSBT) and two sections with their own headers (NLI1 and TXT2). Each section is padded to the next multiple of 0x10 using a sequence of <code>0xAB</code> bytes. | |
− | |||
− | The file has a main header (MSBT) and two | ||
− | |||
− | |||
== Header == | == Header == | ||
− | |||
The MSBT file format starts with a header structure. | The MSBT file format starts with a header structure. | ||
− | {| class="wikitable" | + | {|class="wikitable" |
|- | |- | ||
− | ! Offset | + | ! Offset !! Type !! Description |
− | ! | ||
− | ! Description | ||
|- | |- | ||
− | | 0x00 | + | | 0x00 || String || '''File magic'''. Always ''MsgStdBn'' in ASCII. |
− | | | ||
− | | ''' | ||
|- | |- | ||
− | | 0x08 | + | | 0x08 || UInt16 || {{BOM}} |
− | | | ||
− | | | ||
|- | |- | ||
− | | | + | | 0x0A || UInt16 || '''Unknown'''. Always 0x0000. |
− | | | ||
− | | ''Unknown'' | ||
|- | |- | ||
− | | | + | | 0x0C || UInt16 || '''Unknown'''. Always 0x0103. |
− | | | ||
− | | ''Unknown'' | ||
|- | |- | ||
− | | | + | | 0x0E || UInt16 || '''Number of sections'''. |
− | | | ||
− | | '''Number of sections''' | ||
|- | |- | ||
− | | 0x10 | + | | 0x10 || UInt16 || '''Unknown'''. Always 0x0000. |
− | | | ||
− | | ''Unknown'' | ||
|- | |- | ||
− | | 0x12 | + | | 0x12 || UInt32 || '''File size'''. |
− | | | ||
− | | '''File size''' | ||
|- | |- | ||
− | | 0x16 | + | | 0x16 || Byte[10] || '''Unknown'''. Always 0. |
− | | 10 | ||
− | | ''Unknown'' | ||
|- | |- | ||
− | | 0x20 | + | | 0x20 || colspan=2 {{unknown|End of file header}} |
− | | colspan=2 {{unknown|End of file header}} | ||
|} | |} | ||
== NLI1 == | == NLI1 == | ||
+ | The NLI1 section starts with a section header. | ||
− | + | {|class="wikitable" | |
− | |||
− | {| class="wikitable" | ||
|- | |- | ||
− | ! Offset | + | ! Offset !! Type !! Description |
− | ! | ||
− | ! Description | ||
|- | |- | ||
− | | 0x00 | + | | 0x00 || String || '''Section magic'''. Always ''NLI1'' in ASCII. |
− | | | ||
− | | ''' | ||
|- | |- | ||
− | | 0x04 | + | | 0x04 || UInt32 || '''Section size''' (starting from 0x10). |
− | | | ||
− | | '''Section size''' | ||
|- | |- | ||
− | | 0x08 | + | | 0x08 || Byte[8] || '''Unknown'''. Always 0. |
− | | 8 | ||
− | | '' | ||
|- | |- | ||
− | | | + | | 0x10 || UInt32 || '''Number of entries'''. |
− | | | ||
− | | '''Number of entries''' | ||
|- | |- | ||
− | | | + | | 0x14 |
| colspan=2 {{unknown|End of NLI1 header}} | | colspan=2 {{unknown|End of NLI1 header}} | ||
+ | |} | ||
+ | |||
+ | After the header comes the entries. Each entry has the following structure: | ||
+ | |||
+ | {|class="wikitable" | ||
+ | |- | ||
+ | ! Offset !! Type !! Description | ||
+ | |- | ||
+ | | 0x00 || UInt32 || '''Message index'''. The game uses this value as a key to find the relevant string. | ||
+ | |- | ||
+ | | 0x04 || UInt32 || Index into the [[#TXT2|TXT2 strings]]. | ||
|} | |} | ||
== TXT2 == | == TXT2 == | ||
+ | The TXT2 section starts with a header. | ||
− | + | {|class="wikitable" | |
− | |||
− | {| class="wikitable" | ||
|- | |- | ||
− | ! Offset | + | ! Offset !! Type !! Description |
− | ! | ||
− | ! Description | ||
|- | |- | ||
− | | 0x00 | + | | 0x00 || String || '''Section magic'''. Always ''TXT2'' in ASCII. |
− | | | ||
− | | ''' | ||
|- | |- | ||
− | | 0x04 | + | | 0x04 || UInt32 || '''Section size''' (starting from 0x10). |
− | | | ||
− | | '''Section size''' | ||
|- | |- | ||
− | | 0x08 | + | | 0x08 || Byte[8] || '''Unknown'''. Always 0. |
− | | 8 | ||
− | | '' | ||
|- | |- | ||
− | | | + | | 0x10 || UInt32 || '''Number of entries'''. |
− | | | ||
− | | '''Number of entries''' | ||
|- | |- | ||
− | | | + | | 0x14 || colspan=2 {{unknown|End of TXT2 header}} |
− | | colspan=2 {{unknown|End of TXT2 header}} | ||
|} | |} | ||
− | == | + | After the TXT2 header, there are four bytes for each entry, containing the offset to the UTF16 string. This UTF16 string can contain special formatting bytes, which have an 8-byte size and start with <code>0x0E00</code>. This is used to give text a specific (usually red) colour, or to display an icon of a button (E.g. the "A" button present on controllers, or the Amiibo scan icon present on the Wii U gamepad). |
+ | |||
+ | == Tools == | ||
+ | The following tool can handle MSBT files: | ||
+ | * [https://github.com/IcySon55/3DLandMSBTeditor/releases/tag/v0.9.7 MSBT Editor Reloaded], by [[User:IcySon55|IcySon55]] | ||
− | + | [[Category:File Format]] |
Latest revision as of 15:11, 28 January 2024
MSBT files contains the game's text. The files have been used in many different games on the Wii, 3DS and Wii U. In Mario Kart 8 the file has a main header (MSBT) and two sections with their own headers (NLI1 and TXT2). Each section is padded to the next multiple of 0x10 using a sequence of 0xAB
bytes.
Header
The MSBT file format starts with a header structure.
Offset | Type | Description |
---|---|---|
0x00 | String | File magic. Always MsgStdBn in ASCII. |
0x08 | UInt16 | Byte Order Mark (BOM): 0xFEFF for big endian and 0xFFFE for little endian. |
0x0A | UInt16 | Unknown. Always 0x0000. |
0x0C | UInt16 | Unknown. Always 0x0103. |
0x0E | UInt16 | Number of sections. |
0x10 | UInt16 | Unknown. Always 0x0000. |
0x12 | UInt32 | File size. |
0x16 | Byte[10] | Unknown. Always 0. |
0x20 | End of file header |
NLI1
The NLI1 section starts with a section header.
Offset | Type | Description |
---|---|---|
0x00 | String | Section magic. Always NLI1 in ASCII. |
0x04 | UInt32 | Section size (starting from 0x10). |
0x08 | Byte[8] | Unknown. Always 0. |
0x10 | UInt32 | Number of entries. |
0x14 | End of NLI1 header |
After the header comes the entries. Each entry has the following structure:
Offset | Type | Description |
---|---|---|
0x00 | UInt32 | Message index. The game uses this value as a key to find the relevant string. |
0x04 | UInt32 | Index into the TXT2 strings. |
TXT2
The TXT2 section starts with a header.
Offset | Type | Description |
---|---|---|
0x00 | String | Section magic. Always TXT2 in ASCII. |
0x04 | UInt32 | Section size (starting from 0x10). |
0x08 | Byte[8] | Unknown. Always 0. |
0x10 | UInt32 | Number of entries. |
0x14 | End of TXT2 header |
After the TXT2 header, there are four bytes for each entry, containing the offset to the UTF16 string. This UTF16 string can contain special formatting bytes, which have an 8-byte size and start with 0x0E00
. This is used to give text a specific (usually red) colour, or to display an icon of a button (E.g. the "A" button present on controllers, or the Amiibo scan icon present on the Wii U gamepad).
Tools
The following tool can handle MSBT files: