Skip to content

Commit

Permalink
setup level meta in popup, more difficult icons, random fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
user95401 committed Jul 11, 2024
1 parent ad77182 commit 064e454
Show file tree
Hide file tree
Showing 5 changed files with 206 additions and 73 deletions.
2 changes: 1 addition & 1 deletion mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"win": "2.206",
"android": "*"
},
"version": "v7.0.0-beta.3",
"version": "v7.0.0-beta.4",
"id": "user95401.mainlevelseditor",
"name": "Main Levels Editor",
"developer": "user95401",
Expand Down
148 changes: 148 additions & 0 deletions src/_main.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
#include <Geode/Geode.hpp>
using namespace geode::prelude;

#include <regex>

//lol
#define SETTING(type, key_name) Mod::get()->getSettingValue<type>(key_name)

Expand Down Expand Up @@ -121,4 +123,150 @@ inline auto jsonFromLevel(GJGameLevel* level) {
value.try_set("m_songIDs", std::string(level->m_songIDs.data()));
value.try_set("m_sfxIDs", std::string(level->m_sfxIDs.data()));
return value;
}

inline void updateLevelByJson(GJGameLevel* level) {
auto level_meta_file = levels_meta_path / fmt::format("{}.json", level->m_levelID.value());
auto file_content = my_fs::read(level_meta_file);
//json val
auto value = matjson::parse("{}");
//file parse
auto error = std::string();
auto parse = matjson::parse(file_content, error);
if (parse.has_value()) value = parse.value();
//setup level
levelFromJson(parse, level);
//setup json
value = jsonFromLevel(level);
//save json
std::ofstream(level_meta_file) << value.dump(matjson::TAB_INDENTATION);
}

