Skip to content

Commit 0265bef

Browse files
awawawawawawawaw
authored andcommitted
xd
1 parent b8bed3a commit 0265bef

6 files changed

Lines changed: 188 additions & 78 deletions

File tree

changelog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# v8.0.0-beta.28
2+
- Fix char filter in listing settings (allow minus)
3+
- Add IDs Listing editor
4+
15
# v8.0.0-beta.27
26
- Update README.md
37
- Warn for zip related functions on android

mod.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"ios": "2.2074"
99
},
1010

11-
"version": "v8.0.0-beta.27",
11+
"version": "v8.0.0-beta.28",
1212
"id": "lr70.main-levels-editor",
1313
"name": "Main Levels Editor",
1414
"developers": [ "LatterRarity70" ],
@@ -58,14 +58,14 @@
5858
"name": "Levels Listing",
5959
"description": "# IDs set for level select page.\n\n## Format: \n<cy> - Single ID</c>: -1 (shows one level)\n<co> - Sequence</c>: 1:23 (levels from 1 to 23)\n<cr>Use commas to separate entries!</c>\n\n## Example: \n`\"`<cy>`1337`</c>`,`<co>`1:22`</c>`,`<cy>`-1`</c>,<cy>`-2`</c>`\"` will list level <cy>`1337`</c>, levels <co>`1` through `22`</c>, then <cy>`-1`</c> and <cy>`-2`</c>.\n<cr>\n```\n-1 is coming soon page, and -2, the tower.\n```\n</c>",
6060
"type": "string",
61-
"filter": "0123456789,:",
61+
"filter": "-0123456789,:",
6262
"default": "1:22,-2,-1"
6363
},
6464
"AUDIO_LISTING": {
6565
"name": "Audio Listing",
6666
"description": "# IDs set for songs list.\nsame as level listing",
6767
"type": "string",
68-
"filter": "0123456789,:",
68+
"filter": "-0123456789,:",
6969
"default": "0:21,-1"
7070
}
7171
}

