Files
ss/src/toBeSorted/nand_result_tracker.cpp
T
2025-08-02 09:20:02 +02:00

119 lines
2.9 KiB
C++

#include "toBeSorted/nand_result_tracker.h"
#include "common.h"
#include "d/d_dvd_unk.h"
#include "d/d_gfx.h"
#include "d/lyt/d_lyt_system_window.h"
#include "egg/core/eggHeap.h"
NandResultTracker *NandResultTracker::sInstance;
void NandResultTracker::create(EGG::Heap *heap) {
sInstance = new (heap) NandResultTracker();
sInstance->init();
}
NandResultTracker *NandResultTracker::GetInstance() {
return sInstance;
}
bool NandResultTracker::isFailure(NANDResult status) {
bool ret = true;
switch (status) {
case NAND_RESULT_OK:
case NAND_RESULT_EXISTS:
case NAND_RESULT_NOEXISTS: {
mErrorCategory = ERR_CAT_NONE;
ret = false;
break;
}
case NAND_RESULT_ECC_CRIT:
case NAND_RESULT_AUTHENTICATION: {
mErrorCategory = ERR_CAT_SAVE_MGR;
break;
}
default: {
mErrorCategory = ERR_CAT_FATAL;
break;
}
}
return ret;
}
void NandResultTracker::draw() {
dGfx_c::doDrawCapTexture();
}
void NandResultTracker::execute() {
static const ModeFunc procs[] = {
&NandResultTracker::ModeProc_Normal,
&NandResultTracker::ModeProc_Error,
};
ModeFunc f = procs[mMode];
if (f != nullptr) {
(this->*f)();
}
}
void NandResultTracker::init() {
mErrorCategory = ERR_CAT_NONE;
mIsError = false;
ModeRequestNormal();
}
void NandResultTracker::ModeRequestNormal() {
ModeRequest(Normal);
}
void NandResultTracker::ModeProc_Normal() {
if (mErrorCategory != ERR_CAT_NONE && mErrorCategory != ERR_CAT_SAVE_MGR) {
mIsError = true;
dDvdUnk::FontUnk::GetInstance()->onError();
} else {
mIsError = false;
}
if (mErrorCategory != ERR_CAT_NONE && mErrorCategory != ERR_CAT_SAVE_MGR) {
ModeRequestError();
}
}
void NandResultTracker::ModeRequestError() {
ModeRequest(Error);
}
void NandResultTracker::ModeProc_Error() {
// Note: Only index 3 (SYS_NAND_12) is reachable apparently
#pragma push
#pragma readonly_strings on
static const char *sMessages[] = {
// "The Wii system memory has been damaged. Refer to the Wii Operations Manual for details."
"SYS_NAND_08",
"SYS_NAND_08",
// "Could not access Wii system memory. Refer to the Wii Operations Manual for details."
"SYS_NAND_11",
// "An error occurred while accessing Wii system memory. Refer to the Wii Operations Manual for details."
"SYS_NAND_12",
"SYS_NAND_12",
};
#pragma pop
dLytSystemWindow_c *window = dLytSystemWindow_c::GetInstance();
s32 error = GetInstance()->getErrorCategory();
switch (mStep) {
case 0:
if (window->setProperties(sMessages[error], false, nullptr) == true) {
mStep = 1;
}
break;
default: break;
}
}
void NandResultTracker::ModeRequest(Mode_e mode) {
mMode = mode;
mStep = 0;
}