Skip to content

Commit

Permalink
fixes?
Browse files Browse the repository at this point in the history
  • Loading branch information
user95401 committed Jul 11, 2024
1 parent dbdea49 commit 5d3c53e
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 95 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.2",
"version": "v7.0.0-beta.3",
"id": "user95401.mainlevelseditor",
"name": "Main Levels Editor",
"developer": "user95401",
Expand Down
97 changes: 71 additions & 26 deletions src/_main.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,40 @@ using namespace geode::prelude;
//lol
#define SETTING(type, key_name) Mod::get()->getSettingValue<type>(key_name)

namespace fs = std::filesystem;
inline auto levels_path = Mod::get()->getConfigDir() / "levels";
inline auto levels_meta_path = levels_path / "_meta";
namespace my_fs {
using namespace std::filesystem;
inline auto last_err = std::string();
inline std::error_code last_err_code;
template <typename T> inline auto rtnWithErrLog(T rtn, std::string log) { log::error("{}", log); return rtn; }
inline auto exists(path path, std::string& err = last_err) {
return cocos::fileExistsInSearchPaths(path.string().c_str());
}
inline auto read(path path, std::string& err = last_err) {
err = fmt::format("{}(path \"{}\") err: path dnt exists", __func__, path);
if (not my_fs::exists(path)) return rtnWithErrLog(err, err); err = "";

unsigned long file_size = 0;
auto buffer = CCFileUtils::sharedFileUtils()->getFileData(path.string().c_str(), "rb", &file_size);

std::string data = "read failed...";
if (buffer && file_size != 0) data = std::string(reinterpret_cast<char*>(buffer), file_size);
else return rtnWithErrLog(data, err);

return data;
}
inline auto rename(path old_path, path new_path, std::string& err = last_err) {
err = fmt::format("{}(old_path \"{}\", old_path \"{}\") err: old path dnt exists", __func__, old_path, new_path);
if (not my_fs::exists(old_path)) return rtnWithErrLog(false, err);
err = fmt::format("{}(old_path \"{}\", old_path \"{}\") err: new path exists", __func__, old_path, new_path);
if (my_fs::exists(new_path)) return rtnWithErrLog(false, err);
err = "";
std::filesystem::rename(old_path, new_path, last_err_code);
log::debug("{}(old_path \"{}\", old_path \"{}\"): last_err_code={}", __func__, old_path, new_path, last_err_code);
return true;
}
}

#define public_cast(value, member) [](auto* v) { \
class FriendClass__; \
Expand All @@ -23,30 +54,6 @@ inline auto levels_meta_path = levels_path / "_meta";
return c.get(reinterpret_cast<FriendeeClass__*>(v)); \
}(value)

inline auto read_file(std::string path) {
//return std::string("test");
if (not fs::exists(path)) {
auto err = fmt::format("file \"{}\" isnt exists.", path);
log::error("{}", err);
return err;
}

// Open the stream to 'lock' the file.
std::ifstream f(path, std::ios::in | std::ios::binary);

// Obtain the size of the file.
const auto sz = fs::file_size(path);

// Create a buffer.
std::string result(sz, '\0');

// Read the whole file into the buffer.
f.read(result.data(), sz);

//log::debug("\n{}({}) -> \n{}\n", __FUNCTION__, path, result);
return result;
}

namespace geode::cocos {
inline std::string frameName(CCNode* node) {
if (node == nullptr) return "NIL_NODE";
Expand Down Expand Up @@ -76,4 +83,42 @@ namespace geode::cocos {
) return btnSpriteTry;
return "CANT_GET_FRAME_NAME";
}
};
};

inline matjson::Value levelFromJson(matjson::Value value, GJGameLevel* levelToRewrite = nullptr) {
GJGameLevel* level = levelToRewrite ? levelToRewrite : LevelTools::getLevel(1, 0);
level->m_levelName = value.try_get<std::string>("m_levelName").value_or(level->m_levelName.data());
level->m_levelDesc = value.try_get<std::string>("m_levelDesc").value_or(level->m_levelDesc.data());
level->m_creatorName = value.try_get<std::string>("m_creatorName").value_or(level->m_creatorName.data());
level->m_difficulty = (GJDifficulty)value.try_get<int>("m_difficulty").value_or((int)level->m_difficulty);
level->m_stars = value.try_get<int>("m_stars").value_or(level->m_stars.value());
level->m_audioTrack = value.try_get<int>("m_audioTrack").value_or(level->m_audioTrack);
level->m_songID = value.try_get<int>("m_songID").value_or(level->m_songID);
level->m_levelVersion = value.try_get<int>("m_levelVersion").value_or(level->m_levelVersion);
level->m_gameVersion = value.try_get<int>("m_gameVersion").value_or(level->m_gameVersion);
level->m_levelType = (GJLevelType)value.try_get<int>("m_levelType").value_or((int)level->m_levelType);
level->m_capacityString = value.try_get<std::string>("m_capacityString").value_or(level->m_capacityString.data());
level->m_songIDs = value.try_get<std::string>("m_songIDs").value_or(level->m_songIDs.data());
level->m_sfxIDs = value.try_get<std::string>("m_sfxIDs").value_or(level->m_sfxIDs.data());
return value;
}