namespace MLE_UI {
inline auto DeleteButtonSprite() {
auto hi = geode::AccountButtonSprite::create(
CCSprite::createWithSpriteFrameName("edit_delBtn_001.png"),
AccountBaseColor::Gray
);
hi->setScale(0.8f);
typeinfo_cast<CCSprite*>(hi->getChildren()->objectAtIndex(0))->setScale(1.1f);
return hi;
}
inline auto SettingsButtonSprite() {
auto hi = geode::AccountButtonSprite::create(
CCSprite::createWithSpriteFrameName("d_cogwheel_04_001.png"),
AccountBaseColor::Gray
);
hi->setScale(0.8f);
typeinfo_cast<CCSprite*>(hi->getChildren()->objectAtIndex(0))->setScale(1.1f);
typeinfo_cast<CCSprite*>(hi->getChildren()->objectAtIndex(0))->setColor({ 20, 20, 20 });
hi->addChild(typeinfo_cast<CCSprite*>(hi->getChildren()->objectAtIndex(0)));//make it darker
return hi;
}
class LevelConfigPopup : public FLAlertLayer, FLAlertLayerProtocol, TextInputDelegate {
public:
GJGameLevel* m_level;
std::function<void()> m_onSave = []() {};
inline static auto create(GJGameLevel* for_level = LevelTools::getLevel(1, 0)) {
auto rtn = new LevelConfigPopup;
rtn->init(
rtn,
"Level Meta Config",
"\n \n \n \n \n \n \n \n ",
"Close", "Save", 352.000f, 0, 290.000f, 1.f
);
rtn->setID("LevelConfigPopup");
rtn->m_level = for_level;
rtn->customSetup();
return rtn;
}
inline void customSetup() {
//form_box
auto form_box = CCLayer::create();
if (form_box) {
//base sets
form_box->setID("form_box");
form_box->setPosition(CCPoint(0.f, 116.f));
form_box->setContentSize(CCSize(255.f, 175.f));
form_box->ignoreAnchorPointForPosition(false);
//add
this->m_buttonMenu->addChild(form_box);
//layout
auto layout = ColumnLayout::create();
layout->setAxisReverse(1);
layout->setCrossAxisOverflow(0);
form_box->setLayout(layout);
}
//addInputs
auto addInput = [this, form_box](auto label = "", auto id = "", CommonFilter commonFilter = CommonFilter::Any) {
//labelNode
auto labelNode = CCLabelBMFont::create(label, "bigFont.fnt");
labelNode->setID(id + std::string("/label"));
form_box->addChild(labelNode);
//inputNode
auto inputNode = TextInput::create(form_box->getContentWidth(), label, "gjFont41.fnt");
inputNode->getInputNode()->setID(id);
inputNode->setCommonFilter(commonFilter);
inputNode->setDelegate(this);
form_box->addChild(inputNode);
//upd
form_box->updateLayout();
};
addInput("Name", "m_levelName");
addInput("Audio Track", "m_audioTrack", CommonFilter::Int);
addInput("Difficulty", "m_difficulty", CommonFilter::Int);
addInput("Stars", "m_stars", CommonFilter::Int);
loadInputs();
}
inline void loadInputs() {
if (not this->m_level) return;
auto m_levelName = typeinfo_cast<CCTextInputNode*>(this->getChildByIDRecursive("m_levelName"));
auto m_audioTrack = typeinfo_cast<CCTextInputNode*>(this->getChildByIDRecursive("m_audioTrack"));
auto m_difficulty = typeinfo_cast<CCTextInputNode*>(this->getChildByIDRecursive("m_difficulty"));
auto m_stars = typeinfo_cast<CCTextInputNode*>(this->getChildByIDRecursive("m_stars"));
if (m_levelName) m_levelName->setString(fmt::format("{}", this->m_level->m_levelName.data()));
if (m_audioTrack) m_audioTrack->setString(fmt::format("{}", this->m_level->m_audioTrack));
if (m_difficulty) m_difficulty->setString(fmt::format("{}", (int)this->m_level->m_difficulty));
if (m_stars) m_stars->setString(fmt::format("{}", this->m_level->m_stars.value()));
}
inline void applyInputs() {
if (not this->m_level) return;
auto m_levelName = typeinfo_cast<CCTextInputNode*>(this->getChildByIDRecursive("m_levelName"));
auto m_audioTrack = typeinfo_cast<CCTextInputNode*>(this->getChildByIDRecursive("m_audioTrack"));
auto m_difficulty = typeinfo_cast<CCTextInputNode*>(this->getChildByIDRecursive("m_difficulty"));
auto m_stars = typeinfo_cast<CCTextInputNode*>(this->getChildByIDRecursive("m_stars"));
if (m_levelName) m_level->m_levelName = m_levelName->getString();
if (m_audioTrack) m_level->m_audioTrack = utils::numFromString<int>(m_audioTrack->getString().data()).value_or(m_level->m_audioTrack);
if (m_difficulty) m_level->m_difficulty = (GJDifficulty)utils::numFromString<int>(m_difficulty->getString().data()).value_or((int)m_level->m_difficulty);
if (m_stars) m_level->m_stars = utils::numFromString<int>(m_stars->getString().data()).value_or(m_level->m_stars.value());
}
inline void textChanged(CCTextInputNode* p0) {
log::debug("{}({}) id: {}", __FUNCTION__, p0, p0->getID());
if (p0->getID() == "m_difficulty") {
auto difficulty = utils::numFromString<int>(p0->getString().data()).value_or(0);
GJDifficultySprite* difficultyPrev;
if (difficultyPrev = typeinfo_cast<GJDifficultySprite*>(this->getChildByIDRecursive("difficultyPrev")));
else {
difficultyPrev = GJDifficultySprite::create(difficulty, GJDifficultyName::Short);
difficultyPrev->setAnchorPoint(CCPoint(0.f, 0.f));
difficultyPrev->setPosition(CCPoint(260.f, 0.f));
difficultyPrev->setScale(1.2f);
difficultyPrev->setID("difficultyPrev");
p0->getParent()->addChild(difficultyPrev);
}
difficultyPrev->updateDifficultyFrame(difficulty, GJDifficultyName::Short);
}
}
inline void FLAlert_Clicked(FLAlertLayer* p0, bool p1) {
if (not p1) return;
applyInputs();
//json
auto value = jsonFromLevel(this->m_level);
//save json
auto level_meta_file = levels_meta_path / fmt::format("{}.json", m_level->m_levelID.value());
std::ofstream(level_meta_file) << value.dump(matjson::TAB_INDENTATION);
//call custom func
this->m_onSave();
};
};
}
82 changes: 34 additions & 48 deletions src/control_ui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@

