Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion source/include/preset.hpp
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
#pragma once

#include <3ds.h>

#include <string>
#include <vector>

enum class OptionCategory;

bool CreatePresetDirectories();
void CreatePresetDirectories(FS_Archive sdmcArchive);
std::vector<std::string> GetSettingsPresets();
bool SavePreset(std::string_view presetName, OptionCategory category);
bool LoadPreset(std::string_view presetName, OptionCategory category);
Expand Down
4 changes: 4 additions & 0 deletions source/include/spoiler_log.hpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
#pragma once

#include <3ds.h>

#include <array>
#include <string>
#include <string_view>
#include "rnd/spoiler_data.h"

using RandomizerHash = std::array<std::string, 5>;

void CreateLogDirectories(FS_Archive sdmcArchive);

void GenerateHash();
const RandomizerHash& GetRandomizerHash();

Expand Down
23 changes: 20 additions & 3 deletions source/menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
66 changes: 41 additions & 25 deletions source/preset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ static const std::string CACHED_COSMETICS_FILENAME = "CACHED_COSMETICS";

static std::string_view GetBasePath(OptionCategory category) {
static constexpr std::array<std::string_view, 2> paths{
"/3ds/presets/mm3dr/settings/",
"/3ds/presets/mm3dr/cosmetics/",
"/MM3DR/Presets/Settings/",
"/MM3DR/Presets/Cosmetics/",
};

switch(category) {
Expand All @@ -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<std::string> 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<std::pair<std::string, std::string>> 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
Expand Down
25 changes: 24 additions & 1 deletion source/spoiler_log.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@
#include <string>
#include <unordered_map>
#include <vector>
#include <filesystem>

namespace fs = std::filesystem;

using namespace rnd;
namespace {
std::string placementtxt;
Expand Down Expand Up @@ -92,6 +96,25 @@ namespace {
static RandomizerHash randomizerHash;
static SpoilerData spoilerData;

void CreateLogDirectories(FS_Archive sdmcArchive) {
std::vector<std::string> 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<u8>(Random(0, hashIcons.size()));
Expand Down Expand Up @@ -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() {
Expand Down