inline auto jsonFromLevel(GJGameLevel* level) {
auto value = matjson::Value();
value.try_set("________MAIN_STUFF________", " vvv vvv ");
value.try_set("m_levelName", std::string(level->m_levelName.data()));
value.try_set("m_audioTrack", level->m_audioTrack);
value.try_set("m_difficulty", (int)level->m_difficulty);
value.try_set("m_stars", level->m_stars.value());
value.try_set("________SOME_SHIT________", " vvv vvv ");
value.try_set("m_levelDesc", std::string(level->m_levelDesc.data()));
value.try_set("m_creatorName", std::string(level->m_creatorName.data()));;
value.try_set("m_songID", level->m_songID);
value.try_set("m_levelVersion", level->m_levelVersion);
value.try_set("m_gameVersion", level->m_gameVersion);
value.try_set("m_levelType", (int)level->m_levelType);
value.try_set("m_capacityString", std::string(level->m_capacityString.data()));
value.try_set("m_songIDs", std::string(level->m_songIDs.data()));
value.try_set("m_sfxIDs", std::string(level->m_sfxIDs.data()));
return value;
}
21 changes: 10 additions & 11 deletions src/control_ui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,25 +41,24 @@ class $modify(LevelPageExt, LevelPage) {
//asshell
{
//level setup
for (size_t levelID = 0; levelID < 500; levelID++) {
for (int levelID = 0; levelID < 500; levelID++) {
if (levelID > currentID and levelID < 500) {
std::rename(
(levels_meta_path / fmt::format("{}.json", levelID)).string().data(),
(levels_meta_path / fmt::format("{}.json", levelID - 1)).string().data()
);
auto rn1 = levels_meta_path / fmt::format("{}.json", levelID);
auto rn2 = levels_meta_path / fmt::format("{}.json", levelID - 1);
my_fs::rename(rn1, rn2);
};
}
//level data
for (size_t levelID = 0; levelID < 500; levelID++) {
for (int levelID = 0; levelID < 500; levelID++) {
if (levelID > currentID) {
std::rename(
(levels_path / fmt::format("{}.txt", levelID)).string().data(),
(levels_path / fmt::format("{}.txt", levelID - 1)).string().data()
);
auto rn1 = levels_path / fmt::format("{}.txt", levelID);
auto rn2 = levels_path / fmt::format("{}.txt", levelID - 1);
my_fs::rename(rn1, rn2);
}
}
}
CCDirector::get()->pushScene(LevelSelectLayer::scene(currentID - 1));
auto newLevelSelectLayerScene = LevelSelectLayer::scene(currentID - 1);
CCDirector::get()->pushScene(CCTransitionCrossFade::create(0.1f, newLevelSelectLayerScene));
});
}
bool init(GJGameLevel* p0) {
Expand Down
83 changes: 26 additions & 57 deletions src/level_data.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

void Loaded() {
//dirs
fs::create_directories(levels_meta_path);
my_fs::create_directories(levels_meta_path);
//add info
std::ofstream(levels_meta_path / "_here is {id}.json meta files about names, stars and stuff") << "asd";
std::ofstream(levels_path / "_here u put {id}.txt level data files");
Expand All @@ -15,7 +15,7 @@ void Loaded() {
if (level_is_exists_in_gd and not level_is_exists_in_mod) {
log::debug("ofstreamingo...");
std::ofstream(level_path_to_save)
<< read_file(level_in_game_path);
<< my_fs::read(level_in_game_path);
}
//add sp ea
CCFileUtils::get()->addPriorityPath(Mod::get()->getConfigDir().string().c_str());
Expand All @@ -29,55 +29,10 @@ class $modify(LoadingLayer) {
}
};

static void updateLevelByJson(GJGameLevel* level) {
auto level_meta_file = levels_meta_path / fmt::format("{}.json", level->m_levelID.value());
auto file_content = read_file(level_meta_file.string());
//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
level->m_levelName = value.try_get<std::string>("m_levelName").value_or(level->m_levelName.data());
level->m_levelDesc = value.try_get<std::string>("m_levelDesc").value_or(level->m_levelDesc.data());
level->m_creatorName = value.try_get<std::string>("m_creatorName").value_or(level->m_creatorName.data());
level->m_difficulty = (GJDifficulty)value.try_get<int>("m_difficulty").value_or((int)level->m_difficulty);
level->m_stars = value.try_get<int>("m_stars").value_or(level->m_stars.value());
level->m_audioTrack = value.try_get<int>("m_audioTrack").value_or(level->m_audioTrack);
level->m_songID = value.try_get<int>("m_songID").value_or(level->m_songID);
level->m_levelVersion = value.try_get<int>("m_levelVersion").value_or(level->m_levelVersion);
level->m_gameVersion = value.try_get<int>("m_gameVersion").value_or(level->m_gameVersion);
level->m_levelType = (GJLevelType)value.try_get<int>("m_levelType").value_or((int)level->m_levelType);
level->m_capacityString = value.try_get<std::string>("m_capacityString").value_or(level->m_capacityString.data());
level->m_songIDs = value.try_get<std::string>("m_songIDs").value_or(level->m_songIDs.data());
level->m_sfxIDs = value.try_get<std::string>("m_sfxIDs").value_or(level->m_sfxIDs.data());
//setup json
value.try_set("________MAIN_STUFF________", " vvv vvv ");
value.try_set("m_levelName", std::string(level->m_levelName.data()));
value.try_set("m_audioTrack", level->m_audioTrack);
value.try_set("m_difficulty", (int)level->m_difficulty);
value.try_set("m_stars", level->m_stars.value());
value.try_set("________SOME_SHIT________", " vvv vvv ");
value.try_set("m_levelDesc", std::string(level->m_levelDesc.data()));
value.try_set("m_creatorName", std::string(level->m_creatorName.data()));;
value.try_set("m_songID", level->m_songID);
value.try_set("m_levelVersion", level->m_levelVersion);
value.try_set("m_gameVersion", level->m_gameVersion);
value.try_set("m_levelType", (int)level->m_levelType);
value.try_set("m_capacityString", std::string(level->m_capacityString.data()));
value.try_set("m_songIDs", std::string(level->m_songIDs.data()));
value.try_set("m_sfxIDs", std::string(level->m_sfxIDs.data()));
//save json
std::ofstream(level_meta_file) << value.dump(matjson::TAB_INDENTATION);
}

//huh
#include <Geode/modify/PlayLayer.hpp>
class $modify(PlayLayer) {
bool init(GJGameLevel * level, bool useReplay, bool dontCreateObjects) {
if (level->m_levelType == GJLevelType::Local)
level->m_levelString = GameLevelManager::get()->getMainLevel(level->m_levelID.value(), 0)->m_levelString.c_str();
auto oldID = level->m_levelID.value();
level->m_levelID = 999; //temp "Load Failed" bypass
auto rtn = PlayLayer::init(level, useReplay, dontCreateObjects);
Expand All @@ -89,27 +44,41 @@ class $modify(PlayLayer) {
#include <Geode/modify/LocalLevelManager.hpp>
class $modify(LocalLevelManagerExt, LocalLevelManager) {
gd::string getMainLevelString(int p0) {
auto levelString = LocalLevelManager::getMainLevelString(p0);
//LocalLevelManager::getMainLevelString(p0);
auto levelID = p0;
//lvl str
//get data file path
auto toRead = std::string();
auto dataFile = std::string(CCFileUtils::get()->fullPathForFilename(fmt::format("levels/{}.txt", levelID).c_str(), 1).data());
auto dataFile = std::string(CCFileUtils::get()->fullPathForFilename(fmt::format("levels/{}.txt", levelID).c_str(), 0).data());
auto dataFileAtMod = (levels_path / fmt::format("{}.txt", levelID)).string();
log::debug("dataFile: {}", dataFile);
log::debug("dataFileAtMod: {}", dataFileAtMod);
if (cocos::fileExistsInSearchPaths(dataFileAtMod.c_str())) toRead = dataFileAtMod;
if (my_fs::exists(dataFileAtMod)) toRead = dataFileAtMod;
else toRead = dataFile;
auto fileContent = read_file(toRead);
levelString = fileContent;
return levelString;
//read
auto fileContent = my_fs::read(toRead);
//return
return gd::string(fileContent.c_str());
}
};


//// fffffffffffffuc a here is aaa problematic functions idk lol

#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) {
auto level = LevelTools::getLevel(levelID, dontGetLevelString);
//json meta
Expand Down

0 comments on commit 5d3c53e

Please sign in to comment.