src/InterfaceFixAndExt.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class $modify(MLE_LevelSelectExt, LevelSelectLayer) {
4343
menu->setID("menu"_spr);
4444
menu->setScale(0.75f);
4545
menu->setAnchorPoint(CCPointZero);
46-
menu->addChild(MainLevelsEditorMenu::createButtonForMe());
46+
menu->addChild(MLE_MainMenu::createButtonForMe());
4747
addChildAtPosition(menu, Anchor::BottomRight, { -25.f, 25.f }, false);
4848
menu->setZOrder(228);
4949

@@ -497,7 +497,7 @@ class $modify(MLE_PauseExt, PauseLayer) {
497497
limitNodeWidth(image, ref->getContentWidth(), 99.f, 0.1f);
498498
auto item = CCMenuItemExt::createSpriteExtra(
499499
image, [](void*) {
500-
MainLevelsEditorMenu::create()->show();
500+
MLE_MainMenu::create()->show();
501501
}
502502
);
503503
item->setID("menu-button"_spr);

src/LevelToolboxExt.cpp

Lines changed: 52 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,47 @@
11
#include <_Main.hpp>
22

3+
static auto updateMainLevel(
4+
Ref<GJGameLevel> level, int levelID, bool dontGetLevelString
5+
) {
6+
if (!level) level = GJGameLevel::create();
7+
8+
if (MLE_LevelsInJSON::get()->contains(levelID)) {
9+
/*log::debug(
10+
"MLE_LocalLevelManager::m_mainLevelsInJSON[{}]->{}",
11+
levelID, MLE_LocalLevelManager::m_mainLevelsInJSON[levelID].dump()
12+
);*/
13+
auto loadedLevel = GJGameLevel::create();
14+
level::updateLevelByJson(MLE_LevelsInJSON::get()->at(levelID), loadedLevel);
15+
if (auto aw = level::isImported(loadedLevel)) level::isImported(level, aw->getID());
16+
//xd
17+
level->m_levelString = loadedLevel->m_levelString.c_str();
18+
level->m_stars = (loadedLevel->m_stars.value());
19+
level->m_requiredCoins = loadedLevel->m_requiredCoins;
20+
level->m_levelName = loadedLevel->m_levelName;
21+
level->m_audioTrack = loadedLevel->m_audioTrack;
22+
level->m_songID = loadedLevel->m_songID;
23+
level->m_songIDs = loadedLevel->m_songIDs;
24+
level->m_sfxIDs = loadedLevel->m_sfxIDs;
25+
level->m_demon = (loadedLevel->m_demon.value());
26+
level->m_twoPlayerMode = loadedLevel->m_twoPlayerMode;
27+
level->m_difficulty = loadedLevel->m_difficulty;
28+
level->m_capacityString = loadedLevel->m_capacityString;
29+
level->m_levelID = (levelID);
30+
level->m_timestamp = loadedLevel->m_timestamp;
31+
level->m_levelLength = loadedLevel->m_levelLength;
32+
};
33+
34+
level->m_levelID = levelID; // -1, -2 for listing exists. no default id pls
35+
level->m_songID = !level->m_audioTrack ? level->m_songID : 0; // what the fuck why its ever was saved
36+
level->m_levelType = GJLevelType::Main;
37+
level->m_levelString = dontGetLevelString ? "" : level->m_levelString.c_str();
38+
39+
if (levelID == -1) level->m_levelName = "{Coming Soon Page}";
40+
if (levelID == -2) level->m_levelName = "{The Tower Page}";
41+
42+
return level.data();
43+
}
44+
345
/*
446
547
level getting update hook
@@ -10,40 +52,10 @@ level getting update hook
1052
class $modify(MLE_GameLevelManager, GameLevelManager) {
1153

1254
$override GJGameLevel* getMainLevel(int levelID, bool dontGetLevelString) {
13-
Ref level = GameLevelManager::getMainLevel(levelID, dontGetLevelString);
14-
15-
if (MLE_LevelsInJSON::get()->contains(levelID)) {
16-
/*log::debug(
17-
"MLE_LocalLevelManager::m_mainLevelsInJSON[{}]->{}",
18-
levelID, MLE_LocalLevelManager::m_mainLevelsInJSON[levelID].dump()
19-
);*/
20-
auto loadedLevel = GJGameLevel::create();
21-
level::updateLevelByJson(MLE_LevelsInJSON::get()->at(levelID), loadedLevel);
22-
if (auto aw = level::isImported(loadedLevel)) level::isImported(level, aw->getID());
23-
//xd
24-
level->m_levelString = loadedLevel->m_levelString.c_str();
25-
level->m_stars = (loadedLevel->m_stars.value());
26-
level->m_requiredCoins = loadedLevel->m_requiredCoins;
27-
level->m_levelName = loadedLevel->m_levelName;
28-
level->m_audioTrack = loadedLevel->m_audioTrack;
29-
level->m_songID = loadedLevel->m_songID;
30-
level->m_songIDs = loadedLevel->m_songIDs;
31-
level->m_sfxIDs = loadedLevel->m_sfxIDs;
32-
level->m_demon = (loadedLevel->m_demon.value());
33-
level->m_twoPlayerMode = loadedLevel->m_twoPlayerMode;
34-
level->m_difficulty = loadedLevel->m_difficulty;
35-
level->m_capacityString = loadedLevel->m_capacityString;
36-
level->m_levelID = (levelID);
37-
level->m_timestamp = loadedLevel->m_timestamp;
38-
level->m_levelLength = loadedLevel->m_levelLength;
39-
};
40-
41-
level->m_levelID = levelID; // -1, -2 for listing exists. no default id pls
42-
level->m_songID = !level->m_audioTrack ? level->m_songID : 0; // what the fuck why its ever was saved
43-
level->m_levelType = GJLevelType::Main;
44-
level->m_levelString = dontGetLevelString ? "" : level->m_levelString.c_str();
45-
46-
return level;
55+
return updateMainLevel(
56+
GameLevelManager::getMainLevel(levelID, dontGetLevelString),
57+
levelID, dontGetLevelString
58+
);
4759
};
4860

