diff --git a/config/SOUE01/rels/d_s_bootNP/symbols.txt b/config/SOUE01/rels/d_s_bootNP/symbols.txt index 84a375b5..31754f44 100644 --- a/config/SOUE01/rels/d_s_bootNP/symbols.txt +++ b/config/SOUE01/rels/d_s_bootNP/symbols.txt @@ -52,7 +52,7 @@ finalizeState_Connect__9dScBoot_cFv = .text:0x00001DB0; // type:function size:0x initializeState_Save__9dScBoot_cFv = .text:0x00001DC0; // type:function size:0x18 executeState_Save__9dScBoot_cFv = .text:0x00001DE0; // type:function size:0x29C finalizeState_Save__9dScBoot_cFv = .text:0x00002080; // type:function size:0x4 -fn_3_2090 = .text:0x00002090; // type:function size:0x78 +tryLoadTitleScreen__9dScBoot_cFv = .text:0x00002090; // type:function size:0x78 checkDone__9dScBoot_cFv = .text:0x00002110; // type:function size:0x2C build__24sFStateFct_c<9dScBoot_c>FRC12sStateIDIf_c = .text:0x00002140; // type:function size:0x60 dispose__24sFStateFct_c<9dScBoot_c>FRP10sStateIf_c = .text:0x000021A0; // type:function size:0xC diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index a2ed088c..6adab5b6 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -527,8 +527,8 @@ fn_80015DE0 = .text:0x80015DE0; // type:function size:0x8 fn_80015DF0 = .text:0x80015DF0; // type:function size:0x48 create__11SaveRelatedFv = .text:0x80015E40; // type:function size:0x38 remove__11SaveRelatedFv = .text:0x80015E80; // type:function size:0x18 -fn_80015EA0 = .text:0x80015EA0; // type:function size:0x14 -fn_80015EC0 = .text:0x80015EC0; // type:function size:0x74 +fn_80015EA0__11SaveRelatedFv = .text:0x80015EA0; // type:function size:0x14 +fn_80015EC0__11SaveRelatedFv = .text:0x80015EC0; // type:function size:0x74 fn_80015F40__11SaveRelatedFv = .text:0x80015F40; // type:function size:0xC fn_80015F50 = .text:0x80015F50; // type:function size:0x8 fn_80015F60 = .text:0x80015F60; // type:function size:0x14 diff --git a/include/d/d_gfx.h b/include/d/d_gfx.h index 826e8d33..f1ec0e32 100644 --- a/include/d/d_gfx.h +++ b/include/d/d_gfx.h @@ -28,8 +28,8 @@ public: mDrawCallback = cb; } - void setField0x09(u8 val) { - field_0x09 = val; + void setLetterboxEnabled(bool val) { + mLetterboxEnabled = val; } static dGfx_c *GetInstance() { @@ -142,8 +142,8 @@ private: /* 0x00 */ EGG::TextureBuffer *mpTextureBuffer; /* 0x04 */ DrawCallback mDrawCallback; - /* 0x08 */ u8 field_0x08; - /* 0x09 */ u8 field_0x09; + /* 0x08 */ u8 mBufRefcount; + /* 0x09 */ bool mLetterboxEnabled; }; #endif diff --git a/include/d/d_pad_manager.h b/include/d/d_pad_manager.h index 7db0cfbc..8cd5725d 100644 --- a/include/d/d_pad_manager.h +++ b/include/d/d_pad_manager.h @@ -24,6 +24,9 @@ public: bool isCalibrationFinished() const { return mCalibrationFinished; } + bool isCalibrationSkipped() const { + return mCalibrationSkipped; + } bool getField_0x25() const { return field_0x25; } @@ -114,7 +117,7 @@ private: /* 0x21 */ bool mCalibrationFinished; /* 0x22 */ bool mSavedCsDrawDirectly; /* 0x23 */ bool field_0x23; - /* 0x24 */ bool field_0x24; + /* 0x24 */ bool mCalibrationSkipped; /* 0x25 */ bool field_0x25; static dPadManager_c *sInstance; diff --git a/include/d/d_s_boot.h b/include/d/d_s_boot.h index e87c371c..428f04e5 100644 --- a/include/d/d_s_boot.h +++ b/include/d/d_s_boot.h @@ -24,22 +24,22 @@ public: return sInstance; } - u8 getField_0x5E2() const { + bool getField_0x5E2() const { return field_0x5E2; } - void setField_0x5E2(u8 val) { + void setField_0x5E2(bool val) { field_0x5E2 = val; } - u8 getField_0x5E3() const { + bool getField_0x5E3() const { return field_0x5E3; } - void setField_0x5E3(u8 val) { + void setField_0x5E3(bool val) { field_0x5E3 = val; } - u8 getField_0x5E4() const { + bool getField_0x5E4() const { return field_0x5E4; } - void setField_0x5E4(u8 val) { + void setField_0x5E4(bool val) { field_0x5E4 = val; } @@ -76,6 +76,7 @@ private: virtual void deleteReady() override; bool checkDone(); + bool tryLoadTitleScreen(); static void drawCallback(); @@ -99,16 +100,16 @@ private: /* 0x574 */ STATE_MGR_DECLARE(dScBoot_c); /* 0x5B4 */ dFader_c mFader; /* 0x5D4 */ s32 mProgressStage; - /* 0x5D8 */ u32 field_0x5D8; - /* 0x5DC */ u8 field_0x5DC; - /* 0x5DD */ u8 field_0x5DD; - /* 0x5DE */ u8 field_0x5DE; - /* 0x5DF */ u8 field_0x5DF; - /* 0x5E0 */ u8 field_0x5E0; - /* 0x5E1 */ u8 field_0x5E1; - /* 0x5E2 */ u8 field_0x5E2; - /* 0x5E3 */ u8 field_0x5E3; - /* 0x5E4 */ u8 field_0x5E4; + /* 0x5D8 */ s32 field_0x5D8; + /* 0x5DC */ bool mStrapScreenSeen; + /* 0x5DD */ bool mCalibrationDone; + /* 0x5DE */ bool mAllDataLoaded; + /* 0x5DF */ bool mObjectDataLoaded; + /* 0x5E0 */ bool field_0x5E0; + /* 0x5E1 */ bool mStrapScreenVisible; + /* 0x5E2 */ bool field_0x5E2; + /* 0x5E3 */ bool field_0x5E3; + /* 0x5E4 */ bool field_0x5E4; }; #endif diff --git a/include/toBeSorted/save_related.h b/include/toBeSorted/save_related.h index f6c85a1c..0072dc1c 100644 --- a/include/toBeSorted/save_related.h +++ b/include/toBeSorted/save_related.h @@ -1,6 +1,8 @@ #ifndef SAVE_RELATED_H #define SAVE_RELATED_H +#include "common.h" + class SaveRelated { public: static void create(); @@ -10,10 +12,20 @@ public: return sInstance; } + void fn_80015EA0(); + void fn_80015EC0(); void fn_80015F40(); + bool getField_0x09() const { + return field_0x09; + } + private: static SaveRelated *sInstance; + + /* 0x00 */ u8 _0x00[0x08 - 0x00]; + /* 0x08 */ u8 field_0x08; + /* 0x09 */ bool field_0x09; }; #endif diff --git a/src/REL/d/d_s_boot.cpp b/src/REL/d/d_s_boot.cpp index 19984abf..746d8713 100644 --- a/src/REL/d/d_s_boot.cpp +++ b/src/REL/d/d_s_boot.cpp @@ -2,6 +2,7 @@ #include "common.h" #include "d/d_base.h" +#include "d/d_cs_base.h" #include "d/d_d2d.h" #include "d/d_dvd_unk.h" #include "d/d_dylink.h" @@ -10,8 +11,11 @@ #include "d/d_hbm.h" #include "d/d_heap.h" #include "d/d_message.h" +#include "d/d_pad.h" #include "d/d_pad_manager.h" +#include "d/d_pad_nav.h" #include "d/d_reset.h" +#include "d/d_sc_title.h" #include "d/d_scene.h" #include "d/d_sys.h" #include "d/lyt/d_lyt_battery.h" @@ -33,6 +37,7 @@ #include "toBeSorted/d_emitter.h" #include "toBeSorted/d_particle.h" #include "toBeSorted/fi_context.h" +#include "toBeSorted/file_manager.h" #include "toBeSorted/save_manager.h" #include "toBeSorted/save_related.h" #include "toBeSorted/special_item_drop_mgr.h" @@ -244,7 +249,7 @@ sFPhaseBase::sFPhaseState dScBoot_c::cb6() { } dDvdUnk::FontUnk::GetInstance()->setField_0x2C(1); - field_0x5DF = 1; + mObjectDataLoaded = true; return sFPhaseBase::PHASE_NEXT; } @@ -401,12 +406,12 @@ void dScBoot_c::strap_c::init() { } dScBoot_c::dScBoot_c() : mStateMgr(*this, sStateID::null), mPhases(this, sCallbacks), mpDvdCallback(nullptr) { - field_0x5DF = 0; + mObjectDataLoaded = false; sInstance = this; - field_0x5E1 = 0; - field_0x5E2 = 0; - field_0x5E3 = 0; - field_0x5E4 = 0; + mStrapScreenVisible = false; + field_0x5E2 = false; + field_0x5E3 = false; + field_0x5E4 = false; } dScBoot_c::~dScBoot_c() { @@ -438,7 +443,7 @@ int dScBoot_c::doDelete() { dBase_c::createRoot(fProfile::LAST, 0, 0); d3d::createLightTextures(); SpecialItemDropMgr::create(); - dHbm::Manage_c::GetInstance()->offFlags(8); + dHbm::Manage_c::GetInstance()->offFlags(0x8); dGfx_c::GetInstance()->setDrawCallback(nullptr); dReset::Manage_c::GetInstance()->BootComplete(true); return SUCCEEDED; @@ -448,15 +453,15 @@ int dScBoot_c::execute() { mFader.calc(); mStateMgr.executeState(); sFPhaseBase::sFPhaseState state = executeLoadPhase(); - if (field_0x5DE == 0 && state == sFPhaseBase::PHASE_ALL_DONE) { - field_0x5DE = 1; + if (mAllDataLoaded == false && state == sFPhaseBase::PHASE_ALL_DONE) { + mAllDataLoaded = true; } return SUCCEEDED; } int dScBoot_c::draw() { - if (field_0x5E1 == 1) { + if (mStrapScreenVisible == true) { mStrapScreen.draw(); } @@ -464,16 +469,16 @@ int dScBoot_c::draw() { } void dScBoot_c::deleteReady() { - // TODO + // no-op } void dScBoot_c::initializeState_Init() { mProgressStage = 0; field_0x5D8 = 0; - field_0x5DC = 0; - field_0x5DD = 0; - field_0x5DE = 0; - field_0x5E0 = 0; + mStrapScreenSeen = false; + mCalibrationDone = false; + mAllDataLoaded = false; + field_0x5E0 = false; } void dScBoot_c::executeState_Init() { @@ -484,7 +489,7 @@ void dScBoot_c::finalizeState_Init() {} void dScBoot_c::initializeState_Strap() { mProgressStage = 0; - field_0x5E1 = 1; + mStrapScreenVisible = true; mFader.fadeIn(); mFader.resetFrames(); } @@ -505,7 +510,7 @@ void dScBoot_c::executeState_Strap() { } if (ok) { - field_0x5DC = 1; + mStrapScreenSeen = true; if (mFader.fadeOut() == true) { mProgressStage = 2; } @@ -516,7 +521,7 @@ void dScBoot_c::executeState_Strap() { if (!checkDone() && mFader.isNotStatus(mFaderBase_c::FADING_OUT)) { if (mFader.fadeIn() == true) { mProgressStage = 3; - field_0x5E1 = 0; + mStrapScreenVisible = false; } } break; @@ -528,9 +533,9 @@ void dScBoot_c::executeState_Strap() { case 4: mFader.setStatus(mFaderBase_c::FADED_OUT); if (mFader.fadeIn() == true) { - field_0x5E4 = 1; - if (field_0x5DC != 0) { - field_0x5E1 = 0; + field_0x5E4 = true; + if (mStrapScreenSeen != false) { + mStrapScreenVisible = false; mStateMgr.changeState(StateID_Connect); } else { mProgressStage = 0; @@ -544,8 +549,7 @@ void dScBoot_c::executeState_Strap() { } void dScBoot_c::finalizeState_Strap() { - // TODO - dGfx_c::GetInstance()->setField0x09(1); + dGfx_c::GetInstance()->setLetterboxEnabled(1); } void dScBoot_c::initializeState_Connect() { @@ -554,7 +558,91 @@ void dScBoot_c::initializeState_Connect() { } void dScBoot_c::executeState_Connect() { - // TODO + switch (mProgressStage) { + case 0: + if (field_0x5E3 == true) { + field_0x5E3 = false; + mProgressStage = 4; + } else if (mObjectDataLoaded == true) { + mProgressStage = 1; + } + break; + case 1: + if (field_0x5E3 == true) { + field_0x5E3 = false; + mProgressStage = 4; + } else { + dHbm::Manage_c::GetInstance()->offFlags(0x8); + dDvdUnk::FontUnk::GetInstance()->fn_80052CC0(); + mProgressStage = 2; + } + break; + case 2: + if (field_0x5E3 == true) { + field_0x5E3 = false; + mProgressStage = 5; + } else { + mProgressStage = 3; + } + break; + case 3: + if (field_0x5E3 == true) { + field_0x5E3 = false; + mProgressStage = 5; + } else if (dPadManager_c::GetInstance()->isCalibrationFinished() || + dPadManager_c::GetInstance()->isCalibrationSkipped()) { + mCalibrationDone = true; + mStateMgr.changeState(StateID_Save); + } + break; + case 4: + mFader.setStatus(mFaderBase_c::FADED_OUT); + if (mFader.fadeIn() == true) { + field_0x5E4 = true; + if (mObjectDataLoaded == true) { + mProgressStage = 1; + } else { + mProgressStage = 0; + } + dHbm::Manage_c::GetInstance()->fn_80197560(0); + } + break; + case 5: + mFader.setStatus(mFaderBase_c::FADED_OUT); + if (mFader.fadeIn() == true) { + field_0x5E4 = true; + mProgressStage = 6; + } + break; + case 6: + if (mFader.isNotStatus(mFaderBase_c::FADING_IN)) { + if (dReset::Manage_c::GetInstance()->isSoftReset()) { + if (dPadManager_c::GetInstance()->isCalibrationFinished() == true && + dPadManager_c::GetInstance()->getField_0x25() == false) { + mCalibrationDone = true; + mStateMgr.changeState(StateID_Save); + } else { + mProgressStage = 2; + } + } else { + dHbm::Manage_c::GetInstance()->fn_80197560(0); + if (dPadManager_c::GetInstance()->isCalibrationFinished() == true) { + if (dPadManager_c::GetInstance()->getField_0x25() == false) { + mCalibrationDone = true; + mStateMgr.changeState(StateID_Save); + } else { + dDvdUnk::FontUnk::GetInstance()->fn_80052CC0(); + mProgressStage = 2; + } + } else { + dPad::ex_c::setCalibrateMpls(); + dDvdUnk::FontUnk::GetInstance()->fn_80052CC0(); + mProgressStage = 2; + } + } + } + break; + } } void dScBoot_c::finalizeState_Connect() {} @@ -566,16 +654,95 @@ void dScBoot_c::initializeState_Save() { } void dScBoot_c::executeState_Save() { - // TODO + switch (mProgressStage) { + case 0: + if (field_0x5E3 == true) { + field_0x5E3 = false; + field_0x5D8 = mProgressStage; + dDvdUnk::FontUnk::GetInstance()->fn_800529B0(); + mProgressStage = 3; + } else if (field_0x5E2 == true) { + field_0x5E2 = false; + mProgressStage = 2; + } else { + SaveRelated *saveRelated = SaveRelated::GetInstance(); + saveRelated->fn_80015EC0(); + if (saveRelated->getField_0x09() == true) { + mProgressStage = 1; + field_0x5E0 = true; + } + } + break; + case 1: + if (field_0x5E3 == true) { + field_0x5E3 = false; + field_0x5D8 = mProgressStage; + mProgressStage = 3; + } else if (tryLoadTitleScreen()) { + mProgressStage = 100; + } + break; + case 2: + if (FileManager::GetInstance()->getField_0xA84D() != true) { + mFader.setStatus(mFaderBase_c::FADED_OUT); + if (mFader.fadeIn() == mFaderBase_c::FADED_IN) { + dCsBase_c::GetInstance()->setCursorStickVisible(false); + dDvdUnk::FontUnk::GetInstance()->fn_800529B0(); + dDvdUnk::FontUnk::GetInstance()->fn_80052A20(); + dLytSystemWindow_c::GetInstance()->fn_80152F10(); + SaveMgr::GetInstance()->init(); + dPadNav::setNavEnabled(false, false); + field_0x5E4 = true; + dHbm::Manage_c::GetInstance()->fn_80197560(0); + SaveRelated::GetInstance()->fn_80015EA0(); + SaveRelated::GetInstance()->fn_80015F40(); + dDvdUnk::FontUnk::GetInstance()->fn_80052CC0(); + mProgressStage = 0; + } + } + break; + case 3: + mFader.setStatus(mFaderBase_c::FADED_OUT); + if (mFader.fadeIn() == mFaderBase_c::FADED_IN) { + field_0x5E4 = true; + mProgressStage = field_0x5D8; + dDvdUnk::FontUnk::GetInstance()->fn_80052CC0(); + dHbm::Manage_c::GetInstance()->fn_80197560(0); + } + break; + case 999999: + if (tryLoadTitleScreen()) { + mProgressStage = 100; + } + break; + } } void dScBoot_c::finalizeState_Save() {} -bool dScBoot_c::checkDone() { - if (field_0x5E3 == 1) { - field_0x5E3 = 0; - mProgressStage = 4; - return 1; +bool dScBoot_c::tryLoadTitleScreen() { + if (mStrapScreenSeen != true) { + return false; } - return 0; + if (mCalibrationDone != true) { + return false; + } + if (mAllDataLoaded != true) { + return false; + } + if (field_0x5E0 != true) { + return false; + } + + dScTitle_c::loadTitleScreen(0); + return true; +} + +bool dScBoot_c::checkDone() { + if (field_0x5E3 == true) { + field_0x5E3 = false; + mProgressStage = 4; + return true; + } + return false; } diff --git a/src/d/d_gfx.cpp b/src/d/d_gfx.cpp index 3ef697c3..fde95962 100644 --- a/src/d/d_gfx.cpp +++ b/src/d/d_gfx.cpp @@ -23,7 +23,7 @@ dGfx_c *dGfx_c::sInstance; -dGfx_c::dGfx_c() : mpTextureBuffer(nullptr), field_0x08(0), field_0x09(0) { +dGfx_c::dGfx_c() : mpTextureBuffer(nullptr), mBufRefcount(0), mLetterboxEnabled(false) { mDrawCallback = nullptr; d3d::create(mHeap::g_gameHeaps[0]); @@ -52,13 +52,13 @@ EGG::TextureBuffer *dGfx_c::getTextureBuffer() { mpTextureBuffer->onCapFlag(0x20); // TODO ret = mpTextureBuffer; } - field_0x08++; + mBufRefcount++; return ret; } void dGfx_c::releaseTextureBuffer() { - field_0x08--; - if (field_0x08 == 0 && mpTextureBuffer != nullptr) { + mBufRefcount--; + if (mBufRefcount == 0 && mpTextureBuffer != nullptr) { mpTextureBuffer->free(); mpTextureBuffer = nullptr; } @@ -74,7 +74,7 @@ void dGfx_c::drawBefore() { } void dGfx_c::drawLetterbox() { - if (field_0x09 != 0 && isTvMode4To3()) { + if (mLetterboxEnabled && isTvMode4To3()) { EGG::Screen screen(*EGG::Screen::GetRoot()); screen.SetNearFar(-1.0f, 1.0f); screen.SetProjectionGX(); diff --git a/src/d/d_pad_manager.cpp b/src/d/d_pad_manager.cpp index 7c63d0ba..af73e352 100644 --- a/src/d/d_pad_manager.cpp +++ b/src/d/d_pad_manager.cpp @@ -50,7 +50,7 @@ void dPadManager_c::init() { if (mpWindow != nullptr) { mpWindow->init(); } - field_0x24 = false; + mCalibrationSkipped = false; } void dPadManager_c::buildWindow() { @@ -293,7 +293,7 @@ void dPadManager_c::ModeRequestCalibrating() { mCalibrationTimer = 0; field_0x1D = true; mCalibrationFinished = false; - field_0x24 = false; + mCalibrationSkipped = false; } void dPadManager_c::ModeProc_Calibrating() { PadStatus_e status = getPadStatus(); @@ -619,7 +619,7 @@ void dPadManager_c::ModeProc_CalibrationFail() { if (mpWindow->fn_80150EB0() == true) { field_0x1D = false; dPad::ex_c::getInstance()->setNoCalibrationNeeded(); - field_0x24 = true; + mCalibrationSkipped = true; field_0x25 = false; mStep = 16; } diff --git a/src/d/d_reset.cpp b/src/d/d_reset.cpp index 15331958..840df09c 100644 --- a/src/d/d_reset.cpp +++ b/src/d/d_reset.cpp @@ -329,13 +329,13 @@ void Manage_c::ModeProc_SoftReset() { if (dScBoot_c::GetInstance()) { if (mpFader->getStatus() == EGG::ColorFader::STATUS_PREPARE_IN) { if (dScBoot_c::GetInstance()->getField_0x5E4()) { - dScBoot_c::GetInstance()->setField_0x5E4(0); + dScBoot_c::GetInstance()->setField_0x5E4(false); mpFader->setStatus(EGG::ColorFader::STATUS_PREPARE_OUT); ModeRequest(Normal); dSndPlayerMgr_c::GetInstance()->fn_8035E310(); } else { if (field_0x66) { - dScBoot_c::GetInstance()->setField_0x5E3(1); + dScBoot_c::GetInstance()->setField_0x5E3(true); dDvdUnk::FontUnk::GetInstance()->fn_800529B0(); dSndPlayerMgr_c::GetInstance()->fn_8035E6E0(); @@ -343,8 +343,8 @@ void Manage_c::ModeProc_SoftReset() { if (dDvdUnk::FontUnk::GetInstance()->isNandError() || dDvdUnk::FontUnk::GetInstance()->getNandError() != NandResultTracker::ERR_CAT_NONE || SaveMgr::GetInstance()->getCheckForFreeSpaceResult()) { - dScBoot_c::GetInstance()->setField_0x5E3(0); - dScBoot_c::GetInstance()->setField_0x5E2(1); + dScBoot_c::GetInstance()->setField_0x5E3(false); + dScBoot_c::GetInstance()->setField_0x5E2(true); dDvdUnk::FontUnk::GetInstance()->clearNandError(); } dDvdUnk::FontUnk::GetInstance()->fn_80052A20(); @@ -553,7 +553,8 @@ void Manage_c::CleanUpLC() { void Manage_c::MotorCancelOn() { for (int i = 0; i < 4; i++) { - mPad::g_core[--++i]->stopRumbleMgr(); + // TODO: Fakematch + mPad::getCore(--++i)->stopRumbleMgr(); } dRumble_c::stop(-1); }