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"
}