From CloudModding ZGCN Wiki

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.

Message Attributes

Hmmm...
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