Skip to content

Commit 7137ec7

Browse files
committed
update, feat(goal): Update to Geode v4.0.1 and allow resuming of a round of roulette
1 parent 7148cea commit 7137ec7

File tree

13 files changed

+490
-196
lines changed

13 files changed

+490
-196
lines changed

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](http://keepachangelog.com/)
66
and this project adheres to [Semantic Versioning](http://semver.org/).
77

8+
## [3.0.0] - 2024-11-24
9+
10+
### Added
11+
12+
- Resuming round of roulette after game shutdown
13+
- Exclamation Mark when a round of roulette is paused
14+
15+
### Changed
16+
17+
- Target Geode v4.0.1
18+
- How target percentage is displayed: it is now always the current goal, not the current percentage + 1
19+
820
## [2.1.0] - 2024-06-15
921

1022
### Changed

mod.json

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
{
2-
"geode": "3.0.0-beta.4",
2+
"geode": "4.0.1",
33
"gd": {
4-
"win": "2.206",
5-
"android": "2.206",
6-
"mac": "2.206"
4+
"win": "2.2074",
5+
"android": "2.2074",
6+
"mac": "2.2074"
77
},
8-
"version": "v2.1.0",
8+
"version": "v3.0.0",
99
"id": "spaghettdev.gd-roulette",
1010
"name": "GD-Roulette",
1111
"developer": "SpaghettDev",
1212
"description": "An in-game level roulette.",
13-
"repository": "https://github.com/SpaghettDev/GD-Roulette",
1413
"links": {
1514
"community": "https://discord.gg/3bShQb6Jz3",
1615
"source": "https://github.com/SpaghettDev/GD-Roulette"
@@ -27,12 +26,12 @@
2726
"dependencies": [
2827
{
2928
"id": "geode.node-ids",
30-
"version": ">=v1.12.0",
29+
"version": ">=v1.17.0",
3130
"importance": "required"
3231
}
3332
],
3433
"tags": [
35-
"Interface", "Online"
34+
"interface", "online"
3635
],
3736
"settings": {
3837
"max-skips": {

src/layers/CreatorLayer.cpp

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ class $modify(RouletteButton, CreatorLayer)
99
{
1010
void onRouletteButton(CCObject*)
1111
{
12-
g_rouletteManager.rouletteLayer = RLRouletteLayer::create();
13-
if (g_rouletteManager.rouletteLayer)
12+
if (g_rouletteManager.rouletteLayer = RLRouletteLayer::create(); g_rouletteManager.rouletteLayer)
1413
g_rouletteManager.rouletteLayer->show();
14+
15+
if (auto exMark = this->getChildByID("center-left-menu"_spr)->getChildByID("roulette-button"_spr)->getChildByID("exclamation-mark"))
16+
exMark->removeFromParent();
1517
}
1618

1719
bool init()
@@ -20,34 +22,28 @@ class $modify(RouletteButton, CreatorLayer)
2022

2123
auto winSize = CCDirector::sharedDirector()->getWinSize();
2224

23-
if(Mod::get()->getSettingValue<bool>("use-big-button") && Loader::get()->isModLoaded("alphalaneous.pages_api")) {
24-
if(auto menu = getChildByID("creator-buttons-menu")) {
25-
auto spr = CCSprite::create("RL_btn_big.png"_spr);
26-
spr->setScale(0.842);
27-
auto rouletteButton = CCMenuItemSpriteExtra::create(
28-
spr,
29-
this,
30-
menu_selector(RouletteButton::onRouletteButton)
31-
);
32-
rouletteButton->setID("roulette-button"_spr);
33-
menu->addChild(rouletteButton);
34-
}
35-
}
36-
else {
37-
if(auto menu = getChildByID("exit-menu")) {
38-
auto spr = CircleButtonSprite::createWithSprite("RL_btn_001.png"_spr, 1.0f, CircleBaseColor::Green, CircleBaseSize::Small);
39-
40-
auto rouletteButton = CCMenuItemSpriteExtra::create(
41-
spr,
42-
this,
43-
menu_selector(RouletteButton::onRouletteButton)
44-
);
45-
rouletteButton->setID("roulette-button"_spr);
46-
menu->addChild(rouletteButton);
47-
typeinfo_cast<AxisLayout*>(menu->getLayout())->setAxisReverse(true);
48-
menu->updateLayout();
49-
}
50-
}
25+
auto centerLeftMenu = CCMenu::create();
26+
centerLeftMenu->setPosition({
27+
this->getChildByID("exit-menu")->getPositionX(),
28+
CCDirector::sharedDirector()->getWinSize().height / 2.f
29+
});
30+
centerLeftMenu->setID("center-left-menu"_spr);
31+
this->addChild(centerLeftMenu);
32+
33+
auto spr = CircleButtonSprite::createWithSprite("RL_btn_001.png"_spr, 1.0f, CircleBaseColor::Green, CircleBaseSize::Small);
34+
spr->setScale(1.1f);
35+
36+
auto rouletteButton = CCMenuItemSpriteExtra::create(
37+
spr,
38+
this,
39+
menu_selector(RouletteButton::onRouletteButton)
40+
);
41+
rouletteButton->setID("roulette-button"_spr);
42+
rouletteButton->setLayout(AnchorLayout::create());
43+
centerLeftMenu->addChild(rouletteButton);
44+
45+
if (g_rouletteManager.gameState.levelID != 0)
46+
g_rouletteManager.addExclamationMark(rouletteButton);
5147

5248
return true;
5349
}

src/layers/LevelInfoLayer.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class $modify(LevelInfoLayer)
1111
{
1212
if (!LevelInfoLayer::init(level, p1)) return false;
1313

14-
if (g_rouletteManager.isPlaying && level->m_levelID.value() == g_rouletteManager.currentLevelID)
14+
if (g_rouletteManager.isPlaying && level->m_levelID.value() == g_rouletteManager.gameState.levelID)
1515
{
1616
CCLabelBMFont* normalPercentageLabel = static_cast<CCLabelBMFont*>(this->getChildByID("normal-mode-percentage"));
1717

@@ -20,7 +20,7 @@ class $modify(LevelInfoLayer)
2020
float goalOffset = normalPercentageLabel->getContentWidth() / 2;
2121

2222
auto goalPercentage = CCLabelBMFont::create(
23-
fmt::format("({}%)", g_rouletteManager.levelPercentageGoal).c_str(),
23+
fmt::format("({}%)", g_rouletteManager.currentPercentageGoal).c_str(),
2424
"bigFont.fnt"
2525
);
2626
goalPercentage->setPosition({ normalPercentageLabel->getPositionX() + goalOffset, normalPercentageLabel->getPositionY() });
@@ -39,11 +39,11 @@ class $modify(LevelInfoLayer)
3939
if (
4040
g_rouletteManager.isPlaying &&
4141
g_rouletteManager.rouletteLayer &&
42-
this->m_level->m_levelID.value() == g_rouletteManager.currentLevelID
42+
this->m_level->m_levelID.value() == g_rouletteManager.gameState.levelID
4343
)
4444
static_cast<CCLabelBMFont*>(
4545
g_rouletteManager.rouletteLayer->playing_menu->getChildByID("percentage-text")
46-
)->setString(fmt::format("{}%", g_rouletteManager.levelPercentageGoal).c_str());
46+
)->setString(fmt::format("{}%", g_rouletteManager.currentPercentageGoal).c_str());
4747

4848
LevelInfoLayer::onBack(sender);
4949
}

src/layers/PauseLayer.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ class $modify(PauseLayer)
1010
{
1111
PauseLayer::customSetup();
1212

13-
const PlayLayer* playLayer = GameManager::sharedState()->getPlayLayer();
13+
const auto* playLayer = GameManager::sharedState()->getPlayLayer();
1414

15-
if (g_rouletteManager.isPlaying && playLayer->m_level->m_levelID.value() == g_rouletteManager.currentLevelID)
15+
if (g_rouletteManager.isPlaying && playLayer->m_level->m_levelID.value() == g_rouletteManager.gameState.levelID)
1616
{
1717
CCLabelBMFont* normalPercentageLabel = static_cast<CCLabelBMFont*>(this->getChildByID("normal-progress-label"));
1818

@@ -21,7 +21,7 @@ class $modify(PauseLayer)
2121
float goalOffset = normalPercentageLabel->getContentWidth() / 2 + 7.f;
2222

2323
auto goalPercentage = CCLabelBMFont::create(
24-
fmt::format("({}%)", g_rouletteManager.levelPercentageGoal).c_str(),
24+
fmt::format("({}%)", g_rouletteManager.currentPercentageGoal).c_str(),
2525
"bigFont.fnt"
2626
);
2727
goalPercentage->setPosition({ normalPercentageLabel->getPositionX() + goalOffset, normalPercentageLabel->getPositionY() });

src/layers/PlayLayer.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,16 @@ class $modify(PlayLayerPause, PlayLayer)
6464
#endif // GEODE_IS_MACOS
6565
if (
6666
g_rouletteManager.isPlaying &&
67-
this->m_level->m_levelID == g_rouletteManager.currentLevelID &&
67+
this->m_level->m_levelID == g_rouletteManager.gameState.levelID &&
6868
!this->m_isPracticeMode &&
69-
percentage >= g_rouletteManager.levelPercentageGoal
69+
percentage >= g_rouletteManager.gameState.levelPercentageGoal
7070
) {
7171
if (currentDelta > .2f/* && !this->m_player1->m_isDead*/)
7272
{
73-
g_rouletteManager.hasFinishedPreviousLevel = true;
74-
g_rouletteManager.currentLevelPercentage = percentage;
75-
g_rouletteManager.levelPercentageGoal = percentage + 1;
76-
g_rouletteManager.numLevels++;
73+
g_rouletteManager.gameState.hasReachedGoal = true;
74+
g_rouletteManager.gameState.levelPercentage = percentage;
75+
g_rouletteManager.gameState.levelPercentageGoal = percentage + 1;
76+
g_rouletteManager.gameState.numLevels++;
7777

7878
if (Mod::get()->getSettingValue<bool>("auto-pause"))
7979
{
@@ -99,13 +99,13 @@ class $modify(PlayLayerPause, PlayLayer)
9999
{
100100
if (
101101
g_rouletteManager.isPlaying &&
102-
this->m_level->m_levelID == g_rouletteManager.currentLevelID &&
102+
this->m_level->m_levelID == g_rouletteManager.gameState.levelID &&
103103
!this->m_isPracticeMode
104104
) {
105-
g_rouletteManager.hasFinishedPreviousLevel = true;
106-
g_rouletteManager.currentLevelPercentage = 100;
107-
g_rouletteManager.levelPercentageGoal = 100;
108-
g_rouletteManager.numLevels++;
105+
g_rouletteManager.gameState.hasReachedGoal = true;
106+
g_rouletteManager.gameState.levelPercentage = 100;
107+
g_rouletteManager.gameState.levelPercentageGoal = 100;
108+
g_rouletteManager.gameState.numLevels++;
109109
}
110110

111111
PlayLayer::levelComplete();

src/listfetcher/ListFetcher.cpp

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -102,19 +102,29 @@ void ListFetcher::getRandomDemonListLevel(level_pair_t& level, std::string& erro
102102

103103
const auto& jsonResp = resp.unwrap();
104104

105-
if (jsonResp.is_null())
105+
if (jsonResp.isNull() || !jsonResp.isArray())
106106
{
107-
error = "Pointercrate API returned null. Try again later.";
107+
error = "Pointercrate API returned null or non-array. Try again later.";
108108
is_fetching = false;
109109
return;
110110
}
111111

112+
const auto array = jsonResp.asArray().unwrap();
113+
112114
int randomIndex;
113115
do {
114-
randomIndex = rl::utils::randomInt(0, jsonResp.as_array().size() - 1);
115-
} while (jsonResp[randomIndex]["level_id"].is_null());
116+
randomIndex = rl::utils::randomInt(0, array.size() - 1);
117+
} while (array[randomIndex]["level_id"].isNull());
118+
119+
int levelId = array[randomIndex].template get<int>("level_id").unwrapOr(-1);
120+
121+
if (levelId == -1)
122+
{
123+
error = "Pointercrate API returned non-number 'level_id'. Contact developer to fix this.";
124+
is_fetching = false;
125+
return;
126+
}
116127

117-
int levelId = jsonResp[randomIndex].template get<int>("level_id");
118128
getLevelInfo(levelId, level, error);
119129
}
120130
else if (e->isCancelled())
@@ -150,19 +160,29 @@ void ListFetcher::getRandomChallengeListLevel(level_pair_t& level, std::string&
150160

151161
const auto& jsonResp = resp.unwrap();
152162

153-
if (jsonResp.is_null() || !jsonResp.is_array())
163+
if (jsonResp.isNull() || !jsonResp.isArray())
154164
{
155-
error = "Challenge List API returned null. Try again later.";
165+
error = "Challenge List API returned null or non-array. Try again later.";
156166
is_fetching = false;
157167
return;
158168
}
159169

170+
const auto& array = jsonResp.asArray().unwrap();
171+
160172
int randomIndex;
161173
do {
162-
randomIndex = rl::utils::randomInt(0, jsonResp.as_array().size() - 1);
163-
} while (jsonResp[randomIndex]["level_id"].is_null());
174+
randomIndex = rl::utils::randomInt(0, array.size() - 1);
175+
} while (array[randomIndex]["level_id"].isNull());
176+
177+
int levelId = array[randomIndex].template get<int>("level_id").unwrapOr(-1);
178+
179+
if (levelId == -1)
180+
{
181+
error = "Challenge List API returned non-number 'level_id'. Contact developer to fix this.";
182+
is_fetching = false;
183+
return;
184+
}
164185

165-
int levelId = jsonResp[randomIndex].template get<int>("level_id");
166186
getLevelInfo(levelId, level, error);
167187
}
168188
else if (e->isCancelled())
@@ -253,6 +273,8 @@ void ListFetcher::getRandomGDListLevel(int listID, level_pair_t& level, std::str
253273

254274
void ListFetcher::getLevelInfo(int levelID, level_pair_t& level, std::string& error)
255275
{
276+
is_fetching = true;
277+
256278
m_listener2.bind([&](web::WebTask::Event* e) {
257279
if (web::WebResponse* res = e->getValue())
258280
{

src/roulette/layers/RLRouletteInfoLayer.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ bool RLRouletteInfoLayer::init()
6868
);
6969
idButton->setVisible(
7070
rl::utils::getIndexOf(
71-
g_rouletteManager.getFromSaveContainer("selected-list-array").as_array(), true
71+
DataManager::get<DMArrayKey::SELECTED_LIST_ARRAY>().asVector(), true
7272
) == 3
7373
);
7474
{
@@ -121,24 +121,26 @@ void RLRouletteInfoLayer::onClose(CCObject*)
121121
void RLRouletteInfoLayer::onToggleButton(CCObject* sender)
122122
{
123123
auto button = static_cast<CCMenuItemToggler*>(sender);
124-
auto prevIdx = rl::utils::getIndexOf(g_rouletteManager.getFromSaveContainer("selected-list-array").as_array(), true);
124+
auto prevIdx = rl::utils::getIndexOf(
125+
DataManager::get<DMArrayKey::SELECTED_LIST_ARRAY>().asVector(), true
126+
);
125127
const auto demonDifficultyButton = static_cast<RLDifficultyNode*>(
126128
g_rouletteManager.rouletteLayer->getDifficultyButton(GJDifficulty::Demon)->getChildByID("sprite-node")
127129
);
128130

129131
// yeah...
130132
auto changeListWrapper = [&](const std::function<void()>& f) {
131-
g_rouletteManager.getFromSaveContainer("selected-list-array").as_array().at(button->getTag()) = false;
132-
g_rouletteManager.getFromSaveContainer("selected-list-array").as_array().at(0) = true;
133+
DataManager::set<DMArrayKey::SELECTED_LIST_ARRAY>(button->getTag(), false);
134+
DataManager::set<DMArrayKey::SELECTED_LIST_ARRAY>(0, true);
133135

134136
f();
135137

136-
g_rouletteManager.getFromSaveContainer("selected-list-array").as_array().at(0) = false;
137-
g_rouletteManager.getFromSaveContainer("selected-list-array").as_array().at(button->getTag()) = true;
138+
DataManager::set<DMArrayKey::SELECTED_LIST_ARRAY>(0, false);
139+
DataManager::set<DMArrayKey::SELECTED_LIST_ARRAY>(button->getTag(), true);
138140
};
139141

140-
g_rouletteManager.getFromSaveContainer("selected-list-array").as_array().at(prevIdx) = false;
141-
g_rouletteManager.getFromSaveContainer("selected-list-array").as_array().at(button->getTag()) = true;
142+
DataManager::set<DMArrayKey::SELECTED_LIST_ARRAY>(prevIdx, false);
143+
DataManager::set<DMArrayKey::SELECTED_LIST_ARRAY>(button->getTag(), true);
142144

143145
m_buttonMenu->getChildByID("list-id-button")->setVisible(button->getTag() == 3);
144146

@@ -297,7 +299,7 @@ CCMenuItemToggler* RLRouletteInfoLayer::createToggler(int tag, const std::string
297299
button->setSizeMult(1.2f);
298300
button->setTag(tag);
299301
button->setVisible(visible);
300-
button->toggle(g_rouletteManager.getFromSaveContainer("selected-list-array").as_array().at(tag).as<bool>());
302+
button->toggle(DataManager::get<DMArrayKey::SELECTED_LIST_ARRAY>().at<bool>(tag));
301303
button->setID(nodeID);
302304
m_buttonMenu->addChild(button);
303305

0 commit comments

Comments
 (0)