Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/seraxis/lr2oraja-endlessdream/llms.txt

Use this file to discover all available pages before exploring further.

Skin properties are the numeric identifiers that connect skin elements to live game state. When a skin object references a property ID, the engine looks up the corresponding value each frame and uses it to control visibility, animation, text display, slider position, or image selection. Properties are defined in SkinProperty.java and implemented across the property/ package.

Configuring properties in the launcher

The Skin tab in the launcher lists a Skin Configuration section for each scene type. The options shown are declared by the skin itself — typically in the skin’s header section — and may include dropdown menus (custom options), file selectors (custom files), and position/size sliders (custom offsets). Changes are saved to config.json and config_player.json in your player folder. As of Endless Dream 0.4.0, you can also adjust these settings without restarting the game using the Skin Configuration window in the mod menu (F5 / Insert). See Live skin configuration for details.
As of beatoraja 0.8.8 (which Endless Dream 0.3.0 is based on), some skin property IDs changed from their values in earlier releases. If you are migrating a skin from a pre-0.8.8 beatoraja installation, verify that option and timer IDs in your skin still match the constants in SkinProperty.java.

Property categories

Boolean properties control element visibility and conditional rendering. A skin object with a positive OPTION_* ID is visible when the condition is true; a negative ID inverts the condition.Common categories:
ID rangeCategory
15Song bar type (folder, song, grade, playable)
2123Music select panel state (PANEL1–3)
3039BGA and autoplay state
4051BGA visibility, gauge type, IR connection
6066Score saving state
7079Chart difficulty level
8084Loading state and replay mode
9091Result clear / fail
100105Music select bar clear rank
118131Clear type trophies (Easy, Hard, Full Combo, etc.)
150155Chart difficulty tier (BEGINNER–INSANE)
160164Chart key mode (5K, 7K, 9K, 10K, 14K)
170179Chart metadata flags (BGA, LN, BPM change, etc.)
180184Chart judge rank (VERY HARD – VERY EASY)
190198Stage file, banner, back BMP presence; replay data
200227Score rank (AAA–F) for 1P, 2P, and best/now/result contexts
230240Gauge percentage bands (0–10 %, 10–20 %, … 100 %)
241246Current judge type (PERFECT / GREAT / GOOD / BAD / POOR / MISS)
270273Lane cover / lift / hidden state
280293Course stage index and mode
300318Result rank for 1P and 2P
320327Best-score rank for 1P
330336Score update / draw state on result screen
340347Current rank (AAA–F) during gameplay
350354Result flip, 1P/2P win, draw
400CONSTANT scroll mode active
601625IR connection and ranking state
1080Practice mode active
11001104Extended bar clear ranks (Assist Easy, ExHard, Perfect, Max)
1240Gauge at border or above
Example usage in a JSON skin:
{ "draw": 91, "..." : "..." }
This element is only drawn when OPTION_RESULT_FAIL (id 91) is true — i.e., the player failed.
Timer properties drive time-based animations. A timer value is a microsecond timestamp representing when the timer turned on, or Long.MIN_VALUE when off. Skin destinations reference a timer to anchor their keyframe timeline.Key timers:
ConstantIDDescription
TIMER_STARTINPUT1Scene accepts input
TIMER_FADEOUT2Scene fade-out begins
TIMER_FAILED3Player failed
TIMER_PLAY41Chart playback starts
TIMER_JUDGE_1P461P judge event
TIMER_COMBO_1P4461P combo update
TIMER_FULLCOMBO_1P481P full combo achieved
TIMER_RHYTHM140Beat-synced rhythm timer
TIMER_RESULTGRAPH_BEGIN150Result graph animation starts
TIMER_IR_CONNECT_SUCCESS173IR connection succeeded
TIMER_MUSIC_END908Chart audio ends
TIMER_CUSTOM_BEGINTIMER_CUSTOM_END10000–19999Skin-defined custom timers
Bomb, hold, key-on, and key-off timers exist for all key slots (scratch + keys 1–9 for both 1P and 2P), with extended ranges (IDs 1010–2110) covering up to 99 keys.
Integer number properties supply values to numeric display elements (SkinNumber, SkinTextBitmap).
CategoryExamples
Hi-speed / laneNUMBER_HISPEED_LR2 (10), NUMBER_LANECOVER1 (14)
BPMNUMBER_NOWBPM (160), NUMBER_MAINBPM (92), NUMBER_MINBPM (91), NUMBER_MAXBPM (90)
ScoreNUMBER_SCORE (71), NUMBER_COMBO (104), NUMBER_MAXCOMBO (75)
Judge countsNUMBER_PERFECT (110), NUMBER_GREAT (111), NUMBER_GOOD (112), NUMBER_BAD (113), NUMBER_POOR (114)
Early/late splitNUMBER_EARLY_PERFECT (410), NUMBER_LATE_PERFECT (411), and equivalents for GREAT, GOOD, BAD, POOR, MISS
Chart metadataNUMBER_TOTALNOTES (74), NUMBER_PLAYLEVEL (96)
TimeNUMBER_PLAYTIME_MINUTE (161), NUMBER_TIMELEFT_SECOND (164)
IRNUMBER_IR_RANK (179), NUMBER_IR_TOTALPLAYER (180), NUMBER_IR_CLEARRATE (181)
RandomNUMBER_RANDOM_1P_1KEYNUMBER_RANDOM_1P_SCR (450–459)
DensityNUMBER_DENSITY_PEAK (360), NUMBER_DENSITY_AVERAGE (364)
Float properties return a value in the range 0.0–1.0 and are used by bar graphs, sliders, and custom Lua scripts.
ConstantIDDescription
RATE_SCORE110Current score rate
RATE_SCORE_FINAL111Final score rate (result screen)
RATE_BESTSCORE_NOW112Best score rate up to current note
RATE_PGREATRATE_POOR140–144Per-judge-type rate
FLOAT_SCORE_RATE1102Score rate (alternative alias)
FLOAT_GROOVEGAUGE_1P1107Groove gauge value
FLOAT_HISPEED310Hi-speed as a float
FLOAT_CHART_PEAKDENSITY360Chart peak note density
RATE_MASTERVOLUME17Master volume slider position
RATE_KEYVOLUME18Key sound volume slider position
RATE_BGMVOLUME19BGM volume slider position
RATE_LANECOVER4Lane cover position
RATE_MUSIC_PROGRESS6Music progress (0–1)
String properties supply text to SkinText and SkinTextBitmap elements.
ConstantIDDescription
STRING_TITLE10Chart title
STRING_SUBTITLE11Chart subtitle
STRING_FULLTITLE12Full title (title + subtitle)
STRING_GENRE13Chart genre
STRING_ARTIST14Chart artist
STRING_SUBARTIST15Chart sub-artist
STRING_PLAYER2Player name
STRING_RIVAL1Rival player name
STRING_SKIN_NAME50Active skin name
STRING_SKIN_AUTHOR51Skin author
STRING_SKIN_CUSTOMIZE_CATEGORY110100–109Skin custom option category labels
STRING_SKIN_CUSTOMIZE_ITEM110110–119Skin custom option selected item labels
STRING_TABLE_NAME1001Current difficulty table name
STRING_TABLE_LEVEL1002Current difficulty table level
STRING_IR_NAME1020IR server name
STRING_IR_USER_NAME1021IR user name
STRING_SONG_HASH_MD51030Chart MD5 hash
STRING_SONG_HASH_SHA2561031Chart SHA-256 hash
STRING_VERSION1010Game version string
Sliders are writable float properties used for interactive controls. Offsets define position adjustments for skin element groups.Sliders:
ConstantIDDescription
SLIDER_MUSICSELECT_POSITION1Song wheel scroll position
SLIDER_MUSIC_PROGRESS6Music progress (read-only slider)
SLIDER_MASTER_VOLUME17Master volume control
SLIDER_KEY_VOLUME18Key sound volume control
SLIDER_BGM_VOLUME19BGM volume control
SLIDER_LANECOVER4Lane cover position
SLIDER_LANECOVER25Second lane cover (DP)
Built-in offsets:
ConstantIDDescription
OFFSET_ALL10Global element offset (play scenes only)
OFFSET_SCRATCHANGLE_1P11P scratch turntable angle
OFFSET_SCRATCHANGLE_2P22P scratch turntable angle
OFFSET_LIFT3Lift offset
OFFSET_LANECOVER4Lane cover offset
OFFSET_NOTES_1P301P note area offset
OFFSET_JUDGE_1P321P judge display offset
User-defined custom offsets use IDs 40 and above (up to OFFSET_MAX = 199).
Button properties represent interactive actions. In skins they are used as event targets and for reading the current state of multi-state buttons (e.g., gauge type, random option).
CategoryExamples
NavigationBUTTON_PLAY (15), BUTTON_KEYCONFIG (13), BUTTON_SKINSELECT (14)
GaugeBUTTON_GAUGE_1P (40), BUTTON_GAUGE_2P (41)
RandomBUTTON_RANDOM_1P (42), BUTTON_RANDOM_2P (43)
DisplayBUTTON_BGA (72), BUTTON_HSFIX (55)
Skin customizeBUTTON_SKIN_CUSTOMIZE110 (220–229)
Lane coverBUTTON_LANECOVER (330), BUTTON_LIFT (331), BUTTON_HIDDEN (332)
Skin select shortcutsBUTTON_SKINSELECT_7KEY (170) through all scene types
Custom eventsEVENT_CUSTOM_BEGINEVENT_CUSTOM_END (1000–1999)

Build docs developers (and LLMs) love