mirror of https://github.com/PrimeDecomp/prime.git
135 lines
3.3 KiB
C++
135 lines
3.3 KiB
C++
#include "MetroidPrime/CErrorOutputWindow.hpp"
|
|
|
|
#include "MetroidPrime/CArchitectureMessage.hpp"
|
|
|
|
#include "MetaRender/CCubeRenderer.hpp"
|
|
#include "Kyoto/Graphics/CGraphics.hpp"
|
|
|
|
#include "dolphin/dvd.h"
|
|
|
|
CErrorOutputWindow::CErrorOutputWindow(bool flag)
|
|
: CIOWin(rstl::string_l("Error Output Window"))
|
|
, x14_state(0)
|
|
, x18_24_(false)
|
|
, x18_25_(true)
|
|
, x18_26_(true)
|
|
, x18_27_(true)
|
|
, x18_28_(flag)
|
|
, x1c_msg(nullptr)
|
|
|
|
{}
|
|
|
|
bool CErrorOutputWindow::GetIsContinueDraw() const { return x14_state == 2; }
|
|
|
|
CIOWin::EMessageReturn CErrorOutputWindow::OnMessage(const CArchitectureMessage& msg,
|
|
CArchitectureQueue&) {
|
|
|
|
switch (msg.GetType()) {
|
|
case kAM_UserInput:
|
|
return CIOWin::EMessageReturn((-x14_state | x14_state) >> 0x1f);
|
|
|
|
case kAM_FrameBegin:
|
|
UpdateWindow();
|
|
|
|
case kAM_TimerTick:
|
|
case kAM_FrameEnd:
|
|
{
|
|
int result = x14_state ^ 1;
|
|
result = (result >> 1) - ((result & x14_state) >> 0x1f);
|
|
return CIOWin::EMessageReturn(result);
|
|
}
|
|
break;
|
|
}
|
|
return kMR_Normal;
|
|
}
|
|
|
|
void CErrorOutputWindow::UpdateWindow() {
|
|
if (x14_state == 1) {
|
|
sub_802694c4(2);
|
|
return;
|
|
}
|
|
s32 driveStatus = DVDGetDriveStatus();
|
|
const wchar_t* errMsg = nullptr;
|
|
int flagThing = (-x14_state | x14_state) >> 0x1f;
|
|
static s32 s_LastDvdStatus = 0;
|
|
if (driveStatus != s_LastDvdStatus) {
|
|
s_LastDvdStatus = driveStatus;
|
|
}
|
|
if (true) {
|
|
switch (driveStatus)
|
|
{
|
|
case 4:
|
|
errMsg = L"Please insert the\nMetroid Prime Game Disc";
|
|
break;
|
|
|
|
case 5:
|
|
errMsg = L"The Disc Cover is open.\nIf you want to continue the game,\nplease close the Disc Cover.";
|
|
break;
|
|
|
|
case 6:
|
|
errMsg = L"This is not the\nMetroid Prime Game Disc.\n \nPlease insert the\nMetroid Prime Game Disc.";
|
|
break;
|
|
|
|
case 0xb:
|
|
errMsg = L"The Game Disc could not be read.\nPlease read the Nintendo GameCube\nInstruction Booklet\nfor more information.";
|
|
break;
|
|
|
|
case -1:
|
|
errMsg = L"An error has occurred. Turn the\npower off and refer to the\nNintendo GameCube\nInstruction Booklet\nfor further instructions.";
|
|
|
|
default:
|
|
break;
|
|
}
|
|
bool flag = false;
|
|
if (driveStatus != 2 && driveStatus != 1 && errMsg) {
|
|
if (x1c_msg != nullptr && errMsg != x1c_msg) {
|
|
flag = true;
|
|
}
|
|
x1c_msg = errMsg;
|
|
}
|
|
if (flagThing == 0) {
|
|
if (x14_state != 0) {
|
|
if (x18_26_) {
|
|
CGraphics::SetIsBeginSceneClearFb(x18_24_);
|
|
}
|
|
sub_802694c4(0);
|
|
}
|
|
} else if (x14_state == 3) {
|
|
if (flag) {
|
|
if (x18_26_) {
|
|
CGraphics::SetIsBeginSceneClearFb(x18_24_);
|
|
}
|
|
sub_802694c4(2);
|
|
}
|
|
} else {
|
|
if (x14_state == 0) {
|
|
x18_24_ = CGraphics::IsBeginSceneClearFb();
|
|
}
|
|
sub_802694c4(x14_state + 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CErrorOutputWindow::Draw() const {
|
|
// SCOPED_GRAPHICS_DEBUG_GROUP("CErrorOutputWindow::Draw", zeus::skGreen);
|
|
switch (x14_state) {
|
|
case 0:
|
|
break;
|
|
|
|
case 2:
|
|
sub_802695f8();
|
|
|
|
case 1:
|
|
case 3:
|
|
CGraphics::SetIsBeginSceneClearFb(false);
|
|
if (gpRender != NULL) {
|
|
gpRender->x318_26_ = true;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void CErrorOutputWindow::sub_802695f8() const {}
|
|
|
|
void CErrorOutputWindow::sub_802694c4(int) {}
|