BCMA

From 3dbrew
Revision as of 23:22, 28 November 2021 by HenkKalkwater (talk | contribs) (Fixed small formatting mistake)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

BCMA is the file format used for the electronic manuals on the Nintendo 3DS. It presumably stands for Binary CTR Manual.

Region and language codes[edit]

In several places, three letter uppercase region codes and two letter lowercase language codes are used. These will be indicated by the italic placeholders REG and la respectively on this page.

The following region and language codes are known:

Region code Region Language code Language
EUR Europe de German
en British English
fr French
es Spanish
it Italic
nl Dutch
pt Portuguese
ru Russian
JPN Japan ja Japanese

Top-level archive overview[edit]

A BCMA file is a regular, uncompressed DARC archive which contains a set of LZ10-compressed DARC archives. These subarchives contoin files containing either textures in the BCLIM format or metadata and manual pages in the binary CLYT format.

At least the following archives should be found in the top level archive:

Archive path Comment
./BcmaInfo.arc Archive containing metadata about this manual, such as available languages and version information.
./REG_la_index.arc Archive containing the table of contents for a specific locale.
./REG_la_large.arc Archive containing the pages of the manual in a large font size.
./REG_la_small.arc Archive containing the pages of the manual in a small font size.

Other archives not named here may be present as well. Usually, these contain locale specific images.


BcmaInfo.arc[edit]

This archive has a single BCLYT file located in ./blyt/BcmaInfo.bclyt. This file contains the following panes, all direct children of the RootPane:

Pane name Pane type User data Other info
Key Type Value description
LangInfo pan1 LangNum Int[1] The number of languages following this property This pane lists all languages in this manual.
Lang_xxx String xxx is a number from 000 until the value of LangNum. This value is a language-region pair in the form of REG_la.
RegionInfo pan1 RegionNum Int[1] The number of regions following this property
Region_xxx String xxx is a number from 000 until the value of RegionNum. This value is a region name in the form of REG.
REG pan1 LangNum Int[1] The number of languages following this property This pane lists all languages in the region indicated by the name of this pane. There is one pane for every region listed in the RegInfo pane.
Lang_xxx String xxx is a number from 000 until the value of LangNum. This value is a language-region pair in the form of REG_la.
REG_la txt1 TexResNum Int[1] The number of texture resources following this property This pane lists all additional archives with locale-dependent textures that should be loaded. The text string of this text pane is set to the localized name of the language. There is an instance of this pane for every language listed in the LangInfo pane.
TexRes_xxxx String xxxx is a number from 0000 until the value of TexResNum. This value is a file name referring to an archive in the top-level BCMA file, for example Common_texture.arc.
VersionInfo pan1 CurrentVersion Int[1] The version of the file format. Only the value 2 has been found so far.
Description String Contains a human-readable description about the export settings and software. For example, the Kid Icarus manual contains "Multi Region (Old Style Langinfo Include). (ManualEditor 0.33.0.0)"

All other properties of the panes seem to be set to a default value and do not seem to matter.

REG_la_index.arc[edit]

This archive contains the table of contents for a certain language. This archive contains exactly one file, ./blyt/Index.bclyt, which contains the following panes, all children of the RootPane:

Pane name Pane type User data Other info
Key Type Value description
MetaData pan1 PageNum Int[1] The amount of pages in this manual
CategoryNum Int[1] The amount of categories in this manual.
SplitNumL Int[PageNum] Each integer in this array maps to the amount of parts each page in the manual with the large font size has been split.
SplitNumS Int[PageNum] Each integer in this array maps to the amount of parts each page in the manual with the small font size has been split.
PageTitle_xxx txt1 None The text of this textbox contains the page title of the page at index xxx, where xxx ranges from 000 until PageNum
Category_xxx txt1 IsValid Int[1] Either 0 or 1, whether this category is valid. This seems to be always 0 for the first category, usually named __CATEGORY_INVALID__. Other sections have this set to 1. This pane describes each category. The text of the textbox is the localized name of the category shown to the user.
CategoryPageNum Int[1] The amount of pages in this category
PageID_xxx Int[1] The xxx ranges from 000 until CategoryPageNum. The value refers to the same page number used in PageTitle_xxx, which should be part of this category.

REG_la_size.arc[edit]

These archives actually contain the contents of a page in the manual. It contains the following files:

File name Description
./blyt/Page_xxx_size_y.bclyt Contains the text and foreground images of page number xxx, part y and size size.
./blyt/Page_xxx_size_bg.bclyt Contains all background images on the page.
./blyt/Page_xxx_size_info.bclyt Could perhaps contain metadata from the manual editor?

In the filenames, xxx should be replaced by the page number, starting from 000. size should be replaced by either "large" or "small". Finally, y should be replaced by the page part, starting from 0.