JSYSTEM
JSYSTEM is Nintendo's in-house middleware which was used to develop a number of games for the GameCube and Wii era. The first game known to use it was Luigi's Mansion, and the last being The Legend of Zelda: Skyward Sword. It was mostly replaced by the NintendoWare toolkit during the Wii's lifetime. A very early form was also used for the GameCube System Menu.
JSYSTEM is made up of a number of different libraries to aid in game development, all of which start with the letter "J". Note that different games use different versions of JSYSTEM, and the file formats between games is not always compatible.
Contents
Common Conventions of some JSYSTEM binary files
Some JSYSTEM files follow some common conventions in how they are laid out. This pattern has been observed in files from the JUtility, JParticle, and J3DGraph libraries, at least.
Files that follow this convention use a series of chunks, each with identified with four letters.
Header
Offset | Type | Name | Description |
---|---|---|---|
|
char[4] | Subsystem Version | Some code for the JSYSTEM library that this file is used in, along with a version, like "J3D2" or "JPA2". Sometimes this is a generic code, like "MESG" for BMG files. |
|
char[4] | File Type | The kind of file used by this subsystem, like "bmd1", "bmg1". Usually the same as the file extension of the file. |
|
int | File Size | The total size of the file. |
|
int | Chunk Count | The number of "chunks" that follow. |
|
char[4] | (Optional) Subversion | "SVRn" with some number might appear, or it might be 0xFF padding like below. It is ignored. It is hypothesized that this was a marker was used to track data migration during the development of the game. |
|
char[12] | Padding | This was likely reserved space in case they wanted to expand the header later. It is ignored. Official files have it as 0xFF padding. |
Chunk Data
Offset | Type | Name | Description |
---|---|---|---|
|
char[4] | Chunk Type | A FourCC code describing the contents of the chunk. This is chunk-specific. |
|
int | Size | The size of the chunk, including this header. In some cases, this has been known to be off slightly and run off the end of the file. It is used to locate the next chunk. |
Each chunk is aligned to a 0x20 boundary, and the size is the aligned version. If the data does is not aligned to 0x20, then Nintendo's official tooling uses a custom string to fill the remaining chunk contents. The longest known version of this string is:
This is padding data to alignme
The rest of the data is file and chunk-specific. See the format's page for further information.
Name Tables
Name tables are pools of strings used by multiple different JSYSTEM files, under the class name JUTNameTab. They collect all strings used in a chunk or section so that multiple references to the same string can be referenced by an index into the name table. A name table is laid out like this:
Offset | Type | Name | Description |
---|---|---|---|
|
int | Name Count | The number of names in this Name Table. |
|
JUTNameTabEntry[Count] | Entries | A variable-length set of entries. |
Each entry consists of the following.
Offset | Type | Name | Description |
---|---|---|---|
|
short | Hash Code | A hash code of the string for fast lookup. |
|
short | String Offset | An offset, relative to the start of the name table, containing the string contents followed by a NUL byte. |
Known JSYSTEM libraries
JUtility
Utility toolkit with various bits and bobs. Contains JKernel, which are the core routines for doing I/O from disc, and memory management.
J3DGraph
J3DGraph is a 3D rendering library.
J3DGraphBase
J3DGraphAnimator
J3DGraphAnimator is a helper library that can animate various parts of J3D objects. Most animations come in two forms, "full", where each frame of an animation is serialized its entirety, and "key", where only key frames are serialized, and the runtime interpolates between key frames.
Extension | JSYSTEM Class Name | Description |
---|---|---|
BTK | J3DAnmTextureSRTKey | Texture SRT Animation (Key) |
BCK | J3DAnmTransformKey | Joint Animation (Key) |
BRK | J3DAnmTevRegKey | Texture Register Animation (Key) |
BPK | J3DAnmColor | Color Animation (Key) |
BTP | J3DAnmTexPattern | Texture Palette Animation (Full) |
BCA | J3DAnmTransformFull | Joint Animation (Full) |
BVA | J3DAnmVisibilityFull | Visibility Animation (Full) |
BLA | J3DAnmClusterFull | Cluster Animation (Full) |
BLK | J3DAnmClusterKey | Cluster Animation (Key) |
BPA | J3DAnmColorFull | Color Animation (Full) (No Known Usages) |
BXA | J3DAnmVtxColorFull | Vertex Color Animation (Full) (No Known Usages) |
BXK | J3DAnmVtxColorKey | Vertex Color Animation (Key) (No Known Usages) |
J2DGraph
J2DGraph is a 2D rendering and UI library.
JParticle
JParticle is a particle and effects system.
JAudio
JAudio is a music and audio system, which encompasses audio and music playback.
Maybe also BAS (Binary Animation Sound)
JStudio
JStudio is a cutscene recording & playback library able to sequence and play back prerecorded animations for multiple actors, objects, lights.
Extension | JSYSTEM Class Name | Description |
---|---|---|
STB | JStudio::TParse | JStudio Binary |
JMap
JMap is a helper library for serializing map layouts. It has been seen in Luigi's Mansion and Super Mario Galaxy 1 and 2.
Extension | JSYSTEM Class Name | Description |
---|---|---|
BCSV | JMapInfo | Binary CSV, a miscellaneous serialization format. |