Modding Metadata
Modding metadata is new to v3.17.0. It contains game- and pattern-specific
metadata to assist with game modding.
If you're looking for the specifics of game SFX data and patterns, see this article instead.
Modding metadata is visible when Advanced Options are turned on (press
CTRL+A
in the Info and Settings screen). They are visible on tooltips.
If the Ruler tool is selected, they will also be visible on the entities
themselves.
Supported Modding Game IDs
These game IDs refer to Rhythm Heaven installments and not minigames. They are region-specific! For the time being, it seems that the only games with any modding documentation are North American releases (excluding Rhythm Tengoku).
Name | Region | ID |
---|---|---|
Rhythm Tengoku (リズム天国) (GBA) | Japan | gba |
Rhythm Heaven (NDS) | North America | rhds |
Rhythm Heaven Fever (Wii) | North America | rhFever |
Rhythm Heaven Megamix (3DS) | North America | rhMegamix |
Reserved IDs
These IDs are reserved for future use, but are not currently usable.
Name | Region | ID |
---|---|---|
Rhythm Tengoku Arcade (ARCADE) | Japan | gbaArcade |
Rhythm Tengoku Gold (リズム天国ゴールド) (NDS) | Japan | rhdsJa |
Rhythm Paradise (NDS) | Europe | rhdsEu |
Rhythm World (리듬세상) (NDS) | Korea | rhdsKo |
Minna no Rhythm Tengoku (みんなのリズム天国) (Wii) | Japan | rhFeverJa |
Beat the Beat: Rhythm Paradise (Wii) | Europe | rhFeverEu |
Rhythm World Wii (리듬 세상 Wii) (Wii) | Korea | rhFeverKo |
Rhythm Tengoku The Best+ (リズム天国ザ・ベスト+) (3DS) | Japan | rhMegamixJa |
Rhythm Paradise Megamix (3DS) | Europe | rhMegamixEu |
Rhythm World The Best+ (리듬세상・더베스트+) (3DS) | Korea | rhMegamixKo |
File and folder structure
Various json
files will be in the SFX database under the moddingMetadata/
folder.
They are grouped into folders of the modding game ID.
Custom modding metadata can be put in .rhre3/customModdingMetadata/
with the same structure
as above. Files that are identically named in the custom folder will overwrite something with
the same file name in the stock SFX database.
JSON structure
Each json file is an array of objects.
Each object has these fields:
Field | Type | Description |
---|---|---|
applyTo | array of strings | Array of strings to apply this data to |
... | strings/functions | Key/value pairs of data |
The ...
is one or more key/value pairs. (See example.)
The key must be from a list of known keys described below.
The value should be a string or a function.
The various function types and valid keys are listed below this section.
Example (actual information may not be correct!):
[
{
"applyTo": ["screwbotFactoryEn", "screwbotFactoryJa"],
"engine": "0x2D",
"name": "rvlRobot",
"tempoFile": "00234D2",
"index": "0x12345"
},
{
"applyTo": ["screwbotFactoryEn_blackRobot", "screwbotFactoryJa_blackRobot"],
"sub": "0x58"
},
{
"applyTo": ["screwbotFactoryEn_whiteRobot", "screwbotFactoryJa_whiteRobot"],
"sub": "0x56"
},
{
"applyTo": ["screwbotFactoryEn_blackRobotFaster", "screwbotFactoryJa_blackRobotFaster"],
"sub": "0x59"
},
{
"applyTo": ["screwbotFactoryEn_whiteRobotFast", "screwbotFactoryJa_whiteRobotFast"],
"sub": "0x57"
},
{
"applyTo": ["bouncyRoad_15bounces", "bouncyRoadMegamix_15bounces"],
"sub": {
"function": "widthRange",
"2.0": "0x59",
"1.0": "0x58",
"0.6667": "0x57",
"0.5": "0x56",
"else": "undefined"
}
}
]
Valid keys
For all games:
Field | Intended for | Description |
---|---|---|
note | datamodels or games | An extra note or comment to be displayed. |
For rhMegamix
only:
Field | Intended for | Description |
---|---|---|
sub | datamodels | The sub number, as a hex number starting with 0x. |
engine | games | The engine ID, as a hex number starting with 0x. |
name | games | The engine's internal name. |
tempoFile | games | The engine's tempo file ID. |
index | games | The engine's index, as a hex number starting with 0x. |
For rhds
only:
Field | Intended for | Description |
---|---|---|
sub | datamodels | The sub data. |
cue | datamodels | The cue data. |
ftc | games | The minigame's internal name. |
id | games | The minigame's ID. |
Width Range function
The width range function returns a string based on the current width of the entity. As such, this function can only be applied on entity-types, i.e.: not GameObject. Think of this function as a piecewise-defined one operating on the width.
There must be a field named function
with the value "widthRange"
.
All other fields are either ranges
or have the key "else"
.
"else"
is used when none of the conditions match.
If it is not present, its value defaults to an empty string.
Range syntax
Ranges can either be a single value or a span of values.
A single value means that the width should be exactly that value, +/- 0.0001.
A range is defined as "lower .. upper"
, where lower
is the lower bound (inclusive)
and upper
is the upper bound (inclusive). The whitespace and decimal places are optional.
Example
"sub": {
"function": "widthRange",
"0.0 .. 1.0": "between 0.0 and 1.0",
"3.0": "exactly 3.0",
"else": "none of the provided"
}