#include <Geode/modify/LevelPage.hpp>
class $modify(LevelPageExt, LevelPage) {
void updateUI(float) {
if (auto pCCMenu = this->getChildByIDRecursive("menu_for_level_page"_spr)) {
pCCMenu->setVisible(this->m_level->m_levelID >= 1);
pCCMenu->setZOrder(this->m_level->m_levelID);
}
}
void editLevel(CCObject*) {
auto ae = MLE_UI::LevelConfigPopup::create(this->m_level);
ae->m_onSave = [ae]() {
CCDirector::get()->pushScene(CCTransitionCrossFade::create(
0.15f, LevelSelectLayer::scene(ae->m_level->m_levelID.value() - 1)
));
};
ae->show();
}
void deleteLevel(CCObject*) {
auto currentLevel = this->m_level;
Expand All @@ -25,82 +26,67 @@ class $modify(LevelPageExt, LevelPage) {
);
geode::createQuickPopup("Delete Level", content, "No", "Yes", [this, levelFile, levelMetaFile, currentID, currentLevel](void*, bool asd) {
if (!asd) return;
//level setup
//remove meta
std::remove(levelMetaFile.string().data());
//data store
//remove data
std::remove(levelFile.string().data());
//_PagesSetupPatch
{
//update settings here
Mod::get()->setSettingValue("max_id", SETTING(int64_t, "max_id") - 1);
};
//_AudioTracks
{
//idk lol
};
//asshell
//update settings here
Mod::get()->setSettingValue("max_id", SETTING(int64_t, "max_id") - 1);
//change ids of all next levels
{
//level setup
//level meta
for (int levelID = 0; levelID < 500; levelID++) {
if (levelID > currentID and levelID < 500) {
auto rn1 = levels_meta_path / fmt::format("{}.json", levelID);
auto rn2 = levels_meta_path / fmt::format("{}.json", levelID - 1);
my_fs::rename(rn1, rn2);
if (my_fs::exists(rn1)) my_fs::rename(rn1, rn2);
};
}
//level data
for (int levelID = 0; levelID < 500; levelID++) {
if (levelID > currentID) {
auto rn1 = levels_path / fmt::format("{}.txt", levelID);
auto rn2 = levels_path / fmt::format("{}.txt", levelID - 1);
my_fs::rename(rn1, rn2);
if (my_fs::exists(rn1)) my_fs::rename(rn1, rn2);
}
}
}
auto newLevelSelectLayerScene = LevelSelectLayer::scene(currentID - 1);
CCDirector::get()->pushScene(CCTransitionCrossFade::create(0.1f, newLevelSelectLayerScene));
});
//reset layer
CCDirector::get()->pushScene(CCTransitionCrossFade::create(
0.15f, LevelSelectLayer::scene(currentID - 1)
));
});
}
bool init(GJGameLevel* p0) {
$override bool init(GJGameLevel* p0) {
auto rtn = LevelPage::init(p0);
if (SETTING(bool, "ui")) {
this->schedule(schedule_selector(LevelPageExt::updateUI));
CCMenuItemSpriteExtra* deleteLevel;
{
auto hi = geode::AccountButtonSprite::create(
CCSprite::createWithSpriteFrameName("edit_delBtn_001.png"),
AccountBaseColor::Gray
);
hi->setScale(0.8f);
typeinfo_cast<CCSprite*>(hi->getChildren()->objectAtIndex(0))->setScale(1.1f);
deleteLevel = CCMenuItemSpriteExtra::create(hi, this, menu_selector(LevelPageExt::deleteLevel));
CCMenuItemSpriteExtra* deleteLevel; {
deleteLevel = CCMenuItemSpriteExtra::create(MLE_UI::DeleteButtonSprite(), this, menu_selector(LevelPageExt::deleteLevel));
deleteLevel->setID("deleteLevel"_spr);
deleteLevel->setPosition(CCPoint(190, 30));
deleteLevel->m_baseScale = 0.8f;
deleteLevel->setScale(deleteLevel->m_baseScale);
};
CCMenuItemSpriteExtra* editLevel;
{
auto hi = geode::AccountButtonSprite::create(
CCSprite::createWithSpriteFrameName("d_cogwheel_04_001.png"),
AccountBaseColor::Gray
);
hi->setScale(0.8f);
typeinfo_cast<CCSprite*>(hi->getChildren()->objectAtIndex(0))->setScale(1.1f);
typeinfo_cast<CCSprite*>(hi->getChildren()->objectAtIndex(0))->setColor({ 20, 20, 20 });
hi->addChild(typeinfo_cast<CCSprite*>(hi->getChildren()->objectAtIndex(0)));//make it darker
editLevel = CCMenuItemSpriteExtra::create(hi, this, menu_selector(LevelPageExt::editLevel));
CCMenuItemSpriteExtra* editLevel; {
editLevel = CCMenuItemSpriteExtra::create(MLE_UI::SettingsButtonSprite(), this, menu_selector(LevelPageExt::editLevel));
editLevel->setID("editLevel"_spr);
editLevel->setPosition(CCPoint(190, 0));
editLevel->m_baseScale = 0.8f;
editLevel->setScale(editLevel->m_baseScale);
};
auto levelMenu = getChildByIDRecursive("level-menu");
{
if (auto levelMenu = getChildByIDRecursive("level-menu")) {
levelMenu->addChild(deleteLevel);
levelMenu->addChild(editLevel);
};
}
return rtn;
};
$override void updateDynamicPage(GJGameLevel* p0) {
LevelPage::updateDynamicPage(p0);
//my menu_for_level_page
if (auto pCCMenu = this->getChildByIDRecursive("menu_for_level_page"_spr)) {
pCCMenu->setVisible(p0->m_levelID >= 1);
pCCMenu->setZOrder(p0->m_levelID);
}
}
};
27 changes: 6 additions & 21 deletions src/level_data.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ void Loaded() {
};
#include <Geode/modify/LoadingLayer.hpp>
class $modify(LoadingLayer) {
void loadAssets() {
$override void loadAssets() {
if (m_loadStep == 0) Loaded();
LoadingLayer::loadAssets();
}
Expand All @@ -32,7 +32,7 @@ class $modify(LoadingLayer) {
//huh
#include <Geode/modify/PlayLayer.hpp>
class $modify(PlayLayer) {
bool init(GJGameLevel * level, bool useReplay, bool dontCreateObjects) {
$override bool init(GJGameLevel * level, bool useReplay, bool dontCreateObjects) {
auto oldID = level->m_levelID.value();
level->m_levelID = 999; //temp "Load Failed" bypass
auto rtn = PlayLayer::init(level, useReplay, dontCreateObjects);
Expand All @@ -43,7 +43,7 @@ class $modify(PlayLayer) {

#include <Geode/modify/LocalLevelManager.hpp>
class $modify(LocalLevelManagerExt, LocalLevelManager) {
gd::string getMainLevelString(int p0) {
$override gd::string getMainLevelString(int p0) {
//LocalLevelManager::getMainLevelString(p0);
auto levelID = p0;
//get data file path
Expand All @@ -63,29 +63,14 @@ class $modify(LocalLevelManagerExt, LocalLevelManager) {

#include <Geode/modify/LevelTools.hpp>
class $modify(LevelTools) {
static void updateLevelByJson(GJGameLevel * level) {
auto level_meta_file = levels_meta_path / fmt::format("{}.json", level->m_levelID.value());
auto file_content = my_fs::read(level_meta_file);
//json val
auto value = matjson::parse("{}");
//file parse
auto error = std::string();
auto parse = matjson::parse(file_content, error);
if (parse.has_value()) value = parse.value();
//setup level
levelFromJson(parse, level);
//setup json
value = jsonFromLevel(level);
//save json
std::ofstream(level_meta_file) << value.dump(matjson::TAB_INDENTATION);
}
static GJGameLevel* getLevel(int levelID, bool dontGetLevelString) {
$override static GJGameLevel* getLevel(int levelID, bool dontGetLevelString) {
auto level = LevelTools::getLevel(levelID, dontGetLevelString);
//json meta
updateLevelByJson(level);
level->m_isUnlocked = true;
return level;
};
static bool NOT_NOW___verifyLevelIntegrity(gd::string p0, int p1) {
$override static bool NOT_NOW___verifyLevelIntegrity(gd::string p0, int p1) {
//hooking error lol
return 1;
}
Expand Down
Loading

0 comments on commit 064e454

Please sign in to comment.