GD-Roulette
GD-Roulette
A Geometry Dash Level Roulette.
Features
- Normal List (regular levels ranging from Easy to Extreme Demon)
- Demon List
- Challenge List
- GD List
- Skip levels you can't beat
- Resume playing after leaving the game
How To Play
Simply choose the list you want to play levels from (the default is normal list), select a difficulty, and press Start! A random level of the chosen difficulty will be given to you and you will need to achieve a certain percentage in said level (starts from 1%, and increments by 1 after each level beaten). Normally, you're supposed to get to get the goal percentage, and not higher. Unfortunately, some levels don't have a way to die at said percentage, so the goal will automatically be your death percentage + 1.
After reaching/surpassing the goal percentage in a round of roulette, the game will automatically pause after you die. This can be disabled in the mod's Geode settings.
If a level is too hard, you can click on the Skip button, which will subtract 1 skip from your skips. You can set the number of skips you are allowed to use during a round of roulette in the roulette's settings (accessible from the info icon in the roulette while not playing it, or from the Geode mod settings).
You can select which list you would like to play levels from by clicking the info icon in the roulette while not playing it. You can currently select 1 of 4 options: Normal List, Demon List, Challenge List, GD List. Info about these lists can be found by clicking the corresponding info icon next to the list's button.
And that's pretty much it! Have fun rouletting!
Donate
This mod has taken a lot of time to make and refine, so your donation would be much appreciated! You can help fuel the next 50 hours I spend on this mod and my other mods by donating through Ko-fi!
Contact
You can contact me through my personal Discord server.
GD-Roulette Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
[4.0.5] - 2025-12-29
Changed
- Target Geode version (v4.10.0)
- RTRP version (v5.1.0)
Fixed
- Invalid response error on random levels
[4.0.4] - 2025-04-01
Fixed
- Its always Aprils Fools
[4.0.3] - 2025-04-01
Added
- April fools!
Changed
- How some internal stuff is managed
Fixed
- :trolley:
[4.0.2] - 2025-02-01
Fixed
- Practice mode crash when finishing level (thanks @Vulm)
[4.0.1] - 2025-01-31
Fixed
- Android crash
- Android not saving cache.json
- Roulette would only show the same levels from page 1
- Weird blink transition when exiting Roulette layer
[4.0.0] - 2025-01-31
The GD-Roulette UI update, featuring new UI, new UI and even more new UI! This update took a lot of time, so if you like it and would like more, consider donating by clicking the gift box icon below :D I will omit coding related changes from now on in CHANGELOG.md
Added
- New UI! Main Roulette menu was completely overhauled, and new UI when playing as well!
- View statistics while playing and after finishing a round
- When the round started
- How many skips were used
- Current and total level attempts
- How many levels played
- Total playtime
- View played levels
- Percentage is colored when the goal is reached
- Big button option again
- Caching of max pages of normal list difficulties every 7 days
- peggy
Changed
- Target Geode v4.2.0 (green)
- A lot of the internals and how stuff is managed
- Demon List now fetches all pages
- Challenge List now fetches all pages
Fixed
- A lot of bugs
- Android crash/invalid list ID bug
- Roulette resetting to easy demon difficulty after pausing and resuming a demon round
[3.1.0] - 2024-12-07
Added
- Ability to play any demon difficulty
- Ability to refresh if an error occurs
Fixed
- Save data bug
[3.0.2] - 2024-12-05
Fixed
- Incompatibility with Ninxout's Overcharged Menu
[3.0.1] - 2024-11-28
Fixed
- Fixed Android crashing
[3.0.0-beta.1] - 2024-11-28
Changed
- Target Windows and Mac only, until I find a fix for Android later
- Renamed GD List ID key to "gd-list-id"
Fixed
- Integer input layer crash on android
[3.0.0] - 2024-11-24
Added
- Resuming round of roulette after game shutdown
- Exclamation Mark when a round of roulette is paused
Changed
- Target Geode v4.0.1
- How target percentage is displayed: it is now always the current goal, not the current percentage + 1
[2.1.0] - 2024-06-15
Changed
- Target Geode v3.0.0-beta.1
- Use new Geode Web API
[2.0.6] - 2024-04-26
Fixed
- Potential MacOS bug
[2.0.5] - 2024-04-19
Changed
- Alphalaneous github page to their new profile
Fixed
RLDifficultyNodewrong position when playing rouletteRLLoadingCirclewrong position for a split second when offline- Some miscellaneous bugs (#21)
[2.0.4] - 2024-03-13
Added
RLLoadingCircle, a better LoadingCircle lol
Changed
- Cleaned up
#includes in header files
Fixed
- 5 Character limit in
RLIntegerInputLayer LoadingCirclein wrong position on Android
[2.0.3] - 2024-03-09
Changed
- No longer use
geode::Notification, now userl::utils::createNotificationToast - How levelIDs are stored when in LevelInfoLayer (they no longer are)
Fixed
- Weird 5th arg in
TextAlertPopup::create
[2.0.2] - 2024-03-06
Added
#includedirectives to the/custom_layers- Platform name to
RLRouletteInfoLayer RLDifficultyNodesupports epic, legendary and mythic nowrl::utils::getFeatureStateFromResponse
Changed
- Renamed RLDemonSelectLayer to RLDifficultySelectLayer
- Made RLDifficultySelectLayer dynamically made (RLDifficultySelectInfo)
- How touch prio is handled in RLRouletteLayer
- Made the difficulty buttons in RLDifficultySelectLayer in another menu
- Refactored RLDifficultySelectLayer.cpp
- Use structured bindings (i forgor they existed)
RLDifficultyNodenow inherits from CCNodeRGBA (rookie mistake)
Fixed
- Empty list id crash on Android (probably)
- Show options sprite being set even if the info icon was never clicked
RLDifficultyNode::setColorbeing weird- Difficulty not being highlighted when changing the list multiple times
[2.0.1] - 2024-03-03
Fixed
RouletteManagernot getting new keys because it just assumed they existed prior
[2.0.0] - 2024-03-01
GD-Roulette commit everything at once challenge (mildly possible)
Notable changes:
- MacOS support
- GD Lists option
- Ability to pause when in a round of roulette
- Bugs & crashes
Added
- rtrp library, that parses Geometry Dash's server responses, made by yours truly
- MacOS support
RLDemonSelectLayer, a layer that lets you select a demon difficulty (appears when clicking the demon plus button)IntegerInputInfo::show_arrowsboolRLDifficultyNode, a custom node that's basicallyGJDifficultySpritebut better IMOListFetcher::level_pair_t, anstd::pairof a LevelObject and a CreatorObjectListFetcher::getRandomGDListLevelListFetcher::GJ_SECRET,ListFetcher::GJ_LEVELS_URL,ListFetcher::GJ_LISTS_URL,ListFetcher::GJ_LEN_QUERY,ListFetcher::DEMONLIST_URL,ListFetcher::CHALLENGELIST_URL,ListFetcher::m_cDemonDiffToFilter,ListFetcher::m_cachedGDListID,ListFetcher::m_cachedGDListLevelIDs,ListFetcher::getDifficultyQuery(GJDifficulty)RWDI_MODEmacro when compiling in RelWithDebInfo- GD Lists as a list option
- Info icons to list checkboxes in
RLRouletteInfoLayer - Visual indicator of selected list (except GD List)
- Node IDs to RLRouletteInfoLayer
- Node IDs to RLRouletteLayer
- Ability to Pause or Quit when closing RLRouletteLayer
RLRouletteLayer::getDifficultyButton,RLRouletteLayer::setDifficultyButtonColor- JSON arrays are checked on launch in
RouletteManager's ctor RouletteManager::isPaused,RouletteManager::gdListID,RouletteManager::previousDifficulty,RouletteManager::previousDemonDifficulty,RouletteManager::getDifficultyFromSaveContainer()rl::constantsnamespacerl::utils::createLevelFromResponse(),rl::utils::getCreatorFromLevelResponse(),rl::utils::getDifficultyFromResponse()- Geode 2.0.0-beta.21 support
- Some missing node IDs to
RLRouletteLayer - Some colors to some layers
Changed
- Rely on Geometry Dash's servers instead of GDBrowser's API (this was long overdue)
- Renamed
BaseCustomLayertoBaseCustomAlertLayer - Prefixed all custom layers/nodes with
RL - Renamed
ConfirmationAlertInfo::onYestoRLConfirmationAlertInfo::onBtn1 - Renamed
ConfirmationAlertInfo::onNotoRLConfirmationAlertInfo::onBtn2 - Renamed
RLRouletteLayer::onDifficultyChosentoRLRouletteLayer::onDifficultyButton - Renamed
roulettenamespace torl - Pass
ConfirmationAlertInfointo thecreatemethod instead ofsetup IntegerInputInfo::starting_valueis now anstd::optional<int>- rouletteButton
CreatorLayer's CCMenu is now positioned based on the window's size - All
asback tostatic_casts because yes - Renamed
ListFetcher::normalListMaxPagetoListFetcher::m_cNormalListMaxPage - Updated
ListFetcher::m_cNormalListMaxPage - All
ListFetcher's methods take aListFetcher::level_pair_tinstead of amatjson::Value ListFetcher::getRandomNormalListLevelis passed a GJDifficulty instead of an int- How
RLRouletteLayer::onDifficultyButtonhandles stuff RLRouletteLayer::getRandomListLevelis passed a GJDifficulty instead of an int- How coins are positioned in
RLRouletteLayer(they're now based on the difficulty node's position) - Some info about the info icons in ABOUT.md
- How touch priority is handled in BaseCustomAlertLayer
- No longer use
geode::cocos::handleTouchPriority
Fixed
- Made the rouletteButton a bit better code-wise (still sucks)
- Potential crash when modifying
LevelInfoLayerof a platformer level - Potential crash when modifying
PauseLayerof a platformer level - Invalid page when searching for a level in
ListFetcher::getRandomNormalListLevel - Dev macro (RWDI_MODE)
- Demon plus button visible in Demon List and Challenge List modes
- Weird static variable swap stuff in
RLConfirmationAlertLayerandRLIntegerInputLayer - Odd way of resetting all
CCMenuItemTogglers after being toggled - Clicking the level's name/creator/id not copying it to the clipboard
- Potential crash if
RLRouletteLayer::m_levelis empty (highly situational) - Geode invalid tags
- Touch Prio on android :heart:
[1.6.2] - 2024-02-09
Fixed
- Crash when leaving LevelInfoLayer
[1.6.1-beta.3] - 2024-02-07
Changed
- No longer target any Node-IDs version because that's broken. Instead, target v1.3.0
[1.6.1-beta.2] - 2024-02-07
Changed
- Actually target any Node-IDs version that matches or is greater than 1.3.0, previous version targeted v1.1.4
[1.6.1-beta.1] - 2024-02-07
Added
- Auto pause option
- Some IDs to layers that are modified
Changed
- Target Geode 2.0.0-beta.16
- Some
static_casts toas - CHANGELOG.md layout to "Added", "Changed" then "Fixed"
- Target any Node-IDs version that matches or is greater than 1.3.0
- Changed some for loops to getChildByID
- Renamed RouletteManager::lastLevelID to currentLevelID
- Renamed RouletteManager::lastLevelPercentage to currentLevelPercentage
- Removed Node-IDs dependency in CMakeLists.txt
- Removed RouletteManager::levelCreatorName
- Renamed about.md to ABOUT.md
Fixed
- Goal percentage appearing in a level that isn't the current roulette level
[1.6.0-beta.4] - 2024-02-06
Fixed
- Platformer levels appearing in the roulette
[1.6.0-beta.3] - 2024-02-04
Changed
- Geode 2.0.0-beta.15 support
[1.6.0-beta.2] - 2024-02-04
Changed
- assets/GD-Roulette.png
- Removed 1 unnecessary objectAtIndex
Fixed
- Crash when on a fresh install of GD-Roulette
[1.6.0-beta.1] - 2024-02-04
Added
- Android support (?)
- Error text when ListFetcher fails to fetch a link
- RouletteLayer pointer member to RouletteManager
- Array verifier to assure selected difficulty/list is correct (cant select multiple at once, maybe for a future update?)
- Choosing a list highlights a difficulty that matches said list
Changed
- about.md
- Logo
- RouletteManager to be an inline global variable instead of that broken define system
- Removed CustomDirector
- Made selecting a list change the selected difficulty (only visual)
- Renamed RouletteManagerStruct to RouletteManager
- Renamed RouletteManager's variable name to g_rouletteManager
- Cleaned up include directives
Fixed
- Crash when clicking Reset after ListFetcher fails
- Bugs
[1.5.0-beta] - 2024-02-03
Changed
- CURL for Geode's web::AsyncWebRequest
- nlohmann::json for matjson
- Move from CCString::createWithFormat to fmt::format
- Move from JsonManager to Geode settings/save data
Fixed
- Crashes
[1.4.0-alpha] - 2024-01-31
This release is very unstable and doesn't get past the "Start" button.
Added
- 2.2 support
- Geode support
[1.3.0] - 2023-12-17
Last update before 2.2. I might update this to 2.2 if I have enough free time.
Added
- Added a confirmation dialogue layer that is used when closing the RouletteLayer while playing
- Added a reset method to the RouletteManager struct
- Added an OK button to the IntegerInputLayer
Changed
- Moved CustomLayer and its inheriting classes to /src/custom_layers
- Separated each bunch of nodes to unique CCMenus
- Changed RouletteInfoLayer's text nodes from CCLabelBMFont to TextArea
- Repositioned the RouletteInfoLayer's toggles
- Renamed RouletteInfoLayer::onSkipsButton to onNumSkipsButton
- Renamed RouletteManager::skipsCount to skipsUsed
- RouletteLayer.difficultyToTag is now const
- Phased out use of std::to_string in favor of CCString::createWithFormat (with the exception of ListFetcher)
- Removed unused parameters' names in onXButton functions
- IntegerInputLayer's information is dynamic instead of hard coded
- Renamed CreatorLayer's ButtonsClass to RouletteButton
- Refactored CreatorLayer.cpp
Fixed
- Fixed ConfirmationAlertLayer result getting ignored
- Fixed touch events not getting dispatched from the nested RouletteLayer CCMenus
- Fixed RouletteButton's CCSprite being too big on resolutions other than High
- Fixed the roulette level's author name being removed
[1.2.1] - 2023-12-10
Added
- Added a 1s pause after player death while playing a level
Changed
- RouletteInfoLayer::createToggler's definition from RouletteLayer.cpp to RouletteInfoLayer.cpp
- Removed duplicate code ln. 402-403 -- ln. 409-410 in RouletteLayer.cpp
- Removed duplicate code ln. 436-437 -- ln. 447-448 in RouletteLayer.cpp
Fixed
- Fixed JsonManager overriding saved values
[1.2.0] - 2023-12-06
Added
- Added a json manager (to save options)
- Added a percentage goal besides the LevelInfoLayer percentage text
- Added a percentage goal in the PauseLayer
Changed
- Separated the layers contained in the RouletteLayer.cpp file into sub-files
Fixed
- Fixed RouletteManager not managing data correctly after JSON saving was added
- Fixed demonDiffArr resetting everything to false when RouletteLayer::onClose is called
[1.1.7] - 2023-10-29
Added
- Added a DEV_CONSOLE macro enabled only when compiling RelWithDebInfo
- Added a check for MegaHack v7 to change the roulette button's position
.geode files you get from this page. Some mods also require other mods as dependencies; you will need to find and install them yourself.