diff --git a/source/include/preset.hpp b/source/include/preset.hpp index 6453675..4273b2b 100644 --- a/source/include/preset.hpp +++ b/source/include/preset.hpp @@ -1,11 +1,13 @@ #pragma once +#include <3ds.h> + #include #include enum class OptionCategory; -bool CreatePresetDirectories(); +void CreatePresetDirectories(FS_Archive sdmcArchive); std::vector GetSettingsPresets(); bool SavePreset(std::string_view presetName, OptionCategory category); bool LoadPreset(std::string_view presetName, OptionCategory category); diff --git a/source/include/spoiler_log.hpp b/source/include/spoiler_log.hpp index 07d17ca..980ebce 100644 --- a/source/include/spoiler_log.hpp +++ b/source/include/spoiler_log.hpp @@ -1,5 +1,7 @@ #pragma once +#include <3ds.h> + #include #include #include @@ -7,6 +9,8 @@ using RandomizerHash = std::array; +void CreateLogDirectories(FS_Archive sdmcArchive); + void GenerateHash(); const RandomizerHash& GetRandomizerHash(); diff --git a/source/menu.cpp b/source/menu.cpp index ddedbea..ff3647e 100644 --- a/source/menu.cpp +++ b/source/menu.cpp @@ -61,9 +61,26 @@ void MenuInit() { consoleSelect(&topScreen); - if (!CreatePresetDirectories()) { - printf("\x1b[20;5Failed to create preset directories."); - printf("\x1b[21;5Loading presets might crash."); + // Create directories + FS_Archive sdmcArchive; + if (R_SUCCEEDED(FSUSER_OpenArchive(&sdmcArchive, ARCHIVE_SDMC, fsMakePath(PATH_EMPTY, "")))) { + CreateLogDirectories(sdmcArchive); + CreatePresetDirectories(sdmcArchive); + + FSUSER_CloseArchive(sdmcArchive); + } else { + consoleClear(); + printf("\x1b[10;10HFailed to create directories."); + printf("\x1b[11;10H- Spoiler logs won't be written."); + printf("\x1b[12;10H- Loading presets might crash."); + printf("\x1b[14;10HPress B to continue."); + + while (aptMainLoop()) { + hidScanInput(); + if (hidKeysHeld() & KEY_B) { + break; + } + } } //If cached presets exist, load them diff --git a/source/preset.cpp b/source/preset.cpp index 843057e..93af53f 100644 --- a/source/preset.cpp +++ b/source/preset.cpp @@ -22,8 +22,8 @@ static const std::string CACHED_COSMETICS_FILENAME = "CACHED_COSMETICS"; static std::string_view GetBasePath(OptionCategory category) { static constexpr std::array paths{ - "/3ds/presets/mm3dr/settings/", - "/3ds/presets/mm3dr/cosmetics/", + "/MM3DR/Presets/Settings/", + "/MM3DR/Presets/Cosmetics/", }; switch(category) { @@ -37,32 +37,48 @@ static std::string_view GetBasePath(OptionCategory category) { } //Creates preset directories if they don't exist -bool CreatePresetDirectories() { - Result res; - FS_Archive sdmcArchive; +void CreatePresetDirectories(FS_Archive sdmcArchive) { + std::vector dirs = { + "/MM3DR/", + "/MM3DR/Presets/", + "/MM3DR/Presets/Settings/", + "/MM3DR/Presets/Cosmetics/", + }; - // Open SD archive - if (!R_SUCCEEDED(res = FSUSER_OpenArchive(&sdmcArchive, ARCHIVE_SDMC, fsMakePath(PATH_EMPTY, "")))) { - return false; + const auto printInfo = [&](int progress) { + consoleClear(); + printf("\x1b[10;10HCreating Preset Directories"); + printf("\x1b[11;10HProgress: %d/%d", progress, dirs.size()); + }; + + printInfo(0); + for (size_t i = 0; i < dirs.size(); i++) { + FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, dirs[i].c_str()), FS_ATTRIBUTE_DIRECTORY); + printInfo(i + 1); } - //Create the 3ds directory if it doesn't exist - FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/3ds"), FS_ATTRIBUTE_DIRECTORY); - //Create the presets directory if it doesn't exist - FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/3ds/presets"), FS_ATTRIBUTE_DIRECTORY); - //Create the mm3dr directory if it doesn't exist - FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/3ds/presets/mm3dr"), FS_ATTRIBUTE_DIRECTORY); - //Create the cosmetics directory if it doesn't exist - FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/3ds/presets/mm3dr/cosmetics"), FS_ATTRIBUTE_DIRECTORY); - //Create the settings directory if it doesn't exist - FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/3ds/presets/mm3dr/settings"), FS_ATTRIBUTE_DIRECTORY); - //Create mm3dr directory if it doesnt exist - FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/3ds/mm3dr"), FS_ATTRIBUTE_DIRECTORY); - //create spoiler_logs directory if it doesnst exist - FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, "/3ds/mm3dr/spoiler_logs"), FS_ATTRIBUTE_DIRECTORY); - // Close SD archive - FSUSER_CloseArchive(sdmcArchive); - return true; + // Migrate presets to new directories + + std::vector> dirPairs = { + { "/3ds/presets/mm3dr/settings/", "/MM3DR/Presets/Settings/" }, + { "/3ds/presets/mm3dr/cosmetics/", "/MM3DR/Presets/Cosmetics/" }, + }; + + for (auto dirPair : dirPairs) { + if (R_FAILED(FSUSER_OpenDirectory(nullptr, sdmcArchive, fsMakePath(PATH_ASCII, dirPair.first.c_str())))) { + continue; + } + for (const auto& entry : fs::directory_iterator(dirPair.first)) { + if (entry.is_regular_file() && entry.path().extension().string() == ".xml") { + auto filename = entry.path().filename().string(); + consoleClear(); + printf("\x1b[10;10HMigrating Presets"); + printf("\x1b[11;10HMoving %s", filename.c_str()); + FSUSER_RenameFile(sdmcArchive, fsMakePath(PATH_ASCII, std::string(dirPair.first + filename).c_str()), + sdmcArchive, fsMakePath(PATH_ASCII, std::string(dirPair.second + filename).c_str())); + } + } + } } //Gets the preset filenames diff --git a/source/spoiler_log.cpp b/source/spoiler_log.cpp index d99d829..d6a46be 100644 --- a/source/spoiler_log.cpp +++ b/source/spoiler_log.cpp @@ -19,6 +19,10 @@ #include #include #include +#include + +namespace fs = std::filesystem; + using namespace rnd; namespace { std::string placementtxt; @@ -92,6 +96,25 @@ namespace { static RandomizerHash randomizerHash; static SpoilerData spoilerData; +void CreateLogDirectories(FS_Archive sdmcArchive) { + std::vector dirs = { + "/MM3DR/", + "/MM3DR/Spoiler_Logs/", + }; + + const auto printInfo = [&](int progress) { + consoleClear(); + printf("\x1b[10;10HCreating Log Directories"); + printf("\x1b[11;10HProgress: %d/%d", progress, dirs.size()); + }; + + printInfo(0); + for (size_t i = 0; i < dirs.size(); i++) { + FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, dirs[i].c_str()), FS_ATTRIBUTE_DIRECTORY); + printInfo(i + 1); + } +} + void GenerateHash() { for (size_t i = 0; i < randomizerHash.size(); i++) { const auto iconIndex = static_cast(Random(0, hashIcons.size())); @@ -122,7 +145,7 @@ const SpoilerData& GetSpoilerData() { } static auto GetGeneralPath() { - return "/3ds/mm3dr/spoiler_logs/" + Settings::seed + " (" + GetRandomizerHashAsString() + ")"; + return "/MM3DR/Spoiler_Logs/" + Settings::seed + " (" + GetRandomizerHashAsString() + ")"; } static auto GetSpoilerLogPath() {