From d7f138747139b76bd98c2679329ab928de058461 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Mon, 16 Jun 2025 00:13:23 -0400 Subject: [PATCH] d_reset almost fully matching --- config/SOUE01/splits.txt | 4 + config/SOUE01/symbols.txt | 56 +-- include/d/d_cs_base.h | 3 + include/d/d_dvd_unk.h | 7 +- include/d/d_hbm.h | 13 +- include/d/d_reset.h | 102 +++-- include/d/d_s_boot.h | 19 + include/d/d_title_manager.h | 11 + include/d/lyt/d_lyt_system_window.h | 2 + include/d/snd/d_snd_player_mgr.h | 7 + include/egg/core/eggColorFader.h | 4 +- include/m/m_pad.h | 5 +- include/rvl/DVD/dvd.h | 40 +- include/rvl/GX/GXFifo.h | 5 + include/rvl/OS/OSReset.h | 4 + include/toBeSorted/file_manager.h | 4 +- include/toBeSorted/music_mgrs.h | 3 +- include/toBeSorted/save_manager.h | 16 +- src/REL/d/d_s_boot.cpp | 2 +- src/d/d_dvd_drive_error.cpp | 3 +- src/d/d_reset.cpp | 593 +++++++++++++++++++++++++++- src/d/d_rumble.cpp | 3 +- src/d/d_sc_title.cpp | 4 +- 23 files changed, 815 insertions(+), 95 deletions(-) diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 28f38fc4..29005b8f 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -340,7 +340,11 @@ toBeSorted/deg_angle_util.cpp: d/d_reset.cpp: .text start:0x80067B20 end:0x80068FD0 align:16 .ctors start:0x804DB6A4 end:0x804DB6A8 + .rodata start:0x804E0F18 end:0x804E0FA8 + .data start:0x8050DFB0 end:0x8050DFE0 + .sdata start:0x80571D20 end:0x80571D30 .sbss start:0x80575270 end:0x80575278 + .sdata2 start:0x805779E8 end:0x805779F8 toBeSorted/arc_managers/current_stage_arc_manager.cpp: .text start:0x80068FD0 end:0x80069910 align:16 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index d9f2ae3a..bd4873b1 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2155,9 +2155,9 @@ fn_800527F0 = .text:0x800527F0; // type:function size:0x11C fn_80052910 = .text:0x80052910; // type:function size:0x48 fn_80052960 = .text:0x80052960; // type:function size:0x18 init__Q27dDvdUnk7FontUnkFv = .text:0x80052980; // type:function size:0x30 -fn_800529B0 = .text:0x800529B0; // type:function size:0x30 -fn_800529E0 = .text:0x800529E0; // type:function size:0x38 -fn_80052A20 = .text:0x80052A20; // type:function size:0xB8 +fn_800529B0__Q27dDvdUnk7FontUnkFv = .text:0x800529B0; // type:function size:0x30 +fn_800529E0__Q27dDvdUnk7FontUnkFv = .text:0x800529E0; // type:function size:0x38 +fn_80052A20__Q27dDvdUnk7FontUnkFv = .text:0x80052A20; // type:function size:0xB8 fn_80052AE0 = .text:0x80052AE0; // type:function size:0x148 fn_80052C30 = .text:0x80052C30; // type:function size:0x24 fn_80052C60__Q27dDvdUnk7FontUnkFv = .text:0x80052C60; // type:function size:0x24 @@ -2945,11 +2945,11 @@ SetHbmReset__Q26dReset8Manage_cFv = .text:0x80067FB0; // type:function size:0xC SetDelayReset__Q26dReset8Manage_cFv = .text:0x80067FC0; // type:function size:0xC SetDelayPowerOff__Q26dReset8Manage_cFv = .text:0x80067FD0; // type:function size:0xC SetInteriorReturnDataManager__Q26dReset8Manage_cFv = .text:0x80067FE0; // type:function size:0xC -fn_80067FF0 = .text:0x80067FF0; // type:function size:0x3C +fn_80067FF0__Q26dReset8Manage_cFv = .text:0x80067FF0; // type:function size:0x3C ExecProcPre__Q26dReset8Manage_cFv = .text:0x80068030; // type:function size:0x34 -fn_80068070 = .text:0x80068070; // type:function size:0x4 +fn_80068070__Q26dReset8Manage_cFv = .text:0x80068070; // type:function size:0x4 ExecProcMain__Q26dReset8Manage_cFv = .text:0x80068080; // type:function size:0x48 -DiskCheckModeRequest__Q26dReset8Manage_cFv = .text:0x800680D0; // type:function size:0xC8 +DiskCheckModeRequest__Q26dReset8Manage_cFb = .text:0x800680D0; // type:function size:0xC8 DebugPrintMode__Q26dReset8Manage_cFPCc = .text:0x800681A0; // type:function size:0x4 ModeProc__Q26dReset8Manage_cFv = .text:0x800681B0; // type:function size:0x114 ModeRequest__Q26dReset8Manage_cFQ36dReset8Manage_c6Mode_e = .text:0x800682D0; // type:function size:0x40 @@ -2969,8 +2969,8 @@ ModeInit_SafetyWait__Q26dReset8Manage_cFv = .text:0x80068B00; // type:function s ModeProc_SafetyWait__Q26dReset8Manage_cFv = .text:0x80068B60; // type:function size:0xE8 SetResetCallback__Q26dReset8Manage_cFv = .text:0x80068C50; // type:function size:0xC SetPowerCallback__Q26dReset8Manage_cFv = .text:0x80068C60; // type:function size:0xC -fn_80068C70 = .text:0x80068C70; // type:function size:0x18 -fn_80068C90 = .text:0x80068C90; // type:function size:0x48 +SetDiskCheckCallback__Q26dReset8Manage_cFv = .text:0x80068C70; // type:function size:0x18 +DiskCheckCallback__Q26dReset8Manage_cFlP11DVDFileInfo = .text:0x80068C90; // type:function size:0x48 ResetCallback__Q26dReset8Manage_cFv = .text:0x80068CE0; // type:function size:0x30 PowerCallback__Q26dReset8Manage_cFv = .text:0x80068D10; // type:function size:0x30 CleanUpGX__Q26dReset8Manage_cFv = .text:0x80068D40; // type:function size:0x88 @@ -8513,13 +8513,13 @@ create__18dLytSystemWindow_cFv = .text:0x80152DE0; // type:function size:0x3C fn_80152E20 = .text:0x80152E20; // type:function size:0xC8 fn_80152EF0 = .text:0x80152EF0; // type:function size:0x8 fn_80152F00 = .text:0x80152F00; // type:function size:0x8 -fn_80152F10 = .text:0x80152F10; // type:function size:0x10 +fn_80152F10__18dLytSystemWindow_cFv = .text:0x80152F10; // type:function size:0x10 fn_80152F20 = .text:0x80152F20; // type:function size:0x18 setProperties__18dLytSystemWindow_cFPCcbPCw = .text:0x80152F40; // type:function size:0x8 fn_80152F50__18dLytSystemWindow_cCFv = .text:0x80152F50; // type:function size:0x8 fn_80152F60__18dLytSystemWindow_cCFv = .text:0x80152F60; // type:function size:0x8 fn_80152F70__18dLytSystemWindow_cCFv = .text:0x80152F70; // type:function size:0x8 -fn_80152F80 = .text:0x80152F80; // type:function size:0x8 +fn_80152F80__18dLytSystemWindow_cCFv = .text:0x80152F80; // type:function size:0x8 getField_0xDE0__18dLytSystemWindow_cCFv = .text:0x80152F90; // type:function size:0x8 showMaybe__18dLytSystemWindow_cFl = .text:0x80152FA0; // type:function size:0x8 showMaybe__18dLytSystemWindow_cFv = .text:0x80152FB0; // type:function size:0x8 @@ -10512,9 +10512,9 @@ IconInit__Q24dHbm8Manage_cFv = .text:0x801971A0; // type:function size:0x44 IconCalc__Q24dHbm8Manage_cFv = .text:0x801971F0; // type:function size:0x148 IconClear__Q24dHbm8Manage_cFv = .text:0x80197340; // type:function size:0x14 StopMotor__Q24dHbm8Manage_cFv = .text:0x80197360; // type:function size:0x5C -fn_801973C0 = .text:0x801973C0; // type:function size:0x58 +fn_801973C0__Q24dHbm8Manage_cFl = .text:0x801973C0; // type:function size:0x58 ForbidCalc__Q24dHbm8Manage_cFv = .text:0x80197420; // type:function size:0x140 -fn_80197560__6dHbm_cFl = .text:0x80197560; // type:function size:0x28 +fn_80197560__Q24dHbm8Manage_cFl = .text:0x80197560; // type:function size:0x28 fn_80197590 = .text:0x80197590; // type:function size:0x28 dStageMgr_c_classInit__Fv = .text:0x801975C0; // type:function size:0x34 fn_80197600 = .text:0x80197600; // type:function size:0xA0 @@ -19940,11 +19940,11 @@ getFreeSize__15dSndPlayerMgr_cFv = .text:0x8035DF60; // type:function size:0x54 fn_8035DFC0 = .text:0x8035DFC0; // type:function size:0x3C fn_8035E000 = .text:0x8035E000; // type:function size:0xD4 fn_8035E0E0 = .text:0x8035E0E0; // type:function size:0xCC -fn_8035E1B0 = .text:0x8035E1B0; // type:function size:0x68 -fn_8035E220 = .text:0x8035E220; // type:function size:0x2C -fn_8035E250 = .text:0x8035E250; // type:function size:0x8C -fn_8035E2E0 = .text:0x8035E2E0; // type:function size:0x2C -fn_8035E310 = .text:0x8035E310; // type:function size:0x50 +fn_8035E1B0__15dSndPlayerMgr_cFUs = .text:0x8035E1B0; // type:function size:0x68 +fn_8035E220__15dSndPlayerMgr_cFv = .text:0x8035E220; // type:function size:0x2C +fn_8035E250__15dSndPlayerMgr_cFUs = .text:0x8035E250; // type:function size:0x8C +fn_8035E2E0__15dSndPlayerMgr_cFv = .text:0x8035E2E0; // type:function size:0x2C +fn_8035E310__15dSndPlayerMgr_cFv = .text:0x8035E310; // type:function size:0x50 enterPauseState__15dSndPlayerMgr_cFv = .text:0x8035E360; // type:function size:0x70 leavePauseState__15dSndPlayerMgr_cFv = .text:0x8035E3D0; // type:function size:0x70 enterMenu__15dSndPlayerMgr_cFv = .text:0x8035E440; // type:function size:0x2C @@ -19956,7 +19956,7 @@ fn_8035E560 = .text:0x8035E560; // type:function size:0x18 fn_8035E580 = .text:0x8035E580; // type:function size:0x50 fn_8035E5D0 = .text:0x8035E5D0; // type:function size:0x44 fn_8035E620 = .text:0x8035E620; // type:function size:0xB4 -fn_8035E6E0 = .text:0x8035E6E0; // type:function size:0xA4 +fn_8035E6E0__15dSndPlayerMgr_cFv = .text:0x8035E6E0; // type:function size:0xA4 fn_8035E790 = .text:0x8035E790; // type:function size:0x84 fn_8035E820 = .text:0x8035E820; // type:function size:0x38 fn_8035E860 = .text:0x8035E860; // type:function size:0x14 @@ -22009,12 +22009,12 @@ OSGetSaveRegion = .text:0x803AAE20; // type:function size:0x14 OSRegisterShutdownFunction = .text:0x803AAE40; // type:function size:0x88 scope:global __OSCallShutdownFunctions = .text:0x803AAED0; // type:function size:0xB0 __OSShutdownDevices = .text:0x803AAF80; // type:function size:0x180 scope:global -fn_803AB100 = .text:0x803AB100; // type:function size:0xE0 -fn_803AB1E0 = .text:0x803AB1E0; // type:function size:0x11C -fn_803AB300 = .text:0x803AB300; // type:function size:0xD4 +OSRebootSystem = .text:0x803AB100; // type:function size:0xE0 +OSShutdownSystem = .text:0x803AB1E0; // type:function size:0x11C +OSRestart = .text:0x803AB300; // type:function size:0xD4 __OSReturnToMenu = .text:0x803AB3E0; // type:function size:0x288 scope:local OSReturnToMenu = .text:0x803AB670; // type:function size:0x40 scope:global -fn_803AB6B0 = .text:0x803AB6B0; // type:function size:0x40 +OSReturnToDataManager = .text:0x803AB6B0; // type:function size:0x40 fn_803AB6F0 = .text:0x803AB6F0; // type:function size:0xA4 fn_803AB7A0 = .text:0x803AB7A0; // type:function size:0x58 OSGetResetCode = .text:0x803AB800; // type:function size:0x30 scope:global @@ -22070,8 +22070,8 @@ OSUTF32toSJIS = .text:0x803AE130; // type:function size:0x40 __OSGetIPCBufferHi = .text:0x803AE170; // type:function size:0x8 __OSGetIPCBufferLo = .text:0x803AE180; // type:function size:0x8 __OSInitIPCBuffer = .text:0x803AE190; // type:function size:0x18 scope:global -fn_803AE1B0 = .text:0x803AE1B0; // type:function size:0xEC -fn_803AE2A0 = .text:0x803AE2A0; // type:function size:0xEC +OSSetResetCallback = .text:0x803AE1B0; // type:function size:0xEC +OSSetPowerCallback = .text:0x803AE2A0; // type:function size:0xEC __OSInitSTM = .text:0x803AE390; // type:function size:0x118 scope:global fn_803AE4B0 = .text:0x803AE4B0; // type:function size:0x7C __OSHotReset = .text:0x803AE530; // type:function size:0x74 scope:global @@ -28214,8 +28214,8 @@ lbl_804E0E3C = .rodata:0x804E0E3C; // type:object size:0x3C lbl_804E0E78 = .rodata:0x804E0E78; // type:object size:0x3C lbl_804E0EB4 = .rodata:0x804E0EB4; // type:object size:0x3C lbl_804E0EF0 = .rodata:0x804E0EF0; // type:object size:0x28 -lbl_804E0F18 = .rodata:0x804E0F18; // type:object size:0x48 -lbl_804E0F60 = .rodata:0x804E0F60; // type:object size:0x48 +@LOCAL@ModeProc__Q26dReset8Manage_cFv@procs = .rodata:0x804E0F18; // type:object size:0x48 +@LOCAL@ModeRequest__Q26dReset8Manage_cFQ36dReset8Manage_c6Mode_e@procs = .rodata:0x804E0F60; // type:object size:0x48 sInfos = .rodata:0x804E0FA8; // type:object size:0x246C scope:local data:4byte lbl_804E3418 = .rodata:0x804E3418; // type:object size:0x40 data:4byte lbl_804E3458 = .rodata:0x804E3458; // type:object size:0x38 data:4byte @@ -41338,7 +41338,7 @@ sInstance__18ArcCallbackHandler = .sbss:0x80575250; // type:object size:0x8 data aspectRatio = .sbss:0x80575258; // type:object size:0x4 align:4 data:float sInstance__8dCsMgr_c = .sbss:0x80575260; // type:object size:0x4 data:4byte spInstance__9dRumble_c = .sbss:0x80575268; // type:object size:0x4 data:4byte -c_faderColor__Q26dReset8Manage_c = .sbss:0x80575270; // type:object size:0x1 data:byte +c_faderColor__Q26dReset8Manage_c = .sbss:0x80575270; // type:object size:0x4 data:byte s_pInstance__Q26dReset8Manage_c = .sbss:0x80575274; // type:object size:0x4 data:4byte sInstance__22CurrentStageArcManager = .sbss:0x80575278; // type:object size:0x4 data:4byte @GUARD@getCurrentStageDirectory__22CurrentStageArcManagerFv@sStageDirTmp = .sbss:0x8057527C; // type:object size:0x1 scope:local data:byte @@ -41524,7 +41524,7 @@ lbl_805756A0 = .sbss:0x805756A0; // type:object size:0x4 data:4byte lbl_805756A4 = .sbss:0x805756A4; // type:object size:0x4 data:4byte sInstance__19GoddessChestCounter = .sbss:0x805756A8; // type:object size:0x8 data:4byte sInstance__9dScBoot_c = .sbss:0x805756B0; // type:object size:0x4 data:4byte -lbl_805756B4 = .sbss:0x805756B4; // type:object size:0x4 data:4byte +sInstance__11dTitleMgr_c = .sbss:0x805756B4; // type:object size:0x4 data:4byte TITLE_SCREEN_CHANGE = .sbss:0x805756B8; // type:object size:0x4 data:4byte sInstance__10dTgSiren_c = .sbss:0x805756BC; // type:object size:0x4 data:4byte WEATHER_TAG = .sbss:0x805756C0; // type:object size:0x8 data:4byte diff --git a/include/d/d_cs_base.h b/include/d/d_cs_base.h index fce72800..5f39ad67 100644 --- a/include/d/d_cs_base.h +++ b/include/d/d_cs_base.h @@ -28,6 +28,9 @@ public: void setField704(bool val) { field_0x704 = val; } + void setField705(bool val) { + field_0x705 = val; + } dCursorHitCheck_c *getHitCheck() { return mCursorIf.getHit(); diff --git a/include/d/d_dvd_unk.h b/include/d/d_dvd_unk.h index 419dc63b..2b93fd22 100644 --- a/include/d/d_dvd_unk.h +++ b/include/d/d_dvd_unk.h @@ -21,6 +21,9 @@ public: static void create(EGG::Heap *heap); void init(); + void fn_800529B0(); + void fn_800529E0(); + void fn_80052A20(); void fn_80052D00(bool); void fn_80052D50(); void fn_80052C90(); @@ -30,7 +33,7 @@ public: return field_0x24; } - u8 getField_0x28() const { + bool getField_0x28() const { return field_0x28; } @@ -53,7 +56,7 @@ private: /* 0x1C */ s32 field_0x1C; /* 0x20 */ s32 field_0x20; /* 0x24 */ s32 field_0x24; - /* 0x28 */ u8 field_0x28; + /* 0x28 */ bool field_0x28; /* 0x29 */ u8 field_0x29; /* 0x2A */ u8 field_0x2A; /* 0x2B */ u8 field_0x2B; diff --git a/include/d/d_hbm.h b/include/d/d_hbm.h index b676b6f7..34b8c551 100644 --- a/include/d/d_hbm.h +++ b/include/d/d_hbm.h @@ -1,4 +1,5 @@ +#include "common.h" #include "egg/core/eggHeap.h" namespace dHbm { class Manage_c { @@ -28,6 +29,7 @@ public: void IconCalc(); void IconClear(); void StopMotor(); + bool fn_801973C0(s32); void ForbidCalc(); s32 fn_80197560(s32); @@ -35,9 +37,16 @@ public: mFlags &= ~flags; } + UNKWORD getField_0x210() const { + return field_0x210; + } + private: static Manage_c *s_pInstance; - u8 _0x00[0x218 - 0x000]; - u32 mFlags; + + /* 0x000 */ u8 _0x00[0x210 - 0x000]; + /* 0x210 */ UNKWORD field_0x210; + /* 0x218 */ UNKWORD field_0x214; + /* 0x218 */ u32 mFlags; }; } // namespace dHbm diff --git a/include/d/d_reset.h b/include/d/d_reset.h index 76ec7993..7cc29663 100644 --- a/include/d/d_reset.h +++ b/include/d/d_reset.h @@ -2,20 +2,34 @@ #define RELOAD_COLOR_FADER_H #include "common.h" +#include "egg/core/eggColorFader.h" #include "egg/core/eggFader.h" +#include "egg/core/eggHeap.h" #include "m/m_color.h" namespace dReset { class Manage_c { public: - enum Mode_c { - // TODO + enum Mode_e { + Normal = 0, + SoftReset = 1, + HbmWait = 2, + DiskWait = 3, + FatalError = 4, + SafetyWait = 5, }; - enum Exec_c { - // TODO + enum Exec_e { + Restart = 0, + Reboot = 1, + ReturnToMenu = 2, + ReturnToDataManager = 3, + Shutdown = 4, + ExecNone = 5, }; + static void CreateInstance(EGG::Heap *); static Manage_c *GetInstance(); + Manage_c(EGG::Heap *); void Configure(); void Reset(); @@ -32,28 +46,28 @@ public: void SetDelayReset(); void SetDelayPowerOff(); void SetInteriorReturnDataManager(); - // fn_80067FF0 + void fn_80067FF0(); void ExecProcPre(); - // fn_80068070 + void fn_80068070(); void ExecProcMain(); - void DiskCheckModeRequest(); + void DiskCheckModeRequest(bool); void DebugPrintMode(const char *); void ModeProc(); - void ModeRequest(Mode_c); - void ModeRequestSafetyWait(Exec_c); + void ModeRequest(Mode_e); + void ModeRequestSafetyWait(Exec_e); void ModeRequestSoftReset(); void ModeInit_Normal(); void ModeProc_Normal(); - void ModtInit_SoftReset(); - void ModtProc_SoftReset(); + void ModeInit_SoftReset(); + void ModeProc_SoftReset(); - void ModtInit_HbmWait(); - void ModtProc_HbmWait(); + void ModeInit_HbmWait(); + void ModeProc_HbmWait(); - void ModtInit_DiscWait(); - void ModtProc_DiscWait(); + void ModeInit_DiskWait(); + void ModeProc_DiskWait(); void ModeInit_FatalError(); void ModeProc_FatalError(); @@ -63,33 +77,67 @@ public: void SetResetCallback(); void SetPowerCallback(); - // fn_80068C70 - // fn_80068C90 + void SetDiskCheckCallback(); + static void DiskCheckCallback(s32 b, struct DVDFileInfo *info); static void ResetCallback(); static void PowerCallback(); void CleanUpGX(); void CleanUpLC(); void MotorCancelOn(); void MotorCancelOff(); - bool IsFatalError(); - bool IsDiskError(); - EGG::Fader::EStatus FadeOutCalc(); + static bool IsFatalError(); + static bool IsDiskError(); + bool FadeOutCalc(); void FadeOutRequest(bool fadeout); - bool is1Or5() const { - return field_0x0C == 1 || field_0x0C == 5; + bool isSoftResetOrSafetyWait() const { + return mMode == SoftReset || mMode == SafetyWait; } - s32 get0x0C() const { - return field_0x0C; + bool isNormal() const { + return mMode == Normal; + } + bool isSoftReset() const { + return mMode == SoftReset; + } + bool isHbmWait() const { + return mMode == HbmWait; + } + bool isDiskWait() const { + return mMode == DiskWait; + } + bool isFatalError() const { + return mMode == FatalError; + } + bool isSafetyWait() const { + return mMode == SafetyWait; } private: + /* 0x00 */ EGG::Heap *mpHeap; + /* 0x04 */ EGG::ColorFader *mpFader; + /* 0x08 */ EGG::ColorFader::EStatus mFaderStatusPrev; + /* 0x0C */ Mode_e mMode; + /* 0x10 */ UNKWORD field_0x10; + /* 0x14 */ Mode_e mModePrev; + /* 0x18 */ Exec_e mExec; + /* 0x1C */ UNKWORD field_0x1C; + /* 0x20 */ DVDCommandBlock mDvdCmd; + /* 0x50 */ bool mHbmReset; + /* 0x51 */ bool mHbmReturnMenu; + /* 0x52 */ bool mRestart; + /* 0x53 */ bool mShutdown; + /* 0x54 */ bool mInteriorReturnDataManager; + /* 0x58 */ UNKWORD field_0x58; + /* 0x5C */ UNKWORD field_0x5C; + /* 0x60 */ UNKWORD field_0x60; + /* 0x64 */ u8 mBootComplete; + /* 0x65 */ u8 mSoftReset; + /* 0x66 */ u8 field_0x66; + /* 0x67 */ u8 field_0x67; + static Manage_c *s_pInstance; static mColor c_faderColor; - - u8 field_0x00[0x0C - 0x00]; - s32 field_0x0C; }; } // namespace dReset diff --git a/include/d/d_s_boot.h b/include/d/d_s_boot.h index a7e9fe9a..e87c371c 100644 --- a/include/d/d_s_boot.h +++ b/include/d/d_s_boot.h @@ -24,6 +24,25 @@ public: return sInstance; } + u8 getField_0x5E2() const { + return field_0x5E2; + } + void setField_0x5E2(u8 val) { + field_0x5E2 = val; + } + u8 getField_0x5E3() const { + return field_0x5E3; + } + void setField_0x5E3(u8 val) { + field_0x5E3 = val; + } + u8 getField_0x5E4() const { + return field_0x5E4; + } + void setField_0x5E4(u8 val) { + field_0x5E4 = val; + } + private: static dScBoot_c *sInstance; class strap_c { diff --git a/include/d/d_title_manager.h b/include/d/d_title_manager.h index 4d157e95..77c3d000 100644 --- a/include/d/d_title_manager.h +++ b/include/d/d_title_manager.h @@ -17,7 +17,18 @@ public: STATE_FUNC_DECLARE(dTitleMgr_c, FileSelect); STATE_FUNC_DECLARE(dTitleMgr_c, Input); + static dTitleMgr_c *GetInstance() { + return sInstance; + } + + u8 getField_0xBC() const { + return field_0xBC; + } + private: + static dTitleMgr_c *sInstance; + /* 0x68 */ u8 _0x68[0xBC - 0x68]; + /* 0xBC */ u8 field_0xBC; /* 0x??? */ STATE_MGR_DECLARE(dTitleMgr_c); }; diff --git a/include/d/lyt/d_lyt_system_window.h b/include/d/lyt/d_lyt_system_window.h index b0a3a6b6..ff1959a0 100644 --- a/include/d/lyt/d_lyt_system_window.h +++ b/include/d/lyt/d_lyt_system_window.h @@ -23,9 +23,11 @@ public: s32 getField_0xDE0() const; bool getField_0xDFC() const; + void fn_80152F10(); bool fn_80152F50() const; bool fn_80152F60() const; bool fn_80152F70() const; + bool fn_80152F80() const; private: static dLytSystemWindow_c *sInstance; diff --git a/include/d/snd/d_snd_player_mgr.h b/include/d/snd/d_snd_player_mgr.h index 95886ba8..6bbf7fb0 100644 --- a/include/d/snd/d_snd_player_mgr.h +++ b/include/d/snd/d_snd_player_mgr.h @@ -39,6 +39,13 @@ public: void enterHbm(); void leaveHbm(); + void fn_8035E1B0(u16); + bool fn_8035E220(); + void fn_8035E250(u16); + bool fn_8035E2E0(); + void fn_8035E310(); + void fn_8035E6E0(); + u32 getFreeSize(); bool loadDemoArchive(const char *demoArchiveName); const char *getSoundArchivePath(); diff --git a/include/egg/core/eggColorFader.h b/include/egg/core/eggColorFader.h index 2b8f609c..3b72c347 100644 --- a/include/egg/core/eggColorFader.h +++ b/include/egg/core/eggColorFader.h @@ -4,8 +4,8 @@ #include "common.h" #include "egg/core/eggFader.h" #include "egg/prim/eggBitFlag.h" -#include "nw4r/ut.h" +#include "nw4r/ut.h" namespace EGG { @@ -20,7 +20,7 @@ public: /* vt 0x14 */ virtual bool fadeOut(); /* vt 0x18 */ virtual bool calc(); /* vt 0x1C */ virtual void draw(); - /* vt 0x1C */ virtual ~ColorFader() {} + /* vt 0x20 */ virtual ~ColorFader() {} public: /* 0x04 */ EStatus mStatus; diff --git a/include/m/m_pad.h b/include/m/m_pad.h index 47fd5d1c..a692edcd 100644 --- a/include/m/m_pad.h +++ b/include/m/m_pad.h @@ -25,9 +25,12 @@ enum Button { BUTTON_C = 0x4000, }; -inline EGG::CoreController *getCore(int i) { +inline EGG::CoreController *getCore(const int i) { return g_core[i]; } +inline void stopRumbleMgr(int i) { + g_core[i]->stopRumbleMgr(); +} inline EGG::CoreController *getCore() { return g_currentCore; } diff --git a/include/rvl/DVD/dvd.h b/include/rvl/DVD/dvd.h index 9c7a27b2..fbed2577 100644 --- a/include/rvl/DVD/dvd.h +++ b/include/rvl/DVD/dvd.h @@ -22,30 +22,29 @@ typedef enum { DVD_RESULT_OK, } DVDResult; -#define DVD_ESUCCESS DVD_RESULT_OK -#define DVD_EFATAL DVD_RESULT_FATAL -#define DVD_ECANCELED DVD_RESULT_CANCELED -#define DVD_ECOVER DVD_RESULT_COVER_CLOSED +#define DVD_ESUCCESS DVD_RESULT_OK +#define DVD_EFATAL DVD_RESULT_FATAL +#define DVD_ECANCELED DVD_RESULT_CANCELED +#define DVD_ECOVER DVD_RESULT_COVER_CLOSED typedef long DVDState; -enum DVDState_et -{ - DVD_STATE_IDLE = 0, +enum DVDState_et { + DVD_STATE_IDLE = 0, - DVD_STATE_BUSY = 1, - DVD_STATE_WAITING = 2, - DVD_STATE_COVER_CLOSED = 3, - DVD_STATE_NO_DISK = 4, - DVD_STATE_COVER_OPENED = 5, - DVD_STATE_WRONG_DISK_ID = 6, - DVD_STATE_7 = 7, - DVD_STATE_PAUSED = 8, - DVD_STATE_9 = 9, - DVD_STATE_CANCELED = 10, - DVD_STATE_DISK_ERROR = 11, - DVD_STATE_MOTOR_STOPPED = 12, + DVD_STATE_BUSY = 1, + DVD_STATE_WAITING = 2, + DVD_STATE_COVER_CLOSED = 3, + DVD_STATE_NO_DISK = 4, + DVD_STATE_COVER_OPENED = 5, + DVD_STATE_WRONG_DISK_ID = 6, + DVD_STATE_7 = 7, + DVD_STATE_PAUSED = 8, + DVD_STATE_9 = 9, + DVD_STATE_CANCELED = 10, + DVD_STATE_DISK_ERROR = 11, + DVD_STATE_MOTOR_STOPPED = 12, - DVD_STATE_FATAL = -1, + DVD_STATE_FATAL = -1, }; typedef enum { @@ -110,6 +109,7 @@ s32 DVDGetDriveStatus(void); void DVDPause(void); void DVDResume(void); BOOL DVDCancelAsync(DVDCommandBlock *block, DVDCommandCallback callback); +BOOL DVDCheckDiskAsync(DVDCommandBlock *block, DVDAsyncCallback callback); s32 DVDCancel(DVDCommandBlock *block); BOOL DVDCancelAllAsync(DVDCommandCallback callback); const DVDDiskID *DVDGetCurrentDiskID(void); diff --git a/include/rvl/GX/GXFifo.h b/include/rvl/GX/GXFifo.h index 6dd6af76..46b47372 100644 --- a/include/rvl/GX/GXFifo.h +++ b/include/rvl/GX/GXFifo.h @@ -2,6 +2,7 @@ #define RVL_SDK_GX_FIFO_H #include "common.h" #include "rvl/GX/GXInternal.h" +#include "rvl/OS/OSThread.h" #ifdef __cplusplus extern "C" { @@ -15,6 +16,10 @@ BOOL GXGetCPUFifo(GXFifoObj *); u32 GXGetFifoCount(GXFifoObj *); u8 GXGetFifoWrap(GXFifoObj *); +// IDK where this goes +OSThread *GXSetCurrentGXThread(); +OSThread *GXGetCurrentGXThread(); +void GXSetDrawDoneCallback(void *); #ifdef __cplusplus } #endif diff --git a/include/rvl/OS/OSReset.h b/include/rvl/OS/OSReset.h index 06d5a344..971ac6ee 100644 --- a/include/rvl/OS/OSReset.h +++ b/include/rvl/OS/OSReset.h @@ -40,6 +40,10 @@ void OSReturnToMenu(void); u32 OSGetResetCode(void); void OSResetSystem(u32 arg0, u32 arg1, u32 arg2); +void OSRestart(u32); +void OSRebootSystem(void); +void OSReturnToDataManager(void); + #ifdef __cplusplus } #endif diff --git a/include/toBeSorted/file_manager.h b/include/toBeSorted/file_manager.h index 5011684c..e80e0f1a 100644 --- a/include/toBeSorted/file_manager.h +++ b/include/toBeSorted/file_manager.h @@ -342,7 +342,9 @@ public: u8 getField_0xA843() const { return mIsFileInvalid[1]; } - + u8 getField_0xA84D() const { + return m_0xA84D; + } void setField0xA84C(u8 val) { m_0xA84C = val; diff --git a/include/toBeSorted/music_mgrs.h b/include/toBeSorted/music_mgrs.h index b7b4d884..518ef793 100644 --- a/include/toBeSorted/music_mgrs.h +++ b/include/toBeSorted/music_mgrs.h @@ -13,7 +13,6 @@ class dSndSound_c; #define BGM_MGR (dSndPlayerMgr_c::GetInstance()) extern "C" void fn_8035E000(); extern "C" void fn_8035E860(dSndPlayerMgr_c *); -extern "C" void fn_8035E310(dSndPlayerMgr_c *); extern "C" void fn_8035E820(dSndPlayerMgr_c *); extern "C" void fn_8035E880(dSndPlayerMgr_c *); extern "C" void fn_8035E790(dSndPlayerMgr_c *, UNKWORD, void *); @@ -45,6 +44,6 @@ extern "C" bool fn_80373550(void *, u32); extern "C" void fn_80372920(void *); extern "C" void fn_803738B0(void *, dSndSound_c *sound); extern "C" void fn_80373900(void *, dSndSound_c *sound); -extern "C" bool fn_803733B0(void*, u32); +extern "C" bool fn_803733B0(void *, u32); #endif diff --git a/include/toBeSorted/save_manager.h b/include/toBeSorted/save_manager.h index 6f261dcf..d1e74677 100644 --- a/include/toBeSorted/save_manager.h +++ b/include/toBeSorted/save_manager.h @@ -124,6 +124,20 @@ public: return sInstance; } + bool getField_0x83D() const { + return field_0x83D; + } + bool getField_0x83F() const { + return field_0x83F; + } + s32 getCheckForFreeSpaceResult() const { + return mCheckForFreeSpaceResult; + } + bool isInState() { + return mCurrentState != STATE_MAX; + } + + void init(); void createSaveMsgWindow(); void execute(); void draw(); @@ -191,7 +205,6 @@ private: SaveMgr(); ~SaveMgr(); - void init(); void beginState(SaveMgrState_e state); void endState(); @@ -226,5 +239,4 @@ private: static SaveMgr *sInstance; }; - #endif diff --git a/src/REL/d/d_s_boot.cpp b/src/REL/d/d_s_boot.cpp index 8572a94b..b459a1ef 100644 --- a/src/REL/d/d_s_boot.cpp +++ b/src/REL/d/d_s_boot.cpp @@ -499,7 +499,7 @@ void dScBoot_c::executeState_Strap() { case 1: if (!checkDone()) { bool ok = mStrapScreen.execute(); - if (dReset::Manage_c::GetInstance()->get0x0C() == 1) { + if (dReset::Manage_c::GetInstance()->isSoftReset()) { ok = false; } diff --git a/src/d/d_dvd_drive_error.cpp b/src/d/d_dvd_drive_error.cpp index e9056a47..d500b68f 100644 --- a/src/d/d_dvd_drive_error.cpp +++ b/src/d/d_dvd_drive_error.cpp @@ -9,7 +9,6 @@ #include "m/m_mtx.h" #include "m/m_vec.h" - /** 805750d0 */ dDvdDriveError_c *dDvdDriveError_c::sInstance; @@ -146,7 +145,7 @@ void dDvdDriveError_c::execute() { dDvdUnk::FontUnk::GetInstance()->fn_80052C60(); } } else if (mDvdDriveStatus == DVD_STATE_IDLE) { - if (!dReset::Manage_c::GetInstance()->is1Or5()) { + if (!dReset::Manage_c::GetInstance()->isSoftResetOrSafetyWait()) { mIsError = false; } } diff --git a/src/d/d_reset.cpp b/src/d/d_reset.cpp index da35de7a..7d80da2b 100644 --- a/src/d/d_reset.cpp +++ b/src/d/d_reset.cpp @@ -1,14 +1,605 @@ #include "d/d_reset.h" +#include "common.h" +#include "d/d_cs_base.h" +#include "d/d_dvd_unk.h" +#include "d/d_hbm.h" +#include "d/d_rumble.h" +#include "d/d_s_boot.h" +#include "d/d_sc_title.h" +#include "d/d_title_manager.h" +#include "d/lyt/d_lyt_system_window.h" +#include "d/snd/d_snd_player_mgr.h" +#include "egg/core/eggColorFader.h" +#include "egg/core/eggController.h" +#include "egg/core/eggFader.h" +#include "egg/core/eggHeap.h" #include "m/m_color.h" +#include "m/m_pad.h" +#include "m/m_video.h" +#include "rvl/GX/GXDraw.h" +#include "rvl/GX/GXMisc.h" +#include "rvl/OS/OSCache.h" +#include "rvl/OS/OSInterrupt.h" +#include "rvl/OS/OSReset.h" +#include "rvl/OS/OSStateTM.h" +#include "rvl/OS/OSThread.h" +#include "rvl/VI/vi.h" +#include "toBeSorted/file_manager.h" +#include "toBeSorted/save_manager.h" + +#include "rvl/OS.h" namespace dReset { -Manage_c *Manage_c::s_pInstance; mColor Manage_c::c_faderColor(0, 0, 0, 0xFF); +Manage_c *Manage_c::s_pInstance; + +void Manage_c::CreateInstance(EGG::Heap *pHeap) { + s_pInstance = new (pHeap) Manage_c(pHeap); +} Manage_c *Manage_c::GetInstance() { return s_pInstance; } +Manage_c::Manage_c(EGG::Heap *pHeap) { + mpHeap = pHeap; + mpFader = nullptr; + mMode = Normal; + field_0x10 = 0; + mModePrev = Normal; + mExec = ExecNone; + field_0x1C = 0; + mHbmReset = false; + mHbmReturnMenu = false; + mRestart = false; + mShutdown = false; + mInteriorReturnDataManager = false; + field_0x58 = 0; + field_0x5C = 0; + field_0x60 = 0; + mBootComplete = 0; + mSoftReset = 0; + field_0x66 = 0; + field_0x67 = 0; + Configure(); +} + +void Manage_c::Configure() { + mpFader = new (mpHeap) EGG::ColorFader( + 0.f, 0.f, mVideo::m_video->pRenderMode->fbWidth, mVideo::m_video->pRenderMode->efbHeight, c_faderColor, + EGG::ColorFader::STATUS_PREPARE_OUT + ); + SetResetCallback(); + SetPowerCallback(); +} + +void Manage_c::Reset() { + mMode = Normal; + field_0x10 = 0; + mExec = ExecNone; + field_0x1C = 0; + SetResetCallback(); + SetPowerCallback(); + mHbmReset = false; + mHbmReturnMenu = false; + mRestart = false; + mShutdown = false; + mInteriorReturnDataManager = false; + field_0x58 = 0; + field_0x5C = 0; + field_0x60 = 0; + mSoftReset = 0; + field_0x67 = 0; +} + +void Manage_c::Calculate() { + ModeProc(); + if (!SaveMgr::GetInstance()->getField_0x83D() && !SaveMgr::GetInstance()->getField_0x83F()) { + if (FileManager::GetInstance()->getField_0xA84D() != 1) { + mpFader->calc(); + } + } +} + +void Manage_c::Draw() { + mpFader->draw(); +} + +void Manage_c::BootComplete(bool complete) { + mBootComplete = complete; +} + +bool Manage_c::CanExecSoftReset() const { + return mMode == SoftReset && mpFader->getStatus() == EGG::Fader::STATUS_PREPARE_IN && field_0x60 == 0 && + dHbm::Manage_c::GetInstance()->getField_0x210() != 2 && dSndPlayerMgr_c::GetInstance()->fn_8035E2E0() && + FileManager::GetInstance()->getField_0xA84D() != 1; +} + +void Manage_c::SetSoftResetFinish() { + if (mMode == SoftReset) { + if (field_0x60 == 1) { + field_0x60 = 2; + } + } +} + +void Manage_c::SetSoftResetScene() { + if (CanExecSoftReset() && dScBoot_c::GetInstance() == nullptr) { + dScTitle_c::loadTitleScreen(0); + field_0x60 = 1; + } +} + +void Manage_c::PostDeleteScene() {} + +bool Manage_c::IsFaderBlank() const { + return mpFader->getStatus() == EGG::Fader::STATUS_PREPARE_IN; +} + +void Manage_c::SetHbmReturnMenu() { + mHbmReturnMenu = true; +} + +void Manage_c::SetHbmReset() { + mHbmReset = true; +} + +void Manage_c::SetDelayReset() { + field_0x58 = 2; +} + +void Manage_c::SetDelayPowerOff() { + field_0x5C = 2; +} + +void Manage_c::SetInteriorReturnDataManager() { + mInteriorReturnDataManager = true; +} + +void Manage_c::fn_80067FF0() { + MotorCancelOn(); + CleanUpGX(); + CleanUpLC(); +} + +void Manage_c::ExecProcPre() { + CleanUpGX(); + CleanUpLC(); +} + +void Manage_c::fn_80068070() { + ExecProcMain(); +} + +void Manage_c::ExecProcMain() { + if (mExec == Restart) { + OSRestart(0); + } else if (mExec == Reboot) { + OSRebootSystem(); + } else if (mExec == ReturnToMenu) { + OSReturnToMenu(); + } else if (mExec == ReturnToDataManager) { + OSReturnToDataManager(); + } else if (mExec == Shutdown) { + OSShutdownSystem(); + } +} + +void Manage_c::DiskCheckModeRequest(bool) { + if (mBootComplete) { + SetDiskCheckCallback(); + while (true) { + if (field_0x1C == 2) { + ModeRequestSafetyWait(ReturnToMenu); + return; + } else if (field_0x1C == 1) { + ModeRequestSoftReset(); + return; + } else { + VIWaitForRetrace(); + } + } + } else { + SetDiskCheckCallback(); + while (true) { + if (field_0x1C == 2) { + ModeRequestSafetyWait(ReturnToMenu); + return; + } else if (field_0x1C != 1) { + VIWaitForRetrace(); + } else { + if (dScBoot_c::GetInstance()) { + ModeRequestSoftReset(); + dHbm::Manage_c::GetInstance()->fn_80197560(1); + field_0x1C = 0; + } + return; + } + } + } +} + +void Manage_c::DebugPrintMode(const char *) {} + +void Manage_c::ModeProc() { + bool fatalErr = IsFatalError(); + bool diskErr = IsDiskError(); + if (fatalErr) { + if (mMode != FatalError) { + ModeRequest(FatalError); + } + } else if (diskErr) { + if (mMode != DiskWait && mMode != SafetyWait) { + ModeRequest(DiskWait); + } + } else if (mMode == Normal && dHbm::Manage_c::GetInstance()->getField_0x210() == 2) { + ModeRequest(HbmWait); + } + static void (Manage_c::*const procs[6])() = { + &Manage_c::ModeProc_Normal, &Manage_c::ModeProc_SoftReset, &Manage_c::ModeProc_HbmWait, + &Manage_c::ModeProc_DiskWait, &Manage_c::ModeProc_FatalError, &Manage_c::ModeProc_SafetyWait, + }; + + (this->*procs[mMode])(); + + if (mRestart) { + SetResetCallback(); + } + if (mShutdown) { + SetPowerCallback(); + } + mHbmReset = false; + mHbmReturnMenu = false; + mRestart = false; + mShutdown = false; + mInteriorReturnDataManager = false; +} + +void Manage_c::ModeRequest(Manage_c::Mode_e mode) { + mModePrev = mMode; + mMode = mode; + static void (Manage_c::*const procs[6])() = { + &Manage_c::ModeInit_Normal, &Manage_c::ModeInit_SoftReset, &Manage_c::ModeInit_HbmWait, + &Manage_c::ModeInit_DiskWait, &Manage_c::ModeInit_FatalError, &Manage_c::ModeInit_SafetyWait, + }; + (this->*procs[mMode])(); +} + +void Manage_c::ModeRequestSafetyWait(Manage_c::Exec_e exec) { + ModeRequest(SafetyWait); + mExec = exec; + MotorCancelOn(); +} + +void Manage_c::ModeRequestSoftReset() { + mSoftReset = 1; + ModeRequest(SoftReset); + MotorCancelOn(); +} + +void Manage_c::ModeInit_Normal() { + DebugPrintMode("Normal"); + mExec = ExecNone; +} + +void Manage_c::ModeProc_Normal() { + Exec_e exec; + if (mShutdown) { + ModeRequestSafetyWait(Shutdown); + } else if (mInteriorReturnDataManager) { + ModeRequestSafetyWait(ReturnToDataManager); + } else if (mRestart) { + DiskCheckModeRequest(false); + } +} + +extern "C" void fn_803267B0(s32, s32); +void Manage_c::ModeInit_SoftReset() { + DebugPrintMode("SoftReset"); + if (mSoftReset) { + mSoftReset = false; + if (dScBoot_c::GetInstance()) { + mpFader->setFrame(30); + mpFader->fadeOut(); + field_0x66 = true; + dSndPlayerMgr_c::GetInstance()->fn_8035E250(30); + } else { + field_0x60 = 0; + if (dTitleMgr_c::GetInstance()) { + if (dTitleMgr_c::GetInstance()->getField_0xBC() == 0) { + dSndPlayerMgr_c::GetInstance()->fn_8035E250(30); + } + } else { + dSndPlayerMgr_c::GetInstance()->fn_8035E250(30); + } + fn_803267B0(0, 60); + mpFader->setFrame(30); + mpFader->fadeOut(); + field_0x66 = true; + field_0x67 = false; + } + } +} + +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); + mpFader->setStatus(EGG::ColorFader::STATUS_PREPARE_OUT); + ModeRequest(Normal); + dSndPlayerMgr_c::GetInstance()->fn_8035E310(); + } else { + if (field_0x66) { + dScBoot_c::GetInstance()->setField_0x5E3(1); + + dDvdUnk::FontUnk::GetInstance()->fn_800529B0(); + dSndPlayerMgr_c::GetInstance()->fn_8035E6E0(); + + if (dDvdUnk::FontUnk::GetInstance()->getField_0x29() || + dDvdUnk::FontUnk::GetInstance()->getField_0x24() || + SaveMgr::GetInstance()->getCheckForFreeSpaceResult()) { + dScBoot_c::GetInstance()->setField_0x5E3(0); + dScBoot_c::GetInstance()->setField_0x5E2(1); + dDvdUnk::FontUnk::GetInstance()->fn_800529E0(); + } + dDvdUnk::FontUnk::GetInstance()->fn_80052A20(); + } + field_0x66 = false; + } + } + } else if (dTitleMgr_c::GetInstance() == nullptr || dTitleMgr_c::GetInstance()->getField_0xBC() == 0) { + if (field_0x66 && mpFader->getStatus() == EGG::ColorFader::STATUS_PREPARE_IN) { + dDvdUnk::FontUnk::GetInstance()->fn_800529B0(); + dDvdUnk::FontUnk::GetInstance()->fn_80052A20(); + + dCsBase_c::GetInstance()->setField703(false); + dCsBase_c::GetInstance()->setField704(false); + dCsBase_c::GetInstance()->setField705(false); + + field_0x66 = false; + } + if (mpFader->getStatus() == EGG::Fader::STATUS_PREPARE_IN && field_0x60 == 2) { + if (field_0x67 == 0) { + if (SaveMgr::GetInstance()->isInState()) { + SaveMgr::GetInstance()->init(); + } + if (dLytSystemWindow_c::GetInstance()->fn_80152F80()) { + dLytSystemWindow_c::GetInstance()->fn_80152F10(); + } + field_0x67++; + } else { + mpFader->setStatus(EGG::Fader::STATUS_PREPARE_OUT); + VISetBlack(FALSE); + MotorCancelOff(); + Reset(); + } + } + } +} + +void Manage_c::ModeInit_HbmWait() { + DebugPrintMode("HbmWait"); +} + +void Manage_c::ModeProc_HbmWait() { + bool doFade = false; + if (field_0x5C == 0 && field_0x58 == 0) { + if (mHbmReturnMenu) { + ModeRequestSafetyWait(ReturnToMenu); + } else if (mHbmReset) { + DiskCheckModeRequest(true); + doFade = true; + } else { + if (dHbm::Manage_c::GetInstance()->getField_0x210() != 2) { + if (mShutdown) { + ModeRequestSafetyWait(Shutdown); + } else if (mRestart) { + DiskCheckModeRequest(false); + } else { + ModeRequest(Normal); + } + } else { + if (mShutdown) { + if (dHbm::Manage_c::GetInstance()->fn_801973C0(2)) { + field_0x5C = 1; + } + } else if (mRestart) { + if (dHbm::Manage_c::GetInstance()->fn_801973C0(1)) { + field_0x58 = 1; + } + } + } + } + } else if (field_0x5C == 2) { + field_0x5C = 0; + ModeRequestSafetyWait(Shutdown); + doFade = true; + } else if (field_0x58 == 2) { + field_0x58 = 0; + DiskCheckModeRequest(false); + doFade = true; + } + if (doFade) { + mpFader->setStatus(EGG::Fader::STATUS_PREPARE_IN); + } +} + +void Manage_c::ModeInit_DiskWait() { + if (dScBoot_c::GetInstance()) { + mFaderStatusPrev = mpFader->getStatus(); + mpFader->setStatus(EGG::Fader::STATUS_PREPARE_OUT); + } else { + if (mModePrev == SoftReset) { + mpFader->setStatus(EGG::Fader::STATUS_PREPARE_OUT); + } + } + DebugPrintMode("DiskWait"); +} + +void Manage_c::ModeProc_DiskWait() { + if (IsDiskError()) { + if (mShutdown) { + ModeRequestSafetyWait(Shutdown); + } else if (mRestart) { + ModeRequestSafetyWait(ReturnToMenu); + } + } else { + if (dScBoot_c::GetInstance()) { + if (mFaderStatusPrev == EGG::Fader::STATUS_PREPARE_IN) { + mpFader->setStatus(EGG::Fader::STATUS_PREPARE_IN); + } else if (mFaderStatusPrev == EGG::Fader::STATUS_PREPARE_OUT) { + mpFader->setStatus(EGG::Fader::STATUS_PREPARE_OUT); + } else if (mFaderStatusPrev == EGG::Fader::STATUS_FADE_IN) { + mpFader->setStatus(EGG::Fader::STATUS_PREPARE_OUT); + } else { + mpFader->setStatus(EGG::Fader::STATUS_PREPARE_IN); + } + } else { + if (mModePrev == SoftReset) { + mpFader->setStatus(EGG::Fader::STATUS_PREPARE_IN); + } + } + ModeRequest(mModePrev); + } +} + +void Manage_c::ModeInit_FatalError() { + DebugPrintMode("FatalError"); +} + +void Manage_c::ModeProc_FatalError() {} + +void Manage_c::ModeInit_SafetyWait() { + DebugPrintMode("SafetyWait"); + dSndPlayerMgr_c::GetInstance()->fn_8035E1B0(30); + mpFader->setFrame(30); + mpFader->fadeOut(); +} + +void Manage_c::ModeProc_SafetyWait() { + if (mpFader->getStatus() == EGG::Fader::STATUS_PREPARE_IN) { + bool b = dSndPlayerMgr_c::GetInstance()->fn_8035E220() && !FileManager::GetInstance()->getField_0xA84D(); + if (b) { + ExecProcPre(); + fn_80068070(); + } + } + if (SaveMgr::GetInstance()->getField_0x83D() || SaveMgr::GetInstance()->getField_0x83F() || + FileManager::GetInstance()->getField_0xA84D() == 1) { + if (FileManager::GetInstance()->getField_0xA84D() != 1) { + mpFader->calc(); + } + } +} + +void Manage_c::SetResetCallback() { + OSSetResetCallback(ResetCallback); +} + +void Manage_c::SetPowerCallback() { + OSSetPowerCallback(PowerCallback); +} + +void Manage_c::SetDiskCheckCallback() { + field_0x1C = 0; + DVDCheckDiskAsync(&mDvdCmd, DiskCheckCallback); +} + +void Manage_c::DiskCheckCallback(s32 result, struct DVDFileInfo *info) { + if (result == 0) { + GetInstance()->field_0x1C = 2; + } else { + GetInstance()->field_0x1C = 1; + } +}; + +void Manage_c::ResetCallback() { + GetInstance()->mRestart = true; +}; + +void Manage_c::PowerCallback() { + GetInstance()->mShutdown = true; +}; + +void Manage_c::CleanUpGX() { + VISetBlack(TRUE); + VIFlush(); + VIWaitForRetrace(); + VIWaitForRetrace(); + OSThread *thread = GXGetCurrentGXThread(); + BOOL status = OSDisableInterrupts(); + + if (thread != OSGetCurrentThread()) { + OSCancelThread(thread); + GXSetCurrentGXThread(); + } + GXFlush(); + GXAbortFrame(); + GXDrawDone(); + OSRestoreInterrupts(status); + + GXSetDrawDoneCallback(0); + VIWaitForRetrace(); +} + +void Manage_c::CleanUpLC() { + LCDisable(); +} + +void Manage_c::MotorCancelOn() { + // Huh + for (int i = 0; i < 4;) { + mPad::g_core[i++]->stopRumbleMgr(); + } + dRumble_c::stop(-1); +} + +void Manage_c::MotorCancelOff() {} + +bool Manage_c::IsFatalError() { + return false; +} + +bool Manage_c::IsDiskError() { + return dDvdUnk::FontUnk::GetInstance()->getField_0x28(); +} + +bool Manage_c::FadeOutCalc() { + if (mpFader->getStatus() == EGG::Fader::STATUS_PREPARE_IN || + mpFader->getStatus() == EGG::Fader::STATUS_PREPARE_OUT) { + return false; + } else { + return true; + } +} + +void Manage_c::FadeOutRequest(bool fade) { + if (!fade) { + dDvdUnk::FontUnk::GetInstance()->fn_800529B0(); + dDvdUnk::FontUnk::GetInstance()->fn_80052A20(); + + dCsBase_c::GetInstance()->setField703(false); + dCsBase_c::GetInstance()->setField704(false); + dCsBase_c::GetInstance()->setField705(false); + + field_0x66 = 0; + + if (SaveMgr::GetInstance()->isInState()) { + SaveMgr::GetInstance()->init(); + } + + if (dLytSystemWindow_c::GetInstance()->fn_80152F80()) { + dLytSystemWindow_c::GetInstance()->fn_80152F10(); + } + } else { + mpFader->setStatus(EGG::Fader::STATUS_PREPARE_OUT); + VISetBlack(FALSE); + MotorCancelOff(); + Reset(); + } +} + } // namespace dReset diff --git a/src/d/d_rumble.cpp b/src/d/d_rumble.cpp index 21c522a8..15bde884 100644 --- a/src/d/d_rumble.cpp +++ b/src/d/d_rumble.cpp @@ -6,7 +6,6 @@ #include "d/lyt/d_lyt_control_game.h" #include "m/m_pad.h" - dRumbleEntry_c dRumble_c::sRumblePreset0(8, 0b11000000000000000000000000000000, 2.f); dRumbleEntry_c dRumble_c::sRumblePreset1(9, 0b11010000000000000000000000000000, 4.f); dRumbleEntry_c dRumble_c::sRumblePreset2(10, 0b11101100000000000000000000000000, 6.f); @@ -45,7 +44,7 @@ void dRumble_c::execute() { } // I am guessing on any reload screen or homebutton menu? - if (dReset::Manage_c::GetInstance()->is1Or5()) { + if (dReset::Manage_c::GetInstance()->isSoftResetOrSafetyWait()) { mPad::g_core[0]->stopRumbleMgr(); mPad::g_core[1]->stopRumbleMgr(); return; diff --git a/src/d/d_sc_title.cpp b/src/d/d_sc_title.cpp index f5ab20f8..548125aa 100644 --- a/src/d/d_sc_title.cpp +++ b/src/d/d_sc_title.cpp @@ -74,7 +74,7 @@ static const char *const sSkb = "SoftwareKeyboard"; int dScTitle_c::create() { int ret = dScGame_c::create(); - if (ret == SUCCEEDED && dReset::Manage_c::GetInstance()->get0x0C() == 1) { + if (ret == SUCCEEDED && dReset::Manage_c::GetInstance()->isSoftReset()) { if (field_0x2AC == 0) { dReset::Manage_c::GetInstance()->FadeOutRequest(false); if (checkAllSaveFilesEmpty() != true) { @@ -100,7 +100,7 @@ int dScTitle_c::create() { SizedString<128> fntPath; fntPath.sprintf("/US/Font/%s/%s", dMessage_c::getLanguageIdentifier(), "normal_02.brfnt"); mDvd_toMainRam_normal_c::create2(&mpSkbFont, fntPath, 0, dHeap::work2Heap.heap); - fn_8035E310(BGM_MGR); + BGM_MGR->fn_8035E310(); } return ret;