mirror of
https://github.com/zeldaret/ss
synced 2026-06-06 03:28:56 -04:00
239 lines
6.4 KiB
C++
239 lines
6.4 KiB
C++
#include "d/d_dvd_unk.h"
|
|
|
|
#include "common.h"
|
|
#include "d/d_cs_base.h"
|
|
#include "d/d_cursor_hit_check.h"
|
|
#include "d/d_dvd_drive_error.h"
|
|
#include "d/d_gfx.h"
|
|
#include "d/d_hbm.h"
|
|
#include "d/d_pad.h"
|
|
#include "d/d_pad_manager.h"
|
|
#include "d/d_s_boot.h"
|
|
#include "d/d_video.h"
|
|
#include "d/lyt/d_lyt_system_window.h"
|
|
#include "d/snd/d_snd_player_mgr.h"
|
|
#include "egg/core/eggHeap.h"
|
|
#include "egg/gfx/eggTextureBuffer.h"
|
|
#include "rvl/NAND/nand.h"
|
|
#include "toBeSorted/nand_result_tracker.h"
|
|
|
|
// included asset
|
|
#include "d/dol_backup_error_font.inc"
|
|
|
|
namespace dDvdUnk {
|
|
|
|
FontUnk *FontUnk::sInstance;
|
|
|
|
void FontUnk::create(EGG::Heap *heap) {
|
|
sInstance = new (heap, 0x04) FontUnk();
|
|
sInstance->init();
|
|
dDvdDriveError_c::create(heap);
|
|
NandResultTracker::create(heap);
|
|
dPadManager_c::create(heap);
|
|
sInstance->field_0x2C = 0;
|
|
}
|
|
|
|
void FontUnk::execute() {
|
|
if (dHbm::Manage_c::GetInstance()->getState() == dHbm::Manage_c::HBM_MANAGE_ACTIVE) {
|
|
return;
|
|
}
|
|
|
|
dDvdDriveError_c *driveError = dDvdDriveError_c::GetInstance();
|
|
dPadManager_c *padManager = dPadManager_c::GetInstance();
|
|
NandResultTracker *nandTracker = NandResultTracker::GetInstance();
|
|
|
|
// Errors in decreasing importance
|
|
switch (mErrorType) {
|
|
case ERROR_DISK: driveError->execute(); break;
|
|
case ERROR_PAD:
|
|
driveError->execute();
|
|
padManager->execute();
|
|
break;
|
|
case ERROR_NAND:
|
|
driveError->execute();
|
|
padManager->execute();
|
|
nandTracker->execute();
|
|
break;
|
|
default:
|
|
driveError->execute();
|
|
nandTracker->execute();
|
|
padManager->execute();
|
|
break;
|
|
}
|
|
if (checkFlag(FLAG_ERROR_REQUEST)) {
|
|
offFlag(FLAG_ERROR_REQUEST);
|
|
EGG::TextureBuffer *buf = dGfx_c::GetInstance()->getTextureBuffer();
|
|
if (buf != nullptr) {
|
|
buf->capture(0, 0, false, -1);
|
|
}
|
|
onFlag(FLAG_ERROR_STATE);
|
|
}
|
|
}
|
|
|
|
void FontUnk::drawNonDriveError() {
|
|
switch (mErrorType) {
|
|
case ERROR_PAD: dPadManager_c::GetInstance()->draw(); break;
|
|
case ERROR_NAND: NandResultTracker::GetInstance()->draw(); break;
|
|
default: break;
|
|
}
|
|
}
|
|
|
|
void FontUnk::drawDriveError() {
|
|
if (mIsDiskError == true) {
|
|
dDvdDriveError_c::GetInstance()->draw();
|
|
}
|
|
}
|
|
|
|
void FontUnk::init() {
|
|
mIsDiskError = false;
|
|
mIsNandError = false;
|
|
mIsPadError = false;
|
|
mFlags = 0;
|
|
mDiskErrorCode = 0;
|
|
mNandErrorCode = 0;
|
|
field_0x2B = false;
|
|
mErrorType = ERROR_NONE;
|
|
mFont.SetResource(DOL_BACKUP_FONT);
|
|
}
|
|
|
|
void dDvdUnk::FontUnk::fn_800529B0() {
|
|
mIsPadError = false;
|
|
field_0x2B = false;
|
|
if (dCsBase_c::GetInstance() == nullptr) {
|
|
return;
|
|
}
|
|
dCsBase_c::GetInstance()->setVisible(false);
|
|
dCsBase_c::GetInstance()->setDrawDirectly(false);
|
|
dCsBase_c::GetInstance()->setCalibrationPointCenterEnabled(false);
|
|
}
|
|
|
|
void dDvdUnk::FontUnk::clearNandError() {
|
|
clearNandTrackerError();
|
|
mIsNandError = false;
|
|
mNandErrorCode = 0;
|
|
}
|
|
|
|
void dDvdUnk::FontUnk::fn_80052A20() {
|
|
if (dScBoot_c::GetInstance() == nullptr && !dPadManager_c::GetInstance()->isCalibrationFinished()) {
|
|
dPad::ex_c::setCalibrateMpls();
|
|
}
|
|
|
|
if (checkFlag(FLAG_ERROR_STATE)) {
|
|
dGfx_c::GetInstance()->releaseTextureBuffer();
|
|
dSndPlayerMgr_c::GetInstance()->leaveCaution();
|
|
}
|
|
|
|
if (dLytSystemWindow_c::GetInstance() != nullptr && dLytSystemWindow_c::GetInstance()->fn_80152F80()) {
|
|
dLytSystemWindow_c::GetInstance()->fn_80152F10();
|
|
}
|
|
|
|
mIsDiskError = false;
|
|
mIsNandError = false;
|
|
mIsPadError = false;
|
|
mFlags = false;
|
|
mDiskErrorCode = 0;
|
|
mNandErrorCode = 0;
|
|
field_0x2B = false;
|
|
mErrorType = ERROR_NONE;
|
|
|
|
dPadManager_c::GetInstance()->init();
|
|
NandResultTracker::GetInstance()->init();
|
|
}
|
|
|
|
void FontUnk::preExecute() {
|
|
if (dHbm::Manage_c::GetInstance()->getState() != dHbm::Manage_c::HBM_MANAGE_ACTIVE) {
|
|
dDvdDriveError_c *drive = dDvdDriveError_c::GetInstance();
|
|
NandResultTracker *nand = NandResultTracker::GetInstance();
|
|
dPadManager_c *pad = dPadManager_c::GetInstance();
|
|
bool prevError = isAnyError();
|
|
mIsDiskError = drive->isError();
|
|
mDiskErrorCode = drive->getStatus();
|
|
mIsNandError = nand->isError();
|
|
mNandErrorCode = nand->getErrorCategory();
|
|
|
|
if (padErrorsAllowed() == true) {
|
|
mIsPadError = pad->isError();
|
|
}
|
|
|
|
// Errors in decreasing importance
|
|
if (mIsDiskError == true) {
|
|
mErrorType = ERROR_DISK;
|
|
} else if (mIsPadError == true) {
|
|
mErrorType = ERROR_PAD;
|
|
} else if (mIsNandError == true) {
|
|
mErrorType = ERROR_NAND;
|
|
} else {
|
|
mErrorType = ERROR_NONE;
|
|
}
|
|
|
|
if (prevError && !isAnyError()) {
|
|
dGfx_c::GetInstance()->releaseTextureBuffer();
|
|
offFlag(FLAG_ERROR_STATE);
|
|
dSndPlayerMgr_c::GetInstance()->leaveCaution();
|
|
}
|
|
|
|
if (field_0x2C == true && !prevError && isAnyError()) {
|
|
dSndPlayerMgr_c::GetInstance()->enterCaution();
|
|
}
|
|
}
|
|
}
|
|
|
|
bool FontUnk::isAnyError() const {
|
|
return mIsDiskError | mIsNandError | mIsPadError;
|
|
}
|
|
|
|
void FontUnk::onError() {
|
|
if (checkFlag(FLAG_ERROR_STATE)) {
|
|
return;
|
|
}
|
|
onFlag(FLAG_ERROR_REQUEST);
|
|
dVideo::enableDimming(1);
|
|
}
|
|
|
|
void FontUnk::clearNandTrackerError() {
|
|
NandResultTracker::GetInstance()->isFailure(NAND_RESULT_OK);
|
|
}
|
|
|
|
void FontUnk::fn_80052CC0() {
|
|
setNeedsPad(true);
|
|
field_0x2B = true;
|
|
}
|
|
|
|
void FontUnk::setNeedsPad(bool b) {
|
|
if (dPadManager_c::GetInstance() != nullptr) {
|
|
dPadManager_c::GetInstance()->setField_0x1F(b);
|
|
}
|
|
}
|
|
|
|
bool FontUnk::padErrorsAllowed() {
|
|
if (field_0x2B != true) {
|
|
return false;
|
|
}
|
|
|
|
if (dPadManager_c::GetInstance() != nullptr) {
|
|
return dPadManager_c::GetInstance()->getField_0x1F();
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void FontUnk::fn_80052D50() {
|
|
if (dPadManager_c::GetInstance()->isError() == true) {
|
|
if (checkFlag(FLAG_ERROR_STATE)) {
|
|
dGfx_c::GetInstance()->releaseTextureBuffer();
|
|
mFlags = 0;
|
|
dSndPlayerMgr_c::GetInstance()->leaveCaution();
|
|
}
|
|
dPadManager_c::GetInstance()->init();
|
|
}
|
|
setNeedsPad(false);
|
|
dVideo::enableDimming(0);
|
|
}
|
|
|
|
void FontUnk::fn_80052DD0() {
|
|
setNeedsPad(true);
|
|
dVideo::enableDimming(1);
|
|
}
|
|
|
|
} // namespace dDvdUnk
|