Improve code readability

This commit is contained in:
Xpl0itU 2022-10-14 18:09:36 +02:00
parent c0f77af12f
commit 027b6258af
3 changed files with 190 additions and 143 deletions

View File

@ -47,7 +47,7 @@ ROMFS := languages
CFLAGS := -std=gnu2x -g -Wall -Ofast -ffunction-sections `freetype-config --cflags` \
$(MACHDEP) $(INCLUDE) -D__WIIU__ -D__WUT__ -D__wiiu__
CXXFLAGS := -std=gnu++20 -g -Wall -Wno-int-in-bool-context -Wno-builtin-declaration-mismatch -Wno-format-overflow -Ofast -fpermissive -ffunction-sections `freetype-config --cflags` \
CXXFLAGS := -std=gnu++20 -g -Wall -Wno-switch -Wno-format-overflow -Ofast -fpermissive -ffunction-sections `freetype-config --cflags` \
$(MACHDEP) $(INCLUDE) -D__WIIU__ -D__WUT__ -D__wiiu__
ASFLAGS := -g $(ARCH)

46
include/main.h Normal file → Executable file
View File

@ -17,4 +17,48 @@
#include <sysapp/launch.h>
#include <sysapp/title.h>
#include <vpad/input.h>
#include <whb/proc.h>
#include <whb/proc.h>
#define MIN_MENU_ID 0
#define MAX_MENU_ID 3
enum Menu {
mainMenu = 0,
selectTitle = 1,
selectTask = 2,
selectOptions = 3
};
Menu operator++(Menu &menu, int) {
Menu currentMenu = menu;
if (MAX_MENU_ID < menu + 1) menu = (Menu) MIN_MENU_ID;
else
menu = static_cast<Menu>(menu + 1);
return (currentMenu);
}
Menu operator--(Menu &menu, int) {
Menu currentMenu = menu;
if (menu != MIN_MENU_ID)
menu = static_cast<Menu>(menu - 1);
return (currentMenu);
}
enum Mode {
WiiU = 0,
vWii = 1,
batchBackup = 2
};
enum Task {
backup = 0,
restore = 1,
wipe = 2,
importLoadiine = 3,
exportLoadiine = 4,
copytoOtherDevice = 5
};

View File

