TP:BMG
This page details how Twilight Princess extends the BMG format to handle all of its text needs, particularly message attributes and tags. For information on how the BMG file format works in general, see the main page on the subject.
Contents
Message Attributes
To do: Figure out more about the message attributes, which likely requires decomp advancements to do sanely. Also more completely catalog how the various style/position attributes interact with each other; they've only been independently tested on "standard" messages so far. And the camera position values. |
Twilight Princess defines 16 bytes of attribute data for every BMG file except zel_unit.bmg
, which is used for a different purpose than other BMG files. These attributes are laid out as follows:
Offset | Size | Meaning |
---|---|---|
0x00 | 2 | Message ID, identical to the one it has been assigned in the MID1 section. These two occurrences of the ID must be kept synchronized for correct operation. |
0x02 | 2 | Unknown |
0x04 | 1 | Uncertain, seems to affect what sound is played as text is being printed (aka the "blips"), as well as what kind of efforts byte 0x0A is allowed to choose. Additionally, valid values appear to depend on some external context. |
0x05 | 1 | Display Style. Affects broadly how the message is displayed on screen, though some values only have their intended function in specific contexts. Valid values are listed further below. |
0x06 | 1 | Printing Style. Affects how text is printed on screen, though some values only have their intended function in specific contexts. Valid values are listed further below. |
0x07 | 1 | Determines where the message area is positioned on screen. Valid values are listed further below. |
0x08 | 1 | Unknown, appears to be some kind of item ID, but trying to set an icon for the Get Item message box style through this doesn't work, so some other external context enables the selection of item icons for those messages. |
0x09 | 1 | Unknown, set to 0x01 for every single Get Item message except the one for a completely filled Vessel of Light. Additionally set on messages for bugs you've already caught, and rupees you can't fit in your wallet. Otherwise zero.
|
0x0A | 1 | Uncertain, seems to determine what effort (indistinct bit of speech/grunting a character does) plays at the start of printing. Affected by byte 0x04 and other external context. |
0x0B | 1 | Determines where the camera is located. Values uncertain. |
0x0C | 4 | Unknown |
Display Style
This attribute determines how the message is to be displayed on screen (for example, is it text on a sign, or the place name showing up in the corner of the screen as you enter the area?). Some of these values are set aside to indicate something about appearance in a very specific context, and for "standard" messages — those which appear as character dialogue, the vast majority of messages — they don't have a well-defined effect.
The values for this attribute that Twilight Princess accepts are:
Value | Meaning |
---|---|
0x00 | Standard dialogue box; dark background, white text, allows for typewriter text. |
0x01 | No background behind text, so it's drawn directly on the rendered 3D image. |
0x02 | Fullscreen sign board background, forces instant text. |
0x05 | Visually the same as 0x01 for standard messages. Used for the Ordon light spirit's "cutscene" dialogue (spoken over scenes of the world be overrun), the Cannon Manual, as well as one system message, and several voiceless messages. |
0x07 | No background, centered text, raised a bit compared to the normal bottom positioning. Used exclusively for credits. |
0x08 | Similar to 0x00, but the glow effect around the text starts out huge around each piece of text printed. |
0x09 | Get Item text box. Defaults to the bow icon unless conditions are right for displaying a chosen icon. |
0x0B | Looks like standard dialogue box when used in standard messages. Used exclusively on item names and item descriptions. |
0x0C | Header box, positioned at the top left of the screen with a unique font. Used to introduce newly-entered areas and hidden skills demos. |
0x0D | Like 0x00, but the default text color is a bright blue. Used for Midna's dialogue. |
0x0E | Like 0x00, but the default text color is a vibrant green. Used for animals when they talk to Wolf Link. |
0x0F | Like 0x00, but text is forced instant, and the box fades in with the text. Seems to only be used with non-modal messages (e.g. "Your hot water has cooled"). |
0x10 | Seemingly same as 0x0F. Used for system messages (e.g. "Checking the memory card"). |
0x11 | Wolf song interface. Does nothing, at least when accessed as human. UI text provided by message body in the one message this type is used. |
0x13 | No background, centered text, font like 0x0C. Used on messages introducing a boss's name and title. |
Printing Style
This attribute controls how text is printed on the screen. This includes things like whether the text pops up instantly or typewriter style, and the speed of typing. Acceptable attributes are:
Value | Meaning |
---|---|
0x00 | Typewriter text by default, can be overridden by display style or tags, player can skip text. |
0x01 | Forced instant text, player can skip printing. |
0x02 | Like 0x00, but disable print skipping. |
0x03 | Like 0x01, but first box's text fades in if not skipped. |
0x04 | Like 0x00, but disables the {instant} tag (forced instant still possible by display style), disables print skipping.
|
0x05 | Like 0x00, but typing is slow (roughly 5x slower). |
0x06 | Appears to behave like 0x00 exactly. Only used in one message. |
0x07 | Appears to behave like 0x04 exactly. Used on some UI prompt messages. Decomp suggests it tells UI code to emphasize the text. |
0x09 | Appears to behave like 0x03 exactly. Used on Ordon spirit "cutscene" messages, and staff credits messages. |
Message Area Position
This attribute determines where to place the message area on screen, assuming that such at thing can be controlled for this message. For the standard display style at least, the accepted values have the following listed effects, along with notes on where the more unusual options do get used:
Value | Meaning |
---|---|
0x00 | At the bottom of the screen. |
0x01 | At the top of the screen. |
0x02 | In the center of the screen. |
0x03 | Seemingly the same as 0x00. Seems to be used exclusively for message surrounding the Ordon mayor, including sumo wrestling him in particular. |
0x05 | Seemingly the same as 0x00. Used on system and voiceless messages, as well as the Cannon Manual. |
Tags
This section describes all of the tags that Twilight Princess defines for use in text. These tags are divided up into tag groups by the game, which roughly organizes them by function. Each tag's group and number is presented as group/number
, with both numbers implicitly hexadecimal, and is also presented with a descriptive name to make them easier to identify. If a tag has any parameters, they are presented in the order they are stored in the tag's payload, with descriptive names and standard C types. (As with the rest of the BMG format, all multibyte values are big-endian.) Any parameters that are an array of values are represented in the usual way for a C array, e.g. uint16_t stuff[]
, pretending for a moment that C arrays can be passed by value like this in real C code.
A lot of the following text will describe tags in relation to others; to do this those other tags are referred to by their name as {name}
. Arguments to a tag being discussed in such a way are omitted for brevity unless the specific arguments used matter, in which case they'll be illustrated as {name arg1 arg2}
.
Tag Group 00
This group appears to be a general-purpose group, perhaps indicating that there was initially just one group defined by the game. This group contains tags for inserting special glyphs or strings, controlling how text is displayed to the player, and prompts for players to make some sort of decision. Since this group has these different kinds of features, they have been further subdivided below to present them in a clearer and more organized fashion.
Control Tags
These tags affect how the game prints text in a single box of a message, or how the game advances past the current box (whether it's to the next box in the message, or to end the message).
Tag ID | Name | Arguments | Explanation |
---|---|---|---|
00/0001 | instant | none | Causes all following text in the message to be printed instantaneously, until a {type} tag is encountered. This tag may be disabled in certain messages, depending on message attributes and other context.
|
00/0002 | type | none | Causes all following text in the message to be printed typewriter-style, where individual parts of the text are displayed one-at-a-time. Stops when a {instant} tag is encountered. This tag may be disabled depending on the message's attributes and other context; in those cases, text is described as being "forced instant".
|
00/0004 | autobox | uint16_t frame_count
|
If encountered anywhere within a particular box's text, advancement past the box is entirely automated and out of the player's hands. While the player can skip typing (tell the game to print all box text instantly), the game will wait frame_count frames after all box text is printed before automatically moving past this box. Does not effect any box beyond the one it occurs in.
|
00/0005 | boxatmost | uint16_t frame_count
|
If encountered anywhere within a particular box's text, it sets a time limit on how long the box can be on screen. Player may skip typing, but in any case once all text in the box has been printed, the box will be advanced after frame_count frames. The player may advance the box themselves if desired, so in effect this tag says "the box may be on screen for at most frame_count frames", hence the name given to this tag. Has no effect on other boxes of the message.
|
00/0007 | pause | uint16_t frame_count
|
Tells the game to pause typing for frame_count frames, after which printing continues as normal. Has no effect in instant text, including when the player skips typing.
|
00/0020 | softnl | none | Purpose unclear. A newline character always introduces a new line of text, starting a new box if the current one has run out of lines. New boxes are made even if no more text appears after the newline, leading to a blank box. This tag avoids generating a blank box, but otherwise appears to behave exactly like a newline character. In the game, question messages (see Input Tags) seem to always end with a {softnl} , which indicates that this tag may not be intended as a "soft newline" at all. However, its true purpose is currently unknown.
|
00/0021 | nop000021 | none | Purpose unknown. Only ever used ahead of ellipses followed by Link's name; in other words, only ever occurs as part of the phrase {nop000021}...{link} . Has no clear visible effect.
|
00/0026 | acknowledge | none | Waits for the player to press a button before continuing to print text. If you happen to place this at the very end of a box, the input to get past this tag is separate from the input to advance the box. Not present in the GCN US text, only present in what appears to be a test message in the GCN JP text. |
00/0028 | odd-boxatleast | uint32_t frame_count
|
Appears to function like {boxatleast} , but is inconsistent with the timing on repeat viewings in a message outside of cutscenes (the length of time is still, however, dependent on frame_count in some way, as it was a length of time of some sort). Only ever used in the Ordon spirit's speech, specifically in the messages used during the depiction of Hyrule being taken over by Twilight.
|
00/0036 | boxatleast | uint16_t frame_count
|
If it occurs anywhere in a particular box's text, then enforces a minimum amount of time on screen for the box. The player is allowed to skip typing, but cannot advance past the box until frame_count frames after all the box's text has been printed. Since the player is required to advance past the box, this tag essentially says "this box must be on screen for at least frame_count frames", hence the name given to this tag. This tag has no effect on any box besides the one it is in.
|
Input Tags
These tags ask for some kind of input from the player. Most of these tags are for multiple-choice questions, though there is one for paying a chosen amount of money.
Tag ID | Name | Arguments | Explanation |
---|---|---|---|
00/0008 | oneof2 | uint8_t choice
|
Prefaces the text of an option button for a two-option choice. These buttons are displayed above and to the right of the message area (at least when the message area is at the bottom of the screen). All text before the first {oneof2} is treated as normal, except for preceding text on the same line as that tag. The option's text consists of everything immediately after the tag, up to the next option's tag or the end of the message, whichever is first. A choice of 0x01 indicates the default option; otherwise the choice has no effect on message display. More details on this tag are below.
|
00/0009 | oneof3 | uint8_t choice
|
Prefaces the text of an option button for a three-option choice. These buttons are displayed above and to the right of the message area (at least when the message area is at the bottom of the screen). All text before the first {oneof3} is treated as normal, except for preceding text on the same line as that tag. The option's text consists of everything immediately after the tag, up to the next option's tag or the end of the message, whichever is first. A choice of 0x01 indicates the default option; otherwise the choice has no effect on message display. More details on this tag are below.
|
00/001E | inline-two-next | uint8_t value
|
Provides a blank space in text for the non-default option of an inlined two-option choice. This space will contain a red right arrow when selected by the player, and otherwise be blank. Meant to come before text describing the option. value has no effect on message display. See below for more details on this tag.
|
00/001F | inline-two-first | uint8_t value
|
Just like {inline-two-next} , but indicates the default option (and thus where the red right arrow will initially appear). value has no effect on message display. See below for more details on this tag.
|
00/0025 | payment | uint32_t dst
|
Provides a prompt where players enter in an amount of rupees they'll pay to dst . This tag must be in the last box of the message; if more boxes occur after the one this tag is in, then this tag's box will be advanced immediately after printing is done, and the player won't be able to interact with the payment prompt in any way. A dst of 0 pays money to Trill's shop, while a dst of 1 will donate money to Malo Mart's current fundraising effort.
|
00/0033 | inline-three-next | uint8_t value
|
Provides a blank space in text for one of the non-default option of an inlined three-option choice. This space will contain a red right arrow when selected by the player, and otherwise be blank. Meant to come before text describing the option. value has no effect on message display. See below for details on this tag.
|
00/0034 | inline-three-first | uint8_t value
|
Provides a blank space in text for the default option of an inlined three-option choice (and thus where the red right arrow will initially appear). value has no effect on message display. See below for more details on this tag.
|
As seen above, there are fundamentally two kinds of prompts for presenting a multiple-choice question. The {oneof2}
and {oneof3}
tags present their options outside of the message area where text is printed, and can thus be considered "out-of-line" prompts. The others deal with choices that are embedded within the box text, and thus are "inline" prompts.
Out-of-Line Prompts
The out-of-line prompts are almost identical, differing in only how many options are available to be populated. (In fact, the tags are seemingly interchangeable after the first option, whose tag determines how many options there are; it's not known if deliberately misusing the tags like this cause other side effects, though.) Option buttons are presented vertically, with the first option text being the top button, and each subsequent option the next button down. It's the choice
argument that determines which button is initially selected by the game. If too many option texts are provided, the subsequent options are simply discarded. If there aren't enough option texts, then the buttons that should have text are simply blank.
When an out-of-line option tag is encountered, it completely stops the normal formatting of the message; the presumption is that these options are in the last box of the message, and that their texts are brief. One quirk of text before the first option tag is that preceding text on the same line as the first option tag is forced instant; text on preceding lines is not affected in this manner. Aside from this quirk, all text before the first option tag is displayed in the message area exactly as normal. All text after the first option tag is taken to belong to some option button, and as a consequence the normal division of text into boxes is completely disabled. Put another way:
- All text between two out-of-line option tags belongs to the option indicated by the earlier option tag.
- All text between the last option tag and the end of the message belongs to the last option.
Inline Prompts
The inline prompts do fundamentally the same thing as the out-of-line prompts, just presented in a different format. (They appear to be exclusively used for bomb shop interactions.) Whether using the two-option pair {inline-two-first}
/{inline-two-next}
or the three-option {inline-three-first}
/{inline-three-next}
, their behavior is the same, only differing in how many options they allow for. It is intended that all options are presented on one line of text, but they only have to be in the same box. They are also expected to be in the last box of text, otherwise they can't be interacted with by the player. Unlike the out-of-line prompts, they do not take ownership of any following text; these tags literally just provide space for an arrow to appear when the option is selected. Each -first
tag defines the default option, while its associated -next
tag defines all remaining non-default options. -first
tags do not have to come first in the message; they are named as such because they are where the red right arrow first appears.
Inline prompt options are naturally presented in the order they appear in the text. Whichever option is written first is considered the leftmost option conceptually, with each subsequent option to the right of the previous one. Thus, players choose between the options by moving the analog stick left or right to move the red right arrow. This left/right conception exists even if options are presented across multiple lines. If too many inline prompt option tags are used, the additional tags still open up space for an arrow, but can't be selected by the player. If too few option tags are used, then the missing options are considered to be to the right of the present options, and can still be selected by the player (though obviously without any visual indicator).
Lines of text where the inline prompt tags appear are centered within the message area. Other lines in the same box, and lines in other boxes, are untouched.
Special Glyphs
These tags insert special glyphs into the text, as if they were characters. The following descriptions of these glyphs are based on how they appear in the US 1.0 GameCube version of the game.
There is only one glyph that takes any arguments:
Tag ID | Name | Arguments | Explanation |
---|---|---|---|
00/0030 | bomb-bag-icon | uint8_t bag
|
Draws a bomb bag icon. bag doesn't appear to have an effect outside of specific contexts, but it's been observed to have values in the range [0, 3].
|
While the rest take no arguments:
Tag ID | Name | Description |
---|---|---|
00/000A | A | GameCube A button. |
00/000B | B | GameCube B button. |
00/000C | C | GameCube C stick. |
00/000D | L | GameCube L button. |
00/000E | R | GameCube R button. |
00/000F | X | GameCube X button. |
00/0010 | Y | GameCube Y button. |
00/0011 | Z | GameCube Z button. |
00/0012 | D | GameCube D-Pad. |
00/0013 | AS-cross | GameCube analog stick, animated to move back-and-forth between center and each of the four cardinal directions. |
00/0014 | left-arrow | Heavy left arrow, approximately 🡄. |
00/0015 | right-arrow | Heavy right arrow, approximately 🡆. |
00/0016 | up-arrow | Heavy up arrow, approximately 🡅. |
00/0017 | down-arrow | Heavy down arrow, approximately 🡇. |
00/0018 | AS-up | GameCube analog stick, animated to move between up and center. |
00/0019 | AS-down | GameCube analog stick, animated to move between down and center. |
00/001A | AS-left | GameCube analog stick, animated to move between left and center. |
00/001B | AS-right | GameCube analog stick, animated to move between right and center. |
00/001C | AS-vertical | GameCube analog stick, animated to move between up, center, and down. |
00/001D | AS-horizontal | GameCube analog stick, animated to move between left, center, and right. |
00/0023 | red-target | The spinning target used for selected Gale Boomerang or Clawshot targets. |
00/0024 | yellow-target | The spinning target used for selectable Clawshot targets and interesting points to target with the Gale Boomerang. |
00/0027 | A-starred | The GameCube A button, but with a starry border. Like the "urgent" A button prompts in Wind Waker. Not used in the GCN US text, and only in a test message in the GCN JP text. |
00/002A | white-target | A white, stationary version of the target icons seen in {red-target} and {yellow-target}. Not used in the GCN US text, and only in a test message in the GCN JP text. |
00/002C | warp-point | The icon used for warp points on the world map. |
00/002E | XorY | Draws a GameCube X or Y button, depending on external context. Used to describe the button an item is assigned to (e.g. "Combine with the bow on {XorY}"). |
00/0039 | heart | Prints a heart, approximately ♥. |
00/003A | quaver | Prints an eighth note with the stem facing up, approximately ♪. Not used in GCN US text, and only in a test message in GCN JP text. |
Special Strings
These tags print particular strings, such as Link's name or your current quiver capacity.
Tag ID | Name | Arguments | Explanation |
---|---|---|---|
00/0000 | link | none | Prints the name the player has given to Link. |
00/0022 | epona | none | Prints the name the player has given to Epona. |
00/0029 | current-scent | none | Prints the name of the scent Wolf Link currently knows. Prints nothing outside of specific contexts. |
00/002B | warping-to | none | Prints the name of the location you've chosen to warp to. (Used in the confirmation dialog for warping.) Prints nothing outside of specific contexts. |
00/002D | bomb-name | none | Prints the name of the bomb currently chosen to be sold or purchased. Prints nothing outside of specific contexts. |
00/0031 | bomb-count | none | Prints a number of bombs, as if by printf("%d bombs", i) . Number is determined externally, and defaults to zero.
|
00/0032 | bomb-price | none | Prints a price for bombs, as if by printf("%d Rupees", i) . Number is determined externally, and defaults to zero.
|
00/0035 | nop000035 | none | Appears in a message as the only character, and prints nothing when used in other messages. Surrounded by credits and possibly debug messages in the file where it appears. In the decompilation effort as it currently stands, all that can be seen is that it cryptically pushes some word to a stack. |
00/0037 | bombcap | uint8_t type
|
Prints how many bombs a bag for a certain type of bomb can hold, as if by printf("%d bombs", i) . A type of 0 selects normal bombs, 1 selects underwater bombs, and 2 selects mobile bombs.
|
00/0038 | arrowcap | none | Prints the capacity of your current quiver, as if by printf("%d arrows", i) .
|
00/003B | returned-bug | none | Prints the name of the bug you've just returned to Agitha. Prints ♂ beetle if no bugs have been returned (or outside of Agitha's messages in general?).
|
00/003C | letter-sender | none | Prints the name of whoever's sent you a letter, used when the mailman tells you about the one and only one letter he has for you. Outside of specific contexts prints nothing. |
00/003E | current-letter-page | none | For the letters screen, prints the number of the current page of letters. Prints zero if you haven't checked the letters screen since booting the game. |
00/003F | max-letter-page | none | For the letters screen, prints how many pages of letters you have in total. Prints zero if you haven't checked the letters screen since booting the game. |
Tag Group 01
This group is very small and none of them have been observed to actually do anything as of yet. According to how they are used, and what's been done in the decomp effort so far, these tags appear to be intended to play efforts — sound effects of people grunting, laughing, or otherwise making noise. None of these tags take any arguments.
Tag ID | Name | Explanation |
---|---|---|
01/0000 | nop010000 | Used in a Yeto message, so likely meant to be a noise he makes. Possibly only works in specific contexts. |
01/0001 | nop010001 | Used in some shopkeeper's message, though whose exactly is unclear. Only in the JP text. |
01/0004 | nop010004 | Used in one piece of Chudley's dialogue, only in the JP text. |
01/000A | nop01000A | Used in a couple of Shad messages, so likely meant to be a noise he makes. Possibly only works in specific contexts. |
01/0014 | nop010014 | Used in many of Midna's messages, always before a written laugh ("Eee hee"), so likely meant to be her laughing. Midna speech in Ordon and Faron using this tag makes no laughing sound, but this tag may still do so in other locations. |
Tag Group 03
This tag group is completely devoted to tags for the Wii versions of the game specifically. One tag is special, and appears to be used for redirecting messages:
Tag ID | Name | Arguments | Explanation |
---|---|---|---|
03/0000 | wii-divert-to-idx | uint32_t idx
|
Has no effect in GameCube versions of the game. Appears to tell the game to use a different message from the one this appears in for Wii versions of the game, e.g. diverting a message about how to control something on the GameCube to a message with the appropriate Wii instructions. idx is an INF1 index into the same file this message appears in. This tag must be the very first character in the message for it to work properly, judging by what's seen in the decomp.
|
If this seems like an odd use for a tag, consider that the alternative for this multisystem game would've been to add "GameCube or Wii?" checks to every part of the game code that needed to display a system-specific message; with this strategy, you only have to enable or disable the tag, and all the messages will be appropriate for their chosen system.
The other tags in this group are merely for controller buttons and other control features unique to the Wii version of the game, although one of them is used in GameCube messages. These tags are:
Tag ID | Name | Explanation |
---|---|---|
03/0001 | wiiA | Intended to be the Wii A button. In GCN US 1.0, looks like GameCube A button. |
03/0002 | wiiB | Wii B button. In GCN US 1.0, looks gray, making it more like a GameCube shoulder button than a Wii button. |
03/0003 | wiiHome | Wii HOME button. Not used in GCN US 1.0 text, and only in a test message in the GCN JP text. |
03/0004 | wiiMinus | Wii - button. |
03/0005 | wiiPlus | Wii + button. |
03/0006 | wii1 | Wii 1 button. |
03/0007 | wii2 | Wii 2 button. |
03/0008 | wiiD-WES | Wii D-Pad, with blinking red marks on the west, east, and south directions. |
03/0009 | wiiD-N | Wii D-Pad, with a blinking red mark on the north direction. Interestingly, this is used to indicate the button for the Items screen in GameCube messages, meaning that players see a bit of the Wii's UI design even in GameCube versions of the game! |
03/000A | wiiD-S | Wii D-Pad, with a blinking red mark on the south direction. |
03/000B | wiiD-WE | Wii D-Pad, with blinking red marks on the west and east directions. |
03/000C | wiiD-E | Wii D-Pad, with a blinking red mark on the east direction. |
03/000D | wiiD-W | Wii D-Pad, with a blinking red mark on the west direction. Not used in GCN US 1.0 text, and only in a test message in the GCN JP text. |
03/000E | wiimote | Wiimote controller, used to indicate the use of its motion controls. Visually identical to {wiimote2} , but used in far fewer places in the GCN US 1.0 text.
|
03/000F | reticule | Targeting reticule seen when aiming with motion controls. |
03/0010 | nunchuck | Nunchuck controller, used to indicate the use of its motion controls. |
03/0011 | wiimote2 | Wiimote controller, used to indicate the use of its motion controls. Visually identical to {wiimote} , but used in far more places in the GCN US 1.0 text.
|
03/0012 | fairy | Blue fairy, with animated wing flapping. Not used in GCN US 1.0 text, and only in a test message in the GCN JP text. |
03/0013 | wiiC | Wii C button. Looks like the GameCube C stick in GCN US 1.0. |
03/0014 | wiiZ | Wii Z button. Looks like the GameCube Z button in GCN US 1.0. |
Tag Group 04
This tag group is devoted to displaying certain kanji characters. While the exact reasons for this aren't clear, the common thread is that these all constitute kanji that are a part of "Level 2" of JIS X 0208. No kanji at this level occur in the text literally, and inversely no Level 1 or non-kanji characters are printed with tags in this group. Furthermore, the decomp shows us that internally these kanji are mapped to "incorrect" Shift-JIS code points, which are all below the Level 2 region. These tags only function properly in versions of the game using Shift JIS for text, since the game simply puts raw Shift JIS code points into the text when these tags are encountered. A version of the game using a different encoding will thus misinterpret those code points and display garbage.
The following table does not give names to these tags, since they should be represented as their literal kanji characters (with text encoders careful to convert them to tags when detected). It includes any notes on usage, and illustrates what the aforementioned internal code points are and what they should be (including the common NEC row 13 extension to JIS X 0208, since several of these code points are not valid standard Shift JIS).
Tag ID | Glyph | Internal Map | Notes |
---|---|---|---|
04/0000 | 巫 | $ 24 |
Only used in a test message. |
04/0001 | 嗅 | \ 5C |
Only used in a test message. |
04/0002 | 眷 | @ 40 |
Only used in a test message. |
04/0003 | 蜀 | ♯ 81 F2 |
Only used in a test message. |
04/0004 | 蟲 | ♭ 81 F3 |
|
04/0005 | 裔 | √ 81 E3 |
|
04/0006 | 惧 | ㌫ 87 6C |
|
04/0007 | 綺 | ㌶ 87 66 |
|
04/0008 | 罠 | ㌃ 87 65 |
|
04/0009 | 祓 | ㍑ 87 67 |
|
04/000A | 墟 | ㍗ 87 68 |
|
04/000B | 絆 | ㌍ 87 69 |
|
04/000C | 僭 | ㌦ 87 6A |
|
04/000D | 憑 | ㌣ 87 6B |
Tag Group 05
This group is dedicated to printing statistics about various things, mainly minigame scores and times.
Tag ID | Name | Arguments | Explanation |
---|---|---|---|
05/0000 | timestat | uint8_t what
|
Prints a time, used for time-based minigames. Outside of specific contexts, prints nothing. For sledding and the STAR minigame, the only what value used is zero. For goat herding, a what of 0 prints a relative time, comparing the player's latest run to the record (e.g. "You were {timestat 0} slower today" ); a what of 1 will instead print the absolute time for the latest run, as is always done for the other minigames.
|
05/0003 | bugstat | uint8_t what
|
Provides information about the player's progress in Agithat's bug sidequest, printed as if by printf("%d bugs", i) . A what of 0 prints the number of bugs returned so far, while 1 prints the number of bugs Agitha is still missing.
|
05/0004 | unknown-time-op050004 | none | Only seen in what might be a test message in GCN JP text, with no context. Prints a time as 18{ruby 1 "じ"}時0{ruby 1 "ふん"}分 , unknown if the time is ever altered.
|
05/0007 | river-points | none | Prints the number of points earned in the Rapid Ride minigame, as if by printf("%d points", i) . Defaults to zero points.
|
05/0008 | fish-length | none | Prints the length of a fish, as if by printf("%d inches", i) . Defaults to zero. Depending on context, it can be used to report the size of a fish the player just caught, or (in the fish journal) reporting the largest size of a given species the player has ever caught.
|
05/0009 | mart-goal-left | uint16_t dummy, int16_t goal
|
Prints how much money is left for a Malo Mart fundraising goal. Specifically, if money_paid is the amount of money that the player has donated so far, then this tag prints text as if by printf("%d Rupees", goal - money_paid) . The game selects which goal to report on by picking a message whose {mart-goal-left} has the right goal . The dummy parameter has no effect, and is a byproduct of how the game implements this tag (takes a 32-bit unsigned integer and casts it to signed 16-bit).
|
05/000A | letter-count | none | Prints the number of letters the mailman has for the player, as if by printf("%d letters", i) . Used when the mailman has more than one letter to give.
|
05/000B | poes-needed | none | Prints the number of Poe souls Jovani still needs, as if by printf("%d ghosts", i) . Starts out at 20 at the beginning of the game.
|
05/000C | balloon-score | uint8_t which
|
Prints a Fruit-Pop-Flight score, as if by printf("%d points", i) . A which of 0 prints the score for the latest run, while 1 prints the high score.
|
05/000D | fish-count | none | Prints a number of fish caught, as if by printf("%d fish", i) . Used in the fishing journal to report how many fish of each species the player has caught.
|
05/000E | at-rollgoal | none | Prints the current Rollgoal level the player is at, defaults to 0-0. |
Tag Group 06
This group is dedicated entirely to printing a few special characters.
Tag ID | Name | Glyph | Notes |
---|---|---|---|
06/0002 | male | ♂ | Used in bug names and for garbled Ooccoo speech. |
06/0003 | female | ♀ | Used in bug names and for garbled Ooccoo speech. |
06/0004 | star | ★ | Used to decorate headers and for garbled Ooccoo speech. |
06/0005 | refmark | ※ | Used for garbled Ooccoo speech, and in all the usual ways a reference mark is used in Japanese typography. |
06/0006 | thin-left-arrow | ← | Only used in two messages on their own, seemingly related to name entry. However, does not show up in name entry in GCN US 1.0. |
06/0007 | thin-right-arrow | → | Not used in GCN US 1.0 text. |
06/0008 | thin-up-arrow | ↑ | Not used in GCN US 1.0 text. |
06/0009 | thin-down-arrow | ↓ | Not used in GCN US 1.0 text. |
06/000A | bullet | ⧫ | Introduces a bullet for a list item, used in item descriptions. Oddly, the game always forces this to be a black color, which is the default text color in item descriptions. |
06/000B | bullet-space | space | Introduces a space just as wide as {bullet} . Used in item descriptions to line up subsequent lines of a list item with the actual text of the first line.
|
Tag Group FF
This tag group contains tags for altering the display of text. Judging by the documentation of other games, this tag group appears to be supplied by JSystem in some way, or was in some other way set aside to be transferred between games that used JSystem. However, these tags do not appear to be fully universal (see the color options in {color}
), so for now we'll treat them as game-specific.
Tag ID | Name | Arguments | Explanation |
---|---|---|---|
FF/0000 | color | uint8_t hue
|
Sets the color of all following text to the chosen color, if it supports having its color changed. Color persists until the next {color} or the end of the message. hue selects from a palette of colors, valid values of which are listed below.
|
FF/0001 | size | uint16_t pct
|
Scales all following text to pct percent of the normal size. For example, {size 100} would set text to 100% scale, the default. Scale persists until the next {size} or the end of the message.
|
FF/0002 | ruby | uint8_t over_count, char text[]
|
Prints ruby text over the next over_count characters in the message. The number of characters in text is determined by however much space is left in the payload, and is Shift-JIS text. Note: The game expects text to only hold two-byte characters, so always pulls an even number of bytes from the message. This means it will take the first byte after the tag if you use an odd number of one-byte characters in text , and may cause strange results in an attempt to display it.
|
Ruby text is expected to be furigana for kanji readings, so any use of it beyond that may not function as expected from a more general-purpose ruby text system. For instance, non-Japanese text doesn't center itself over the chosen number of characters properly, and the system wasn't designed for the drawn-over characters to be broken across multiple lines. Additionally, a newline in text
will cause the ruby text to continue in the next line's ruby area, even if no proper text exists for the next line.
Color values appear to be a modified form of those supported by Wind Waker, judging by the similarities of their {color}
tags. For Twilight Princess, these colors are:
hue |
Color |
---|---|
0 | Default text color |
1 | Red |
2 | Green |
3 | Blue |
4 | Yellow |
5 | Ever-so-slightly lighter blue |
6 | Lavender |
7 | White |
8 | Orange |