4961
};
@@ -114,6 +126,8 @@ class $modify(MLE_LevelTools, LevelTools) {
114126
if (auto a = audio(p0); a.isOk())
115127
if (a.unwrap().contains("title"))
116128
return a.unwrapOr("").get("title").unwrap().asString().unwrapOr("").c_str();
129+
if (p0 == "empty"_h) return "";
130+
if (p0 == "space"_h) return " ";
117131
return LevelTools::getAudioTitle(p0).c_str();
118132
};
119133
$override static gd::string urlForAudio(int p0) {
@@ -168,39 +182,10 @@ class $modify(MLE_LevelTools, LevelTools) {
168182

169183
//paranoic hook
170184
$override static GJGameLevel* getLevel(int levelID, bool dontGetLevelString) {
171-
Ref level = LevelTools::getLevel(levelID, dontGetLevelString);
172-
173-
if (MLE_LevelsInJSON::get()->contains(levelID)) {
174-
/*log::debug(
175-
"MLE_LocalLevelManager::m_mainLevelsInJSON[{}]->{}",
176-
levelID, MLE_LocalLevelManager::m_mainLevelsInJSON[levelID].dump()
177-
);*/
178-
auto loadedLevel = GJGameLevel::create();
179-
level::updateLevelByJson(MLE_LevelsInJSON::get()->at(levelID), loadedLevel);
180-
//xd
181-
level->m_levelString = loadedLevel->m_levelString.c_str();
182-
level->m_stars = (loadedLevel->m_stars.value());
183-
level->m_requiredCoins = loadedLevel->m_requiredCoins;
184-
level->m_levelName = loadedLevel->m_levelName;
185-
level->m_audioTrack = loadedLevel->m_audioTrack;
186-
level->m_songID = loadedLevel->m_songID;
187-
level->m_songIDs = loadedLevel->m_songIDs;
188-
level->m_sfxIDs = loadedLevel->m_sfxIDs;
189-
level->m_demon = (loadedLevel->m_demon.value());
190-
level->m_twoPlayerMode = loadedLevel->m_twoPlayerMode;
191-
level->m_difficulty = loadedLevel->m_difficulty;
192-
level->m_capacityString = loadedLevel->m_capacityString;
193-
level->m_levelID = (levelID);
194-
level->m_timestamp = loadedLevel->m_timestamp;
195-
level->m_levelLength = loadedLevel->m_levelLength;
196-
};
197-
198-
level->m_levelID = levelID; // -1, -2 for listing exists. no default id pls
199-
level->m_songID = !level->m_audioTrack ? level->m_songID : 0; // what the fuck why its ever was saved
200-
level->m_levelType = GJLevelType::Main;
201-
level->m_levelString = dontGetLevelString ? "" : level->m_levelString.c_str();
202-
203-
return level;
185+
return updateMainLevel(
186+
LevelTools::getLevel(levelID, dontGetLevelString),
187+
levelID, dontGetLevelString
188+
);
204189
};
205190

206191
$override static bool verifyLevelIntegrity(gd::string p0, int p1) {

src/_Main.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,11 @@ namespace MLE {
7272
return new_listing;
7373
}
7474

75-
inline void updateListingIDs(const std::vector<int>& list, std::string val = "LEVELS_LISTING") {
75+
inline auto updateListingIDs(const std::vector<int>& list, std::string val = "LEVELS_LISTING") {
7676
auto slist = createListingIDs(list);
7777
if (cocos::fileExistsInSearchPaths((val + ".txt").c_str())) {
78-
auto path = CCFileUtils::get()->fullPathForFilename((val + ".txt").c_str(), 0).c_str();
79-
log::info("Saving `{}` to `{}`...", slist, path);
78+
auto path = CCFileUtils::get()->fullPathForFilename((val + ".txt").c_str(), 0);
79+
log::info("Saving `{}` to `{}`...", slist, path.c_str());
8080
file::writeStringSafe(path, slist).err();
8181
}
8282
else {

src/_MainLevelsEditorMenu.hpp

Lines changed: 124 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
class MainLevelsEditorMenu : public geode::Popup<> {
3+
class MLE_MainMenu : public geode::Popup<> {
44
protected:
55
using FileEvent = Task<Result<std::filesystem::path>>;
66
EventListener<FileEvent> m_listener;
@@ -213,6 +213,127 @@ class MainLevelsEditorMenu : public geode::Popup<> {
213213
menu->addChild(settings, 0, "presist"_h);
214214
};
215215

216+
//ListingEditTool
217+
CCMenuItemSpriteExtra* ListingEditTool = CCMenuItemExt::createSpriteExtra(
218+
btnspr("ID Listing Editor"), [__this = Ref(this)](auto) {
219+
//MLE_ListingEditTool::create()->show();
220+
auto pages = CCArray::create();
221+
222+
for (auto& gdstrkey : Mod::get()->getSettingKeys()) {
223+
if (!string::contains(gdstrkey.c_str(), "_LISTING")) continue;
224+
Ref list = GJLevelList::create();
225+
list->m_listType = GJLevelType::Editor;
226+
list->m_listDesc = ZipUtils::base64URLEncode(
227+
"This list dummy have <cg>realtime sync</c> with real "
228+
"<cy>" + gdstrkey + "</c> setting of mod.");
229+
list->m_listName = gdstrkey.c_str();
230+
auto addToListFN = [](int id, GJLevelList* list)
231+
{
232+
if (auto level = LevelTools::getLevel(id, false)) {
233+
if (string::contains(list->m_listName.c_str(), "AUDIO")) {
234+
level->m_levelName = fmt::format(
235+
" \n{}\nBy: {}",
236+
LevelTools::getAudioTitle(id).c_str(),
237+
LevelTools::nameForArtist(LevelTools::artistForAudio(id)).c_str()
238+
);
239+
level->m_audioTrack = "space"_h;
240+
}
241+
list->addLevelToList(level);
242+
}
243+
};
244+
for (auto id : MLE::getListingIDs(list->m_listName.c_str())) {
245+
addToListFN(id, list);
246+
}
247+
Ref layer = LevelListLayer::create(list);
248+
findFirstChildRecursive<CCMenuItem>(
249+
layer, [layer, addToListFN](CCMenuItem* item) {
250+
auto is = &isSpriteFrameName;
251+
auto ass = &CCMenuItemExt::assignCallback<CCMenuItem>; //hot
252+
if (is(item, "GJ_deleteBtn_001.png")) item->setVisible(0);
253+
if (is(item, "GJ_updateBtn_001.png")) item->setVisible(0);
254+
if (is(item, "GJ_chatBtn_001.png")) item->setVisible(0);
255+
if (is(item, "GJ_plainBtn_001.png")) item->setVisible(0);
256+
if (is(item, "GJ_duplicateBtn_001.png")) item->setVisible(0);
257+
if (is(item, "GJ_shareBtn_001.png")) {
258+
item->setVisible(0);
259+
auto newb = CCMenuItemExt::createSpriteExtraWithFrameName(
260+
"GJ_newBtn_001.png", 0.7f, [layer, addToListFN](void*) {
261+
Ref input = TextInput::create(310.f, "ID");
262+
input->getInputNode()->m_allowedChars = "-0123456789";
263+
input->setPositionY(42.000f);
264+
auto popup = createQuickPopup(
265+
"Add ID:", "\n ", "Add", nullptr,
266+
[input, layer, addToListFN](void*, bool) {
267+
input->getString();
268+
addToListFN(
269+
utils::numFromString<int>(input->getString().c_str()).unwrapOrDefault(),
270+
layer->m_levelList
271+
);
272+
layer->onRefreshLevelList(0);
273+
}
274+
);
275+
popup->m_buttonMenu->addChild(input);
276+
}
277+
);
278+
newb->setPosition(item->getPosition());
279+
item->getParent()->addChild(newb);
280+
}
281+
return false;
282+
}
283+
);
284+
for (auto a : layer->getChildrenExt()) {
285+
if (isSpriteFrameName(a, "GJ_sideArt_001.png"))
286+
a->setVisible(false);
287+
}
288+
if (auto a = layer->getChildByType<CCTextInputNode>(0))
289+
a->setTouchEnabled(false);
290+
pages->addObject(layer);
291+
//updaterrr
292+
layer->runAction(CCRepeatForever::create(CCSequence::create(
293+
CCDelayTime::create(0.1f),
294+
CallFuncExt::create(
295+
[layer] {
296+
auto list = MLE::getListingIDs();
297+
list.clear();
298+
auto strl = layer->m_levelList->m_levelsString;
299+
for (auto id : string::split(strl.c_str(), ",")) list.push_back(
300+
utils::numFromString<int>(id.c_str()).unwrapOrDefault()
301+
);
302+
MLE::updateListingIDs(list, layer->m_levelList->m_listName);
303+
if (auto l = layer->getChildByType<CCLabelBMFont>(0))
304+
l->setString(MLE::createListingIDs(list).c_str());
305+
if (auto l = layer->getChildByType<LoadingCircle>(0))
306+
l->setVisible(false);
307+
}
308+
),
309+
nullptr
310+
)));
311+
}
312+
auto layer = BoomScrollLayer::create(pages, 0, 0);
313+
layer->m_extendedLayer->runAction(CCSequence::create(
314+
CCEaseBackOut::create(CCMoveBy::create(1.0f, { -42.f, 0.f })),
315+
CCEaseExponentialIn::create(CCMoveBy::create(0.5f, { 42.f, 0.f })),
316+
CallFuncExt::create([layer] { layer->moveToPage(layer->m_page); }),
317+
nullptr
318+
));
319+
layer->setPagesIndicatorPosition({ 74.f, layer->getContentHeight() - (320.000f - 312.000f) });
320+
{
321+
auto dotsBG = CCScale9Sprite::create("square02_small.png");
322+
dotsBG->setPosition(layer->m_dotPosition);
323+
dotsBG->setAnchorPoint(CCPointMake(0.5f, 0.1f));
324+
dotsBG->setContentSize(CCSizeMake(52.f, 77.f));
325+
dotsBG->setOpacity(122);
326+
layer->addChild(dotsBG, 0);
327+
}
328+
switchToScene(layer);
329+
}
330+
);
331+
if (menu and ListingEditTool) {
332+
ListingEditTool->setLayoutOptions(lopts);
333+
ListingEditTool->setID("ListingEditTool"_spr);
334+
menu->addChild(ListingEditTool, 0, "presist"_h);
335+
};
336+
216337
//reload_levels_cache
217338
CCMenuItemSpriteExtra* reload_levels_cache = CCMenuItemExt::createSpriteExtra(
218339
btnspr("Reload levels cache!"), [__this = Ref(this)](auto) {
@@ -875,8 +996,8 @@ class MainLevelsEditorMenu : public geode::Popup<> {
875996
return true;
876997
}
877998
public:
878-
static MainLevelsEditorMenu* create() {
879-
auto ret = new MainLevelsEditorMenu();
999+
static MLE_MainMenu* create() {
1000+
auto ret = new MLE_MainMenu();
8801001
if (ret->initAnchored(258.000f, 284.000f)) {
8811002
ret->autorelease();
8821003
return ret;

0 commit comments

Comments
 (0)