Msbt: Difference between revisions
imported>Zephenryus (Added msbt File Specification) |
imported>Zephenryus m (Added categories and fixed italics) |
||
Line 5: | Line 5: | ||
== msbt File Layout == | == msbt File Layout == | ||
msbt files are made up of four sections that are aligned to 16-bytes. | msbt files are made up of four sections that are aligned to 16-bytes. | ||
* Header | * Header | ||
* Labels | * Labels | ||
Line 16: | Line 14: | ||
=== Header Structure === | === Header Structure === | ||
{| class="wikitable" | {| class="wikitable" | ||
!Offset (h) | !Offset (h) | ||
Line 65: | Line 62: | ||
== Labels Section == | == Labels Section == | ||
The labels section has a header followed by an offset table and finally a string table with meta data regarding the later text section. | The labels section has a header followed by an offset table and finally a string table with meta data regarding the later text section. | ||
=== Labels Section Header === | === Labels Section Header === | ||
The section header includes a signature, table size and padding making the header 16 bytes. Table size is relative to the end of the section header. | The section header includes a signature, table size and padding making the header 16 bytes. Table size is relative to the end of the section header. | ||
{| class="wikitable" | {| class="wikitable" | ||
!Offset (h) | !Offset (h) | ||
Line 95: | Line 89: | ||
=== Labels Section Offset Table === | === Labels Section Offset Table === | ||
Offsets in the offset table are relative to the end of the Labels Section Header (byte `0x10`). The offset table length is defined in the first four bytes of the table. | Offsets in the offset table are relative to the end of the Labels Section Header (byte `0x10`). The offset table length is defined in the first four bytes of the table. | ||
{| class="wikitable" | {| class="wikitable" | ||
!Offset (h) | !Offset (h) | ||
Line 109: | Line 101: | ||
| Offset count | | Offset count | ||
|} | |} | ||
Each entry in the offset table is 8 bytes. 4 bytes indicating the number of null-terminated strings at the offset and an offset relative to the beginning of the offset table. | Each entry in the offset table is 8 bytes. 4 bytes indicating the number of null-terminated strings at the offset and an offset relative to the beginning of the offset table. | ||
{| class="wikitable" | {| class="wikitable" | ||
!Offset (h) | !Offset (h) | ||
Line 130: | Line 120: | ||
=== Labels Section String Table === | === Labels Section String Table === | ||
The labels can be determined by iterating through the offset table and reading the number of null-terminated strings from the address. The first byte at the offset indicates the size of the label. One label can contain ''zero'' or more null-terminated strings but will not exceed the indicated total length. | |||
The labels can be determined by iterating through the offset table and reading the number of null-terminated strings from the address. The first byte at the offset indicates the size of the label. One label can contain | |||
After each null-terminated string, there are 4 bytes indicating which index in the texts table this label corresponds to. See the text table section for more information. | After each null-terminated string, there are 4 bytes indicating which index in the texts table this label corresponds to. See the text table section for more information. | ||
{| class="wikitable" | {| class="wikitable" | ||
!Offset (h) | !Offset (h) | ||
Line 147: | Line 135: | ||
|- | |- | ||
| 0x01 | | 0x01 | ||
| | | ''n'' | ||
| char[ | | char[''n''] | ||
| String count number of null-terminated strings<ref>A label can contain | | String count number of null-terminated strings<ref>A label can contain ''zero'' or more null-terminated strings</ref> | ||
|- | |- | ||
| 0xnn | | 0xnn | ||
Line 158: | Line 146: | ||
== Attributes Section == | == Attributes Section == | ||
Attributes are not fully understood at this time. The attribute seem to indicate which actor should be attributed with the dialog (A good example is in <code>100enemy.msbt</code> where <code>NPC_GodVoice</code> is referenced). | Attributes are not fully understood at this time. The attribute seem to indicate which actor should be attributed with the dialog (A good example is in <code>100enemy.msbt</code> where <code>NPC_GodVoice</code> is referenced). | ||
Line 164: | Line 151: | ||
=== Attributes Section Header === | === Attributes Section Header === | ||
The section header includes a signature, table size and padding making the header 16 bytes. Table size is relative to the end of the section header. | The section header includes a signature, table size and padding making the header 16 bytes. Table size is relative to the end of the section header. | ||
{| class="wikitable" | {| class="wikitable" | ||
!Offset (h) | !Offset (h) | ||
Line 190: | Line 175: | ||
=== Attributes Section Offset Table === | === Attributes Section Offset Table === | ||
Offsets in the offset table are relative to the end of the Attributes Section Header (byte <code>0x10</code>). The first 4 bytes of the table are the number of offsets and the second 4 bytes indicate the size of each offset (or table entry) in bytes. | Offsets in the offset table are relative to the end of the Attributes Section Header (byte <code>0x10</code>). The first 4 bytes of the table are the number of offsets and the second 4 bytes indicate the size of each offset (or table entry) in bytes. | ||
{| class="wikitable" | {| class="wikitable" | ||
!Offset (h) | !Offset (h) | ||
Line 209: | Line 192: | ||
| Attribute data size | | Attribute data size | ||
|} | |} | ||
Each entry in the offset table is a 4-byte relative offset from the beginning of the table. | Each entry in the offset table is a 4-byte relative offset from the beginning of the table. | ||
{| class="wikitable" | {| class="wikitable" | ||
!Offset (h) | !Offset (h) | ||
Line 225: | Line 206: | ||
=== Attributes Section String Table === | === Attributes Section String Table === | ||
The attributes can be determined by iterating through the offset table and a null-terminated string from the address. Strings in this table are UTF-16 (Wii U files are UTF-16-BE encoded) encoded and take up 2 bytes for each character. Strings are terminated with a UTF-16 null character <code>00 00</code> or <code>\u0000</code>. | The attributes can be determined by iterating through the offset table and a null-terminated string from the address. Strings in this table are UTF-16 (Wii U files are UTF-16-BE encoded) encoded and take up 2 bytes for each character. Strings are terminated with a UTF-16 null character <code>00 00</code> or <code>\u0000</code>. | ||
{| class="wikitable" | {| class="wikitable" | ||
!Offset (h) | !Offset (h) | ||
Line 235: | Line 214: | ||
|- | |- | ||
| 0x00 | | 0x00 | ||
| | | ''n'' | ||
| char[2] | | char[2] | ||
| Unicode character | | Unicode character | ||
Line 241: | Line 220: | ||
== Texts Section == | == Texts Section == | ||
The text section contains a table of strings. | The text section contains a table of strings. | ||
=== Texts Section Header === | === Texts Section Header === | ||
The section header includes a signature, table size and padding making the header 16 bytes. Table size is relative to the end of the section header. | The section header includes a signature, table size and padding making the header 16 bytes. Table size is relative to the end of the section header. | ||
{| class="wikitable" | {| class="wikitable" | ||
!Offset (h) | !Offset (h) | ||
Line 271: | Line 247: | ||
=== Texts Section Offset Table === | === Texts Section Offset Table === | ||
Offsets in the offset table are relative to the end of the Texts Section Header (byte `0x10`). The offset table length is defined in the first four bytes of the table. | Offsets in the offset table are relative to the end of the Texts Section Header (byte `0x10`). The offset table length is defined in the first four bytes of the table. | ||
{| class="wikitable" | {| class="wikitable" | ||
!Offset (h) | !Offset (h) | ||
Line 285: | Line 259: | ||
| Offset count | | Offset count | ||
|} | |} | ||
Each entry in the offset table is a 4-byte relative offset from the beginning of the table. | Each entry in the offset table is a 4-byte relative offset from the beginning of the table. | ||
{| class="wikitable" | {| class="wikitable" | ||
!Offset (h) | !Offset (h) | ||
Line 301: | Line 273: | ||
=== Texts Section String Table === | === Texts Section String Table === | ||
The attributes can be determined by iterating through the offset table. Strings in this table are UTF-16 (Wii U files are UTF-16-BE encoded) encoded and take up 2 bytes for each character. | The attributes can be determined by iterating through the offset table. Strings in this table are UTF-16 (Wii U files are UTF-16-BE encoded) encoded and take up 2 bytes for each character. | ||
String length is determined by reading until the next offset in the table and not exceeding the end of the file. Strings cannot be read as null-terminated strings since many strings will have multiple null characters in them. | String length is determined by reading until the next offset in the table and not exceeding the end of the file. Strings cannot be read as null-terminated strings since many strings will have multiple null characters in them. | ||
{| class="wikitable" | {| class="wikitable" | ||
!Offset (h) | !Offset (h) | ||
Line 313: | Line 283: | ||
|- | |- | ||
| 0x00 | | 0x00 | ||
| | | ''n'' | ||
| char[2] | | char[2] | ||
| Unicode character | | Unicode character | ||
Line 319: | Line 289: | ||
=== Text Commands === | === Text Commands === | ||
Some string include interpolation operators or commands within the strings. These commands tell the game to behave in a certain way while displaying the string. Commands include choices, selling items, buying items and interacting with objects. | Some string include interpolation operators or commands within the strings. These commands tell the game to behave in a certain way while displaying the string. Commands include choices, selling items, buying items and interacting with objects. | ||
Commands are indicated in the strings with <code>00 0e</code> or <code>\u000e</code>. | Commands are indicated in the strings with <code>00 0e</code> or <code>\u000e</code>. | ||
{| class="wikitable" | {| class="wikitable" | ||
!Offset (h) | !Offset (h) | ||
Line 340: | Line 308: | ||
| Command type | | Command type | ||
|} | |} | ||
For example, in <code>100enemy.msbt</code> the following data appears: | For example, in <code>100enemy.msbt</code> the following data appears: | ||
<pre> | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | | <pre> | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | | ||
---|-------------------------------------------------|------------------| | ---|-------------------------------------------------|------------------| | ||
Line 355: | Line 320: | ||
70 | 00 02 00 03 00 04 00 05 02 03 00 00 | ............ | | 70 | 00 02 00 03 00 04 00 05 02 03 00 00 | ............ | | ||
</pre> | </pre> | ||
At byte <code>0x68</code> is the command indicator followed by the type of <code>1</code>. Command types of <code>1</code> seem to be variable length. The type (in this instance) is followed by the number of additional Unsigned Shorts <code>6</code> and 6 shorts. | At byte <code>0x68</code> is the command indicator followed by the type of <code>1</code>. Command types of <code>1</code> seem to be variable length. The type (in this instance) is followed by the number of additional Unsigned Shorts <code>6</code> and 6 shorts. | ||
Line 361: | Line 325: | ||
The commands are not fully understood at this time, but below is a list of the known command identifiers and variable counts. | The commands are not fully understood at this time, but below is a list of the known command identifiers and variable counts. | ||
{| class="wikitable" | {| class="wikitable" | ||
!Type | !Type | ||
Line 372: | Line 335: | ||
|- | |- | ||
| 1 | | 1 | ||
| | | ''n'' | ||
| Variable length. Length is the unsigned short following the type. | | Variable length. Length is the unsigned short following the type. | ||
|- | |- | ||
Line 393: | Line 356: | ||
== Compiling the Sections == | == Compiling the Sections == | ||
The sections are held together by the indexes in the labels table. The indexes correspond to the attributes table and the texts table. The data can be compiled using the index. | The sections are held together by the indexes in the labels table. The indexes correspond to the attributes table and the texts table. The data can be compiled using the index. | ||
By default the indexes in the labels table are not in order, but the text table is (and possibly the attributes table). Below is the labels table in <code>100enemy.msbt</code>. | By default the indexes in the labels table are not in order, but the text table is (and possibly the attributes table). Below is the labels table in <code>100enemy.msbt</code>. | ||
{| class="wikitable" | {| class="wikitable" | ||
!String Count | !String Count | ||
Line 519: | Line 480: | ||
| 2 | | 2 | ||
|} | |} | ||
And the texts table. | And the texts table. | ||
{| class="wikitable" | {| class="wikitable" | ||
!Index | !Index | ||
Line 562: | Line 521: | ||
| Cancel | | Cancel | ||
|} | |} | ||
Using the indexes to match the labels to the attributes and texts tables, the following table can be compiled. | Using the indexes to match the labels to the attributes and texts tables, the following table can be compiled. | ||
The empty labels are not fully understood. | The empty labels are not fully understood. | ||
{| class="wikitable" | {| class="wikitable" | ||
!Label | !Label | ||
Line 633: | Line 590: | ||
| Cancel | | Cancel | ||
|} | |} | ||
The attribute table is still not fully understood. In this example, there are 8 attribute entries in the table, but they correctly map to the 8 blocks of dialog. | The attribute table is still not fully understood. In this example, there are 8 attribute entries in the table, but they correctly map to the 8 blocks of dialog. | ||
[[Category:File extensions]] | |||
[[Category:File extensions (MSBT)]] | |||
<references /> |
Revision as of 05:48, 4 October 2018
msbt
files are message standard binary files. These files define how text is displayed and interacted with by the player.
msbt File Layout
msbt files are made up of four sections that are aligned to 16-bytes.
- Header
- Labels
- Attributes
- Texts
msbt Header
Header Structure
Offset (h) | Size | Data Type | Description |
---|---|---|---|
0x00 | 8 | String | msbt file signature (magic) 4D 73 67 53 74 64 42 6E or "MsgStdBn"
|
0x08 | 2 | Unsigned Short | Byte-Order Marker |
0x0a | 2 | Unknown (padding?) | |
0x0c | 2 | Unsigned Short | Version? 1.3? |
0x0e | 2 | Unsigned Short | Section Count? |
0x10 | 2 | Padding? | |
0x12 | 4 | Unsigned Int | File Size |
0x16 | 10 | Padding? |
Labels Section
The labels section has a header followed by an offset table and finally a string table with meta data regarding the later text section.
Labels Section Header
The section header includes a signature, table size and padding making the header 16 bytes. Table size is relative to the end of the section header.
Offset (h) | Size | Data Type | Description |
---|---|---|---|
0x00 | 4 | Unsigned Int | Signature (magic) 4C 42 4C 31 or "LBL1"
|
0x04 | 4 | Unsigned Int | Table size |
0x08 | 8 | Padding |
Labels Section Offset Table
Offsets in the offset table are relative to the end of the Labels Section Header (byte `0x10`). The offset table length is defined in the first four bytes of the table.
Offset (h) | Size | Data Type | Description |
---|---|---|---|
0x00 | 4 | Unsigned Int | Offset count |
Each entry in the offset table is 8 bytes. 4 bytes indicating the number of null-terminated strings at the offset and an offset relative to the beginning of the offset table.
Offset (h) | Size | Data Type | Description |
---|---|---|---|
0x00 | 4 | Unsigned Int | String count |
0x04 | 4 | Unsigned Int | String offset |
Labels Section String Table
The labels can be determined by iterating through the offset table and reading the number of null-terminated strings from the address. The first byte at the offset indicates the size of the label. One label can contain zero or more null-terminated strings but will not exceed the indicated total length.
After each null-terminated string, there are 4 bytes indicating which index in the texts table this label corresponds to. See the text table section for more information.
Offset (h) | Size | Data Type | Description |
---|---|---|---|
0x00 | 1 | Unsigned Byte | String length |
0x01 | n | char[n] | String count number of null-terminated strings[1] |
0xnn | 4 | Unsigned Int | String Table Index |
Attributes Section
Attributes are not fully understood at this time. The attribute seem to indicate which actor should be attributed with the dialog (A good example is in 100enemy.msbt
where NPC_GodVoice
is referenced).
The attributes seem to correspond to an entry in the text table with the same table index, since the attribute and text tables are usually the same size[2].
Attributes Section Header
The section header includes a signature, table size and padding making the header 16 bytes. Table size is relative to the end of the section header.
Offset (h) | Size | Data Type | Description |
---|---|---|---|
0x00 | 4 | Unsigned Int | Signature (magic) 41 54 52 31 or "ATR1"
|
0x04 | 4 | Unsigned Int | Table size |
0x08 | 8 | Padding |
Attributes Section Offset Table
Offsets in the offset table are relative to the end of the Attributes Section Header (byte 0x10
). The first 4 bytes of the table are the number of offsets and the second 4 bytes indicate the size of each offset (or table entry) in bytes.
Offset (h) | Size | Data Type | Description |
---|---|---|---|
0x00 | 4 | Unsigned Int | Offset count |
0x04 | 4 | Unsigned Int | Attribute data size |
Each entry in the offset table is a 4-byte relative offset from the beginning of the table.
Offset (h) | Size | Data Type | Description |
---|---|---|---|
0x00 | 4 | Unsigned Int | Attribute offset |
Attributes Section String Table
The attributes can be determined by iterating through the offset table and a null-terminated string from the address. Strings in this table are UTF-16 (Wii U files are UTF-16-BE encoded) encoded and take up 2 bytes for each character. Strings are terminated with a UTF-16 null character 00 00
or \u0000
.
Offset (h) | Size | Data Type | Description |
---|---|---|---|
0x00 | n | char[2] | Unicode character |
Texts Section
The text section contains a table of strings.
Texts Section Header
The section header includes a signature, table size and padding making the header 16 bytes. Table size is relative to the end of the section header.
Offset (h) | Size | Data Type | Description |
---|---|---|---|
0x00 | 4 | Unsigned Int | Signature (magic) 54 58 54 32 or "TXT2"
|
0x04 | 4 | Unsigned Int | Table size |
0x08 | 8 | Padding |
Texts Section Offset Table
Offsets in the offset table are relative to the end of the Texts Section Header (byte `0x10`). The offset table length is defined in the first four bytes of the table.
Offset (h) | Size | Data Type | Description |
---|---|---|---|
0x00 | 4 | Unsigned Int | Offset count |
Each entry in the offset table is a 4-byte relative offset from the beginning of the table.
Offset (h) | Size | Data Type | Description |
---|---|---|---|
0x00 | 4 | Unsigned Int | String offset |
Texts Section String Table
The attributes can be determined by iterating through the offset table. Strings in this table are UTF-16 (Wii U files are UTF-16-BE encoded) encoded and take up 2 bytes for each character.
String length is determined by reading until the next offset in the table and not exceeding the end of the file. Strings cannot be read as null-terminated strings since many strings will have multiple null characters in them.
Offset (h) | Size | Data Type | Description |
---|---|---|---|
0x00 | n | char[2] | Unicode character |
Text Commands
Some string include interpolation operators or commands within the strings. These commands tell the game to behave in a certain way while displaying the string. Commands include choices, selling items, buying items and interacting with objects.
Commands are indicated in the strings with 00 0e
or \u000e
.
Offset (h) | Size | Data Type | Description |
---|---|---|---|
0x00 | 2 | Unsigned Short | Indicator 00 0e
|
0x02 | 2 | Unsigned Short | Command type |
For example, in 100enemy.msbt
the following data appears:
| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ---|-------------------------------------------------|------------------| 00 | 00 57 00 68 00 69 00 63 00 68 00 20 00 70 00 61 | .W.h.i.c.h. .p.a | 10 | 00 72 00 74 00 20 00 6F 00 66 00 20 00 74 00 68 | .r.t. .o.f. .t.h | 20 | 00 65 00 20 00 54 00 72 00 69 00 61 00 6C 00 20 | .e. .T.r.i.a.l. | 30 | 00 77 00 6F 00 75 00 6C 00 64 00 20 00 79 00 6F | .w.o.u.l.d. .y.o | 40 | 00 75 00 0A 00 6C 00 69 00 6B 00 65 00 20 00 74 | .u...l.i.k.e. .t | 50 | 00 6F 00 20 00 63 00 68 00 61 00 6C 00 6C 00 65 | .o. .c.h.a.l.l.e | 60 | 00 6E 00 67 00 65 00 3F 00 0E 00 01 00 06 00 0A | .n.g.e.?........ | 70 | 00 02 00 03 00 04 00 05 02 03 00 00 | ............ |
At byte 0x68
is the command indicator followed by the type of 1
. Command types of 1
seem to be variable length. The type (in this instance) is followed by the number of additional Unsigned Shorts 6
and 6 shorts.
[00 0A] [00 02] [00 03] [00 04] [00 05] [02 03]
The commands are not fully understood at this time, but below is a list of the known command identifiers and variable counts.
Type | Additional Bytes | Notes |
---|---|---|
0 | 3 | |
1 | n | Variable length. Length is the unsigned short following the type. |
2 | 2 | |
3 | 3 | |
4 | 3 | Often end with XX CD
|
5 | 2 | Seem to always end with a line-feed character 00 0A
|
Compiling the Sections
The sections are held together by the indexes in the labels table. The indexes correspond to the attributes table and the texts table. The data can be compiled using the index.
By default the indexes in the labels table are not in order, but the text table is (and possibly the attributes table). Below is the labels table in 100enemy.msbt
.
String Count | Offset | Label | Index |
---|---|---|---|
1 | 188 | talk20 | 3 |
0 | 188 | ||
0 | 188 | ||
0 | 188 | ||
0 | 188 | ||
0 | 188 | ||
0 | 188 | ||
0 | 188 | ||
0 | 188 | ||
0 | 188 | ||
0 | 188 | ||
1 | 199 | 0002 | 8 |
1 | 208 | 0003 | 9 |
1 | 217 | 0004 | 10 |
1 | 226 | 0005 | 11 |
1 | 235 | talk13 | 4 |
0 | 235 | ||
1 | 246 | talk14 | 5 |
1 | 257 | talk15 | 6 |
1 | 268 | talk16 | 7 |
1 | 279 | talk17 | 0 |
1 | 290 | talk18 | 1 |
1 | 301 | talk19 | 2 |
And the texts table.
Index | Text |
---|---|
0 | Which part of the Trial would you like to challenge? |
1 | Which part of the Trial would you like to challenge? |
2 | Which part of the Trial would you like to challenge? |
3 | You cannot participate in the Trial when the Master Sword is out of energy. |
4 | That sword you have reunited with... the Master Sword...it has yet to realize its true splendor. The trial that will awaken its true power... If you wish to rise to the challenge, place the Master Sword in its pedestal. |
5 | The Master Sword you wield is now more powerful than before. If you desire still more power and wish to retry the blade's test... once again place the Master Sword in its pedestal |
6 | Now your body, mind, and soul are ready to wield the Master Sword at its full potential. But do not let your guard down. Just as before, if you use your sword to excess, it will run out of energy and become unusable until it recovers. It would be reckless to rely only on your blade when facing Ganon. Prepare for the worst, and consider freeing the Divine Beasts before confronting your fate. Her smile... The princess's sweet smile... How I would love to see it once more.. |
7 | Now your body, mind, and soul are ready to wield the Master Sword at its full potential. But do not let your guard down. Just as before, if you use your sword to excess, it will run out of energy and become unusable until it recovers. That blade is more than a tool. It is your partner across time, your ally from 100 years past... Wield it with care. Her smile... The princess's sweet smile...How I would love to see it once more... |
8 | Beginning Trials |
9 | Middle Trials |
10 | Final Trials |
11 | Cancel |
Using the indexes to match the labels to the attributes and texts tables, the following table can be compiled.
The empty labels are not fully understood.
Label | Index | Attribute | Text |
---|---|---|---|
talk17 | 0 | NPC_GodVoice | Which part of the Trial would you like to challenge? |
talk18 | 1 | NPC_GodVoice | Which part of the Trial would you like to challenge? |
talk19 | 2 | NPC_GodVoice | Which part of the Trial would you like to challenge? |
talk20 | 3 | NPC_GodVoice | You cannot participate in the Trial when the Master Sword is out of energy. |
talk13 | 4 | TwnObj_Village_Korok_DekuTree_A_01 | That sword you have reunited with... the Master Sword...it has yet to realize its true splendor. The trial that will awaken its true power... If you wish to rise to the challenge, place the Master Sword in its pedestal. |
talk14 | 5 | TwnObj_Village_Korok_DekuTree_A_01 | The Master Sword you wield is now more powerful than before. If you desire still more power and wish to retry the blade's test... once again place the Master Sword in its pedestal |
talk15 | 6 | TwnObj_Village_Korok_DekuTree_A_01 | Now your body, mind, and soul are ready to wield the Master Sword at its full potential. But do not let your guard down. Just as before, if you use your sword to excess, it will run out of energy and become unusable until it recovers. It would be reckless to rely only on your blade when facing Ganon. Prepare for the worst, and consider freeing the Divine Beasts before confronting your fate. Her smile... The princess's sweet smile... How I would love to see it once more... |
talk16 | 7 | TwnObj_Village_Korok_DekuTree_A_01 | Now your body, mind, and soul are ready to wield the Master Sword at its full potential. But do not let your guard down. Just as before, if you use your sword to excess, it will run out of energy and become unusable until it recovers. That blade is more than a tool. It is your partner across time, your ally from 100 years past... Wield it with care. Her smile... The princess's sweet smile...How I would love to see it once more... |
0002 | 8 | Beginning Trials | |
0003 | 9 | Middle Trials | |
0004 | 10 | Final Trials | |
0005 | 11 | Cancel |
The attribute table is still not fully understood. In this example, there are 8 attribute entries in the table, but they correctly map to the 8 blocks of dialog.