@ -16,14 +16,18 @@
static uint8_t slot = 0;
static int8_t allusers = -1, allusers_d = -1, sdusers = -1;
static bool common = true;
static int menu = 0, mode = 0, task = 0, targ = 0, tsort = 1, sorta = 1;
static Menu menu = mainMenu;
static Mode mode;
static Task task;
static bool sortAscending = true;
static int targ = 0, tsort = 1;
static int cursor = 0, scroll = 0;
static int cursorb = 0, cursort = 0, scrollb = 0;
static int titleswiiu = 0, titlesvwii = 0;
static int wiiuTitlesCount = 0, vWiiTitlesCount = 0;
static std::array<const char *, 4> sortn;
template<class It>
static void sortTitle(It titles, It last, int tsort = 1, int sorta = 1) {
static void sortTitle(It titles, It last, int tsort = 1, bool sortAscending = true) {
switch (tsort) {
case 0:
std::ranges::sort(titles, last, std::ranges::less{}, &Title::listID);
@ -32,7 +36,7 @@ static void sortTitle(It titles, It last, int tsort = 1, int sorta = 1) {
const auto proj = [](const Title &title) {
return std::string_view(title.shortName);
};
if (sorta == 1) {
if (sortAscending == true) {
std::ranges::sort(titles, last, std::ranges::less{}, proj);
} else {
std::ranges::sort(titles, last, std::ranges::greater{}, proj);
@ -40,7 +44,7 @@ static void sortTitle(It titles, It last, int tsort = 1, int sorta = 1) {
break;
}
case 2:
if (sorta == 1) {
if (sortAscending == true) {
std::ranges::sort(titles, last, std::ranges::less{}, &Title::isTitleOnUSB);
} else {
std::ranges::sort(titles, last, std::ranges::greater{}, &Title::isTitleOnUSB);
@ -51,7 +55,7 @@ static void sortTitle(It titles, It last, int tsort = 1, int sorta = 1) {
return std::make_tuple(title.isTitleOnUSB,
std::string_view(title.shortName));
};
if (sorta == 1) {
if (sortAscending == true) {
std::ranges::sort(titles, last, std::ranges::less{}, proj);
} else {
std::ranges::sort(titles, last, std::ranges::greater{}, proj);
@ -70,8 +74,7 @@ static void disclaimer() {
static Title *loadWiiUTitles(int run) {
static char *tList;
static uint32_t receivedCount;
const std::array<const char *, 2> highIDs = {"00050000", "00050002"};
const std::array<const uint32_t, 2> highIDsNumeric = {0x00050000, 0x00050002};
const std::array<const uint32_t, 2> highIDs = {0x00050000, 0x00050002};
// Source: haxchi installer
if (run == 0) {
int mcp_handle = MCP_Open();
@ -111,7 +114,7 @@ static Title *loadWiiUTitles(int run) {
int tNoSave = usable;
for (int i = 0; i <= 1; i++) {
for (uint8_t a = 0; a < 2; a++) {
std::string path = stringFormat("%s/usr/save/%s", (i == 0) ? "/vol/storage_usb01" : "/vol/storage_mlc01", highIDs[a]);
std::string path = stringFormat("%s/usr/save/%08x", (i == 0) ? "/vol/storage_usb01" : "/vol/storage_mlc01", highIDs[a]);
DIR *dir = opendir(path.c_str());
if (dir != nullptr) {
struct dirent *data;
@ -119,9 +122,9 @@ static Title *loadWiiUTitles(int run) {
if (data->d_name[0] == '.')
continue;
path = stringFormat("%s/usr/save/%s/%s/user", (i == 0) ? "/vol/storage_usb01" : "/vol/storage_mlc01", highIDs[a], data->d_name);
path = stringFormat("%s/usr/save/%08x/%s/user", (i == 0) ? "/vol/storage_usb01" : "/vol/storage_mlc01", highIDs[a], data->d_name);
if (checkEntry(path.c_str()) == 2) {
path = stringFormat("%s/usr/save/%s/%s/meta/meta.xml", (i == 0) ? "/vol/storage_usb01" : "/vol/storage_mlc01", highIDs[a],
path = stringFormat("%s/usr/save/%08x/%s/meta/meta.xml", (i == 0) ? "/vol/storage_usb01" : "/vol/storage_mlc01", highIDs[a],
data->d_name);
if (checkEntry(path.c_str()) == 1) {
for (int i = 0; i < usable; i++) {
@ -150,7 +153,7 @@ static Title *loadWiiUTitles(int run) {
for (uint8_t a = 0; a < 2; a++) {
for (int i = 0; i <= 1; i++) {
std::string path = stringFormat("%s/usr/save/%s", (i == 0) ? "/vol/storage_usb01" : "/vol/storage_mlc01", highIDs[a]);
std::string path = stringFormat("%s/usr/save/%08x", (i == 0) ? "/vol/storage_usb01" : "/vol/storage_mlc01", highIDs[a]);
DIR *dir = opendir(path.c_str());
if (dir != nullptr) {
struct dirent *data;
@ -158,10 +161,10 @@ static Title *loadWiiUTitles(int run) {
if (data->d_name[0] == '.')
continue;
path = stringFormat("%s/usr/save/%s/%s/meta/meta.xml", (i == 0) ? "/vol/storage_usb01" : "/vol/storage_mlc01", highIDs[a],
path = stringFormat("%s/usr/save/%08x/%s/meta/meta.xml", (i == 0) ? "/vol/storage_usb01" : "/vol/storage_mlc01", highIDs[a],
data->d_name);
if (checkEntry(path.c_str()) == 1) {
saves[pos].highID = highIDsNumeric[a];
saves[pos].highID = highIDs[a];
saves[pos].lowID = strtoul(data->d_name, nullptr, 16);
saves[pos].dev = i;
saves[pos].found = false;
@ -196,55 +199,55 @@ static Title *loadWiiUTitles(int run) {
const std::string path = stringFormat("%s/usr/%s/%08x/%08x/meta/meta.xml", isTitleOnUSB ? "/vol/storage_usb01" : "/vol/storage_mlc01",
saves[i].found ? "title" : "save", highID, lowID);
titles[titleswiiu].saveInit = !saves[i].found;
titles[wiiuTitlesCount].saveInit = !saves[i].found;
char *xmlBuf = nullptr;
if (loadFile(path.c_str(), (uint8_t **) &xmlBuf) > 0) {
char *cptr = strchr(strstr(xmlBuf, "product_code"), '>') + 7;
memset(titles[titleswiiu].productCode, 0, sizeof(titles[titleswiiu].productCode));
strlcpy(titles[titleswiiu].productCode, cptr, strcspn(cptr, "<") + 1);
memset(titles[wiiuTitlesCount].productCode, 0, sizeof(titles[wiiuTitlesCount].productCode));
strlcpy(titles[wiiuTitlesCount].productCode, cptr, strcspn(cptr, "<") + 1);
cptr = strchr(strstr(xmlBuf, "shortname_en"), '>') + 1;
memset(titles[titleswiiu].shortName, 0, sizeof(titles[titleswiiu].shortName));
memset(titles[wiiuTitlesCount].shortName, 0, sizeof(titles[wiiuTitlesCount].shortName));
if (strcspn(cptr, "<") == 0)
cptr = strchr(strstr(xmlBuf, "shortname_ja"), '>') + 1;
decodeXMLEscapeLine(std::string(cptr));
strlcpy(titles[titleswiiu].shortName, decodeXMLEscapeLine(std::string(cptr)).c_str(), strcspn(decodeXMLEscapeLine(std::string(cptr)).c_str(), "<") + 1);
strlcpy(titles[wiiuTitlesCount].shortName, decodeXMLEscapeLine(std::string(cptr)).c_str(), strcspn(decodeXMLEscapeLine(std::string(cptr)).c_str(), "<") + 1);
cptr = strchr(strstr(xmlBuf, "longname_en"), '>') + 1;
memset(titles[i].longName, 0, sizeof(titles[i].longName));
if (strcspn(cptr, "<") == 0)
cptr = strchr(strstr(xmlBuf, "longname_ja"), '>') + 1;
strlcpy(titles[titleswiiu].longName, decodeXMLEscapeLine(std::string(cptr)).c_str(), strcspn(decodeXMLEscapeLine(std::string(cptr)).c_str(), "<") + 1);
strlcpy(titles[wiiuTitlesCount].longName, decodeXMLEscapeLine(std::string(cptr)).c_str(), strcspn(decodeXMLEscapeLine(std::string(cptr)).c_str(), "<") + 1);
free(xmlBuf);
}
titles[titleswiiu].isTitleDupe = false;
for (int i = 0; i < titleswiiu; i++) {
titles[wiiuTitlesCount].isTitleDupe = false;
for (int i = 0; i < wiiuTitlesCount; i++) {
if ((titles[i].highID == highID) && (titles[i].lowID == lowID)) {
titles[titleswiiu].isTitleDupe = true;
titles[titleswiiu].dupeID = i;
titles[wiiuTitlesCount].isTitleDupe = true;
titles[wiiuTitlesCount].dupeID = i;
titles[i].isTitleDupe = true;
titles[i].dupeID = titleswiiu;
titles[i].dupeID = wiiuTitlesCount;
}
}
titles[titleswiiu].highID = highID;
titles[titleswiiu].lowID = lowID;
titles[titleswiiu].isTitleOnUSB = isTitleOnUSB;
titles[titleswiiu].listID = titleswiiu;
if (loadTitleIcon(&titles[titleswiiu]) < 0)
titles[titleswiiu].iconBuf = nullptr;
titles[wiiuTitlesCount].highID = highID;
titles[wiiuTitlesCount].lowID = lowID;
titles[wiiuTitlesCount].isTitleOnUSB = isTitleOnUSB;
titles[wiiuTitlesCount].listID = wiiuTitlesCount;
if (loadTitleIcon(&titles[wiiuTitlesCount]) < 0)
titles[wiiuTitlesCount].iconBuf = nullptr;
titleswiiu++;
wiiuTitlesCount++;
clearBuffersEx();
disclaimer();
drawTGA(298, 144, 1, icon_tga);
consolePrintPosAligned(10, 0, 1, gettext("Loaded %i Wii U titles."), titleswiiu);
consolePrintPosAligned(10, 0, 1, gettext("Loaded %i Wii U titles."), wiiuTitlesCount);
flipBuffers();
WHBLogFreetypeDraw();
}
@ -286,15 +289,15 @@ static Title *loadWiiTitles() {
continue;
}
titlesvwii++;
vWiiTitlesCount++;
}
closedir(dir);
}
}
if (titlesvwii == 0)
if (vWiiTitlesCount == 0)
return nullptr;
auto *titles = (Title *) malloc(titlesvwii * sizeof(Title));
auto *titles = (Title *) malloc(vWiiTitlesCount * sizeof(Title));
if (titles == nullptr) {
promptError(gettext("Out of memory."));
return nullptr;
@ -390,7 +393,7 @@ static Title *loadWiiTitles() {
clearBuffersEx();
disclaimer();
drawTGA(298, 144, 1, icon_tga);
consolePrintPosAligned(10, 0, 1, gettext("Loaded %i Wii U titles."), titleswiiu);
consolePrintPosAligned(10, 0, 1, gettext("Loaded %i Wii U titles."), wiiuTitlesCount);
consolePrintPosAligned(11, 0, 1, gettext("Loaded %i Wii titles."), i);
flipBuffers();
WHBLogFreetypeDraw();
@ -447,15 +450,15 @@ int main() {
int *versionList = (int *) malloc(0x100 * sizeof(int));
getAccountsWiiU();
sortTitle(wiiutitles, wiiutitles + titleswiiu, tsort, sorta);
sortTitle(wiititles, wiititles + titlesvwii, tsort, sorta);
sortTitle(wiiutitles, wiiutitles + wiiuTitlesCount, tsort, sortAscending);
sortTitle(wiititles, wiititles + vWiiTitlesCount, tsort, sortAscending);
bool redraw = true;
int entrycount = 0;
Input input;
while (AppRunning()) {
Title *titles = mode != 0 ? wiititles : wiiutitles;
int count = mode != 0 ? titlesvwii : titleswiiu;
Title *titles = mode != WiiU ? wiititles : wiiutitles;
int count = mode != WiiU ? vWiiTitlesCount : wiiuTitlesCount;
if (redraw) {
OSScreenClearBufferEx(SCREEN_DRC, 0x00006F00);
@ -465,30 +468,30 @@ int main() {
consolePrintPos(0, 1, "----------------------------------------------------------------------------");
switch (menu) {
case 0: { // Main Menu
case mainMenu: {
entrycount = 3;
consolePrintPos(M_OFF, 2, gettext(" Wii U Save Management (%u Title%s)"), titleswiiu,
(titleswiiu > 1) ? "s" : "");
consolePrintPos(M_OFF, 3, gettext(" vWii Save Management (%u Title%s)"), titlesvwii,
(titlesvwii > 1) ? "s" : "");
consolePrintPos(M_OFF, 2, gettext(" Wii U Save Management (%u Title%s)"), wiiuTitlesCount,
(wiiuTitlesCount > 1) ? "s" : "");
consolePrintPos(M_OFF, 3, gettext(" vWii Save Management (%u Title%s)"), vWiiTitlesCount,
(vWiiTitlesCount > 1) ? "s" : "");
consolePrintPos(M_OFF, 4, gettext(" Batch Backup"));
consolePrintPos(M_OFF, 2 + cursor, "\u2192");
consolePrintPosAligned(17, 4, 2, gettext("\ue000: Select Mode"));
} break;
case 1: { // Select Title
if (mode == 2) {
case selectTitle: {
if (mode == batchBackup) {
entrycount = 3;
consolePrintPos(M_OFF, 2, gettext(" Backup All (%u Title%s)"), titleswiiu + titlesvwii,
((titleswiiu + titlesvwii) > 1) ? "s" : "");
consolePrintPos(M_OFF, 3, gettext(" Backup Wii U (%u Title%s)"), titleswiiu,
(titleswiiu > 1) ? "s" : "");
consolePrintPos(M_OFF, 4, gettext(" Backup vWii (%u Title%s)"), titlesvwii,
(titlesvwii > 1) ? "s" : "");
consolePrintPos(M_OFF, 2, gettext(" Backup All (%u Title%s)"), wiiuTitlesCount + vWiiTitlesCount,
((wiiuTitlesCount + vWiiTitlesCount) > 1) ? "s" : "");
consolePrintPos(M_OFF, 3, gettext(" Backup Wii U (%u Title%s)"), wiiuTitlesCount,
(wiiuTitlesCount > 1) ? "s" : "");
consolePrintPos(M_OFF, 4, gettext(" Backup vWii (%u Title%s)"), vWiiTitlesCount,
(vWiiTitlesCount > 1) ? "s" : "");
consolePrintPos(M_OFF, 2 + cursor, "\u2192");
consolePrintPosAligned(17, 4, 2, gettext("\ue000: Backup \ue001: Back"));
} else {
consolePrintPos(39, 0, gettext("%s Sort: %s \ue084"),
(tsort > 0) ? ((sorta == 1) ? "\ue083 \u2193" : "\ue083 \u2191") : "", sortn[tsort]);
(tsort > 0) ? ((sortAscending == true) ? "\ue083 \u2193" : "\ue083 \u2191") : "", sortn[tsort]);
entrycount = count;
for (int i = 0; i < 14; i++) {
if (i + scroll < 0 || i + scroll >= count)
@ -500,40 +503,40 @@ int main() {
ttfFontColor32(0xFF0000FF);
if (strlen(titles[i + scroll].shortName) != 0u)
consolePrintPos(M_OFF, i + 2, " %s %s%s%s", titles[i + scroll].shortName,
titles[i + scroll].isTitleOnUSB ? "(USB)" : ((mode == 0) ? "(NAND)" : ""),
titles[i + scroll].isTitleOnUSB ? "(USB)" : ((mode == WiiU) ? "(NAND)" : ""),
titles[i + scroll].isTitleDupe ? " [D]" : "",
titles[i + scroll].saveInit ? "" : gettext(" [Not Init]"));
else
consolePrintPos(M_OFF, i + 2, " %08lx%08lx", titles[i + scroll].highID,
titles[i + scroll].lowID);
ttfFontColor32(0xFFFFFFFF);
if (mode == 0) {
if (mode == WiiU) {
if (titles[i + scroll].iconBuf != nullptr) {
drawTGA((M_OFF + 4) * 12 - 2, (i + 3) * 24, 0.18, titles[i + scroll].iconBuf);
}
} else if (mode == 1) {
} else if (mode == vWii) {
if (titles[i + scroll].iconBuf != nullptr) {
drawRGB5A3((M_OFF + 2) * 12 - 2, (i + 3) * 24 + 3, 0.25,
titles[i + scroll].iconBuf);
}
}
}
if (mode == 0)
if (mode == WiiU)
consolePrintPos(-1, 2 + cursor, "\u2192");
else if (mode == 1)
else if (mode == vWii)
consolePrintPos(-3, 2 + cursor, "\u2192");
consolePrintPosAligned(17, 4, 2, gettext("\ue000: Select Game \ue001: Back"));
}
} break;
case 2: { // Select Task
entrycount = 3 + 2 * static_cast<int>(mode == 0) + 1 * static_cast<int>((mode == 0) && (titles[targ].isTitleDupe));
case selectTask: {
entrycount = 3 + 2 * static_cast<int>(mode == WiiU) + 1 * static_cast<int>((mode == WiiU) && (titles[targ].isTitleDupe));
consolePrintPos(M_OFF, 2, " [%08X-%08X] [%s]", titles[targ].highID, titles[targ].lowID,
titles[targ].productCode);
consolePrintPos(M_OFF, 3, " %s", titles[targ].shortName);
consolePrintPos(M_OFF, 5, gettext(" Backup savedata"));
consolePrintPos(M_OFF, 6, gettext(" Restore savedata"));
consolePrintPos(M_OFF, 7, gettext(" Wipe savedata"));
if (mode == 0) {
if (mode == WiiU) {
consolePrintPos(M_OFF, 8, gettext(" Import from loadiine"));
consolePrintPos(M_OFF, 9, gettext(" Export to loadiine"));
if (titles[targ].isTitleDupe)
@ -541,25 +544,25 @@ int main() {
titles[targ].isTitleOnUSB ? "NAND" : "USB");
if (titles[targ].iconBuf != nullptr)
drawTGA(660, 80, 1, titles[targ].iconBuf);
} else if (mode == 1)
} else if (mode == vWii)
if (titles[targ].iconBuf != nullptr)
drawRGB5A3(645, 80, 1, titles[targ].iconBuf);
consolePrintPos(M_OFF, 2 + 3 + cursor, "\u2192");
consolePrintPosAligned(17, 4, 2, gettext("\ue000: Select Task \ue001: Back"));
} break;
case 3: { // Select Options
case selectOptions: {
entrycount = 3;
consolePrintPos(M_OFF, 2, "[%08X-%08X] %s", titles[targ].highID, titles[targ].lowID,
titles[targ].shortName);
if (task == 5) {
if (task == copytoOtherDevice) {
consolePrintPos(M_OFF, 4, gettext("Destination:"));
consolePrintPos(M_OFF, 5, " (%s)", titles[targ].isTitleOnUSB ? "NAND" : "USB");
} else if (task > 2) {
entrycount = 2;
consolePrintPos(M_OFF, 4, gettext("Select %s:"), gettext("version"));
consolePrintPos(M_OFF, 5, " < v%u >", versionList != nullptr ? versionList[slot] : 0);
} else if (task == 2) {
} else if (task == wipe) {
consolePrintPos(M_OFF, 4, gettext("Delete from:"));
consolePrintPos(M_OFF, 5, " (%s)", titles[targ].isTitleOnUSB ? "USB" : "NAND");
} else {
@ -575,8 +578,8 @@ int main() {
: gettext("Used"));
}
if (mode == 0) {
if (task == 1) {
if (mode == WiiU) {
if (task == restore) {
if (!isSlotEmpty(titles[targ].highID, titles[targ].lowID, slot)) {
entrycount++;
consolePrintPos(M_OFF, 7, gettext("Select SD user to copy from:"));
@ -591,7 +594,7 @@ int main() {
}
}
if (task == 2) {
if (task == wipe) {
consolePrintPos(M_OFF, 7, gettext("Select Wii U user to delete from:"));
if (allusers == -1)
consolePrintPos(M_OFF, 8, " < %s >", gettext("all users"));
@ -604,27 +607,27 @@ int main() {
: gettext("Empty"));
}
if ((task == 0) || (task == 1) || (task == 5)) {
if ((task == 1) && isSlotEmpty(titles[targ].highID, titles[targ].lowID, slot))
if ((task == backup) || (task == restore) || (task == copytoOtherDevice)) {
if ((task == restore) && isSlotEmpty(titles[targ].highID, titles[targ].lowID, slot))
entrycount--;
else {
consolePrintPos(M_OFF, (task == 1) ? 10 : 7, gettext("Select Wii U user%s:"),
(task == 5) ? gettext(" to copy from") : ((task == 1) ? gettext(" to copy to") : ""));
consolePrintPos(M_OFF, (task == restore) ? 10 : 7, gettext("Select Wii U user%s:"),
(task == copytoOtherDevice) ? gettext(" to copy from") : ((task == restore) ? gettext(" to copy to") : ""));
if (allusers == -1)
consolePrintPos(M_OFF, (task == 1) ? 11 : 8, " < %s >", gettext("all users"));
consolePrintPos(M_OFF, (task == restore) ? 11 : 8, " < %s >", gettext("all users"));
else
consolePrintPos(M_OFF, (task == 1) ? 11 : 8, " < %s (%s) > (%s)",
consolePrintPos(M_OFF, (task == restore) ? 11 : 8, " < %s (%s) > (%s)",
wiiuacc[allusers].miiName, wiiuacc[allusers].persistentID,
hasAccountSave(&titles[targ],
(!((task == 0) || (task == 1) || (task == 5))),
(!((task < 3) || (task == 5))),
(!((task == backup) || (task == restore) || (task == copytoOtherDevice))),
(!((task < 3) || (task == copytoOtherDevice))),
wiiuacc[allusers].pID, slot,
versionList != nullptr ? versionList[slot] : 0)
? gettext("Has Save")
: gettext("Empty"));
}
}
if ((task == 0) || (task == 1))
if ((task == backup) || (task == restore))
if (!isSlotEmpty(titles[targ].highID, titles[targ].lowID, slot)) {
Date *dateObj = new Date(titles[targ].highID, titles[targ].lowID, slot);
consolePrintPos(M_OFF, 15, gettext("Date: %s"),
@ -632,9 +635,9 @@ int main() {
delete dateObj;
}
if (task == 5) {
if (task == copytoOtherDevice) {
entrycount++;
consolePrintPos(M_OFF, 10, gettext("Select Wii U user%s:"), (task == 5) ? gettext(" to copy to") : "");
consolePrintPos(M_OFF, 10, gettext("Select Wii U user%s:"), (task == copytoOtherDevice) ? gettext(" to copy to") : "");
if (allusers_d == -1)
consolePrintPos(M_OFF, 11, " < %s >", gettext("all users"));
else
@ -646,19 +649,19 @@ int main() {
: gettext("Empty"));
}
if ((task != 3) && (task != 4)) {
if ((task != importLoadiine) && (task != exportLoadiine)) {
if (allusers > -1) {
if (hasCommonSave(&titles[targ],
(!((task == 0) || (task == 2) || (task == 5))),
(!((task < 3) || (task == 5))), slot,
(!((task == backup) || (task == wipe) || (task == copytoOtherDevice))),
(!((task < 3) || (task == copytoOtherDevice))), slot,
versionList != nullptr ? versionList[slot] : 0)) {
consolePrintPos(M_OFF, (task == 1) || (task == 5) ? 13 : 10,
consolePrintPos(M_OFF, (task == restore) || (task == copytoOtherDevice) ? 13 : 10,
gettext("Include 'common' save?"));
consolePrintPos(M_OFF, (task == 1) || (task == 5) ? 14 : 11, " < %s >",
consolePrintPos(M_OFF, (task == restore) || (task == copytoOtherDevice) ? 14 : 11, " < %s >",
common ? gettext("yes") : gettext("no "));
} else {
common = false;
consolePrintPos(M_OFF, (task == 1) || (task == 5) ? 13 : 10,
consolePrintPos(M_OFF, (task == restore) || (task == copytoOtherDevice) ? 13 : 10,
gettext("No 'common' save found."));
entrycount--;
}
@ -680,7 +683,7 @@ int main() {
consolePrintPos(M_OFF, 5 + cursor * 3, "\u2192");
if (titles[targ].iconBuf != nullptr)
drawTGA(660, 100, 1, titles[targ].iconBuf);
} else if (mode == 1) {
} else if (mode == vWii) {
entrycount = 1;
if (titles[targ].iconBuf != nullptr)
drawRGB5A3(650, 100, 1, titles[targ].iconBuf);
@ -693,22 +696,22 @@ int main() {
}
switch (task) {
case 0:
case backup:
consolePrintPosAligned(17, 4, 2, gettext("\ue000: Backup \ue001: Back"));
break;
case 1:
case restore:
consolePrintPosAligned(17, 4, 2, gettext("\ue000: Restore \ue001: Back"));
break;
case 2:
case wipe:
consolePrintPosAligned(17, 4, 2, gettext("\ue000: Wipe \ue001: Back"));
break;
case 3:
case importLoadiine:
consolePrintPosAligned(17, 4, 2, gettext("\ue000: Import \ue001: Back"));
break;
case 4:
case exportLoadiine:
consolePrintPosAligned(17, 4, 2, gettext("\ue000: Export \ue001: Back"));
break;
case 5:
case copytoOtherDevice:
consolePrintPosAligned(17, 4, 2, gettext("\ue000: Copy \ue001: Back"));
break;
}
@ -748,8 +751,8 @@ int main() {
}
if (input.get(TRIGGER, PAD_BUTTON_LEFT)) {
if (menu == 3) {
if (task == 5) {
if (menu == selectOptions) {
if (task == copytoOtherDevice) {
switch (cursor) {
case 0:
break;
@ -765,7 +768,7 @@ int main() {
common ^= 1;
break;
}
} else if (task == 1) {
} else if (task == restore) {
switch (cursor) {
case 0:
slot--;
@ -783,7 +786,7 @@ int main() {
common ^= 1;
break;
}
} else if (task == 2) {
} else if (task == wipe) {
switch (cursor) {
case 0:
break;
@ -794,7 +797,7 @@ int main() {
common ^= 1;
break;
}
} else if ((task == 3) || (task == 4)) {
} else if ((task == importLoadiine) || (task == exportLoadiine)) {
switch (cursor) {
case 0:
slot--;
@ -818,8 +821,8 @@ int main() {
}
}
} else if (input.get(TRIGGER, PAD_BUTTON_RIGHT)) {
if (menu == 3) {
if (task == 5) {
if (menu == selectOptions) {
if (task == copytoOtherDevice) {
switch (cursor) {
case 0:
break;
@ -835,7 +838,7 @@ int main() {
common ^= 1;
break;
}
} else if (task == 1) {
} else if (task == restore) {
switch (cursor) {
case 0:
slot++;
@ -853,7 +856,7 @@ int main() {
common ^= 1;
break;
}
} else if (task == 2) {
} else if (task == wipe) {
switch (cursor) {
case 0:
break;
@ -864,7 +867,7 @@ int main() {
common ^= 1;
break;
}
} else if ((task == 3) || (task == 4)) {
} else if ((task == importLoadiine) || (task == exportLoadiine)) {
switch (cursor) {
case 0:
slot++;
@ -890,18 +893,18 @@ int main() {
}
if (input.get(TRIGGER, PAD_BUTTON_R)) {
if (menu == 1) {
if (menu == selectTitle) {
tsort = (tsort + 1) % 4;
sortTitle(titles, titles + count, tsort, sorta);
} else if (menu == 2)
sortTitle(titles, titles + count, tsort, sortAscending);
} else if (menu == selectTask)
targ = (targ + 1) % count;
}
if (input.get(TRIGGER, PAD_BUTTON_L)) {
if ((menu == 1) && (tsort > 0)) {
sorta *= -1;
sortTitle(titles, titles + count, tsort, sorta);
} else if (menu == 2) {
if ((menu == selectTitle) && (tsort > 0)) {
sortAscending = !sortAscending;
sortTitle(titles, titles + count, tsort, sortAscending);
} else if (menu == selectTask) {
targ--;
if (targ < 0)
targ = count - 1;
@ -912,42 +915,42 @@ int main() {
clearBuffers();
WHBLogFreetypeDraw();
if (menu < 3) {
if (menu == 0) {
mode = cursor;
if (mode == 0 && ((wiiutitles == nullptr) || (titleswiiu == 0))) {
if (menu == mainMenu) {
mode = (Mode) cursor;
if (mode == WiiU && ((wiiutitles == nullptr) || (wiiuTitlesCount == 0))) {
promptError(gettext("No Wii U titles found."));
continue;
}
if (mode == 1 && ((wiititles == nullptr) || (titlesvwii == 0))) {
if (mode == vWii && ((wiititles == nullptr) || (vWiiTitlesCount == 0))) {
promptError(gettext("No vWii saves found."));
continue;
}
}
if (menu == 1) {
if (menu == selectTitle) {
targ = cursor + scroll;
cursorb = cursor;
scrollb = scroll;
if (mode == 2) {
if (mode == batchBackup) {
OSCalendarTime dateTime;
switch (cursor) {
case 0:
dateTime.tm_year = 0;
backupAllSave(wiiutitles, titleswiiu, &dateTime);
backupAllSave(wiititles, titlesvwii, &dateTime);
backupAllSave(wiiutitles, wiiuTitlesCount, &dateTime);
backupAllSave(wiititles, vWiiTitlesCount, &dateTime);
break;
case 1:
backupAllSave(wiiutitles, titleswiiu, nullptr);
backupAllSave(wiiutitles, wiiuTitlesCount, nullptr);
break;
case 2:
backupAllSave(wiititles, titlesvwii, nullptr);
backupAllSave(wiititles, vWiiTitlesCount, nullptr);
break;
}
continue;
}
if (titles[targ].highID == 0 || titles[targ].lowID == 0)
continue;
if ((mode == 0) && (strcmp(titles[targ].shortName, "DONT TOUCH ME") == 0)) {
if ((mode == WiiU) && (strcmp(titles[targ].shortName, "DONT TOUCH ME") == 0)) {
if (!promptConfirm(ST_ERROR, gettext("CBHC save. Could be dangerous to modify. Continue?")) ||
!promptConfirm(ST_WARNING, gettext("Are you REALLY sure?"))) {
continue;
@ -956,10 +959,10 @@ int main() {
std::string path = stringFormat("%s/usr/title/000%x/%x/code/fw.img",
(titles[targ].isTitleOnUSB) ? "/vol/storage_usb01" : "/vol/storage_mlc01", titles[targ].highID,
titles[targ].lowID);
if ((mode == 0) && (checkEntry(path.c_str()) != 0))
if ((mode == WiiU) && (checkEntry(path.c_str()) != 0))
if (!promptConfirm(ST_ERROR, gettext("vWii saves are in the vWii section. Continue?")))
continue;
if ((mode == 0) && (!titles[targ].saveInit)) {
if ((mode == WiiU) && (!titles[targ].saveInit)) {
if (!promptConfirm(ST_WARNING, gettext("Recommended to run Game at least one time. Continue?")) ||
!promptConfirm(ST_WARNING, gettext("Are you REALLY sure?"))) {
continue;
@ -967,41 +970,41 @@ int main() {
}
}
if (menu == 2) {
task = cursor;
if (menu == selectTask) {
task = (Task) cursor;
cursort = cursor;
if (task == 0) {
if (task == backup) {
if (!titles[targ].saveInit) {
promptError(gettext("No save to Backup."));
continue;
}
}
if (task == 1) {
if (task == restore) {
getAccountsSD(&titles[targ], slot);
allusers = ((sdusers == -1) ? -1 : allusers);
sdusers = ((allusers == -1) ? -1 : sdusers);
}
if (task == 2) {
if (task == wipe) {
if (!titles[targ].saveInit) {
promptError(gettext("No save to Wipe."));
continue;
}
}
if ((task == 3) || (task == 4)) {
if ((task == importLoadiine) || (task == exportLoadiine)) {
char gamePath[PATH_SIZE];
memset(versionList, 0, 0x100 * sizeof(int));
if (getLoadiineGameSaveDir(gamePath, titles[targ].productCode, titles[targ].longName, titles[targ].highID, titles[targ].lowID) != 0)
continue;
getLoadiineSaveVersionList(versionList, gamePath);
if (task == 3) {
if (task == importLoadiine) {
importFromLoadiine(&titles[targ], common, versionList != nullptr ? versionList[slot] : 0);
continue;
}
if (task == 4) {
if (task == exportLoadiine) {
if (!titles[targ].saveInit) {
promptError(gettext("No save to Export."));
continue;
@ -1011,7 +1014,7 @@ int main() {
}
}
if (task == 5) {
if (task == copytoOtherDevice) {
if (!titles[targ].saveInit) {
promptError(gettext("No save to Copy."));
continue;
@ -1022,16 +1025,16 @@ int main() {
cursor = scroll = 0;
} else {
switch (task) {
case 0:
case backup:
backupSavedata(&titles[targ], slot, allusers, common);
break;
case 1:
case restore:
restoreSavedata(&titles[targ], slot, sdusers, allusers, common);
break;
case 2:
case wipe:
wipeSavedata(&titles[targ], allusers, common);
break;
case 5:
case copytoOtherDevice:
for (int i = 0; i < count; i++) {
if (titles[i].listID == titles[targ].dupeID) {
copySavedata(&titles[targ], &titles[i], allusers, allusers_d, common);
@ -1046,17 +1049,17 @@ int main() {
WHBLogFreetypeDraw();
menu--;
cursor = scroll = 0;
if (menu == 1) {
if (menu == selectTitle) {
cursor = cursorb;
scroll = scrollb;
}
if (menu == 2)
if (menu == selectTask)
cursor = cursort;
}
}
unloadTitles(wiiutitles, titleswiiu);
unloadTitles(wiititles, titlesvwii);
unloadTitles(wiiutitles, wiiuTitlesCount);
unloadTitles(wiititles, vWiiTitlesCount);
free(versionList);
deinitFS();