From b148d141a0f49fc20fb61e5472951f4ddb4176cd Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 1 May 2025 15:11:11 +0200 Subject: [PATCH] save_manager OK --- config/SOUE01/splits.txt | 43 +- config/SOUE01/symbols.txt | 404 ++-- configure.py | 6 +- include/d/d_cs_base.h | 4 + include/d/d_d2d.h | 10 + include/d/d_dvd_unk.h | 47 + include/d/d_gfx.h | 32 + include/d/d_s_boot.h | 5 +- include/d/lyt/d_lyt_save_msg_window.h | 70 + include/d/lyt/d_lyt_system_window.h | 35 + .../msg_window/d_lyt_msg_window_select_btn.h | 25 +- include/rvl/NAND.h | 2 + include/rvl/NAND/NANDOpenClose.h | 7 + include/rvl/NAND/nand.h | 23 +- include/rvl/TPL.h | 2 +- include/toBeSorted/file_manager.h | 55 +- include/toBeSorted/nand_request_thread.h | 4 +- include/toBeSorted/nand_result_tracker.h | 15 + include/toBeSorted/reload_color_fader.h | 3 + include/toBeSorted/save_manager.h | 229 +++ include/toBeSorted/some_gxf_thing.h | 28 - src/REL/d/d_s_boot.cpp | 10 +- src/d/d_sc_game.cpp | 6 +- src/d/d_sc_title.cpp | 5 +- src/d/lyt/d_lyt_battery.cpp | 5 +- src/d/lyt/d_lyt_fader.cpp | 5 +- src/d/lyt/d_lyt_save_msg_window.cpp | 392 ++++ src/d/lyt/d_screen_fader.cpp | 5 +- src/d/lyt/msg_window/d_lyt_msg_window.cpp | 4 +- .../d_lyt_msg_window_select_btn.cpp | 2 +- src/toBeSorted/file_manager.cpp | 12 +- src/toBeSorted/nand_request_thread.cpp | 11 +- src/toBeSorted/save_manager.cpp | 1758 +++++++++++++++++ 33 files changed, 2961 insertions(+), 303 deletions(-) create mode 100644 include/d/d_d2d.h create mode 100644 include/d/d_gfx.h create mode 100644 include/d/lyt/d_lyt_save_msg_window.h create mode 100644 include/d/lyt/d_lyt_system_window.h create mode 100644 include/toBeSorted/nand_result_tracker.h create mode 100644 include/toBeSorted/save_manager.h delete mode 100644 include/toBeSorted/some_gxf_thing.h create mode 100644 src/d/lyt/d_lyt_save_msg_window.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 68ce0d6f..0285c74b 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -44,10 +44,15 @@ toBeSorted/file_manager.cpp: .bss start:0x80580070 end:0x80580080 toBeSorted/save_manager.cpp: - .text start:0x80011730 end:0x80015310 align:16 + .text start:0x80011730 end:0x80015DD4 align:16 + .rodata start:0x804DBB60 end:0x804DBC38 + .data start:0x80500410 end:0x80500828 + .sbss start:0x80575000 end:0x80575008 + .bss start:0x80580080 end:0x8058F120 -toBeSorted/save_requests.cpp: - .text start:0x80015310 end:0x800161F4 align:16 +toBeSorted/save_related.cpp: + .text start:0x80015DE0 end:0x800161F4 + .rodata start:0x804DBC38 end:0x804DBC78 toBeSorted/d_d2d.cpp: .text start:0x80016200 end:0x800166F8 align:16 @@ -64,13 +69,10 @@ toBeSorted/d_scn_callback.cpp: .sbss start:0x80575020 end:0x80575028 .sdata2 start:0x80576A68 end:0x80576A78 -toBeSorted/d_unk_proc.cpp: - .text start:0x8001A590 end:0x8001BE58 align:16 - .sdata2 start:0x80576A78 end:0x80576B08 - toBeSorted/d_shadow.cpp: - .text start:0x8001BE60 end:0x8001BF94 align:16 + .text start:0x8001A590 end:0x8001BF94 align:16 .ctors start:0x804DB650 end:0x804DB654 + .sdata2 start:0x80576A78 end:0x80576B08 toBeSorted/d_unk_mdl_stuff_1.cpp: .text start:0x8001BFA0 end:0x8001E444 align:16 @@ -414,7 +416,7 @@ toBeSorted/nand_request_thread.cpp: .text start:0x800BC980 end:0x800BD604 align:16 .data start:0x80510B30 end:0x80510B70 -toBeSorted/unk_gfx.cpp: +toBeSorted/nand_result_tracker.cpp: .text start:0x800BD610 end:0x800BD8C0 align:16 d/flag/flag_managers.cpp: @@ -888,6 +890,11 @@ d/lyt/d_lyt_pause_text.cpp: d/lyt/d_lyt_save_msg_window.cpp: .text start:0x80164F90 end:0x80166968 align:16 .ctors start:0x804DB7A8 end:0x804DB7AC + .rodata start:0x804E8B60 end:0x804E8BB8 + .data start:0x80526D10 end:0x80527210 + .sdata start:0x805729C8 end:0x805729D0 + .sdata2 start:0x8057A108 end:0x8057A118 + .bss start:0x805B1BB0 end:0x805B1CB0 d/lyt/d_lyt_util_items.cpp: .text start:0x80166970 end:0x80167FD4 align:16 @@ -2273,7 +2280,7 @@ nw4r/ut/ut_TextWriterBase.cpp: nw4r/db/db_directPrint.cpp: .text start:0x804342A0 end:0x80434E9C align:16 - .rodata start:0x804F5D28 end:0x804F5FDC + .rodata start:0x804F5D28 end:0x804F5FE0 .data start:0x8056C000 end:0x8056C010 .sbss start:0x805765E8 end:0x805765EC .bss start:0x80636B80 end:0x80636BA4 @@ -2290,13 +2297,13 @@ nw4r/db/db_exception.cpp: .data start:0x8056C038 end:0x8056C5F0 .sdata start:0x80574DD0 end:0x80574E10 .sbss start:0x805765F8 end:0x80576600 - .sdata2 start:0x8057EBA8 end:0x8057EBAC + .sdata2 start:0x8057EBA8 end:0x8057EBB0 .bss start:0x80636FC0 end:0x8063B320 nw4r/db/db_mapFile.cpp: .text start:0x80436A50 end:0x804373B4 align:16 .data start:0x8056C5F0 end:0x8056C600 - .sdata start:0x80574E10 end:0x80574E24 + .sdata start:0x80574E10 end:0x80574E28 .sbss start:0x80576600 end:0x8057660C .bss start:0x8063B320 end:0x8063B560 @@ -2306,15 +2313,23 @@ nw4r/db/db_assert.cpp: nw4r/math/math_arithmetic.cpp: .text start:0x804373D0 end:0x804375AC align:16 + .data start:0x8056C600 end:0x8056CF10 + .sdata2 start:0x8057EBB0 end:0x8057EBD0 nw4r/math/math_triangular.cpp: .text start:0x804375B0 end:0x804378D0 align:16 + .rodata start:0x804F5FE0 end:0x804F6FF0 + .data start:0x8056CF10 end:0x8056D020 + .sdata2 start:0x8057EBD0 end:0x8057EBF0 nw4r/math/math_types.cpp: .text start:0x804378D0 end:0x80437D34 align:16 + .sdata2 start:0x8057EBF0 end:0x8057EC00 nw4r/math/math_geometry.cpp: .text start:0x80437D40 end:0x80438F4C align:16 + .sdata start:0x80574E28 end:0x80574E30 + .sdata2 start:0x8057EC00 end:0x8057EC18 nw4r/g3d/res/g3d_rescommon.cpp: .text start:0x80438F50 end:0x804390F4 align:16 @@ -2340,7 +2355,7 @@ nw4r/g3d/res/g3d_restev.cpp: nw4r/g3d/res/g3d_resmat.cpp: .text start:0x8043C2C0 end:0x8043E17C align:16 - .data start:0x8056D190 end:0x8056D1E4 + .data start:0x8056D190 end:0x8056D200 .sdata2 start:0x8057EC18 end:0x8057EC4C nw4r/g3d/res/g3d_resvtx.cpp: @@ -2476,7 +2491,7 @@ nw4r/g3d/g3d_state.cpp: .sdata start:0x80574E48 end:0x80574E50 .sbss start:0x80576628 end:0x80576648 .sdata2 start:0x8057EDA0 end:0x8057EDC8 - .bss start:0x8063B9A0 end:0x80640F44 + .bss start:0x8063B9A0 end:0x80640F80 nw4r/g3d/g3d_draw1mat1shp.cpp: .text start:0x8044EAB0 end:0x8044F7F4 align:16 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 2890520f..17ceb02f 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -256,8 +256,8 @@ fn_80009DA0 = .text:0x80009DA0; // type:function size:0xC __ct__11FileManagerFv = .text:0x80009DB0; // type:function size:0x124 __ct__7mVec3_cFv = .text:0x80009EE0; // type:function size:0x4 create__11FileManagerFPQ23EGG4Heap = .text:0x80009EF0; // type:function size:0x3C -loadSaveData__11FileManagerFPvPcb = .text:0x80009F30; // type:function size:0x38 -saveSaveData__11FileManagerFPvb = .text:0x80009F70; // type:function size:0x90 +loadSaveData__11FileManagerFP22NandRequestWriteHolderPCcb = .text:0x80009F30; // type:function size:0x38 +saveSaveData__11FileManagerFP29NandRequestLoadSaveFileHolderb = .text:0x80009F70; // type:function size:0x90 refreshSaveFileData__11FileManagerFv = .text:0x8000A000; // type:function size:0x258 getFileHeroname__11FileManagerFi = .text:0x8000A260; // type:function size:0x14 getFileSaveTime__11FileManagerFi = .text:0x8000A280; // type:function size:0x18 @@ -416,7 +416,7 @@ clearFileA__11FileManagerFv = .text:0x8000FF60; // type:function size:0x94 initBlankSaveFiles__11FileManagerFv = .text:0x80010000; // type:function size:0x154 initSkipData__11FileManagerFv = .text:0x80010160; // type:function size:0x88 unsetFileANewFile__11FileManagerFv = .text:0x800101F0; // type:function size:0x28 -saveT1SaveInfo__11FileManagerFUc = .text:0x80010220; // type:function size:0x12C +saveT1SaveInfo__11FileManagerFb = .text:0x80010220; // type:function size:0x12C copyFileSkipData__11FileManagerFi = .text:0x80010350; // type:function size:0xE8 clearTempFileData__11FileManagerFv = .text:0x80010440; // type:function size:0x60 saveAfterCredits__11FileManagerFv = .text:0x800104A0; // type:function size:0xD64 @@ -437,92 +437,92 @@ setPlayerInfoFileA__11FileManagerFv = .text:0x80011500; // type:function size:0x setT3Info__11FileManagerFRC7mVec3_cRC7mAng3_c = .text:0x800115E0; // type:function size:0xD8 getRegionVersion__11FileManagerFPc = .text:0x800116C0; // type:function size:0x28 __sinit_\file_manager_cpp = .text:0x800116F0; // type:function size:0x3C scope:local -fn_80011730 = .text:0x80011730; // type:function size:0x2C -fn_80011760 = .text:0x80011760; // type:function size:0x1D4 -fn_80011940 = .text:0x80011940; // type:function size:0x100 -fn_80011A40 = .text:0x80011A40; // type:function size:0xA8 -fn_80011AF0 = .text:0x80011AF0; // type:function size:0xA4 -fn_80011BA0 = .text:0x80011BA0; // type:function size:0xA0 -fn_80011C40 = .text:0x80011C40; // type:function size:0x6C -fn_80011CB0 = .text:0x80011CB0; // type:function size:0x58 +__ct__7SaveMgrFv = .text:0x80011730; // type:function size:0x2C +__dt__19dLytSaveMsgWindow_cFv = .text:0x80011760; // type:function size:0x1D4 +__dt__24dLytMsgWindowSelectBtn_cFv = .text:0x80011940; // type:function size:0x100 +__dt__29dLytMsgWindowSelectBtnParts_cFv = .text:0x80011A40; // type:function size:0xA8 +__dt__68sFStateMgr_c<29dLytMsgWindowSelectBtnParts_c,20sStateMethodUsr_FI_c>Fv = .text:0x80011AF0; // type:function size:0xA4 +__dt__98sStateMgr_c<29dLytMsgWindowSelectBtnParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80011BA0; // type:function size:0xA0 +__dt__45sFStateFct_c<29dLytMsgWindowSelectBtnParts_c>Fv = .text:0x80011C40; // type:function size:0x6C +__dt__42sFState_c<29dLytMsgWindowSelectBtnParts_c>Fv = .text:0x80011CB0; // type:function size:0x58 __dt__Q23d2d10AnmGroup_cFv = .text:0x80011D10; // type:function size:0x5C __dt__Q23d2d14AnmGroupBase_cFv = .text:0x80011D70; // type:function size:0x40 __dt__Q23d2d7dLytSubFv = .text:0x80011DB0; // type:function size:0x58 -fn_80011E10 = .text:0x80011E10; // type:function size:0xA4 -fn_80011EC0 = .text:0x80011EC0; // type:function size:0xA0 -fn_80011F60 = .text:0x80011F60; // type:function size:0x6C -fn_80011FD0 = .text:0x80011FD0; // type:function size:0x58 +__dt__63sFStateMgr_c<24dLytMsgWindowSelectBtn_c,20sStateMethodUsr_FI_c>Fv = .text:0x80011E10; // type:function size:0xA4 +__dt__93sStateMgr_c<24dLytMsgWindowSelectBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80011EC0; // type:function size:0xA0 +__dt__40sFStateFct_c<24dLytMsgWindowSelectBtn_c>Fv = .text:0x80011F60; // type:function size:0x6C +__dt__37sFState_c<24dLytMsgWindowSelectBtn_c>Fv = .text:0x80011FD0; // type:function size:0x58 __dt__Q23d2d8dSubPaneFv = .text:0x80012030; // type:function size:0x40 __dt__Q23d2d15SubPaneListNodeFv = .text:0x80012070; // type:function size:0x40 -fn_800120B0 = .text:0x800120B0; // type:function size:0x74 +__dt__Q23d2d10ResAccIf_cFv = .text:0x800120B0; // type:function size:0x74 __dt__Q34nw4r3lyt11FontRefLinkFv = .text:0x80012130; // type:function size:0x40 -fn_80012170 = .text:0x80012170; // type:function size:0xA4 -fn_80012220 = .text:0x80012220; // type:function size:0xA0 -fn_800122C0 = .text:0x800122C0; // type:function size:0x6C -fn_80012330 = .text:0x80012330; // type:function size:0x58 -fn_80012390 = .text:0x80012390; // type:function size:0x40 -fn_800123D0 = .text:0x800123D0; // type:function size:0xA8 -fn_80012480 = .text:0x80012480; // type:function size:0x7C -fn_80012500 = .text:0x80012500; // type:function size:0x3C -fn_80012540 = .text:0x80012540; // type:function size:0x54 -fn_800125A0 = .text:0x800125A0; // type:function size:0x40 -fn_800125E0 = .text:0x800125E0; // type:function size:0x40 -fn_80012620 = .text:0x80012620; // type:function size:0x40 -fn_80012660 = .text:0x80012660; // type:function size:0x40 -fn_800126A0 = .text:0x800126A0; // type:function size:0xB4 -fn_80012760 = .text:0x80012760; // type:function size:0x90 -fn_800127F0 = .text:0x800127F0; // type:function size:0x40 -fn_80012830 = .text:0x80012830; // type:function size:0x60 -fn_80012890 = .text:0x80012890; // type:function size:0x58 -fn_800128F0 = .text:0x800128F0; // type:function size:0x54 -fn_80012950 = .text:0x80012950; // type:function size:0x260 -fn_80012BB0 = .text:0x80012BB0; // type:function size:0x54 -fn_80012C10 = .text:0x80012C10; // type:function size:0x10C -fn_80012D20 = .text:0x80012D20; // type:function size:0x50 -fn_80012D70 = .text:0x80012D70; // type:function size:0x278 -fn_80012FF0 = .text:0x80012FF0; // type:function size:0x160 -fn_80013150 = .text:0x80013150; // type:function size:0x390 -fn_800134E0 = .text:0x800134E0; // type:function size:0x50 -fn_80013530 = .text:0x80013530; // type:function size:0x468 -fn_800139A0 = .text:0x800139A0; // type:function size:0x58 -fn_80013A00 = .text:0x80013A00; // type:function size:0x664 -fn_80014070 = .text:0x80014070; // type:function size:0x88 -fn_80014100 = .text:0x80014100; // type:function size:0x368 -fn_80014470 = .text:0x80014470; // type:function size:0x48 -fn_800144C0 = .text:0x800144C0; // type:function size:0x68 -fn_80014530 = .text:0x80014530; // type:function size:0x48 -fn_80014580 = .text:0x80014580; // type:function size:0x50 -fn_800145D0 = .text:0x800145D0; // type:function size:0x50 -SaveFileMaybe = .text:0x80014620; // type:function size:0xBC -fn_800146E0 = .text:0x800146E0; // type:function size:0x38 -fn_80014720 = .text:0x80014720; // type:function size:0x228 -fn_80014950 = .text:0x80014950; // type:function size:0x5C -fn_800149B0 = .text:0x800149B0; // type:function size:0x478 +__dt__58sFStateMgr_c<19dLytSaveMsgWindow_c,20sStateMethodUsr_FI_c>Fv = .text:0x80012170; // type:function size:0xA4 +__dt__88sStateMgr_c<19dLytSaveMsgWindow_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80012220; // type:function size:0xA0 +__dt__35sFStateFct_c<19dLytSaveMsgWindow_c>Fv = .text:0x800122C0; // type:function size:0x6C +__dt__32sFState_c<19dLytSaveMsgWindow_c>Fv = .text:0x80012330; // type:function size:0x58 +create__7SaveMgrFPQ23EGG4Heap = .text:0x80012390; // type:function size:0x40 +init__7SaveMgrFv = .text:0x800123D0; // type:function size:0xA8 +execute__7SaveMgrFv = .text:0x80012480; // type:function size:0x7C +draw__7SaveMgrFv = .text:0x80012500; // type:function size:0x3C +createSaveMsgWindow__7SaveMgrFv = .text:0x80012540; // type:function size:0x54 +checkForSave__7SaveMgrFv = .text:0x800125A0; // type:function size:0x40 +checkForFreeSpace__7SaveMgrFv = .text:0x800125E0; // type:function size:0x40 +createFiles__7SaveMgrFv = .text:0x80012620; // type:function size:0x40 +loadSave__7SaveMgrFv = .text:0x80012660; // type:function size:0x40 +save__7SaveMgrFbb = .text:0x800126A0; // type:function size:0xB4 +saveAfterCredits__7SaveMgrFv = .text:0x80012760; // type:function size:0x90 +writeSkipDat__7SaveMgrFv = .text:0x800127F0; // type:function size:0x40 +copySave__7SaveMgrFUcUc = .text:0x80012830; // type:function size:0x60 +clearSelectedFile__7SaveMgrFv = .text:0x80012890; // type:function size:0x58 +initializeCheckForSave__7SaveMgrFv = .text:0x800128F0; // type:function size:0x54 +executeCheckForSave__7SaveMgrFv = .text:0x80012950; // type:function size:0x260 +initializeCheckForFreeSpace__7SaveMgrFv = .text:0x80012BB0; // type:function size:0x54 +executeCheckForFreeSpace__7SaveMgrFv = .text:0x80012C10; // type:function size:0x10C +initializeCreateFiles__7SaveMgrFv = .text:0x80012D20; // type:function size:0x50 +executeCreateFiles__7SaveMgrFv = .text:0x80012D70; // type:function size:0x278 +initializeSaveBanner__7SaveMgrFv = .text:0x80012FF0; // type:function size:0x160 +executeSaveBanner__7SaveMgrFv = .text:0x80013150; // type:function size:0x390 +initializeLoadSave__7SaveMgrFv = .text:0x800134E0; // type:function size:0x50 +executeLoadSave__7SaveMgrFv = .text:0x80013530; // type:function size:0x468 +initializeWriteSave__7SaveMgrFv = .text:0x800139A0; // type:function size:0x58 +executeWriteSave__7SaveMgrFv = .text:0x80013A00; // type:function size:0x664 +initializeWriteSkipDat__7SaveMgrFv = .text:0x80014070; // type:function size:0x88 +executeWriteSkipDat__7SaveMgrFv = .text:0x80014100; // type:function size:0x368 +initializeCopySave__7SaveMgrFv = .text:0x80014470; // type:function size:0x48 +executeCopySave__7SaveMgrFv = .text:0x800144C0; // type:function size:0x68 +initializeClearSelectedFile__7SaveMgrFv = .text:0x80014530; // type:function size:0x48 +executeClearSelectedFile__7SaveMgrFv = .text:0x80014580; // type:function size:0x50 +initializeSave__7SaveMgrFv = .text:0x800145D0; // type:function size:0x50 +executeSave__7SaveMgrFv = .text:0x80014620; // type:function size:0xBC +initializeDeleteAllData__7SaveMgrFv = .text:0x800146E0; // type:function size:0x38 +executeDeleteAllData__7SaveMgrFv = .text:0x80014720; // type:function size:0x228 +initializeError__7SaveMgrFv = .text:0x80014950; // type:function size:0x5C +executeError__7SaveMgrFv = .text:0x800149B0; // type:function size:0x478 downTrigger__Q23EGG14CoreControllerCFUl = .text:0x80014E30; // type:function size:0x18 -fn_80014E50 = .text:0x80014E50; // type:function size:0x54 -fn_80014EB0 = .text:0x80014EB0; // type:function size:0x3C4 -fn_80015280 = .text:0x80015280; // type:function size:0x1C -fn_800152A0 = .text:0x800152A0; // type:function size:0x70 -fn_80015310 = .text:0x80015310; // type:function size:0x2C -fn_80015340 = .text:0x80015340; // type:function size:0xE0 -fn_80015420 = .text:0x80015420; // type:function size:0x6C -fn_80015490 = .text:0x80015490; // type:function size:0x94 -fn_80015530 = .text:0x80015530; // type:function size:0xC -fn_80015540 = .text:0x80015540; // type:function size:0x7C -fn_800155C0 = .text:0x800155C0; // type:function size:0xE4 -fn_800156B0 = .text:0x800156B0; // type:function size:0xD4 -fn_80015790 = .text:0x80015790; // type:function size:0xB4 -fn_80015850 = .text:0x80015850; // type:function size:0xC -createLoadSaveFileRequest = .text:0x80015860; // type:function size:0x108 -fn_80015970 = .text:0x80015970; // type:function size:0x170 -fn_80015AE0 = .text:0x80015AE0; // type:function size:0x54 -initiateLoadingSaveFile = .text:0x80015B40; // type:function size:0xA4 -fn_80015BF0 = .text:0x80015BF0; // type:function size:0xC -fn_80015C00 = .text:0x80015C00; // type:function size:0xC -fn_80015C10 = .text:0x80015C10; // type:function size:0x8 -fn_80015C20 = .text:0x80015C20; // type:function size:0xDC -fn_80015D00 = .text:0x80015D00; // type:function size:0x38 -fn_80015D40 = .text:0x80015D40; // type:function size:0x94 +initializeNandError__7SaveMgrFv = .text:0x80014E50; // type:function size:0x54 +executeNandError__7SaveMgrFv = .text:0x80014EB0; // type:function size:0x3C4 +beginState__7SaveMgrFQ27SaveMgr14SaveMgrState_e = .text:0x80015280; // type:function size:0x1C +endState__7SaveMgrFv = .text:0x800152A0; // type:function size:0x70 +getFrameRate__7SaveMgrFv = .text:0x80015310; // type:function size:0x2C +__ct__22NandRequestCheckIsFileFPCc = .text:0x80015340; // type:function size:0xE0 +execute__22NandRequestCheckIsFileFv = .text:0x80015420; // type:function size:0x6C +checkIsFile__28NandRequestCheckIsFileHolderFPCc = .text:0x80015490; // type:function size:0x94 +getCheckResult__28NandRequestCheckIsFileHolderCFv = .text:0x80015530; // type:function size:0xC +__ct__21NandRequestSaveBannerFPCcP10TPLPalettePCwPCwUcUc = .text:0x80015540; // type:function size:0x7C +execute__21NandRequestSaveBannerFv = .text:0x800155C0; // type:function size:0xE4 +writeBannerTpl__21NandRequestSaveBannerFP12NANDFileInfo = .text:0x800156B0; // type:function size:0xD4 +saveBanner__27NandRequestSaveBannerHolderFPCcP10TPLPalettePCwPCwUcUc = .text:0x80015790; // type:function size:0xB4 +hasFailed__27NandRequestSaveBannerHolderCFv = .text:0x80015850; // type:function size:0xC +__ct__23NandRequestLoadSaveFileFPCcllPQ23EGG4Heap = .text:0x80015860; // type:function size:0x108 +execute__23NandRequestLoadSaveFileFv = .text:0x80015970; // type:function size:0x170 +remove__23NandRequestLoadSaveFileFv = .text:0x80015AE0; // type:function size:0x54 +loadSave__29NandRequestLoadSaveFileHolderFPCcllPQ23EGG4Heap = .text:0x80015B40; // type:function size:0xA4 +getBuf__29NandRequestLoadSaveFileHolderCFv = .text:0x80015BF0; // type:function size:0xC +getLen__29NandRequestLoadSaveFileHolderCFv = .text:0x80015C00; // type:function size:0xC +remove__29NandRequestLoadSaveFileHolderFv = .text:0x80015C10; // type:function size:0x8 +__ct__17NandRequestDeleteFPCc = .text:0x80015C20; // type:function size:0xDC +execute__17NandRequestDeleteFv = .text:0x80015D00; // type:function size:0x38 +doDelete__23NandRequestDeleteHolderFPCc = .text:0x80015D40; // type:function size:0x94 fn_80015DE0 = .text:0x80015DE0; // type:function size:0x8 fn_80015DF0 = .text:0x80015DF0; // type:function size:0x48 fn_80015E40 = .text:0x80015E40; // type:function size:0x38 @@ -542,7 +542,7 @@ fn_80016140 = .text:0x80016140; // type:function size:0x44 fn_80016190 = .text:0x80016190; // type:function size:0x18 fn_800161B0 = .text:0x800161B0; // type:function size:0x10 fn_800161C0 = .text:0x800161C0; // type:function size:0x34 -fn_80016200 = .text:0x80016200; // type:function size:0xF4 +defaultSet__3d2dFv = .text:0x80016200; // type:function size:0xF4 fn_80016300 = .text:0x80016300; // type:function size:0x28 fn_80016330 = .text:0x80016330; // type:function size:0x28 fn_80016360 = .text:0x80016360; // type:function size:0x54 @@ -2145,7 +2145,7 @@ __ct__Q24dDvd8loader_cFv = .text:0x80052100; // type:function size:0x28 __dt__Q24dDvd8loader_cFv = .text:0x80052130; // type:function size:0x40 request__Q24dDvd8loader_cFPCcUcPQ23EGG4Heap = .text:0x80052170; // type:function size:0x128 remove__Q24dDvd8loader_cFv = .text:0x800522A0; // type:function size:0x5C -create__Q24dDvd11unkstruct_cFPQ23EGG4Heap = .text:0x80052300; // type:function size:0x34 +createFont__Q27dDvdUnk11unkstruct_cFPQ23EGG4Heap = .text:0x80052300; // type:function size:0x34 getUnk__Q24dDvd11unkstruct_cFv = .text:0x80052340; // type:function size:0x8 draw__Q27dDvdUnk11unkstruct_cFv = .text:0x80052350; // type:function size:0x35C fn_800526B0 = .text:0x800526B0; // type:function size:0x98 @@ -2161,11 +2161,11 @@ fn_80052A20 = .text:0x80052A20; // type:function size:0xB8 fn_80052AE0 = .text:0x80052AE0; // type:function size:0x148 fn_80052C30 = .text:0x80052C30; // type:function size:0x24 fn_80052C60 = .text:0x80052C60; // type:function size:0x24 -fn_80052C90 = .text:0x80052C90; // type:function size:0x28 +fn_80052C90__Q27dDvdUnk7FontUnkFv = .text:0x80052C90; // type:function size:0x28 fn_80052CC0 = .text:0x80052CC0; // type:function size:0x38 -fn_80052D00 = .text:0x80052D00; // type:function size:0x14 +fn_80052D00__Q27dDvdUnk7FontUnkFb = .text:0x80052D00; // type:function size:0x14 fn_80052D20 = .text:0x80052D20; // type:function size:0x30 -fn_80052D50 = .text:0x80052D50; // type:function size:0x78 +fn_80052D50__Q27dDvdUnk7FontUnkFv = .text:0x80052D50; // type:function size:0x78 fn_80052DD0 = .text:0x80052DD0; // type:function size:0x2C initDylinkHeap__4dDylFiPC10RelNamePtriPQ23EGG4Heap = .text:0x80052E00; // type:function size:0x1A0 isLinked__4dDylFUs = .text:0x80052FA0; // type:function size:0x30 @@ -2939,12 +2939,12 @@ getStatus__Q23EGG10ColorFaderCFv = .text:0x80067EC0; // type:function size:0x8 fn_80067ED0__16ReloadColorFaderFv = .text:0x80067ED0; // type:function size:0x24 fn_80067F00__16ReloadColorFaderFv = .text:0x80067F00; // type:function size:0x50 fn_80067F50__16ReloadColorFaderFv = .text:0x80067F50; // type:function size:0x4 -fn_80067F60 = .text:0x80067F60; // type:function size:0x38 +fn_80067F60__16ReloadColorFaderFv = .text:0x80067F60; // type:function size:0x38 fn_80067FA0 = .text:0x80067FA0; // type:function size:0xC fn_80067FB0 = .text:0x80067FB0; // type:function size:0xC fn_80067FC0 = .text:0x80067FC0; // type:function size:0xC fn_80067FD0 = .text:0x80067FD0; // type:function size:0xC -fn_80067FE0 = .text:0x80067FE0; // type:function size:0xC +fn_80067FE0__16ReloadColorFaderFv = .text:0x80067FE0; // type:function size:0xC fn_80067FF0 = .text:0x80067FF0; // type:function size:0x3C fn_80068030 = .text:0x80068030; // type:function size:0x34 fn_80068070 = .text:0x80068070; // type:function size:0x4 @@ -2979,7 +2979,7 @@ fn_80068DE0 = .text:0x80068DE0; // type:function size:0x64 fn_80068E50 = .text:0x80068E50; // type:function size:0x4 fn_80068E60 = .text:0x80068E60; // type:function size:0x8 fn_80068E70 = .text:0x80068E70; // type:function size:0xC -fn_80068E80 = .text:0x80068E80; // type:function size:0x6C +fn_80068E80__16ReloadColorFaderFv = .text:0x80068E80; // type:function size:0x6C fn_80067EF0__16ReloadColorFaderFl = .text:0x80068EF0; // type:function size:0xC0 fn_80068FB0 = .text:0x80068FB0; // type:function size:0x20 __ct__22CurrentStageArcManagerFv = .text:0x80068FD0; // type:function size:0x54 @@ -4050,8 +4050,8 @@ execute__17NandRequestCreateFv = .text:0x800BD0D0; // type:function size:0x16C __ct__16NandRequestWriteFPCcPvUl = .text:0x800BD240; // type:function size:0xE8 execute__16NandRequestWriteFv = .text:0x800BD330; // type:function size:0xE0 isCompleted__21NandRequestHolderBaseCFv = .text:0x800BD410; // type:function size:0x1C -getStatus__21NandRequestHolderBaseCFv = .text:0x800BD430; // type:function size:0x18 -runToCompletion__21NandRequestHolderBaseFv = .text:0x800BD450; // type:function size:0x60 +getResult__21NandRequestHolderBaseCFv = .text:0x800BD430; // type:function size:0x18 +finish__21NandRequestHolderBaseFv = .text:0x800BD450; // type:function size:0x60 check__22NandRequestCheckHolderFUlUl = .text:0x800BD4B0; // type:function size:0x5C getCheckResult__22NandRequestCheckHolderFv = .text:0x800BD510; // type:function size:0xC create__23NandRequestCreateHolderFPCcUcUc = .text:0x800BD520; // type:function size:0x5C @@ -4060,8 +4060,8 @@ failedWrite__22NandRequestWriteHolderFv = .text:0x800BD5E0; // type:function siz onExit__Q23EGG6ThreadFv = .text:0x800BD5F0; // type:function size:0x4 onEnter__Q23EGG6ThreadFv = .text:0x800BD600; // type:function size:0x4 fn_800BD610 = .text:0x800BD610; // type:function size:0x34 -fn_800BD650 = .text:0x800BD650; // type:function size:0x8 -fn_800BD660 = .text:0x800BD660; // type:function size:0x5C +GetInstance__17NandResultTrackerFv = .text:0x800BD650; // type:function size:0x8 +isFailure__17NandResultTrackerF10NANDResult = .text:0x800BD660; // type:function size:0x5C fn_800BD6C0 = .text:0x800BD6C0; // type:function size:0x34 fn_800BD700 = .text:0x800BD700; // type:function size:0x74 fn_800BD780 = .text:0x800BD780; // type:function size:0x18 @@ -7073,7 +7073,7 @@ init__29dLytMsgWindowSelectBtnParts_cFv = .text:0x8011E510; // type:function siz execute__29dLytMsgWindowSelectBtnParts_cFv = .text:0x8011E570; // type:function size:0x4C executeState__98sStateMgr_c<29dLytMsgWindowSelectBtnParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8011E5C0; // type:function size:0x10 fn_8011E5D0__24dLytMsgWindowSelectBtn_cFUlb = .text:0x8011E5D0; // type:function size:0x138 -fn_8011E710 = .text:0x8011E710; // type:function size:0x10 +changeState__93sStateMgr_c<24dLytMsgWindowSelectBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8011E710; // type:function size:0x10 initializeState_Wait__24dLytMsgWindowSelectBtn_cFv = .text:0x8011E720; // type:function size:0x2C executeState_Wait__24dLytMsgWindowSelectBtn_cFv = .text:0x8011E750; // type:function size:0x4 finalizeState_Wait__24dLytMsgWindowSelectBtn_cFv = .text:0x8011E760; // type:function size:0x4 @@ -8515,15 +8515,15 @@ 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_80152F20 = .text:0x80152F20; // type:function size:0x18 -fn_80152F40 = .text:0x80152F40; // type:function size:0x8 -fn_80152F50 = .text:0x80152F50; // type:function size:0x8 -fn_80152F60 = .text:0x80152F60; // type:function size:0x8 -fn_80152F70 = .text:0x80152F70; // type:function size:0x8 +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_80152F90 = .text:0x80152F90; // type:function size:0x8 -fn_80152FA0 = .text:0x80152FA0; // type:function size:0x8 -fn_80152FB0 = .text:0x80152FB0; // type:function size:0x8 -fn_80152FC0 = .text:0x80152FC0; // 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 +getField_0xDFC__18dLytSystemWindow_cCFv = .text:0x80152FC0; // type:function size:0x8 initializeState_ModeNone__19dLytBirdGaugeMain_cFv = .text:0x80152FD0; // type:function size:0x4 executeState_ModeNone__19dLytBirdGaugeMain_cFv = .text:0x80152FE0; // type:function size:0xC finalizeState_ModeNone__19dLytBirdGaugeMain_cFv = .text:0x80152FF0; // type:function size:0x4 @@ -9055,77 +9055,77 @@ fn_80164B30 = .text:0x80164B30; // type:function size:0x30 LytPauseText__initStates = .text:0x80164B60; // type:function size:0x338 LytPauseText__state_dtor = .text:0x80164EA0; // type:function size:0x58 fn_80164F00 = .text:0x80164F00; // type:function size:0x88 -LytSaveMsgWindow__ctor = .text:0x80164F90; // type:function size:0x204 -fn_801651A0 = .text:0x801651A0; // type:function size:0x8C -fn_80165230 = .text:0x80165230; // type:function size:0x168 -fn_801653A0 = .text:0x801653A0; // type:function size:0x10 -fn_801653B0 = .text:0x801653B0; // type:function size:0xD4 -fn_80165490 = .text:0x80165490; // type:function size:0x68 -fn_80165500 = .text:0x80165500; // type:function size:0x10 -fn_80165510 = .text:0x80165510; // type:function size:0x3C -fn_80165550 = .text:0x80165550; // type:function size:0x48 -fn_801655A0 = .text:0x801655A0; // type:function size:0x48 -fn_801655F0 = .text:0x801655F0; // type:function size:0xDC -fn_801656D0 = .text:0x801656D0; // type:function size:0x70 -fn_80165740 = .text:0x80165740; // type:function size:0x10 -LytSaveMsgWindow__stateInitEnter = .text:0x80165750; // type:function size:0x54 -LytSaveMsgWindow__stateInitUpdate = .text:0x801657B0; // type:function size:0x30 -LytSaveMsgWindow__stateInitLeave = .text:0x801657E0; // type:function size:0x4 -LytSaveMsgWindow__stateInEnter = .text:0x801657F0; // type:function size:0xE4 -LytSaveMsgWindow__stateInUpdate = .text:0x801658E0; // type:function size:0xD8 -LytSaveMsgWindow__stateInLeave = .text:0x801659C0; // type:function size:0x54 -LytSaveMsgWindow__stateWaitEnter = .text:0x80165A20; // type:function size:0x24 -LytSaveMsgWindow__stateWaitUpdate = .text:0x80165A50; // type:function size:0xAC -LytSaveMsgWindow__stateWaitLeave = .text:0x80165B00; // type:function size:0x4 -LytSaveMsgWindow__stateOutEnter = .text:0x80165B10; // type:function size:0x80 -LytSaveMsgWindow__stateOutUpdate = .text:0x80165B90; // type:function size:0x120 -LytSaveMsgWindow__stateOutLeave = .text:0x80165CB0; // type:function size:0xA4 -fn_80165D60 = .text:0x80165D60; // type:function size:0x40 -fn_80165DA0 = .text:0x80165DA0; // type:function size:0x68 -fn_80165E10 = .text:0x80165E10; // type:function size:0x10 -LytSaveMsgWindow__updateSaveTextMaybe = .text:0x80165E20; // type:function size:0x14 -LytSaveMsgWindow__setupSaveTextMaybe = .text:0x80165E40; // type:function size:0x1BC -fn_80166000 = .text:0x80166000; // type:function size:0x108 -fn_80166110 = .text:0x80166110; // type:function size:0x60 -fn_80166170 = .text:0x80166170; // type:function size:0xC -fn_80166180 = .text:0x80166180; // type:function size:0x60 -fn_801661E0 = .text:0x801661E0; // type:function size:0xC -fn_801661F0 = .text:0x801661F0; // type:function size:0x60 -fn_80166250 = .text:0x80166250; // type:function size:0xC -fn_80166260 = .text:0x80166260; // type:function size:0x1C -fn_80166280 = .text:0x80166280; // type:function size:0x1C -fn_801662A0 = .text:0x801662A0; // type:function size:0x1C -fn_801662C0 = .text:0x801662C0; // type:function size:0x1C -fn_801662E0 = .text:0x801662E0; // type:function size:0x1C -fn_80166300 = .text:0x80166300; // type:function size:0x1C -fn_80166320 = .text:0x80166320; // type:function size:0x1C -fn_80166340 = .text:0x80166340; // type:function size:0x1C -fn_80166360 = .text:0x80166360; // type:function size:0x1C -fn_80166380 = .text:0x80166380; // type:function size:0x10 -fn_80166390 = .text:0x80166390; // type:function size:0x10 -fn_801663A0 = .text:0x801663A0; // type:function size:0x10 -fn_801663B0 = .text:0x801663B0; // type:function size:0x10 -fn_801663C0 = .text:0x801663C0; // type:function size:0x10 -fn_801663D0 = .text:0x801663D0; // type:function size:0x10 -fn_801663E0 = .text:0x801663E0; // type:function size:0x10 -fn_801663F0 = .text:0x801663F0; // type:function size:0x10 -fn_80166400 = .text:0x80166400; // type:function size:0x10 -fn_80166410 = .text:0x80166410; // type:function size:0x10 -fn_80166420 = .text:0x80166420; // type:function size:0x10 -fn_80166430 = .text:0x80166430; // type:function size:0x10 -fn_80166440 = .text:0x80166440; // type:function size:0x10 -fn_80166450 = .text:0x80166450; // type:function size:0x10 -fn_80166460 = .text:0x80166460; // type:function size:0x10 -fn_80166470 = .text:0x80166470; // type:function size:0x10 -fn_80166480 = .text:0x80166480; // type:function size:0x10 -fn_80166490 = .text:0x80166490; // type:function size:0x10 -fn_801664A0 = .text:0x801664A0; // type:function size:0x10 -fn_801664B0 = .text:0x801664B0; // type:function size:0x30 -fn_801664E0 = .text:0x801664E0; // type:function size:0x30 -fn_80166510 = .text:0x80166510; // type:function size:0x30 -LytSaveMsgWindow__initStates = .text:0x80166540; // type:function size:0x338 -LytSaveMsgWindow__state_dtor = .text:0x80166880; // type:function size:0x58 -fn_801668E0 = .text:0x801668E0; // type:function size:0x88 +__ct__19dLytSaveMsgWindow_cFv = .text:0x80164F90; // type:function size:0x204 +__ct__29dLytMsgWindowSelectBtnParts_cFv = .text:0x801651A0; // type:function size:0x8C +build__19dLytSaveMsgWindow_cFb = .text:0x80165230; // type:function size:0x168 +changeState__88sStateMgr_c<19dLytSaveMsgWindow_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x801653A0; // type:function size:0x10 +remove__19dLytSaveMsgWindow_cFv = .text:0x801653B0; // type:function size:0xD4 +execute__19dLytSaveMsgWindow_cFv = .text:0x80165490; // type:function size:0x68 +executeState__88sStateMgr_c<19dLytSaveMsgWindow_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80165500; // type:function size:0x10 +draw__19dLytSaveMsgWindow_cFv = .text:0x80165510; // type:function size:0x3C +drawNow__19dLytSaveMsgWindow_cFv = .text:0x80165550; // type:function size:0x48 +reset__19dLytSaveMsgWindow_cFv = .text:0x801655A0; // type:function size:0x48 +setProperties__19dLytSaveMsgWindow_cFPCcllUc = .text:0x801655F0; // type:function size:0xDC +checkIsWait__19dLytSaveMsgWindow_cFv = .text:0x801656D0; // type:function size:0x70 +getStateID__88sStateMgr_c<19dLytSaveMsgWindow_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80165740; // type:function size:0x10 +initializeState_Init__19dLytSaveMsgWindow_cFv = .text:0x80165750; // type:function size:0x54 +executeState_Init__19dLytSaveMsgWindow_cFv = .text:0x801657B0; // type:function size:0x30 +finalizeState_Init__19dLytSaveMsgWindow_cFv = .text:0x801657E0; // type:function size:0x4 +initializeState_In__19dLytSaveMsgWindow_cFv = .text:0x801657F0; // type:function size:0xE4 +executeState_In__19dLytSaveMsgWindow_cFv = .text:0x801658E0; // type:function size:0xD8 +finalizeState_In__19dLytSaveMsgWindow_cFv = .text:0x801659C0; // type:function size:0x54 +initializeState_Wait__19dLytSaveMsgWindow_cFv = .text:0x80165A20; // type:function size:0x24 +executeState_Wait__19dLytSaveMsgWindow_cFv = .text:0x80165A50; // type:function size:0xAC +finalizeState_Wait__19dLytSaveMsgWindow_cFv = .text:0x80165B00; // type:function size:0x4 +initializeState_Out__19dLytSaveMsgWindow_cFv = .text:0x80165B10; // type:function size:0x80 +executeState_Out__19dLytSaveMsgWindow_cFv = .text:0x80165B90; // type:function size:0x120 +finalizeState_Out__19dLytSaveMsgWindow_cFv = .text:0x80165CB0; // type:function size:0xA4 +resetProperties__19dLytSaveMsgWindow_cFv = .text:0x80165D60; // type:function size:0x40 +setAnmFrame__19dLytSaveMsgWindow_cFlf = .text:0x80165DA0; // type:function size:0x68 +unbindAnm__19dLytSaveMsgWindow_cFl = .text:0x80165E10; // type:function size:0x10 +updateSaveTextMaybe__19dLytSaveMsgWindow_cFv = .text:0x80165E20; // type:function size:0x14 +setupSaveTextMaybe__19dLytSaveMsgWindow_cFv = .text:0x80165E40; // type:function size:0x1BC +updateSaveText__19dLytSaveMsgWindow_cFv = .text:0x80166000; // type:function size:0x108 +build__35sFStateFct_c<19dLytSaveMsgWindow_c>FRC12sStateIDIf_c = .text:0x80166110; // type:function size:0x60 +dispose__35sFStateFct_c<19dLytSaveMsgWindow_c>FRP10sStateIf_c = .text:0x80166170; // type:function size:0xC +build__40sFStateFct_c<24dLytMsgWindowSelectBtn_c>FRC12sStateIDIf_c = .text:0x80166180; // type:function size:0x60 +dispose__40sFStateFct_c<24dLytMsgWindowSelectBtn_c>FRP10sStateIf_c = .text:0x801661E0; // type:function size:0xC +build__45sFStateFct_c<29dLytMsgWindowSelectBtnParts_c>FRC12sStateIDIf_c = .text:0x801661F0; // type:function size:0x60 +dispose__45sFStateFct_c<29dLytMsgWindowSelectBtnParts_c>FRP10sStateIf_c = .text:0x80166250; // type:function size:0xC +initialize__32sFState_c<19dLytSaveMsgWindow_c>Fv = .text:0x80166260; // type:function size:0x1C +execute__32sFState_c<19dLytSaveMsgWindow_c>Fv = .text:0x80166280; // type:function size:0x1C +finalize__32sFState_c<19dLytSaveMsgWindow_c>Fv = .text:0x801662A0; // type:function size:0x1C +initialize__37sFState_c<24dLytMsgWindowSelectBtn_c>Fv = .text:0x801662C0; // type:function size:0x1C +execute__37sFState_c<24dLytMsgWindowSelectBtn_c>Fv = .text:0x801662E0; // type:function size:0x1C +finalize__37sFState_c<24dLytMsgWindowSelectBtn_c>Fv = .text:0x80166300; // type:function size:0x1C +initialize__42sFState_c<29dLytMsgWindowSelectBtnParts_c>Fv = .text:0x80166320; // type:function size:0x1C +execute__42sFState_c<29dLytMsgWindowSelectBtnParts_c>Fv = .text:0x80166340; // type:function size:0x1C +finalize__42sFState_c<29dLytMsgWindowSelectBtnParts_c>Fv = .text:0x80166360; // type:function size:0x1C +initializeState__88sStateMgr_c<19dLytSaveMsgWindow_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80166380; // type:function size:0x10 +finalizeState__88sStateMgr_c<19dLytSaveMsgWindow_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80166390; // type:function size:0x10 +refreshState__88sStateMgr_c<19dLytSaveMsgWindow_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801663A0; // type:function size:0x10 +getState__88sStateMgr_c<19dLytSaveMsgWindow_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801663B0; // type:function size:0x10 +getNewStateID__88sStateMgr_c<19dLytSaveMsgWindow_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801663C0; // type:function size:0x10 +getOldStateID__88sStateMgr_c<19dLytSaveMsgWindow_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801663D0; // type:function size:0x10 +initializeState__93sStateMgr_c<24dLytMsgWindowSelectBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801663E0; // type:function size:0x10 +finalizeState__93sStateMgr_c<24dLytMsgWindowSelectBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801663F0; // type:function size:0x10 +refreshState__93sStateMgr_c<24dLytMsgWindowSelectBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80166400; // type:function size:0x10 +getState__93sStateMgr_c<24dLytMsgWindowSelectBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80166410; // type:function size:0x10 +getNewStateID__93sStateMgr_c<24dLytMsgWindowSelectBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80166420; // type:function size:0x10 +getOldStateID__93sStateMgr_c<24dLytMsgWindowSelectBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80166430; // type:function size:0x10 +initializeState__98sStateMgr_c<29dLytMsgWindowSelectBtnParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80166440; // type:function size:0x10 +finalizeState__98sStateMgr_c<29dLytMsgWindowSelectBtnParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80166450; // type:function size:0x10 +refreshState__98sStateMgr_c<29dLytMsgWindowSelectBtnParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80166460; // type:function size:0x10 +getState__98sStateMgr_c<29dLytMsgWindowSelectBtnParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80166470; // type:function size:0x10 +getNewStateID__98sStateMgr_c<29dLytMsgWindowSelectBtnParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80166480; // type:function size:0x10 +getStateID__98sStateMgr_c<29dLytMsgWindowSelectBtnParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80166490; // type:function size:0x10 +getOldStateID__98sStateMgr_c<29dLytMsgWindowSelectBtnParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801664A0; // type:function size:0x10 +finalizeState__34sFStateID_c<19dLytSaveMsgWindow_c>CFR19dLytSaveMsgWindow_c = .text:0x801664B0; // type:function size:0x30 +executeState__34sFStateID_c<19dLytSaveMsgWindow_c>CFR19dLytSaveMsgWindow_c = .text:0x801664E0; // type:function size:0x30 +initializeState__34sFStateID_c<19dLytSaveMsgWindow_c>CFR19dLytSaveMsgWindow_c = .text:0x80166510; // type:function size:0x30 +__sinit_\d_lyt_save_msg_window_cpp = .text:0x80166540; // type:function size:0x338 scope:local +__dt__34sFStateID_c<19dLytSaveMsgWindow_c>Fv = .text:0x80166880; // type:function size:0x58 +isSameName__34sFStateID_c<19dLytSaveMsgWindow_c>CFPCc = .text:0x801668E0; // type:function size:0x88 fn_80166970 = .text:0x80166970; // type:function size:0x58 fn_801669D0 = .text:0x801669D0; // type:function size:0x4 hasPouchSlot__Flb = .text:0x801669E0; // type:function size:0x50 @@ -27764,11 +27764,11 @@ __fini_cpp_exceptions_reference = .dtors:0x804DB9E4; // type:object size:0x4 sco lbl_804DBA00 = .rodata:0x804DBA00; // type:object size:0x18 ActorLink__NameNodePairs = .rodata:0x804DBA18; // type:object size:0x28 data:4byte lbl_804DBA40 = .rodata:0x804DBA40; // type:object size:0x120 data:2byte -lbl_804DBB60 = .rodata:0x804DBB60; // type:object size:0x10 -lbl_804DBB70 = .rodata:0x804DBB70; // type:object size:0xC -lbl_804DBB7C = .rodata:0x804DBB7C; // type:object size:0xC +lbl_804DBB60 = .rodata:0x804DBB60; // type:object size:0xD data:string +lbl_804DBB70 = .rodata:0x804DBB70; // type:object size:0x9 data:string +lbl_804DBB7C = .rodata:0x804DBB7C; // type:object size:0xB data:string lbl_804DBB88 = .rodata:0x804DBB88; // type:object size:0x10 data:string -MEMBER_FUNC_ARR = .rodata:0x804DBB98; // type:object size:0xA0 +MEMBER_FUNC_ARR = .rodata:0x804DBB98; // type:object size:0x9C lbl_804DBC38 = .rodata:0x804DBC38; // type:object size:0x40 lbl_804DBC78 = .rodata:0x804DBC78; // type:object size:0x50 data:4byte GRADIENT_LIGHT_TEXTURE_DEFS = .rodata:0x804DBCC8; // type:object size:0x40 data:4byte @@ -29842,17 +29842,17 @@ lbl_80500310 = .data:0x80500310; // type:object size:0x28 lbl_80500338 = .data:0x80500338; // type:object size:0x5C JStudioCustscenControl__vtable = .data:0x80500394; // type:object size:0x6C __vt__8UnkClass = .data:0x80500400; // type:object size:0x10 -lbl_80500410 = .data:0x80500410; // type:object size:0xB0 +lbl_80500410 = .data:0x80500410; // type:object size:0xC data:string jumptable_805004C0 = .data:0x805004C0; // type:object size:0x58 scope:local jumptable_80500518 = .data:0x80500518; // type:object size:0x80 scope:local jumptable_805005C0 = .data:0x805005C0; // type:object size:0xA4 scope:local jumptable_80500664 = .data:0x80500664; // type:object size:0x90 scope:local jumptable_80500730 = .data:0x80500730; // type:object size:0x5C scope:local jumptable_805007B0 = .data:0x805007B0; // type:object size:0x38 scope:local -lbl_805007E8 = .data:0x805007E8; // type:object size:0xC -LoadSaveFileRequest__vtable = .data:0x805007F4; // type:object size:0xC -lbl_80500800 = .data:0x80500800; // type:object size:0xC -lbl_8050080C = .data:0x8050080C; // type:object size:0x1C +__vt__17NandRequestDelete = .data:0x805007E8; // type:object size:0xC +__vt__23NandRequestLoadSaveFile = .data:0x805007F4; // type:object size:0xC +__vt__21NandRequestSaveBanner = .data:0x80500800; // type:object size:0xC +__vt__22NandRequestCheckIsFile = .data:0x8050080C; // type:object size:0xC lbl_80500828 = .data:0x80500828; // type:object size:0x10 lbl_80500838 = .data:0x80500838; // type:object size:0xC lbl_80500844 = .data:0x80500844; // type:object size:0xC @@ -32152,7 +32152,7 @@ lbl_8051C688 = .data:0x8051C688; // type:object size:0x10 data:string lbl_8051C698 = .data:0x8051C698; // type:object size:0x10 data:string lbl_8051C6A8 = .data:0x8051C6A8; // type:object size:0x10 data:string lbl_8051C6B8 = .data:0x8051C6B8; // type:object size:0x40 -lbl_8051C6F8 = .data:0x8051C6F8; // type:object size:0x3AC +__vt__24dLytMsgWindowSelectBtn_c = .data:0x8051C6F8; // type:object size:0x3AC lbl_8051CAA4 = .data:0x8051CAA4; // type:object size:0x34 lbl_8051CAD8 = .data:0x8051CAD8; // type:object size:0x38 lbl_8051CB10 = .data:0x8051CB10; // type:object size:0x9 data:string @@ -33296,20 +33296,20 @@ lbl_80526DD8 = .data:0x80526DD8; // type:object size:0x10 lbl_80526DE8 = .data:0x80526DE8; // type:object size:0x18 lbl_80526E00 = .data:0x80526E00; // type:object size:0x38 lbl_80526E38 = .data:0x80526E38; // type:object size:0x48 -lbl_80526E80 = .data:0x80526E80; // type:object size:0x10 -lbl_80526E90 = .data:0x80526E90; // type:object size:0x30 -lbl_80526EC0 = .data:0x80526EC0; // type:object size:0x30 -lbl_80526EF0 = .data:0x80526EF0; // type:object size:0x18 -lbl_80526F08 = .data:0x80526F08; // type:object size:0x18 -lbl_80526F20 = .data:0x80526F20; // type:object size:0x30 -lbl_80526F50 = .data:0x80526F50; // type:object size:0x30 -lbl_80526F80 = .data:0x80526F80; // type:object size:0x18 -lbl_80526F98 = .data:0x80526F98; // type:object size:0x18 -lbl_80526FB0 = .data:0x80526FB0; // type:object size:0x30 -lbl_80526FE0 = .data:0x80526FE0; // type:object size:0x30 -lbl_80527010 = .data:0x80527010; // type:object size:0x18 -lbl_80527028 = .data:0x80527028; // type:object size:0x1B0 -lbl_805271D8 = .data:0x805271D8; // type:object size:0x38 +__vt__19dLytSaveMsgWindow_c = .data:0x80526E80; // type:object size:0x10 +__vt__58sFStateMgr_c<19dLytSaveMsgWindow_c,20sStateMethodUsr_FI_c> = .data:0x80526E90; // type:object size:0x30 +__vt__88sStateMgr_c<19dLytSaveMsgWindow_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80526EC0; // type:object size:0x30 +__vt__35sFStateFct_c<19dLytSaveMsgWindow_c> = .data:0x80526EF0; // type:object size:0x18 +__vt__32sFState_c<19dLytSaveMsgWindow_c> = .data:0x80526F08; // type:object size:0x18 +__vt__63sFStateMgr_c<24dLytMsgWindowSelectBtn_c,20sStateMethodUsr_FI_c> = .data:0x80526F20; // type:object size:0x30 +__vt__93sStateMgr_c<24dLytMsgWindowSelectBtn_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80526F50; // type:object size:0x30 +__vt__40sFStateFct_c<24dLytMsgWindowSelectBtn_c> = .data:0x80526F80; // type:object size:0x18 +__vt__37sFState_c<24dLytMsgWindowSelectBtn_c> = .data:0x80526F98; // type:object size:0x18 +__vt__68sFStateMgr_c<29dLytMsgWindowSelectBtnParts_c,20sStateMethodUsr_FI_c> = .data:0x80526FB0; // type:object size:0x30 +__vt__98sStateMgr_c<29dLytMsgWindowSelectBtnParts_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80526FE0; // type:object size:0x30 +__vt__45sFStateFct_c<29dLytMsgWindowSelectBtnParts_c> = .data:0x80527010; // type:object size:0x18 +__vt__42sFState_c<29dLytMsgWindowSelectBtnParts_c> = .data:0x80527028; // type:object size:0x1B0 +__vt__34sFStateID_c<19dLytSaveMsgWindow_c> = .data:0x805271D8; // type:object size:0x38 jumptable_80527210 = .data:0x80527210; // type:object size:0x20 scope:local jumptable_80527230 = .data:0x80527230; // type:object size:0x20 scope:local lbl_80527250 = .data:0x80527250; // type:object size:0x10 @@ -36218,7 +36218,7 @@ jumptable_80546F38 = .data:0x80546F38; // type:object size:0x2C scope:local jpa_dl = .data:0x80546F80; // type:object size:0x20 align:32 jpa_dl_x = .data:0x80546FA0; // type:object size:0x20 p_prj = .data:0x80546FC0; // type:object size:0xC -p_direction = .data:0x80546FCC; // type:object size:0x1B4 +p_direction = .data:0x80546FCC; // type:object size:0x14 jumptable_80547180 = .data:0x80547180; // type:object size:0x24 scope:local __vt__12JPAFieldSpin = .data:0x805471A4; // type:object size:0x14 __vt__18JPAFieldConvection = .data:0x805471B8; // type:object size:0x14 @@ -39869,7 +39869,7 @@ lbl_80574FE8 = .sbss:0x80574FE8; // type:object size:0x4 data:4byte lbl_80574FEC = .sbss:0x80574FEC; // type:object size:0xC sInstance__8UnkClass = .sbss:0x80574FF8; // type:object size:0x4 sInstance__11FileManager = .sbss:0x80574FFC; // type:object size:0x4 data:4byte -SAVE_FILE_RELATED = .sbss:0x80575000; // type:object size:0x8 data:4byte +sInstance__7SaveMgr = .sbss:0x80575000; // type:object size:0x8 data:4byte lbl_80575008 = .sbss:0x80575008; // type:object size:0x8 data:4byte lbl_80575010 = .sbss:0x80575010; // type:object size:0x8 data:4byte lbl_80575018 = .sbss:0x80575018; // type:object size:0x8 data:4byte @@ -39912,7 +39912,7 @@ s_ExecuteControlFlags__7dBase_c = .sbss:0x805750C0; // type:object size:0x4 data s_DrawControlFlags__7dBase_c = .sbss:0x805750C4; // type:object size:0x4 data:4byte s_NextExecuteControlFlags__7dBase_c = .sbss:0x805750C8; // type:object size:0x4 data:4byte lbl_805750D0 = .sbss:0x805750D0; // type:object size:0x8 data:4byte -lbl_805750D8 = .sbss:0x805750D8; // type:object size:0x8 data:4byte +sInstance__Q27dDvdUnk7FontUnk = .sbss:0x805750D8; // type:object size:0x8 data:4byte pDynamicNameTable = .sbss:0x805750E0; // type:object size:0x4 data:4byte nDynamicNameTable = .sbss:0x805750E4; // type:object size:0x4 data:4byte pDMC__4dDyl = .sbss:0x805750E8; // type:object size:0x4 data:4byte @@ -40116,7 +40116,7 @@ sInstance__13dLytBattery_c = .sbss:0x805754B8; // type:object size:0x8 data:4byt sInstance__17dLytAreaCaption_c = .sbss:0x805754C0; // type:object size:0x8 data:4byte sInstance__10dLytWipe_c = .sbss:0x805754C8; // type:object size:0x4 data:4byte LYT_HELP_PTR = .sbss:0x805754D0; // type:object size:0x8 data:4byte -lbl_805754D8 = .sbss:0x805754D8; // type:object size:0x8 data:4byte +sInstance__18dLytSystemWindow_c = .sbss:0x805754D8; // type:object size:0x8 data:4byte sInstance__15dLytBirdGauge_c = .sbss:0x805754E0; // type:object size:0x4 data:4byte sInstance__14dLytSkyGauge_c = .sbss:0x805754E8; // type:object size:0x4 data:4byte lbl_805754F0 = .sbss:0x805754F0; // type:object size:0x8 data:4byte diff --git a/configure.py b/configure.py index 5c2384a2..078816d6 100644 --- a/configure.py +++ b/configure.py @@ -377,8 +377,8 @@ config.libs = [ Object(NonMatching, "toBeSorted/d_jstudio.cpp"), Object(Matching, "toBeSorted/save_file.cpp"), Object(NonMatching, "toBeSorted/file_manager.cpp"), - Object(NonMatching, "toBeSorted/save_manager.cpp"), - Object(NonMatching, "toBeSorted/save_requests.cpp"), + Object(Matching, "toBeSorted/save_manager.cpp"), + Object(NonMatching, "toBeSorted/save_related.cpp"), Object(NonMatching, "toBeSorted/d_d2d.cpp"), Object(NonMatching, "toBeSorted/d_d3d.cpp"), Object( @@ -458,7 +458,7 @@ config.libs = [ Object(NonMatching, "d/d_tag_processor.cpp"), Object(NonMatching, "toBeSorted/time_area_mgr.cpp"), Object(NonMatching, "toBeSorted/nand_request_thread.cpp"), - Object(NonMatching, "toBeSorted/unk_gfx.cpp"), + Object(NonMatching, "toBeSorted/nand_result_tracker.cpp"), Object(Matching, "d/flag/flag_managers.cpp"), Object(NonMatching, "toBeSorted/bigboss_model_math_stuff.cpp"), Object(NonMatching, "toBeSorted/actor_event_flow_manager_related.cpp"), diff --git a/include/d/d_cs_base.h b/include/d/d_cs_base.h index 12c83def..bc54cf5d 100644 --- a/include/d/d_cs_base.h +++ b/include/d/d_cs_base.h @@ -24,6 +24,10 @@ public: field_0x703 = val; } + void setField704(bool val) { + field_0x704 = val; + } + dCursorHitCheck_c *getHitCheck() { return mCursorIf.getHit(); } diff --git a/include/d/d_d2d.h b/include/d/d_d2d.h new file mode 100644 index 00000000..105d2852 --- /dev/null +++ b/include/d/d_d2d.h @@ -0,0 +1,10 @@ +#ifndef D_D2D_H +#define D_D2D_H + +namespace d2d { + +void defaultSet(); + +} // namespace d2d + +#endif diff --git a/include/d/d_dvd_unk.h b/include/d/d_dvd_unk.h index 96ec60c3..71291116 100644 --- a/include/d/d_dvd_unk.h +++ b/include/d/d_dvd_unk.h @@ -4,6 +4,10 @@ #include "common.h" #include "egg/core/eggHeap.h" +// This file is related to errors that are +// displayed on the screen, using a backup font +// included in the DOL. + namespace dDvdUnk { class unkstruct_c { @@ -21,6 +25,49 @@ private: char field_0x4; }; +class FontUnk { +public: + FontUnk() {} + + static FontUnk *GetInstance() { + return sInstance; + } + + void fn_80052D00(bool); + void fn_80052D50(); + void fn_80052C90(); + + s32 getField_0x24() const { + return field_0x24; + } + + u8 getField_0x28() const { + return field_0x28; + } + + u8 getField_0x29() const { + return field_0x29; + } + + void setField_0x2C(u8 val) { + field_0x2C = val; + } + +private: + static FontUnk *sInstance; + + /* 0x00 */ nw4r::ut::ResFont mFont; + /* 0x1C */ s32 field_0x1C; + /* 0x20 */ s32 field_0x20; + /* 0x24 */ s32 field_0x24; + /* 0x28 */ u8 field_0x28; + /* 0x29 */ u8 field_0x29; + /* 0x2A */ u8 field_0x2A; + /* 0x2B */ u8 field_0x2B; + /* 0x2C */ u8 field_0x2C; + /* 0x2D */ u8 field_0x2D; +}; + } // namespace dDvdUnk #endif diff --git a/include/d/d_gfx.h b/include/d/d_gfx.h new file mode 100644 index 00000000..fe5d2d90 --- /dev/null +++ b/include/d/d_gfx.h @@ -0,0 +1,32 @@ +#ifndef D_GFX_H +#define D_GFX_H + +#include "common.h" + +// Made up name +class dGfx_c { +public: + typedef void (*PreDrawCallback)(void); + + void setDrawCallback(PreDrawCallback cb) { + mPreDrawCb = cb; + } + + void setField0x09(u8 val) { + field_0x09 = val; + } + + static dGfx_c *GetInstance() { + return sInstance; + } + +private: + static dGfx_c *sInstance; + + /* 0x00 */ u8 _0x00[0x04 - 0x00]; + /* 0x04 */ PreDrawCallback mPreDrawCb; + /* 0x08 */ u8 field_0x08; + /* 0x09 */ u8 field_0x09; +}; + +#endif diff --git a/include/d/d_s_boot.h b/include/d/d_s_boot.h index 5f159f44..5c365380 100644 --- a/include/d/d_s_boot.h +++ b/include/d/d_s_boot.h @@ -20,9 +20,12 @@ public: STATE_FUNC_DECLARE(dScBoot_c, Connect); STATE_FUNC_DECLARE(dScBoot_c, Save); - static dScBoot_c *sInstance; + static dScBoot_c *GetInstance() { + return sInstance; + } private: + static dScBoot_c *sInstance; class strap_c { public: strap_c(); diff --git a/include/d/lyt/d_lyt_save_msg_window.h b/include/d/lyt/d_lyt_save_msg_window.h new file mode 100644 index 00000000..d61f5888 --- /dev/null +++ b/include/d/lyt/d_lyt_save_msg_window.h @@ -0,0 +1,70 @@ +#ifndef D_LYT_SAVE_MSG_WINDOW_H +#define D_LYT_SAVE_MSG_WINDOW_H + +#include "d/lyt/d2d.h" +#include "d/lyt/msg_window/d_lyt_msg_window_select_btn.h" +#include "s/s_State.hpp" +#include "sized_string.h" + +class dLytSaveMsgWindow_c { +public: + dLytSaveMsgWindow_c(); + virtual ~dLytSaveMsgWindow_c() {} + + bool build(bool); + bool remove(); + bool execute(); + bool draw(); + bool drawNow(); + + void reset(); + bool setProperties(const char *message, s32, s32, u8); + bool checkIsWait(); + void setNumLines(s32 numLines) { + mNumLines = numLines; + } + + u8 getWillFinishOut() const { + return mWillFinishOut; + } + +private: + void resetProperties(); + void setupSaveTextMaybe(); + void updateSaveTextMaybe(); + void updateSaveText(); + void setAnmFrame(s32 group, f32 frame); + void unbindAnm(s32 group); + + STATE_FUNC_DECLARE(dLytSaveMsgWindow_c, Init); + STATE_FUNC_DECLARE(dLytSaveMsgWindow_c, In); + STATE_FUNC_DECLARE(dLytSaveMsgWindow_c, Wait); + STATE_FUNC_DECLARE(dLytSaveMsgWindow_c, Out); + + /* 0x0004 */ UI_STATE_MGR_DECLARE(dLytSaveMsgWindow_c); + /* 0x0040 */ d2d::ResAccIf_c mResAcc; + /* 0x03B0 */ d2d::LytBase_c mLyt; + /* 0x0440 */ d2d::AnmGroup_c mAnm[9]; + /* 0x0680 */ d2d::SubPaneList mSubpaneList; + /* 0x068C */ d2d::SubPaneListNode mSubpanes[1]; + /* 0x069C */ dLytMsgWindowSelectBtn_c mBtn; + /* 0x1070 */ SizedString<64> mLabel; + /* 0x10B0 */ s32 field_0x10B0; + /* 0x10B4 */ s32 field_0x10B4; + /* 0x10B8 */ s32 field_0x10B8; + /* 0x10BC */ s32 field_0x10BC; + /* 0x10C0 */ s32 field_0x10C0; + /* 0x10C4 */ s32 field_0x10C4; + /* 0x10C8 */ s32 field_0x10C8; + /* 0x10CC */ s32 mNumLines; + /* 0x10D0 */ s32 mSaveobjId; + /* 0x10D4 */ f32 mLineSpace; + /* 0x10D8 */ u8 field_0x10D8; + /* 0x10D9 */ u8 mWillFinishOut; + /* 0x10DA */ u8 field_0x10DA; + /* 0x10DB */ u8 field_0x10DB; + /* 0x10DC */ u8 field_0x10DC; + /* 0x10DD */ u8 field_0x10DD; +}; + +#endif diff --git a/include/d/lyt/d_lyt_system_window.h b/include/d/lyt/d_lyt_system_window.h new file mode 100644 index 00000000..10f81063 --- /dev/null +++ b/include/d/lyt/d_lyt_system_window.h @@ -0,0 +1,35 @@ +#ifndef D_LYT_SYSTEM_WINDOW_H +#define D_LYT_SYSTEM_WINDOW_H + +#include "common.h" + +class dLytSystemWindow_c { +public: + virtual ~dLytSystemWindow_c(); + // TODO fill out + static dLytSystemWindow_c *GetInstance() { + return sInstance; + } + + bool setProperties(const char *label, bool, const wchar_t *); + void showMaybe(); + void showMaybe(s32 arg); + + s32 getField_0xE10() const { + return field_0xE10; + } + + s32 getField_0xDE0() const; + bool getField_0xDFC() const; + bool fn_80152F50() const; + bool fn_80152F60() const; + bool fn_80152F70() const; + +private: + static dLytSystemWindow_c *sInstance; + + /* 0x004 */ u8 _0x004[0xE10 - 0x004]; + /* 0xE10 */ u8 field_0xE10; +}; + +#endif diff --git a/include/d/lyt/msg_window/d_lyt_msg_window_select_btn.h b/include/d/lyt/msg_window/d_lyt_msg_window_select_btn.h index 3d69201e..43a0b409 100644 --- a/include/d/lyt/msg_window/d_lyt_msg_window_select_btn.h +++ b/include/d/lyt/msg_window/d_lyt_msg_window_select_btn.h @@ -36,6 +36,7 @@ class dLytMsgWindowSelectBtnParts_c { public: dLytMsgWindowSelectBtnParts_c() : mStateMgr(*this) {} + ~dLytMsgWindowSelectBtnParts_c() {} void init(); void execute(); @@ -73,6 +74,14 @@ public: bool draw(); + u8 getField_0x9A4() const { + return field_0x9A4; + } + + s32 getField_0x9B0() const { + return field_0x9B0; + } + s32 getField_0x9B4() const { return field_0x9B4; } @@ -85,14 +94,26 @@ public: field_0x9BC = value; } + void setField_0x9C4(s32 value) { + field_0x9C4 = value; + } + void setField_0x990(s32 value) { mBtnHelper.field_0x4C = value; } - void setField_0x998(dTagProcessor_c *value) { + void setField_0x9A0(s32 value) { + field_0x9A0 = value; + } + + void setTagProcessor(dTagProcessor_c *value) { mpTagProcessor = value; } + void setField_0x99C(s32 value) { + field_0x99C = value; + } + void fn_8011E5D0(u32, bool); dTextBox_c *getSelectTextBox(s32 option, s32 idx) const { @@ -136,7 +157,7 @@ private: /* 0x9B8 */ s32 field_0x9B8; /* 0x9BC */ s32 field_0x9BC; /* 0x9C0 */ s32 field_0x9C0; - /* 0x9C4 */ void *field_0x9C4; + /* 0x9C4 */ s32 field_0x9C4; /* 0x9C8 */ s32 field_0x9C8; /* 0x9CC */ s8 field_0x9CC; /* 0x9CD */ u8 field_0x9CD; diff --git a/include/rvl/NAND.h b/include/rvl/NAND.h index 10795a52..b1e607a1 100644 --- a/include/rvl/NAND.h +++ b/include/rvl/NAND.h @@ -4,10 +4,12 @@ extern "C" { #endif +// IWYU pragma: begin_exports #include "rvl/NAND/NANDCheck.h" #include "rvl/NAND/NANDCore.h" #include "rvl/NAND/NANDOpenClose.h" #include "rvl/NAND/nand.h" +// IWYU pragma: end_exports #ifdef __cplusplus } diff --git a/include/rvl/NAND/NANDOpenClose.h b/include/rvl/NAND/NANDOpenClose.h index afabe1d2..d808337a 100644 --- a/include/rvl/NAND/NANDOpenClose.h +++ b/include/rvl/NAND/NANDOpenClose.h @@ -24,6 +24,13 @@ NANDResult NANDPrivateSafeOpenAsync( ); NANDResult NANDSafeCloseAsync(NANDFileInfo *info, NANDAsyncCallback callback, NANDCommandBlock *block); +NANDResult NANDChangeDir(const char *path); +NANDResult NANDCreateDir(const char *path, u8 perm, u8 attr); +NANDResult NANDSimpleSafeOpen(const char *path, NANDFileInfo *outInfo, int, void *buf, size_t bufLen); +NANDResult NANDSimpleSafeCancel(NANDFileInfo *info); +NANDResult NANDSimpleSafeClose(NANDFileInfo *info); + + #ifdef __cplusplus } #endif diff --git a/include/rvl/NAND/nand.h b/include/rvl/NAND/nand.h index 6482ecc6..6cc55556 100644 --- a/include/rvl/NAND/nand.h +++ b/include/rvl/NAND/nand.h @@ -1,6 +1,7 @@ #ifndef RVL_SDK_NAND_H #define RVL_SDK_NAND_H #include "common.h" + #include "rvl/FS.h" #ifdef __cplusplus @@ -9,6 +10,8 @@ extern "C" { #define NAND_BANNER_TITLE_MAX 32 #define NAND_BANNER_ICON_MAX_FRAME 8 +#define NAND_BANNER_TEXTURE_SIZE 0x6000 +#define NAND_BANNER_ICON_TEXTURE_SIZE 0x1200 // Forward declarations typedef struct NANDCommandBlock; @@ -127,15 +130,19 @@ typedef struct NANDCommandBlock { int simpleFlag; // } NANDCommandBlock; +// via spm +#define NAND_SET_ICON_SPEED(banner, icon, speed) \ + (banner)->iconSpeed = (u16)(((banner)->iconSpeed & ~(3 << 2 * (icon))) | ((speed) << 2 * (icon))) + typedef struct NANDBanner { - u32 magic; // at 0x0 - u32 flags; // at 0x4 - u16 iconSpeed; // at 0x8 - u8 reserved[0x20 - 0xA]; // at 0xA - wchar_t title[NAND_BANNER_TITLE_MAX]; // at 0x20 - wchar_t subtitle[NAND_BANNER_TITLE_MAX]; // at 0x60 - u8 bannerTexture[0x6000]; // at 0xA0 - u8 iconTexture[0x1200][NAND_BANNER_ICON_MAX_FRAME]; // at 0x60A0 + u32 magic; // at 0x0 + u32 flags; // at 0x4 + u16 iconSpeed; // at 0x8 + u8 reserved[0x20 - 0xA]; // at 0xA + wchar_t title[NAND_BANNER_TITLE_MAX]; // at 0x20 + wchar_t subtitle[NAND_BANNER_TITLE_MAX]; // at 0x60 + u8 bannerTexture[NAND_BANNER_TEXTURE_SIZE]; // at 0xA0 + u8 iconTexture[NAND_BANNER_ICON_MAX_FRAME][NAND_BANNER_ICON_TEXTURE_SIZE]; // at 0x60A0 } NANDBanner; NANDResult NANDCreate(const char *path, u8 perm, u8 attr); diff --git a/include/rvl/TPL.h b/include/rvl/TPL.h index f5d29af4..4609aeca 100644 --- a/include/rvl/TPL.h +++ b/include/rvl/TPL.h @@ -4,7 +4,7 @@ extern "C" { #endif -#include "rvl/TPL/TPL.h" +#include "rvl/TPL/TPL.h" // IWYU pragma: export #ifdef __cplusplus } diff --git a/include/toBeSorted/file_manager.h b/include/toBeSorted/file_manager.h index fee3b36a..6d92c6a3 100644 --- a/include/toBeSorted/file_manager.h +++ b/include/toBeSorted/file_manager.h @@ -6,7 +6,9 @@ #include "egg/core/eggHeap.h" #include "m/m_angle.h" #include "m/m_vec.h" +#include "toBeSorted/nand_request_thread.h" #include "toBeSorted/save_file.h" +#include "toBeSorted/save_manager.h" enum SAVE_ITEM_ID { }; @@ -65,8 +67,8 @@ public: /* 80009EE0 */ // mVec3(); /* 80009EF0 */ static FileManager *create(EGG::Heap *); - /* 80009F30 */ bool loadSaveData(void *out, char *name, bool isSkipData); - /* 80009F70 */ void saveSaveData(void *unk, bool isSkipData); + /* 80009F30 */ bool loadSaveData(NandRequestWriteHolder *out, const char *name, bool isSkipData); + /* 80009F70 */ void saveSaveData(NandRequestLoadSaveFileHolder *request, bool isSkipData); /* 8000A000 */ void refreshSaveFileData(); /* 8000A260 */ wchar_t *getFileHeroname(int fileNum); /* 8000A280 */ s64 getFileSaveTime(int fileNum); @@ -256,7 +258,7 @@ public: /* 80010160 */ void initSkipData(); /* 800101F0 */ void unsetFileANewFile(); - /* 80010220 */ void saveT1SaveInfo(u8 entranceT1LoadFlag); + /* 80010220 */ void saveT1SaveInfo(bool entranceT1LoadFlag); /* 80010350 */ void copyFileSkipData(int fileNum); /* 80010440 */ void clearTempFileData(); /* 800104A0 */ void saveAfterCredits(); @@ -272,7 +274,7 @@ public: /* 800112D0 */ void updateEmptyFileFlags(); /* 80011370 */ bool isFileEmpty(u8 fileNum); /* 80011390 */ bool isFileDirty(int fileNum); - /* 800113B0 */ u8 get_0xA84C(); + /* 800113B0 */ u32 get_0xA84C(); /* 800113C0 */ bool checkRegionCode(); /* 80011440 */ bool checkFileCRC(u8 fileNum); /* 80011490 */ bool isFileInactive() const; @@ -309,6 +311,51 @@ public: return getStaminaPotionTimer() != 0; } + u8 isFileInvalid() const { + return mIsFileInvalid[2]; + } + + void setField0xA840(u8 val) { + mIsFileUnk1[0] = val; + } + + void setField0xA841(u8 val) { + mIsFileUnk1[1] = val; + } + + void setField0xA842(u8 val) { + mIsFileUnk1[2] = val; + } + + void setField_0xA843(u8 val) { + mIsFileInvalid[1] = val; + } + + u8 getField_0xA841() const { + return mIsFileUnk1[1]; + } + + u8 getField_0xA842() const { + return mIsFileUnk1[2]; + } + + u8 getField_0xA843() const { + return mIsFileInvalid[1]; + } + + + void setField0xA84C(u8 val) { + m_0xA84C = val; + } + + void setField0xA84D(u8 val) { + m_0xA84D = val; + } + + void setSelectedFileNum(u8 val) { + mSelectedFile = val; + } + private: static FileManager *sInstance; }; diff --git a/include/toBeSorted/nand_request_thread.h b/include/toBeSorted/nand_request_thread.h index 1781ffe1..6279d0b6 100644 --- a/include/toBeSorted/nand_request_thread.h +++ b/include/toBeSorted/nand_request_thread.h @@ -62,8 +62,8 @@ struct NandRequestHolderBase { NandRequest *mpRequest; bool isCompleted() const; - NANDResult getStatus() const; - bool runToCompletion(); + NANDResult getResult() const; + bool finish(); }; struct NandRequestCheckHolder : public NandRequestHolderBase { diff --git a/include/toBeSorted/nand_result_tracker.h b/include/toBeSorted/nand_result_tracker.h new file mode 100644 index 00000000..690f0aaa --- /dev/null +++ b/include/toBeSorted/nand_result_tracker.h @@ -0,0 +1,15 @@ +#ifndef NAND_RESULT_TRACKER_H +#define NAND_RESULT_TRACKER_H + +#include "rvl/NAND.h" + +class NandResultTracker { + public: + static NandResultTracker *GetInstance(); + bool isFailure(NANDResult status); + + private: + NandResultTracker *sInstance; + }; + +#endif diff --git a/include/toBeSorted/reload_color_fader.h b/include/toBeSorted/reload_color_fader.h index 4bd58227..e92b8ea6 100644 --- a/include/toBeSorted/reload_color_fader.h +++ b/include/toBeSorted/reload_color_fader.h @@ -9,6 +9,9 @@ public: void fn_80067EF0(s32); void fn_80067F00(); void fn_80067F50(); + void fn_80067FE0(); + bool fn_80068E80(); + bool fn_80067F60(); u8 field_0x00[0x0C - 0x00]; s32 field_0x0C; diff --git a/include/toBeSorted/save_manager.h b/include/toBeSorted/save_manager.h new file mode 100644 index 00000000..746b1486 --- /dev/null +++ b/include/toBeSorted/save_manager.h @@ -0,0 +1,229 @@ +#ifndef D_SAVE_MANAGER_H +#define D_SAVE_MANAGER_H + +#include "d/lyt/d_lyt_save_msg_window.h" +#include "egg/egg_types.h" +#include "toBeSorted/nand_request_thread.h" + +#include "rvl/TPL.h" + +class NandRequestCheckIsFile : public NandRequest { + friend class NandRequestCheckIsFileHolder; + +public: + virtual bool execute() override; + +private: + NandRequestCheckIsFile(const char *path); + + /* 0x11 */ SizedString<0x40> mPath; + /* 0x51 */ bool mIsFile; +}; + +class NandRequestCheckIsFileHolder : public NandRequestHolderBase { +public: + NandRequestCheckIsFileHolder(NandRequestCheck *req) : NandRequestHolderBase(req) {} + + bool checkIsFile(const char *path); + bool getCheckResult() const; +}; + +class NandRequestSaveBanner : public NandRequestCreate { + friend class NandRequestSaveBannerHolder; + NandRequestSaveBanner( + const char *filePath, TPLPalette *palette, const wchar_t *title, const wchar_t *subtitle, u8 perm, u8 attr + ); + +public: + virtual bool execute() override; + +private: + TPLPalette *getPalette() const { + return mpPalette; + } + + const wchar_t *getTitle() const { + return mpTitle; + } + + const wchar_t *getSubTitle() const { + return mpSubTitle; + } + + u32 writeBannerTpl(NANDFileInfo *info); + /* 0x54 */ TPLPalette *mpPalette; + /* 0x58 */ const wchar_t *mpTitle; + /* 0x5C */ const wchar_t *mpSubTitle; + /* 0x60 */ bool mFailed; +}; + +class NandRequestSaveBannerHolder : public NandRequestHolderBase { +public: + NandRequestSaveBannerHolder(NandRequestSaveBanner *req) : NandRequestHolderBase(req) {} + + bool saveBanner( + const char *filePath, TPLPalette *palette, const wchar_t *title, const wchar_t *subtitle, u8 perm, u8 attr + ); + bool hasFailed() const; +}; + +class NandRequestLoadSaveFile : public NandRequest { + friend class NandRequestLoadSaveFileHolder; + +public: + virtual bool execute() override; + +private: + NandRequestLoadSaveFile(const char *path, s32 readSize, s32 mountDirection, EGG::Heap *heap); + + void remove(); + + /* 0x11 */ SizedString<0x40> mPath; + /* 0x54 */ EGG::Heap *mpHeap; + /* 0x58 */ void *mpBuf; + /* 0x5C */ u32 mBufLen; + /* 0x60 */ s32 mMountDirection; + /* 0x64 */ u32 mReadSize; + /* 0x68 */ bool mUnused; +}; + +class NandRequestLoadSaveFileHolder : public NandRequestHolderBase { +public: + NandRequestLoadSaveFileHolder(NandRequestLoadSaveFile *req) : NandRequestHolderBase(req) {} + + bool loadSave(const char *path, s32 readSize, s32 mountDirection, EGG::Heap *heap); + void *getBuf() const; + u32 getLen() const; + void remove(); +}; + +class NandRequestDelete : public NandRequest { + friend class NandRequestDeleteHolder; + +public: + virtual bool execute() override; + +private: + NandRequestDelete(const char *path); + + /* 0x11 */ SizedString<0x40> mPath; +}; + +class NandRequestDeleteHolder : public NandRequestHolderBase { +public: + NandRequestDeleteHolder(NandRequestCheck *req) : NandRequestHolderBase(req) {} + + bool doDelete(const char *path); +}; + +class SaveMgr { + static void create(EGG::Heap *heap); + + static SaveMgr *GetInstance() { + return sInstance; + } + + void createSaveMsgWindow(); + void execute(); + void draw(); + + bool checkForSave(); + bool checkForFreeSpace(); + bool createFiles(); + bool loadSave(); + bool save(bool entranceT1LoadFlag, bool full); + bool saveAfterCredits(); + bool writeSkipDat(); + bool copySave(u8 to, u8 from); + bool clearSelectedFile(); + +private: + void initializeCheckForSave(); + void initializeCheckForFreeSpace(); + void initializeCreateFiles(); + void initializeSaveBanner(); + void initializeLoadSave(); + void initializeWriteSave(); + void initializeWriteSkipDat(); + void initializeCopySave(); + void initializeClearSelectedFile(); + void initializeSave(); + void initializeDeleteAllData(); + void initializeError(); + void initializeNandError(); + + void executeCheckForSave(); + void executeCheckForFreeSpace(); + void executeCreateFiles(); + void executeSaveBanner(); + void executeLoadSave(); + void executeWriteSave(); + void executeWriteSkipDat(); + void executeCopySave(); + void executeClearSelectedFile(); + void executeSave(); + void executeDeleteAllData(); + void executeError(); + void executeNandError(); + + static s32 getFrameRate(); + + enum SaveMgrState_e { + STATE_CHECK_FOR_SAVE = 0, + STATE_CHECK_FOR_FREE_SPACE = 1, + STATE_CREATE_FILES = 2, + STATE_SAVE_BANNER = 3, + STATE_LOAD_SAVE = 4, + STATE_WRITE = 5, + STATE_WRITE_SKIP_DAT = 6, + STATE_COPY_SAVE = 7, + STATE_CLEAR_SELECTED_FILE = 8, + STATE_SAVE = 9, + STATE_DELETE_ALL_DATA = 10, + STATE_ERROR = 11, + STATE_NAND_ERROR = 12, + STATE_MAX = 13, + }; + + typedef void (SaveMgr::*StateFunc)(); + static const StateFunc sStateFuncs[STATE_MAX]; + + SaveMgr(); + ~SaveMgr(); + void init(); + + void beginState(SaveMgrState_e state); + void endState(); + + /* 0x000 */ NandRequestCheckIsFileHolder mCheckIsFileRequest; + /* 0x004 */ NandRequestCheckHolder mCheckRequest; + /* 0x008 */ NandRequestCreateHolder mCreateRequest; + /* 0x00C */ NandRequestWriteHolder mWriteRequest; + /* 0x010 */ NandRequestSaveBannerHolder mSaveBannerRequest; + /* 0x014 */ NandRequestLoadSaveFileHolder mLoadSaveRequest; + /* 0x018 */ NandRequestDeleteHolder mDeleteRequest; + /* 0x01C */ dLytSaveMsgWindow_c *mpWindow; + /* 0x020 */ wchar_t mTextBuf[0x400]; + /* 0x820 */ SaveMgrState_e mCurrentState; + /* 0x824 */ s32 field_0x824; + /* 0x828 */ s32 mCheckForFreeSpaceResult; + /* 0x82C */ s32 mStep; + /* 0x830 */ s32 mDelayTimer; + /* 0x834 */ u8 mCopyToFile; + /* 0x835 */ u8 mCopyFromFile; + /* 0x836 */ u8 field_0x836; + /* 0x837 */ u8 field_0x837; + /* 0x838 */ u8 field_0x838; + /* 0x839 */ u8 field_0x839; + /* 0x83A */ u8 field_0x83A; + /* 0x83B */ u8 field_0x83B; + /* 0x83C */ u8 field_0x83C; + /* 0x83D */ u8 field_0x83D; + /* 0x83E */ u8 field_0x83E; + /* 0x83F */ u8 field_0x83F; + + static SaveMgr *sInstance; +}; + + +#endif diff --git a/include/toBeSorted/some_gxf_thing.h b/include/toBeSorted/some_gxf_thing.h deleted file mode 100644 index af718c16..00000000 --- a/include/toBeSorted/some_gxf_thing.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef SOME_GFX_THING_H -#define SOME_GFX_THING_H - -#include "common.h" - -class SomeGfxThing; -extern SomeGfxThing *SOME_GFX_THING; - -class SomeGfxThing { -public: - typedef void (*drawCallback)(void); - static void setDrawCallback(drawCallback cb) { - SOME_GFX_THING->mDrawCb = cb; - } - - static void setField0x09(u8 val) { - SOME_GFX_THING->field_0x09 = val; - } - -private: - u8 _0x00[0x04 - 0x00]; - drawCallback mDrawCb; - u8 field_0x08; - u8 field_0x09; -}; - - -#endif diff --git a/src/REL/d/d_s_boot.cpp b/src/REL/d/d_s_boot.cpp index e2733224..22f9982d 100644 --- a/src/REL/d/d_s_boot.cpp +++ b/src/REL/d/d_s_boot.cpp @@ -2,8 +2,10 @@ #include "common.h" #include "d/d_base.h" +#include "d/d_dvd_unk.h" #include "d/d_dylink.h" #include "d/d_font_manager.h" +#include "d/d_gfx.h" #include "d/d_heap.h" #include "d/d_message.h" #include "d/d_scene.h" @@ -24,7 +26,6 @@ #include "toBeSorted/arc_managers/layout_arc_manager.h" #include "toBeSorted/arc_managers/oarc_manager.h" #include "toBeSorted/hbm.h" -#include "toBeSorted/some_gxf_thing.h" #include "toBeSorted/reload_color_fader.h" sFPhase::phaseCallback dScBoot_c::sCallbacks[] = {&dScBoot_c::cb1, &dScBoot_c::cb2, &dScBoot_c::cb3, @@ -44,7 +45,6 @@ sFPhaseBase::sFPhaseState dScBoot_c::executeLoadPhase() { extern "C" u8 getUsedLanguageNTSCNum(); extern "C" const char *getEventFlowFileNameByIndex(int, int); extern "C" u8 fn_80054F30(); -extern "C" nw4r::ut::ResFont *lbl_805750D8; sFPhaseBase::sFPhaseState dScBoot_c::cb1() { LayoutArcManager::GetInstance()->loadLayoutArcFromDisk("cursor", mHeap::g_archiveHeap); @@ -235,9 +235,7 @@ sFPhaseBase::sFPhaseState dScBoot_c::cb6() { } } - // TODO we think this is a ResFont but - // the offset is larger than ResFont... - ((u8 *)lbl_805750D8)[0x2C] = 1; + dDvdUnk::FontUnk::GetInstance()->setField_0x2C(1); field_0x5DF = 1; return sFPhaseBase::PHASE_NEXT; } @@ -520,7 +518,7 @@ void dScBoot_c::executeState_Strap() { void dScBoot_c::finalizeState_Strap() { // TODO - SomeGfxThing::setField0x09(1); + dGfx_c::GetInstance()->setField0x09(1); } void dScBoot_c::initializeState_Connect() { diff --git a/src/d/d_sc_game.cpp b/src/d/d_sc_game.cpp index 7decd4c1..a6b056a5 100644 --- a/src/d/d_sc_game.cpp +++ b/src/d/d_sc_game.cpp @@ -2,6 +2,7 @@ #include "common.h" #include "d/d_base.h" +#include "d/d_gfx.h" #include "d/d_stage_mgr.h" #include "d/flag/storyflag_manager.h" #include "f/f_base.h" @@ -15,7 +16,6 @@ #include "toBeSorted/file_manager.h" #include "toBeSorted/minigame_mgr.h" #include "toBeSorted/music_mgrs.h" -#include "toBeSorted/some_gxf_thing.h" #include @@ -69,7 +69,7 @@ int dScGame_c::create() { return NOT_READY; } - SomeGfxThing::setDrawCallback(someGfxThingCallback); + dGfx_c::GetInstance()->setDrawCallback(someGfxThingCallback); return SUCCEEDED; } @@ -97,7 +97,7 @@ int dScGame_c::draw() { } void dScGame_c::deleteReady() { - SomeGfxThing::setDrawCallback(nullptr); + dGfx_c::GetInstance()->setDrawCallback(nullptr); } sFPhaseBase::sFPhaseState dScGame_c::cb1() { diff --git a/src/d/d_sc_title.cpp b/src/d/d_sc_title.cpp index ffb231fb..f148b159 100644 --- a/src/d/d_sc_title.cpp +++ b/src/d/d_sc_title.cpp @@ -1,6 +1,7 @@ #include "d/d_sc_title.h" #include "common.h" +#include "d/d_dvd_unk.h" #include "d/d_heap.h" #include "d/d_message.h" #include "d/d_sc_game.h" @@ -40,8 +41,6 @@ STATE_VIRTUAL_DEFINE(dScTitle_c, Action); extern "C" void *lbl_80575688; extern "C" void fn_801907F0(void *); -extern "C" void *lbl_805750D8; -extern "C" void fn_80052D50(void *); dScTitle_c::dScTitle_c() { sInstance = this; @@ -55,7 +54,7 @@ dScTitle_c::dScTitle_c() { } FileManager::GetInstance()->clearTempFileData(); FileManager::GetInstance()->initFile(1); - fn_80052D50(lbl_805750D8); + dDvdUnk::FontUnk::GetInstance()->fn_80052D50(); lbl_80575787 = 0; field_0x2AC = 0; } diff --git a/src/d/lyt/d_lyt_battery.cpp b/src/d/lyt/d_lyt_battery.cpp index 0f8681d9..5a522545 100644 --- a/src/d/lyt/d_lyt_battery.cpp +++ b/src/d/lyt/d_lyt_battery.cpp @@ -1,5 +1,6 @@ #include "d/lyt/d_lyt_battery.h" +#include "d/d_d2d.h" #include "egg/core/eggController.h" #include "m/m_pad.h" #include "toBeSorted/arc_managers/layout_arc_manager.h" @@ -59,8 +60,6 @@ bool dLytBattery_c::init() { return true; } -extern "C" void fn_80016200(); - bool dLytBattery_c::doDraw() { mStateMgr.executeState(); if (*mStateMgr.getStateID() != StateID_Off) { @@ -71,7 +70,7 @@ bool dLytBattery_c::doDraw() { } mLyt.calc(); - fn_80016200(); + d2d::defaultSet(); mLyt.draw(); } diff --git a/src/d/lyt/d_lyt_fader.cpp b/src/d/lyt/d_lyt_fader.cpp index 4b27ae73..a96b3b63 100644 --- a/src/d/lyt/d_lyt_fader.cpp +++ b/src/d/lyt/d_lyt_fader.cpp @@ -1,5 +1,6 @@ #include "d/lyt/d_lyt_fader.h" +#include "d/d_d2d.h" #include "toBeSorted/arc_managers/layout_arc_manager.h" @@ -60,11 +61,9 @@ bool dLytFader_c::calc() { } } -extern "C" void fn_80016200(); - void dLytFader_c::draw() { if (field_0x4DD) { - fn_80016200(); + d2d::defaultSet(); mLytBase.draw(); } } diff --git a/src/d/lyt/d_lyt_save_msg_window.cpp b/src/d/lyt/d_lyt_save_msg_window.cpp new file mode 100644 index 00000000..cc8fd0f0 --- /dev/null +++ b/src/d/lyt/d_lyt_save_msg_window.cpp @@ -0,0 +1,392 @@ +#include "d/lyt/d_lyt_save_msg_window.h" + +#include "common.h" +#include "d/d_message.h" +#include "d/d_tag_processor.h" +#include "d/lyt/d2d.h" +#include "nw4r/lyt/lyt_group.h" +#include "sized_string.h" +#include "toBeSorted/arc_managers/layout_arc_manager.h" + +STATE_DEFINE(dLytSaveMsgWindow_c, Init); +STATE_DEFINE(dLytSaveMsgWindow_c, In); +STATE_DEFINE(dLytSaveMsgWindow_c, Wait); +STATE_DEFINE(dLytSaveMsgWindow_c, Out); + +dLytSaveMsgWindow_c::dLytSaveMsgWindow_c() : mStateMgr(*this, sStateID::null) { + resetProperties(); +} + +static const d2d::LytBrlanMapping brlanMap[] = { + { "save_00_in.brlan", "G_inOut_00"}, + { "save_00_in.brlan", "G_inOut_01"}, + { "save_00_bgV.brlan", "G_bgV_00"}, + { "save_00_textV.brlan", "G_textV_00"}, + {"save_00_winPosition.brlan", "G_winPosition_00"}, + { "save_00_out.brlan", "G_inOut_00"}, + { "save_00_out.brlan", "G_inOut_01"}, + { "save_00_textIn.brlan", "G_textInOut_00"}, + { "save_00_textOut.brlan", "G_textInOut_00"}, +}; + +#define SAVE_ANIM_IN_0 0 +#define SAVE_ANIM_IN_1 1 +#define SAVE_ANIM_BG_V 2 +#define SAVE_ANIM_TEXT_V 3 +#define SAVE_ANIM_WIN_POSITION 4 +#define SAVE_ANIM_OUT_0 5 +#define SAVE_ANIM_OUT_1 6 +#define SAVE_ANIM_TEXT_IN 7 +#define SAVE_ANIM_TEXT_OUT 8 + +#define SAVE_NUM_ANIMS 9 + +static const char *sGroupName = "G_ref_00"; + +bool dLytSaveMsgWindow_c::build(bool arg) { + void *data = LayoutArcManager::GetInstance()->getLoadedData("System2D"); + mResAcc.attach(data, ""); + mLyt.build("save_00.brlyt", &mResAcc); + + for (int i = 0; i < SAVE_NUM_ANIMS; i++) { + mAnm[i].init(brlanMap[i].mFile, &mResAcc, mLyt.getLayout(), brlanMap[i].mName); + } + + mLyt.setPriority(0x8A); + + for (int i = 0; i < 1; i++) { + mSubpanes[i].mpLytPane = &mBtn; + mBtn.build(&mResAcc); + mSubpaneList.PushBack(&mSubpanes[i]); + } + + if (mLyt.getLayout()->GetGroupContainer() != nullptr) { + nw4r::lyt::Group *g = mLyt.getLayout()->GetGroupContainer()->FindGroupByName(sGroupName); + if (g != nullptr) { + d2d::dSubPane::linkMeters(g, &mSubpaneList); + } + } + + mBtn.setField_0x9C4(1); + if (arg) { + mBtn.setField_0x99C(1); + } + mBtn.setField_0x9A0(1); + + mStateMgr.changeState(StateID_Init); + mLineSpace = mLyt.getTextBox("T_text_00")->GetLineSpace(); + field_0x10DC = 1; + return true; +} + +bool dLytSaveMsgWindow_c::remove() { + for (d2d::SubPaneList::Iterator it = mSubpaneList.GetBeginIter(); it != mSubpaneList.GetEndIter(); ++it) { + d2d::dSubPane *subPane = it->mpLytPane; + if (subPane != nullptr) { + nw4r::lyt::Pane *parent = subPane->getPane()->GetParent(); + parent->RemoveChild(subPane->getPane()); + } + } + + for (int i = 0; i < 1; i++) { + mSubpanes[i].mpLytPane->remove(); + } + mLyt.unbindAnims(); + for (int i = 0; i < SAVE_NUM_ANIMS; i++) { + mAnm[i].remove(); + } + mResAcc.detach(); + return true; +} + +bool dLytSaveMsgWindow_c::execute() { + for (int i = 0; i < 1; i++) { + mSubpanes[i].mpLytPane->execute(); + } + mStateMgr.executeState(); + mLyt.calc(); + return true; +} + +bool dLytSaveMsgWindow_c::draw() { + if (field_0x10D8 != 1) { + return true; + } + mLyt.addToDrawList(); + return true; +} + +bool dLytSaveMsgWindow_c::drawNow() { + if (field_0x10D8 != 1) { + return true; + } + mLyt.draw(); + return true; +} + +void dLytSaveMsgWindow_c::reset() { + resetProperties(); + mStateMgr.changeState(StateID_Init); +} + +bool dLytSaveMsgWindow_c::setProperties(const char *message, s32 a1, s32 a2, u8 a3) { + mLabel = message; + field_0x10B0 = a1; + field_0x10B4 = a2; + field_0x10DD = a3; + field_0x10DA = 1; + mNumLines = 1; + field_0x10B8 = 0; + mSaveobjId = -1; + return true; +} + +bool dLytSaveMsgWindow_c::checkIsWait() { + if (*mStateMgr.getStateID() == StateID_Wait) { + field_0x10DB = 1; + return true; + } + return false; +} + +void dLytSaveMsgWindow_c::initializeState_Init() { + resetProperties(); + for (int i = 0; i < SAVE_NUM_ANIMS; i++) { + mAnm[i].unbind(); + } +} +void dLytSaveMsgWindow_c::executeState_Init() { + if (field_0x10DA != 1) { + return; + } + field_0x10DA = 0; + mStateMgr.changeState(StateID_In); +} +void dLytSaveMsgWindow_c::finalizeState_Init() {} + +void dLytSaveMsgWindow_c::initializeState_In() { + field_0x10D8 = 1; + if (field_0x10B8 == 1) { + setAnmFrame(SAVE_ANIM_TEXT_IN, 0.0f); + } else { + setAnmFrame(SAVE_ANIM_IN_0, 0.0f); + setAnmFrame(SAVE_ANIM_IN_1, 0.0f); + } + setupSaveTextMaybe(); + f32 bgV = 0.0f; + if (field_0x10DD == 1) { + bgV = 1.0f; + } + setAnmFrame(SAVE_ANIM_BG_V, bgV); + f32 textV = 0.0f; + if (mNumLines != 1) { + textV = 1.0f; + } + setAnmFrame(SAVE_ANIM_TEXT_V, textV); + setAnmFrame(SAVE_ANIM_WIN_POSITION, field_0x10B4); + field_0x10DC = 0; +} +void dLytSaveMsgWindow_c::executeState_In() { + if (field_0x10C0 != 0) { + return; + } + s32 group = SAVE_ANIM_IN_0; + if (field_0x10B8 == 1) { + group = SAVE_ANIM_TEXT_IN; + } + d2d::AnmGroup_c &grp = mAnm[group]; + if (grp.isEndReached() == true) { + updateSaveTextMaybe(); + mStateMgr.changeState(StateID_Wait); + } + grp.play(); + if (field_0x10B8 != 1) { + mAnm[SAVE_ANIM_IN_1].play(); + } +} +void dLytSaveMsgWindow_c::finalizeState_In() { + if (field_0x10B8 == 1) { + unbindAnm(SAVE_ANIM_TEXT_IN); + } else { + unbindAnm(SAVE_ANIM_IN_0); + unbindAnm(SAVE_ANIM_IN_1); + } +} + +void dLytSaveMsgWindow_c::initializeState_Wait() { + if (field_0x10B0 == 0) { + field_0x10C0 = 10; + } else { + field_0x10C0 = 0; + } +} +void dLytSaveMsgWindow_c::executeState_Wait() { + if (field_0x10C0 == 0) { + field_0x10C4 = mBtn.getField_0x9B4(); + field_0x10C8 = mBtn.getField_0x9B0(); + } + if (field_0x10DB == 1) { + field_0x10DB = 0; + mStateMgr.changeState(StateID_Out); + } + if (field_0x10DA == 1) { + field_0x10DA = 0; + field_0x10C4 = -1; + field_0x10C8 = -1; + mStateMgr.changeState(StateID_In); + } +} +void dLytSaveMsgWindow_c::finalizeState_Wait() {} + +void dLytSaveMsgWindow_c::initializeState_Out() { + field_0x10C0 = 0; + if (field_0x10BC == 1) { + setAnmFrame(SAVE_ANIM_TEXT_OUT, 0.0f); + } else if (field_0x10BC == 2) { + setAnmFrame(SAVE_ANIM_OUT_1, 0.0f); + } else { + setAnmFrame(SAVE_ANIM_OUT_0, 0.0f); + setAnmFrame(SAVE_ANIM_OUT_1, 0.0f); + } +} +void dLytSaveMsgWindow_c::executeState_Out() { + s32 group = SAVE_ANIM_OUT_0; + if (field_0x10BC == 1) { + group = SAVE_ANIM_TEXT_OUT; + } else if (field_0x10BC == 2) { + group = SAVE_ANIM_OUT_1; + } + d2d::AnmGroup_c &grp = mAnm[group]; + switch (field_0x10C0) { + case 0: + if (grp.isEndReached() == true) { + mWillFinishOut = 1; + field_0x10C0 = 1; + } + break; + case 1: + if (field_0x10BC == 1) { + mStateMgr.changeState(StateID_Wait); + } else { + mStateMgr.changeState(StateID_Init); + } + return; + } + + grp.play(); + if (field_0x10BC == 0) { + mAnm[SAVE_ANIM_OUT_1].play(); + } +} +void dLytSaveMsgWindow_c::finalizeState_Out() { + if (mBtn.getField_0x9A4() == 0) { + mLyt.findPane("N_messageBtn_00")->SetVisible(false); + } + mWillFinishOut = 0; + if (field_0x10BC == 1) { + unbindAnm(SAVE_ANIM_TEXT_OUT); + } else if (field_0x10BC == 2) { + unbindAnm(SAVE_ANIM_OUT_1); + } else { + unbindAnm(SAVE_ANIM_OUT_0); + unbindAnm(SAVE_ANIM_OUT_1); + } +} + +void dLytSaveMsgWindow_c::resetProperties() { + field_0x10D8 = 0; + mWillFinishOut = 0; + field_0x10DA = 0; + field_0x10DB = 0; + field_0x10C4 = -1; + field_0x10C8 = -1; + field_0x10C0 = 0; + field_0x10B0 = 4; + field_0x10B4 = 4; + field_0x10B8 = 0; + field_0x10BC = 0; + mSaveobjId = -1; +} + +void dLytSaveMsgWindow_c::setAnmFrame(s32 group, f32 frame) { + d2d::AnmGroup_c &anm = mAnm[group]; + anm.bind(false); + anm.setAnimEnable(true); + anm.setFrame(frame); +} + +void dLytSaveMsgWindow_c::unbindAnm(s32 group) { + d2d::AnmGroup_c &anm = mAnm[group]; + anm.unbind(); +} + +void dLytSaveMsgWindow_c::updateSaveTextMaybe() { + // Redundant check, this is also checked internally + if (field_0x10B0 != 0) { + updateSaveText(); + } +} + +void dLytSaveMsgWindow_c::setupSaveTextMaybe() { + const wchar_t *text = dMessage_c::getTextMessageByLabel(mLabel, true, nullptr, 0); + dTextBox_c *box = mLyt.getTextBox("T_text_00"); + dTagProcessor_c *tagProcessor = dMessage_c::getGlobalTagProcessor(); + if (mSaveobjId != -1) { + SizedString<32> name; + if (mSaveobjId == 0xFF) { + name = "SAVEOBJ_NAME_UNKNOWN"; + } else { + name.sprintf("SAVEOBJ_NAME_%02d", mSaveobjId); + } + + if (tagProcessor != nullptr) { + const wchar_t *objMsg = dMessage_c::getTextMessageByLabel(name, true, nullptr, 0); + if (objMsg != nullptr) { + tagProcessor->setStringArg(objMsg, 0); + } + } + } + mNumLines = box->calcTextLines(text, tagProcessor); + if (mNumLines == 1) { + box->SetLineSpace(0.0f); + } else { + box->SetLineSpace(mLineSpace); + } + box->setTextWithGlobalTextProcessor(text); + dTextBox_c *boxShadow = mLyt.getTextBox("T_textS_00"); + if (mNumLines == 1) { + boxShadow->SetLineSpace(0.0f); + } else { + boxShadow->SetLineSpace(mLineSpace); + } + boxShadow->setTextWithGlobalTextProcessor(text); + mLyt.findPane("N_messageBtn_00")->SetVisible(false); +} + +void dLytSaveMsgWindow_c::updateSaveText() { + if (field_0x10B0 == 0) { + return; + } + mLyt.findPane("N_messageBtn_00")->SetVisible(true); + s32 numOptions = 2; + if (field_0x10B0 == 2) { + numOptions = 3; + } else if (field_0x10B0 == 3) { + numOptions = 4; + } + for (s32 i = 0; i < numOptions; i++) { + const wchar_t *text = dMessage_c::getGlobalTagProcessor()->getBuf(i); + mBtn.getSelectTextBox(i, 0)->setTextWithGlobalTextProcessor(text); + mBtn.getSelectTextBox(i, 1)->setTextWithGlobalTextProcessor(text); + } + + if (field_0x10B0 != 0) { + mBtn.setTagProcessor(dMessage_c::getGlobalTagProcessor()); + static const u32 sInts[] = {0, 2, 3, 4}; + u32 unkInt = sInts[field_0x10B0]; + s32 f = dMessage_c::getGlobalTagProcessor()->getField_0x828(); + mBtn.setField_0x9BC(f); + mBtn.setField_0x990(f); + mBtn.fn_8011E5D0(unkInt, true); + } +} diff --git a/src/d/lyt/d_screen_fader.cpp b/src/d/lyt/d_screen_fader.cpp index b43edebc..1ea4a5d7 100644 --- a/src/d/lyt/d_screen_fader.cpp +++ b/src/d/lyt/d_screen_fader.cpp @@ -1,5 +1,6 @@ #include "d/lyt/d_screen_fader.h" +#include "d/d_d2d.h" #include "egg/gfx/eggDrawGX.h" #include "egg/gfx/eggScreen.h" #include "m/m_mtx.h" @@ -37,10 +38,8 @@ bool dScreenFader_c::calc() { return res; } -extern "C" void fn_80016200(); - void dScreenFader_c::draw() { - fn_80016200(); + d2d::defaultSet(); EGG::DrawGX::BeginDrawScreen(false, false, true); f32 scaleX = EGG::Screen::GetSizeXMax(); f32 scaleY = EGG::Screen::GetSizeYMax(); diff --git a/src/d/lyt/msg_window/d_lyt_msg_window.cpp b/src/d/lyt/msg_window/d_lyt_msg_window.cpp index 2e043f0b..9dafff64 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window.cpp @@ -485,7 +485,7 @@ void dLytMsgWindow_c::initializeState_WaitKeySelectQuestion() { s32 tmp = mpTagProcessor->getField_0x828(); mSelectBtn.setField_0x9BC(tmp); mSelectBtn.setField_0x990(tmp); - mSelectBtn.setField_0x998(mpTagProcessor); + mSelectBtn.setTagProcessor(mpTagProcessor); wchar_t **buf = sBufs; @@ -510,7 +510,7 @@ void dLytMsgWindow_c::executeState_WaitKeySelectQuestion() { mpTagProcessor->setField_0x90E(0); mpTagProcessor->setField_0x82C(-1); mpTagProcessor->setField_0x828(-1); - mSelectBtn.setField_0x998(nullptr); + mSelectBtn.setTagProcessor(nullptr); field_0x824 = 0; mTextOptionSelection = selection; field_0x1220 = 0; diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_select_btn.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_select_btn.cpp index 4f1dc36f..65c97411 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_select_btn.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_select_btn.cpp @@ -490,7 +490,7 @@ bool dLytMsgWindowSelectBtn_c::build(d2d::ResAccIf_c *resAcc) { mBtnHelper.panes[7] = mpBoundings[2]; mBtnHelper.panes[8] = mpBoundings[3]; - field_0x9C4 = nullptr; + field_0x9C4 = 0; mLyt.findPane("N_arrowIn_00")->SetVisible(true); diff --git a/src/toBeSorted/file_manager.cpp b/src/toBeSorted/file_manager.cpp index 266c6e45..5939075d 100644 --- a/src/toBeSorted/file_manager.cpp +++ b/src/toBeSorted/file_manager.cpp @@ -7,6 +7,8 @@ // clang-format off #include "sized_string.h" #include "toBeSorted/dowsing_target.h" +#include "toBeSorted/nand_request_thread.h" +#include "toBeSorted/save_manager.h" // clang-format on // This class here makes no sense and the name might @@ -58,8 +60,8 @@ extern "C" { /* 80009EF0 */ FileManager *FileManager::create(EGG::Heap *heap) { return new (heap, 0x04) FileManager(); } -/* 80009F30 */ bool FileManager::loadSaveData(void *out, char *name, bool isSkipData) {} -/* 80009F70 */ void FileManager::saveSaveData(void *unk, bool isSkipData) {} +/* 80009F30 */ bool FileManager::loadSaveData(NandRequestWriteHolder *out, const char *name, bool isSkipData) {} +/* 80009F70 */ void FileManager::saveSaveData(NandRequestLoadSaveFileHolder *unk, bool isSkipData) {} /* 8000A000 */ void FileManager::refreshSaveFileData() {} /* 8000A260 */ wchar_t *FileManager::getFileHeroname(int fileNum) {} /* 8000A280 */ s64 FileManager::getFileSaveTime(int fileNum) {} @@ -344,7 +346,7 @@ u16 *FileManager::getStoryFlagsMut() { } /* 80010000 */ void FileManager::initBlankSaveFiles() { - memset(mpSavedSaveFiles, 0, 0xfbe0); + memset(mpSavedSaveFiles, 0, sizeof(SavedSaveFiles)); mSelectedFile = 0; memset(mIsFileEmpty, 0, 3); SkipData *data; @@ -409,7 +411,7 @@ u16 *FileManager::getStoryFlagsMut() { } /* 800101F0 */ void FileManager::unsetFileANewFile() {} -/* 80010220 */ void FileManager::saveT1SaveInfo(u8 entranceT1LoadFlag) {} +/* 80010220 */ void FileManager::saveT1SaveInfo(bool entranceT1LoadFlag) {} /* 80010350 */ void FileManager::copyFileSkipData(int fileNum) {} extern "C" void fn_800C01F0(); // todo flag managers /* 80010440 */ void FileManager::clearTempFileData() { @@ -449,7 +451,7 @@ extern "C" void fn_800C01F0(); // todo flag managers } /* 80011370 */ bool FileManager::isFileEmpty(u8 fileNum) {} /* 80011390 */ bool FileManager::isFileDirty(int fileNum) {} -/* 800113B0 */ u8 FileManager::get_0xA84C() {} +/* 800113B0 */ u32 FileManager::get_0xA84C() {} /* 800113C0 */ bool FileManager::checkRegionCode() {} /* 80011440 */ bool FileManager::checkFileCRC(u8 fileNum) {} /* 80011490 */ diff --git a/src/toBeSorted/nand_request_thread.cpp b/src/toBeSorted/nand_request_thread.cpp index 591c627e..ac506a09 100644 --- a/src/toBeSorted/nand_request_thread.cpp +++ b/src/toBeSorted/nand_request_thread.cpp @@ -157,9 +157,6 @@ const char *splitComponent(const char *inPath, char *outPath, size_t size) { return inPath + 1; } -extern "C" NANDResult NANDChangeDir(const char *path); -extern "C" NANDResult NANDCreateDir(const char *path, u8 perm, u8 attr); - bool NandRequestCreate::execute() { char homeDir[64]; char pathComponent[64]; @@ -210,10 +207,6 @@ NandRequestWrite::NandRequestWrite(const char *someString, void *data, size_t da mFilePath = someString; } -extern "C" NANDResult NANDSimpleSafeOpen(const char *path, NANDFileInfo *outInfo, int, void *buf, size_t bufLen); -extern "C" NANDResult NANDSimpleSafeCancel(NANDFileInfo *info); -extern "C" NANDResult NANDSimpleSafeClose(NANDFileInfo *info); - bool NandRequestWrite::execute() { NANDFileInfo info; mStatus = NANDSimpleSafeOpen( @@ -253,14 +246,14 @@ bool NandRequestHolderBase::isCompleted() const { return true; } -NANDResult NandRequestHolderBase::getStatus() const { +NANDResult NandRequestHolderBase::getResult() const { if (mpRequest != nullptr) { return mpRequest->getStatus(); } return NAND_RESULT_BUSY; } -bool NandRequestHolderBase::runToCompletion() { +bool NandRequestHolderBase::finish() { if (mpRequest == nullptr) { return true; } diff --git a/src/toBeSorted/save_manager.cpp b/src/toBeSorted/save_manager.cpp index e69de29b..78c2ca0c 100644 --- a/src/toBeSorted/save_manager.cpp +++ b/src/toBeSorted/save_manager.cpp @@ -0,0 +1,1758 @@ +#include "toBeSorted/save_manager.h" + +#include "common.h" +#include "d/d_cs_base.h" +#include "d/d_d2d.h" +#include "d/d_dvd_unk.h" +#include "d/d_heap.h" +#include "d/d_message.h" +#include "d/d_s_boot.h" +#include "d/d_sc_game.h" +#include "d/d_sys.h" +#include "d/lyt/d_lyt_save_msg_window.h" +#include "d/lyt/d_lyt_system_window.h" +#include "egg/core/eggHeap.h" +#include "m/m_pad.h" +#include "toBeSorted/arc_managers/layout_arc_manager.h" +#include "toBeSorted/file_manager.h" +#include "toBeSorted/nand_request_thread.h" +#include "toBeSorted/nand_result_tracker.h" +#include "toBeSorted/reload_color_fader.h" +#include "toBeSorted/small_sound_mgr.h" + +#include "rvl/NAND.h" +#include "rvl/TPL.h" + +#include + +SaveMgr *SaveMgr::sInstance; + +static const char sSaveFileName[] = "wiiking2.sav"; +static const char sSkipDatFileName[] = "skip.dat"; +static const char sBannerBinFileName[] = "banner.bin"; +static const char sTmpBannerBinFileName[] = "/tmp/banner.bin"; + +#define FILE_PERMS (NAND_PERM_RUSR | NAND_PERM_WUSR | NAND_PERM_RGRP | NAND_PERM_WGRP) + +const SaveMgr::StateFunc SaveMgr::sStateFuncs[STATE_MAX] = { + &SaveMgr::executeCheckForSave, &SaveMgr::executeCheckForFreeSpace, &SaveMgr::executeCreateFiles, + &SaveMgr::executeSaveBanner, &SaveMgr::executeLoadSave, &SaveMgr::executeWriteSave, + &SaveMgr::executeWriteSkipDat, &SaveMgr::executeCopySave, &SaveMgr::executeClearSelectedFile, + &SaveMgr::executeSave, &SaveMgr::executeDeleteAllData, &SaveMgr::executeError, + &SaveMgr::executeNandError, +}; + +SaveMgr::SaveMgr() + : mCheckIsFileRequest(nullptr), + mCheckRequest(nullptr), + mCreateRequest(nullptr), + mWriteRequest(nullptr), + mSaveBannerRequest(nullptr), + mLoadSaveRequest(nullptr), + mDeleteRequest(nullptr) { + sInstance = this; + mpWindow = nullptr; +} +// Not used but this spawns the weak dtors +SaveMgr::~SaveMgr() { + delete mpWindow; +} + +void SaveMgr::create(EGG::Heap *heap) { + new (heap, 4) SaveMgr(); + sInstance->init(); +} + +void SaveMgr::init() { + mCurrentState = STATE_MAX; + field_0x824 = 2; + mCheckForFreeSpaceResult = 0; + mCopyToFile = 0; + mCopyFromFile = 0; + field_0x836 = 0; + field_0x837 = 0; + field_0x838 = 0; + field_0x839 = 0; + field_0x83A = 0; + field_0x83B = 0; + field_0x83C = 0; + field_0x83D = 0; + field_0x83E = 0; + mDelayTimer = 0; + FileManager::GetInstance()->setField0xA840(1); + if (dCsBase_c::GetInstance() != nullptr) { + dCsBase_c::GetInstance()->setField704(false); + } + if (mpWindow != nullptr) { + mpWindow->reset(); + } + field_0x83F = 0; +} + +void SaveMgr::execute() { + if (mCurrentState != STATE_MAX) { + StateFunc f = sStateFuncs[mCurrentState]; + if (f != nullptr) { + (this->*f)(); + } + } +} + +void SaveMgr::draw() { + d2d::defaultSet(); + if (mpWindow != nullptr) { + mpWindow->drawNow(); + } +} + +void SaveMgr::createSaveMsgWindow() { + if (mpWindow == nullptr) { + mpWindow = new dLytSaveMsgWindow_c(); + mpWindow->build(false); + } +} + +bool SaveMgr::checkForSave() { + if (mCurrentState != STATE_MAX) { + return false; + } + field_0x836 = 0; + initializeCheckForSave(); + return true; +} + +bool SaveMgr::checkForFreeSpace() { + if (mCurrentState != STATE_MAX) { + return false; + } + field_0x836 = 0; + initializeCheckForFreeSpace(); + return true; +} + +bool SaveMgr::createFiles() { + if (mCurrentState != STATE_MAX) { + return false; + } + field_0x836 = 0; + initializeCreateFiles(); + return true; +} + +bool SaveMgr::loadSave() { + if (mCurrentState != STATE_MAX) { + return false; + } + field_0x836 = 0; + initializeLoadSave(); + return true; +} + +bool SaveMgr::save(bool entranceT1LoadFlag, bool full) { + if (mCurrentState != STATE_MAX) { + return false; + } + if (FileManager::GetInstance()->get_0xA84C()) { + return false; + } + field_0x836 = 0; + if (full == 1) { + FileManager::GetInstance()->saveT1SaveInfo(entranceT1LoadFlag); + } else { + FileManager::GetInstance()->setEntranceLoadFlagT1(entranceT1LoadFlag); + } + FileManager::GetInstance()->setFileTimes(); + initializeSave(); + field_0x83E = 0; + return true; +} + +bool SaveMgr::saveAfterCredits() { + if (mCurrentState != STATE_MAX) { + return false; + } + if (FileManager::GetInstance()->get_0xA84C()) { + return false; + } + field_0x836 = 0; + dDvdUnk::FontUnk::GetInstance()->fn_80052D00(true); + FileManager::GetInstance()->setFileTimes(); + FileManager::GetInstance()->saveAfterCredits(); + initializeSave(); + field_0x83E = 0; + return true; +} + +bool SaveMgr::writeSkipDat() { + if (mCurrentState != STATE_MAX) { + return false; + } + field_0x836 = 0; + initializeWriteSkipDat(); + return true; +} + +bool SaveMgr::copySave(u8 to, u8 from) { + if (mCurrentState != STATE_MAX) { + return false; + } + field_0x836 = 0; + mCopyToFile = to; + mCopyFromFile = from; + initializeCopySave(); + field_0x83F = 0; + return true; +} + +bool SaveMgr::clearSelectedFile() { + if (mCurrentState != STATE_MAX) { + return false; + } + field_0x836 = 0; + initializeClearSelectedFile(); + field_0x83F = 0; + return true; +} + +void SaveMgr::initializeCheckForSave() { + beginState(STATE_CHECK_FOR_SAVE); + mCheckIsFileRequest.checkIsFile(sSaveFileName); + field_0x839 = 0; + dDvdUnk::FontUnk::GetInstance()->fn_80052D00(false); +} + +void SaveMgr::executeCheckForSave() { + FileManager *fileManager = FileManager::GetInstance(); + NandResultTracker *t = NandResultTracker::GetInstance(); + switch (mStep) { + case 0: + if (mCheckIsFileRequest.isCompleted()) { + if (t->isFailure(mCheckIsFileRequest.getResult()) && mCheckIsFileRequest.finish()) { + return; + } + if (mCheckIsFileRequest.getCheckResult()) { + field_0x839 |= 2; + } + if (mCheckIsFileRequest.finish()) { + mCheckIsFileRequest.checkIsFile(sSkipDatFileName); + mStep = 1; + } + } + break; + case 1: + if (mCheckIsFileRequest.isCompleted()) { + if (t->isFailure(mCheckIsFileRequest.getResult()) && mCheckIsFileRequest.finish()) { + return; + } + if (mCheckIsFileRequest.getCheckResult()) { + field_0x839 |= 4; + } + if (mCheckIsFileRequest.finish()) { + mCheckIsFileRequest.checkIsFile(sBannerBinFileName); + mStep = 2; + } + } + break; + case 2: + if (mCheckIsFileRequest.isCompleted()) { + if (t->isFailure(mCheckIsFileRequest.getResult()) && mCheckIsFileRequest.finish()) { + return; + } + if (mCheckIsFileRequest.getCheckResult()) { + field_0x839 |= 1; + } + if (mCheckIsFileRequest.finish()) { + mStep = 3; + } + } + break; + case 3: + if (field_0x839 == (1 | 2) || field_0x839 == (1 | 2 | 4)) { + fileManager->setField0xA841(1); + if (field_0x839 == (1 | 2)) { + fileManager->setField0xA842(0); + } else { + fileManager->setField0xA842(1); + } + } else { + fileManager->setField0xA841(0); + fileManager->setField0xA842(0); + if (field_0x839) { + t->isFailure(NAND_RESULT_AUTHENTICATION); + initializeError(); + return; + } + } + endState(); + break; + } +} + +void SaveMgr::initializeCheckForFreeSpace() { + beginState(STATE_CHECK_FOR_FREE_SPACE); + dDvdUnk::FontUnk::GetInstance()->fn_80052D00(false); + mCheckRequest.check(7, 3); + mCheckForFreeSpaceResult = 0; +} + +void SaveMgr::executeCheckForFreeSpace() { + if (mCheckRequest.isCompleted()) { + if (NandResultTracker::GetInstance()->isFailure(mCheckRequest.getResult()) && mCheckRequest.finish()) { + return; + } + u32 result = mCheckRequest.getCheckResult(); + if ((result & (NAND_CHECK_TOO_MANY_APP_BLOCKS | NAND_CHECK_TOO_MANY_USER_BLOCKS)) != 0) { + if (mCheckRequest.finish()) { + mCheckForFreeSpaceResult = 1; + initializeNandError(); + } + } else if ((result & (NAND_CHECK_TOO_MANY_APP_FILES | NAND_CHECK_TOO_MANY_USER_FILES)) != 0) { + if (mCheckRequest.finish()) { + mCheckForFreeSpaceResult = 2; + initializeNandError(); + } + } else { + if (mCheckRequest.finish()) { + if (field_0x838 == 1 || field_0x83A == 1) { + initializeCreateFiles(); + } else { + endState(); + } + } + } + } +} + +void SaveMgr::initializeCreateFiles() { + beginState(STATE_CREATE_FILES); + field_0x838 = 1; + FileManager::GetInstance()->setField0xA84D(1); + dDvdUnk::FontUnk::GetInstance()->fn_80052D00(false); +} + +void SaveMgr::executeCreateFiles() { + FileManager *fileMgr = FileManager::GetInstance(); + switch (mStep) { + case 0: { + s32 numLines = 0; + if (field_0x83A != 0) { + if (field_0x837 == 1) { + // "Restoring save data. Please do not touch the POWER Button or RESET." + if (mpWindow->setProperties("SYS_INIT_06", 0, 1, field_0x83E)) { + numLines = 2; + } + } else { + // "Creating save data again. Please do not touch the POWER Button or RESET." + if (mpWindow->setProperties("SYS_INIT_08", 0, 1, field_0x83E)) { + numLines = 2; + } + } + } else { + // "Creating save data. Please do not touch the POWER Button or RESET." + if (mpWindow->setProperties("SYS_INIT_02", 0, 1, field_0x83E)) { + numLines = 2; + } + } + if (numLines != 0) { + mDelayTimer = 0; + mStep++; + mpWindow->setNumLines(numLines); + } + break; + } + case 1: { + if (mDelayTimer < 30) { + mDelayTimer++; + } else { + mCreateRequest.create(sSaveFileName, FILE_PERMS, 0); + mDelayTimer = 0; + mStep++; + } + break; + } + case 2: { + if (!mCreateRequest.isCompleted()) { + return; + } + NANDResult status = mCreateRequest.getResult(); + if (!mCreateRequest.finish()) { + return; + } + if (NandResultTracker::GetInstance()->isFailure(status)) { + return; + } + fileMgr->setField0xA841(1); + mStep++; + break; + } + case 3: { + mCreateRequest.create(sSkipDatFileName, FILE_PERMS, 0); + mStep++; + break; + } + case 4: { + if (!mCreateRequest.isCompleted()) { + return; + } + NANDResult status = mCreateRequest.getResult(); + if (!mCreateRequest.finish()) { + return; + } + if (NandResultTracker::GetInstance()->isFailure(status)) { + return; + } + if (dScGame_c::GetInstance() != nullptr && dScGame_c::GetInstance()->profile_name == fProfile::GAME) { + fileMgr->copySelectedFileSkipData(); + } + fileMgr->setField0xA842(1); + initializeWriteSave(); + mStep = 1; // Skips something in other state! + break; + } + } + mpWindow->execute(); +} + +void SaveMgr::initializeSaveBanner() { + beginState(STATE_SAVE_BANNER); + // "Zelda: Skyward Sword" + const wchar_t *title = dMessage_c::getTextMessageByLabel("SYS_ZELDA_01", true, nullptr, 0); + // Need to stash title as next call to getTextMessageByLabel will reuse internal buffer + // Missed optimization: Could've passed mTextBuf directly + for (s32 i = 0; i < 0x3FF; i++) { + mTextBuf[i] = title[i]; + } + // "A story of Link and Zelda." + const wchar_t *subtitle = dMessage_c::getTextMessageByLabel("SYS_ZELDA_02", true, nullptr, 0); + void *data = LayoutArcManager::GetInstance()->getData("saveBannerU", "tmp/saveBanner.tpl"); + mSaveBannerRequest.saveBanner(sTmpBannerBinFileName, (TPLPalette *)data, mTextBuf, subtitle, FILE_PERMS, 0); + FileManager::GetInstance()->setField0xA84D(1); +} + +void SaveMgr::executeSaveBanner() { + dDvdUnk::FontUnk *fontUnk = dDvdUnk::FontUnk::GetInstance(); + switch (mStep) { + case 0: { + mDelayTimer++; + if (!mSaveBannerRequest.isCompleted()) { + return; + } + FileManager::GetInstance()->setField0xA84D(0); + NANDResult result = mSaveBannerRequest.getResult(); + bool bFailed = mSaveBannerRequest.hasFailed(); + if (!mSaveBannerRequest.finish()) { + return; + } + if (NandResultTracker::GetInstance()->isFailure(result)) { + mStep = 20; + return; + } + if (bFailed) { + // retry + mStep = 10; + return; + } + mStep = 1; + break; + } + case 1: { + if (mDelayTimer < getFrameRate()) { + mDelayTimer++; + } else { + if (mpWindow->checkIsWait()) { + mDelayTimer = 0; + mStep++; + } + } + break; + } + case 2: { + if (mpWindow->getWillFinishOut() == 1) { + mStep++; + } + break; + } + case 3: { + bool b = false; + if (field_0x83A == 1) { + if (field_0x837 != 0) { + // "Save data is restored." + if (mpWindow->setProperties("SYS_INIT_07", 0, 1, field_0x83E) == true) { + b = true; + } + } else { + // "New save data has been created." + if (mpWindow->setProperties("SYS_INIT_09", 0, 1, field_0x83E) == true) { + b = true; + } + } + } else if (field_0x838 == 1) { + // "Save data for The Legend of Zelda: Skyward Sword has been created." + if (mpWindow->setProperties("SYS_INIT_03", 0, 1, field_0x83E) == true) { + b = true; + mpWindow->setNumLines(2); + } + } else if (field_0x83B == 1) { + // "Copying complete." + if (mpWindow->setProperties("SYS_COPY_02", 0, 1, field_0x83E) == true) { + b = true; + } + } else if (field_0x83C == 1) { + // "Deleting complete." + if (mpWindow->setProperties("SYS_DELETE_02", 0, 1, field_0x83E) == true) { + b = true; + } + } else { + // "Saved." + if (mpWindow->setProperties("SYS_SAVE_02", 0, 1, field_0x83E) == true) { + b = true; + } + } + + if (b == 1) { + if (!dDvdUnk::FontUnk::GetInstance()->getField_0x28()) { + SmallSoundManager::GetInstance()->playSound(SE_S_SAVE_FINISH); + } + mDelayTimer = 0; + mStep++; + } + break; + } + + case 4: { + if (mDelayTimer < getFrameRate() + 30) { + mDelayTimer++; + } else { + if (mpWindow->checkIsWait() == true) { + mDelayTimer = 0; + mStep++; + } + } + break; + } + case 5: { + if (mpWindow->getWillFinishOut() == 1) { + if (fontUnk->getField_0x29() == 1) { + fontUnk->fn_80052C90(); + } + field_0x838 = 0; + field_0x83A = 0; + field_0x837 = 1; + endState(); + } + break; + } + case 10: { + // retry + initializeSaveBanner(); + break; + } + case 20: { + if (mpWindow->checkIsWait()) { + mStep++; + } + break; + } + case 21: { + initializeError(); + break; + } + } + mpWindow->execute(); +} + +void SaveMgr::initializeLoadSave() { + beginState(STATE_LOAD_SAVE); + mLoadSaveRequest.loadSave(sSaveFileName, sizeof(SavedSaveFiles), 0, nullptr); +} + +void SaveMgr::executeLoadSave() { + FileManager *fileManager = FileManager::GetInstance(); + switch (mStep) { + case 0: { + if (!mLoadSaveRequest.isCompleted()) { + return; + } + NANDResult result = mLoadSaveRequest.getResult(); + NandResultTracker *tracker = NandResultTracker::GetInstance(); + if (tracker->isFailure(result)) { + mLoadSaveRequest.remove(); + if (mLoadSaveRequest.finish()) { + initializeError(); + } + return; + } + if (mLoadSaveRequest.getBuf() != nullptr) { + fileManager->saveSaveData(&mLoadSaveRequest, false); + } + mLoadSaveRequest.remove(); + if (!mLoadSaveRequest.finish()) { + return; + } + fileManager->checkFileStatus(); + if (fileManager->isFileInvalid() == true) { + tracker->isFailure(NAND_RESULT_AUTHENTICATION); + initializeError(); + } else if (fileManager->getField_0xA842() != 1) { + mStep = 10; + } else { + mStep = 1; + } + break; + } + case 1: { + mLoadSaveRequest.loadSave(sSkipDatFileName, 0x80, 0, nullptr); + mStep = 2; + break; + } + case 2: { + if (!mLoadSaveRequest.isCompleted()) { + return; + } + NANDResult result = mLoadSaveRequest.getResult(); + NandResultTracker *tracker = NandResultTracker::GetInstance(); + if (tracker->isFailure(result)) { + mLoadSaveRequest.remove(); + if (mLoadSaveRequest.finish()) { + mStep = 30; + } + return; + } + if (mLoadSaveRequest.getBuf() != nullptr) { + fileManager->saveSaveData(&mLoadSaveRequest, true); + } + mLoadSaveRequest.remove(); + if (mLoadSaveRequest.finish()) { + if (fileManager->checkSkipDataCRCs() == 1) { + mStep = 3; + } else { + fileManager->updateEmptyFiles(); + field_0x837 = 1; + endState(); + } + } + break; + } + case 3: { + for (int i = 0; i < 3; i++) { + fileManager->copyFileSkipData(i); + } + mStep++; + break; + } + case 4: { + fileManager->updateEmptyFiles(); + field_0x837 = 1; + initializeWriteSkipDat(); + break; + } + case 10: { + mCheckRequest.check(1, 1); + mStep++; + break; + } + case 11: { + if (!mCheckRequest.isCompleted()) { + return; + } + NANDResult result = mCheckRequest.getResult(); + if (!NandResultTracker::GetInstance()->isFailure(result) || !mCheckRequest.finish()) { + u32 check = mCheckRequest.getCheckResult(); + if (mCheckRequest.finish()) { + if (check) { + fileManager->updateEmptyFiles(); + field_0x837 = 1; + endState(); + } else { + mStep += 1; + } + } + } + break; + } + case 12: { + fileManager->setField0xA84D(1); + mCreateRequest.create(sSkipDatFileName, FILE_PERMS, 0); + mStep += 1; + break; + } + case 13: { + if (mCreateRequest.isCompleted()) { + NANDResult result = mCreateRequest.getResult(); + if (mCreateRequest.finish()) { + if (!NandResultTracker::GetInstance()->isFailure(result)) { + for (int i = 0; i < 3; i++) { + fileManager->copyFileSkipData(i); + } + fileManager->setField0xA842(1); + mStep = 4; + } + } + } + break; + } + case 30: { + fileManager->setField0xA84D(1); + mDeleteRequest.doDelete(sSkipDatFileName); + mStep += 1; + break; + } + case 31: { + if (!mDeleteRequest.isCompleted()) { + return; + } + NANDResult result = mDeleteRequest.getResult(); + if (NandResultTracker::GetInstance()->isFailure(result)) { + if (mDeleteRequest.finish()) { + initializeError(); + } + + } else { + if (mDeleteRequest.finish()) { + mStep = 10; + } + } + + break; + } + } +} + +void SaveMgr::initializeWriteSave() { + beginState(STATE_WRITE); + mDelayTimer = 0; + dDvdUnk::FontUnk::GetInstance()->fn_80052D00(false); + FileManager::GetInstance()->setField0xA84D(1); + field_0x83D = 1; +} + +void SaveMgr::executeWriteSave() { + FileManager *fileManager = FileManager::GetInstance(); + switch (mStep) { + case 0: { + bool anyAction = false; + if (field_0x83B == 1) { + // "Copying... Please do not touch the POWER Button or RESET." + if (mpWindow->setProperties("SYS_COPY_01", 0, 1, field_0x83E)) { + anyAction = true; + } + } else if (field_0x83C == 1) { + // "Deleting... Please do not touch the POWER Button or RESET." + if (mpWindow->setProperties("SYS_DELETE_01", 0, 1, field_0x83E)) { + anyAction = true; + } + } else { + // "Saving in progress. Please do not\\ntouch the POWER Button or RESET." + if (mpWindow->setProperties("SYS_SAVE_01", 0, 1, field_0x83E)) { + anyAction = true; + } + } + + if (anyAction == true) { + mStep = 1; + mDelayTimer = 0; + mpWindow->setNumLines(2); + } + break; + } + case 1: { + if (mDelayTimer >= 30) { + fileManager->loadSaveData(&mWriteRequest, sSaveFileName, false); + mDelayTimer = 0; + mStep++; + } else { + mDelayTimer++; + } + break; + } + case 2: { + mDelayTimer++; + if (!mWriteRequest.isCompleted()) { + return; + } + NANDResult result = mWriteRequest.getResult(); + if (NandResultTracker::GetInstance()->isFailure(result)) { + if (mWriteRequest.finish()) { + mStep = 10; + } + return; + } + if (mWriteRequest.failedWrite() == 1) { + if (mWriteRequest.finish()) { + mStep = 5; + } + return; + } + if (!mWriteRequest.finish()) { + return; + } + if (fileManager->getField_0xA842() == 1) { + mStep = 3; + } else { + mStep = 40; + } + break; + } + case 3: { + fileManager->loadSaveData(&mWriteRequest, sSkipDatFileName, true); + mStep = 4; + break; + } + case 4: { + mDelayTimer++; + if (!mWriteRequest.isCompleted()) { + return; + } + NANDResult result = mWriteRequest.getResult(); + if (NandResultTracker::GetInstance()->isFailure(result)) { + if (mWriteRequest.finish()) { + mStep = 30; + } + return; + } + if (mWriteRequest.failedWrite() == 1) { + if (mWriteRequest.finish()) { + mStep = 6; + } + return; + } + if (!mWriteRequest.finish()) { + return; + } + mStep = 40; + break; + } + case 5: { + fileManager->loadSaveData(&mWriteRequest, sSaveFileName, false); + mStep = 2; + mDelayTimer = 0; + break; + } + case 6: { + fileManager->loadSaveData(&mWriteRequest, sSkipDatFileName, true); + mStep = 4; + mDelayTimer = 0; + break; + } + case 10: { + if (mpWindow->checkIsWait()) { + initializeError(); + } + break; + } + case 20: { + if (mpWindow->checkIsWait()) { + mStep++; + } + break; + } + case 21: { + if (mpWindow->getWillFinishOut() == true) { + fileManager->checkFileStatus(); + if (fileManager->isFileInvalid() == 1) { + NandResultTracker::GetInstance()->isFailure(NAND_RESULT_AUTHENTICATION); + initializeError(); + return; + } + initializeSaveBanner(); + } + break; + } + case 30: { + mDelayTimer++; + mDeleteRequest.doDelete(sSkipDatFileName); + mStep++; + break; + } + case 31: { + mDelayTimer++; + if (!mDeleteRequest.isCompleted()) { + return; + } + NANDResult result = mDeleteRequest.getResult(); + if (NandResultTracker::GetInstance()->isFailure(result)) { + if (!mDeleteRequest.finish()) { + return; + } + mpWindow->checkIsWait(); + initializeError(); + return; + } + if (!mDeleteRequest.finish()) { + return; + } + fileManager->setField0xA842(0); + mStep++; + break; + } + case 32: { + mDelayTimer++; + mCheckRequest.check(1, 1); + mStep++; + break; + } + case 33: { + mDelayTimer++; + if (!mCheckRequest.isCompleted()) { + return; + } + NANDResult result = mCheckRequest.getResult(); + if (NandResultTracker::GetInstance()->isFailure(result) && mCheckRequest.finish()) { + mpWindow->checkIsWait(); + initializeError(); + } else { + u32 result = mCheckRequest.getCheckResult(); + if (!mCheckRequest.finish()) { + return; + } + if (result) { + mStep = 40; + } else { + mStep++; + } + } + break; + } + case 34: { + mDelayTimer++; + mCreateRequest.create(sSkipDatFileName, FILE_PERMS, 0); + mStep++; + break; + } + case 35: { + mDelayTimer++; + if (!mCreateRequest.isCompleted()) { + return; + } + NANDResult result = mCreateRequest.getResult(); + if (!mCreateRequest.finish()) { + return; + } + if (NandResultTracker::GetInstance()->isFailure(result)) { + mpWindow->checkIsWait(); + initializeError(); + return; + } + for (int i = 0; i < 3; i++) { + fileManager->copyFileSkipData(i); + } + mStep = 3; + fileManager->setField0xA842(1); + break; + } + case 40: { + fileManager->checkFileStatus(); + if (fileManager->isFileInvalid() == true) { + NandResultTracker::GetInstance()->isFailure(NAND_RESULT_UNKNOWN); + mpWindow->checkIsWait(); + initializeError(); + return; + } + u32 oldTimer = mDelayTimer; + initializeSaveBanner(); + mDelayTimer = oldTimer; + break; + } + } + mpWindow->execute(); +} + +void SaveMgr::initializeWriteSkipDat() { + beginState(STATE_WRITE_SKIP_DAT); + if (FileManager::GetInstance()->get_0xA84C() || FileManager::GetInstance()->getField_0xA842() != 1) { + mStep = 10; + } else { + FileManager::GetInstance()->setField0xA84D(1); + FileManager::GetInstance()->copySelectedFileSkipData(); + FileManager::GetInstance()->loadSaveData(&mWriteRequest, sSkipDatFileName, true); + } +} + +void SaveMgr::executeWriteSkipDat() { + FileManager *fileManager = FileManager::GetInstance(); + switch (mStep) { + case 0: { + if (mWriteRequest.isCompleted()) { + FileManager::GetInstance()->setField0xA84D(0); + NANDResult result = mWriteRequest.getResult(); + if (NandResultTracker::GetInstance()->isFailure(result)) { + if (mWriteRequest.finish()) { + mStep = 30; + } + } else { + if (mWriteRequest.failedWrite() == true) { + if (mWriteRequest.finish()) { + mStep = 1; + } + } else { + if (mWriteRequest.finish()) { + endState(); + } + } + } + } + break; + } + case 1: { + fileManager->loadSaveData(&mWriteRequest, sSkipDatFileName, true); + FileManager::GetInstance()->setField0xA84D(1); + mStep = 0; + mDelayTimer = 0; + break; + } + case 10: { + fileManager->setField0xA84D(0); + endState(); + break; + } + case 30: { + fileManager->setField0xA84D(1); + mDeleteRequest.doDelete(sSkipDatFileName); + mStep++; + break; + } + case 31: { + if (!mDeleteRequest.isCompleted()) { + return; + } + NANDResult result = mDeleteRequest.getResult(); + if (NandResultTracker::GetInstance()->isFailure(result)) { + if (mDeleteRequest.finish()) { + initializeError(); + } + } else { + if (mDeleteRequest.finish()) { + fileManager->setField0xA842(0); + mStep++; + } + } + break; + } + case 32: { + mCheckRequest.check(1, 1); + mStep++; + break; + } + case 33: { + if (mCheckRequest.isCompleted()) { + NANDResult result = mCheckRequest.getResult(); + if (NandResultTracker::GetInstance()->isFailure(result) && mCheckRequest.finish()) { + initializeError(); + } else { + u32 result = mCheckRequest.getCheckResult(); + if (mCheckRequest.finish()) { + if (result) { + mStep = 10; + } else { + mStep++; + } + } + } + } + break; + } + case 34: { + mDelayTimer++; + mCreateRequest.create(sSkipDatFileName, FILE_PERMS, 0); + mStep++; + break; + } + case 35: { + if (!mCreateRequest.isCompleted()) { + return; + } + NANDResult result = mCreateRequest.getResult(); + if (!mCreateRequest.finish()) { + return; + } + if (NandResultTracker::GetInstance()->isFailure(result)) { + initializeError(); + return; + } + for (int i = 0; i < 3; i++) { + fileManager->copyFileSkipData(i); + } + fileManager->setField0xA842(1); + FileManager::GetInstance()->loadSaveData(&mWriteRequest, sSkipDatFileName, true); + mStep = 0; + break; + } + } +} + +void SaveMgr::initializeCopySave() { + beginState(STATE_COPY_SAVE); + FileManager::GetInstance()->setField0xA840(0); + field_0x83B = 1; +} + +void SaveMgr::executeCopySave() { + FileManager *fileManager = FileManager::GetInstance(); + fileManager->copyFile(mCopyFromFile, mCopyToFile); + fileManager->setSelectedFileNum(mCopyToFile); + initializeWriteSave(); + FileManager::GetInstance()->setField0xA840(1); +} + +void SaveMgr::initializeClearSelectedFile() { + beginState(STATE_CLEAR_SELECTED_FILE); + FileManager::GetInstance()->setField0xA840(0); + field_0x83C = 1; +} + +void SaveMgr::executeClearSelectedFile() { + FileManager::GetInstance()->clearFileA(); + FileManager::GetInstance()->saveFileAToSelectedFile(); + initializeWriteSave(); + FileManager::GetInstance()->setField0xA840(1); +} + +void SaveMgr::initializeSave() { + beginState(STATE_SAVE); + FileManager::GetInstance()->setField0xA840(0); + dDvdUnk::FontUnk::GetInstance()->fn_80052D00(false); + FileManager::GetInstance()->setField_0xA843(1); +} + +void SaveMgr::executeSave() { + FileManager *fileManager = FileManager::GetInstance(); + switch (mStep) { + case 0: { + if (fileManager->get_0xA84C() != 1 && fileManager->getField_0xA843()) { + if (fileManager->getField_0xA841() == 1) { + FileManager::GetInstance()->unsetFileANewFile(); + FileManager::GetInstance()->copyFileAToSelectedFile(); + initializeWriteSave(); + FileManager::GetInstance()->setField0xA840(1); + } else { + FileManager::GetInstance()->copyFileAToSelectedFile(); + FileManager::GetInstance()->setField0xA840(1); + initializeCheckForFreeSpace(); + field_0x838 = 1; + } + } + break; + } + } +} + +void SaveMgr::initializeDeleteAllData() { + beginState(STATE_DELETE_ALL_DATA); + field_0x83A = 1; +} + +void SaveMgr::executeDeleteAllData() { + NandResultTracker *tracker = NandResultTracker::GetInstance(); + switch (mStep) { + case 0: { + FileManager::GetInstance()->setField0xA84D(1); + mDeleteRequest.doDelete(sBannerBinFileName); + if (field_0x837 != 1 || FileManager::GetInstance()->isFileInvalid() == 1) { + FileManager::GetInstance()->initBlankSaveFiles(); + } + mStep = 1; + break; + } + case 1: { + if (!mDeleteRequest.isCompleted()) { + return; + } + NANDResult result = mDeleteRequest.getResult(); + if (tracker->isFailure(result)) { + if (mDeleteRequest.finish()) { + initializeError(); + } + } else { + if (mDeleteRequest.finish()) { + mStep = 2; + } + } + break; + } + case 2: { + mDeleteRequest.doDelete(sSaveFileName); + mStep = 3; + break; + } + case 3: { + if (!mDeleteRequest.isCompleted()) { + return; + } + NANDResult result = mDeleteRequest.getResult(); + if (tracker->isFailure(result)) { + if (mDeleteRequest.finish()) { + initializeError(); + } + } else { + if (mDeleteRequest.finish()) { + mStep = 4; + } + } + break; + } + case 4: { + mDeleteRequest.doDelete(sSkipDatFileName); + mStep = 5; + break; + } + case 5: { + if (!mDeleteRequest.isCompleted()) { + return; + } + NANDResult result = mDeleteRequest.getResult(); + if (tracker->isFailure(result)) { + if (mDeleteRequest.finish()) { + initializeError(); + } + } else { + if (mDeleteRequest.finish()) { + initializeCheckForFreeSpace(); + } + } + break; + } + } +} + +void SaveMgr::initializeError() { + FileManager::GetInstance()->setField0xA84D(0); + field_0x83D = 0; + beginState(STATE_ERROR); + dDvdUnk::FontUnk::GetInstance()->fn_80052D00(true); + field_0x83F = 0; +} + +void SaveMgr::executeError() { + dLytSystemWindow_c *systemWindow = dLytSystemWindow_c::GetInstance(); + FileManager *fileManager = FileManager::GetInstance(); + switch (mStep) { + case 0: { + if (dDvdUnk::FontUnk::GetInstance()->getField_0x24() == 4) { + if (field_0x837 == true) { + // "The save data is corrupted. Save data will be restored." + if (systemWindow->setProperties("SYS_INIT_05", false, nullptr) == true) { + systemWindow->showMaybe(); + mStep = 20; + } + } else if (field_0x838 == true) { + // "Save data could not be created. Try again?[1]Yes[2]No" + if (systemWindow->setProperties("SYS_INIT_04", false, nullptr) == true) { + systemWindow->showMaybe(4); + mStep = 1; + dCsBase_c::GetInstance()->setField704(true); + } + } else { + // "The file cannot be used because nthe data is corrupted. All data saved up to this point will be + // lost. Create new save data?[1]Yes[2]No" + if (systemWindow->setProperties("SYS_NAND_07", false, nullptr) == true) { + systemWindow->showMaybe(4); + mStep = 1; + dCsBase_c::GetInstance()->setField704(true); + } + } + } + break; + } + case 1: { + if (systemWindow->getField_0xE10() != 0 && mPad::g_currentCore->downTrigger(/* A */ 0x800) && + systemWindow->getField_0xDE0() != 2) { + if (systemWindow->getField_0xDE0() == 0) { + if (systemWindow->fn_80152F60() == true) { + mStep = 2; + } + } else { + if (systemWindow->fn_80152F50() == true) { + mStep = 2; + } + } + } + break; + } + case 2: { + if (systemWindow->fn_80152F70() == true) { + if (systemWindow->getField_0xDE0() == false) { + mStep = 3; + } else { + initializeDeleteAllData(); + dCsBase_c::GetInstance()->setField704(false); + } + } + break; + } + case 3: { + if (dScBoot_c::GetInstance() != nullptr) { + // "You will not be able to save. Do you want to begin your game anyway? [1]Begin[2-]Quit" + if (systemWindow->setProperties("SYS_SAVE_10", false, nullptr) == true) { + systemWindow->showMaybe(4); + mpWindow->setNumLines(2); + mStep = 4; + } + } else { + // "It is not possible to save. Continue your adventure anyway? [1]Continue[2]Quit" + if (systemWindow->setProperties("SYS_SAVE_11", false, nullptr) == true) { + systemWindow->showMaybe(4); + mpWindow->setNumLines(2); + mStep = 4; + } + } + break; + } + case 4: { + if (mPad::g_currentCore->downTrigger(/* A */ 0x800) && systemWindow->getField_0xDE0() != 2) { + if (systemWindow->getField_0xDE0() == 0) { + if (systemWindow->fn_80152F60() == true) { + mStep = 5; + } + } else { + if (systemWindow->fn_80152F50()) { + mStep = 10; + } + } + } + break; + } + case 5: { + if (systemWindow->fn_80152F70() == true) { + mStep = 6; + } + break; + } + case 6: { + if (field_0x837 == true) { + // "The save data is corrupted. Save data will be restored." + if (systemWindow->setProperties("SYS_INIT_05", false, nullptr) == true) { + systemWindow->showMaybe(4); + mStep = 1; + } + } else { + // "The file cannot be used because nthe data is corrupted. All data saved up to this point will be + // lost. Create new save data?[1]Yes[2]No" + if (systemWindow->setProperties("SYS_NAND_07", false, nullptr) == true) { + systemWindow->showMaybe(4); + mStep = 1; + } + } + break; + } + case 10: { + if (systemWindow->fn_80152F70() == true) { + dDvdUnk::FontUnk::GetInstance()->fn_80052C90(); + if (field_0x837 != true) { + fileManager->setField0xA84C(1); + } + dCsBase_c::GetInstance()->setField704(false); + endState(); + } + break; + } + case 20: { + if (systemWindow->fn_80152F70() == true) { + mStep++; + } + break; + } + case 21: { + if (systemWindow->getField_0xDFC() == true && mPad::g_currentCore->downTrigger(/* A */ 0x800) && + systemWindow->fn_80152F50() == true) { + mStep++; + } + break; + } + case 22: { + if (systemWindow->fn_80152F70() == true) { + initializeDeleteAllData(); + } + } + } + if (mpWindow != nullptr) { + mpWindow->execute(); + } +} + +void SaveMgr::initializeNandError() { + FileManager::GetInstance()->setField0xA84D(0); + field_0x83D = 0; + dDvdUnk::FontUnk::GetInstance()->fn_80052D00(true); + beginState(STATE_NAND_ERROR); +} + +void SaveMgr::executeNandError() { + FileManager *fileManager = FileManager::GetInstance(); + dLytSystemWindow_c *systemWindow = dLytSystemWindow_c::GetInstance(); + switch (mStep) { + case 0: { + bool anyAction = false; + if (mCheckForFreeSpaceResult == 1) { + // "There is not enough available space in Wii system memory. Create 1 block of free space either by + // moving data to an SD Card or deleting data in the Wii console's Data Management screen." + if (systemWindow->setProperties("SYS_NAND_02", false, nullptr) == true) { + anyAction = true; + } + } else { + // "There is not enough available space in Wii system memory. Either move data to an SD Card or delete + // data in the Wii console's Data Management screen." + if (systemWindow->setProperties("SYS_NAND_03", false, nullptr) == true) { + anyAction = true; + } + } + if (anyAction) { + systemWindow->showMaybe(); + mStep = 1; + } + break; + } + case 1: { + if (systemWindow->fn_80152F70() == 1) { + mStep = 2; + } + break; + } + case 2: { + if (systemWindow->getField_0xDFC() == 1 && mPad::g_currentCore->downTrigger(/* A */ 0x800) && + systemWindow->fn_80152F60() == 1) { + mStep = 3; + } + break; + } + case 3: { + if (systemWindow->fn_80152F70() == 1) { + mStep = 4; + } + break; + } + case 4: { + // "Do you want to go to the Wii console's Data Management screen to edit data? [1]Yes[2]No" + if (systemWindow->setProperties("SYS_NAND_04", false, nullptr) == true) { + systemWindow->showMaybe(4); + dCsBase_c::GetInstance()->setField704(true); + mStep = 5; + } + break; + } + case 5: { + if (systemWindow->fn_80152F70() == 1) { + mStep = 6; + } + break; + } + case 6: { + if (systemWindow->getField_0xE10() != 0) { + if (!ReloadColorFader::GetInstance()->fn_80068E80() && + !ReloadColorFader::GetInstance()->fn_80067F60() && + mPad::g_currentCore->downTrigger(/* A */ 0x800) && systemWindow->getField_0xDE0() != 2 && + systemWindow->fn_80152F60() == true) { + mStep = 7; + } + } + break; + } + case 7: { + if (systemWindow->fn_80152F70() == 1) { + mStep = 8; + } + break; + } + case 8: { + if (systemWindow->getField_0xDE0() == 0) { + mStep = 9; + } else { + dCsBase_c::GetInstance()->setField704(false); + ReloadColorFader::GetInstance()->fn_80067FE0(); + endState(); + field_0x836 = 0; + } + break; + } + case 9: { + // "You will not be able to save. Do you want to begin your game anyway? [1]Begin[2-]Quit" + if (systemWindow->setProperties("SYS_SAVE_10", false, nullptr) == true) { + systemWindow->showMaybe(4); + // Why save mgs window and not system window? + mpWindow->setNumLines(2); + mStep = 10; + } + break; + } + case 10: { + if (systemWindow->fn_80152F70() == 1) { + mStep = 11; + } + break; + } + case 11: { + if (systemWindow->getField_0xE10() != 0 && mPad::g_currentCore->downTrigger(/* A */ 0x800) && + systemWindow->getField_0xDE0() != 2) { + if (systemWindow->getField_0xDE0() == 0) { + if (systemWindow->fn_80152F60() == true) { + mStep = 12; + } + } else { + if (systemWindow->fn_80152F50()) { + mStep = 13; + } + } + } + break; + } + case 12: { + if (systemWindow->fn_80152F70() == 1) { + mStep = 0; + } + break; + } + case 13: { + if (systemWindow->fn_80152F70() == 1) { + dCsBase_c::GetInstance()->setField704(false); + dDvdUnk::FontUnk::GetInstance()->fn_80052C90(); + fileManager->setField0xA84C(1); + endState(); + } + break; + } + } +} + +void SaveMgr::beginState(SaveMgrState_e state) { + mCurrentState = state; + field_0x824 = 2; + mStep = 0; + mDelayTimer = 0; +} + +void SaveMgr::endState() { + field_0x836 = 1; + FileManager::GetInstance()->setField0xA840(1); + field_0x83D = 0; + dDvdUnk::FontUnk::GetInstance()->fn_80052D00(true); + field_0x83B = 0; + field_0x83C = 0; + mCurrentState = STATE_MAX; + field_0x83E = 0; + field_0x83F = 0; +} + +s32 SaveMgr::getFrameRate() { + return 60 / dSys::getFrameRate(); +} + +NandRequestCheckIsFile::NandRequestCheckIsFile(const char *path) : mIsFile(0) { + mPath = path; +} + +bool NandRequestCheckIsFile::execute() { + u8 type = 0; + mStatus = NANDGetType(mPath, &type); + if (mStatus == NAND_RESULT_OK && type == NAND_FILE_TYPE_FILE) { + mIsFile = 1; + } else { + mIsFile = 0; + } + return true; +} + +bool NandRequestCheckIsFileHolder::checkIsFile(const char *path) { + if (mpRequest != nullptr) { + return false; + } + NandRequestCheckIsFile *req = new NandRequestCheckIsFile(path); + if (req == nullptr) { + return false; + } + NandRequestThread::GetInstance()->enqueueRequest(req); + mpRequest = req; + return true; +} + +bool NandRequestCheckIsFileHolder::getCheckResult() const { + return static_cast(mpRequest)->mIsFile; +} + +NandRequestSaveBanner::NandRequestSaveBanner( + const char *filePath, TPLPalette *palette, const wchar_t *title, const wchar_t *subtitle, u8 perm, u8 attr +) + : NandRequestCreate(filePath, perm, attr), + mpPalette(palette), + mpTitle(title), + mpSubTitle(subtitle), + mFailed(false) {} + +bool NandRequestSaveBanner::execute() { + if (!NandRequestCreate::execute()) { + return true; + } + + char homeDir[64]; + NANDFileInfo info; + mStatus = NANDOpen(mFilePath, &info, NAND_ACCESS_WRITE); + if (mStatus != NAND_RESULT_OK) { + return mStatus; + } + + if (writeBannerTpl(&info) != 0x72A0) { + NANDResult res = NANDClose(&info); + if (res != NAND_RESULT_OK) { + mStatus = res; + } + mFailed = true; + return false; + } + + mStatus = NANDClose(&info); + mStatus = NANDGetHomeDir(homeDir); + if (mStatus != NAND_RESULT_OK) { + return mStatus; + } + + mStatus = NANDMove(mFilePath, homeDir); + return true; +} + +#define NUM_BANNER_ICONS 1 + +u32 NandRequestSaveBanner::writeBannerTpl(NANDFileInfo *info) { + static NANDBanner sBanner; + NANDInitBanner(&sBanner, 0, getTitle(), getSubTitle()); + TPLPalette *palette = getPalette(); + TPLDescriptor *tpl = TPLGet(palette, 0); + std::memcpy(&sBanner.bannerTexture, tpl->texHeader->data, NAND_BANNER_TEXTURE_SIZE); + for (s32 i = 0; i < NUM_BANNER_ICONS;) { + TPLDescriptor *tpl = TPLGet(palette, i + 1); + std::memcpy(sBanner.iconTexture[0], tpl->texHeader->data, NAND_BANNER_ICON_TEXTURE_SIZE); + // ah yes + s32 idx = i++; + NAND_SET_ICON_SPEED(&sBanner, idx, 2); + } + NAND_SET_ICON_SPEED(&sBanner, NUM_BANNER_ICONS, 0); + // How is this calculated? + return NANDWrite(info, &sBanner, 0x72A0); +} + +bool NandRequestSaveBannerHolder::saveBanner( + const char *filePath, TPLPalette *palette, const wchar_t *title, const wchar_t *subtitle, u8 perm, u8 attr +) { + if (mpRequest != nullptr) { + return false; + } + NandRequestSaveBanner *req = new NandRequestSaveBanner(filePath, palette, title, subtitle, perm, attr); + if (req == nullptr) { + return false; + } + NandRequestThread::GetInstance()->enqueueRequest(req); + mpRequest = req; + return true; +} + +bool NandRequestSaveBannerHolder::hasFailed() const { + return static_cast(mpRequest)->mFailed; +} + +NandRequestLoadSaveFile::NandRequestLoadSaveFile(const char *path, s32 readSize, s32 mountDirection, EGG::Heap *heap) + : mpHeap(heap), mpBuf(nullptr), mBufLen(0), mMountDirection(mountDirection), mReadSize(readSize), mUnused(false) { + mPath = path; + if (mpHeap == nullptr) { + mpHeap = dHeap::work2Heap.heap; + } +} + +bool NandRequestLoadSaveFile::execute() { + NANDFileInfo info; + mStatus = NANDOpen(mPath, &info, NAND_ACCESS_READ); + if (mStatus != NAND_RESULT_OK) { + return true; + } + + u32 length; + mStatus = NANDGetLength(&info, &length); + if (mStatus != NAND_RESULT_OK) { + mStatus = NAND_RESULT_AUTHENTICATION; // ?? + NANDResult res = NANDClose(&info); + if (res != NAND_RESULT_OK) { + mStatus = res; + } + return true; + } + + if (length != mReadSize) { + mStatus = NAND_RESULT_AUTHENTICATION; // ?? + NANDResult res = NANDClose(&info); + if (res != NAND_RESULT_OK) { + mStatus = res; + } + return true; + } + s32 align = mMountDirection == 0 ? 0x20 : -0x20; + mpBuf = mpHeap->alloc(length, align); + if (mpBuf == nullptr) { + mStatus = NAND_RESULT_AUTHENTICATION; // ?? + NANDResult res = NANDClose(&info); + if (res != NAND_RESULT_OK) { + mStatus = res; + } + return false; + } + + mBufLen = length; + mStatus = NANDRead(&info, mpBuf, mBufLen); + NANDResult res = NANDClose(&info); + if (mStatus != mBufLen && mStatus >= NAND_RESULT_OK) { + mStatus = NAND_RESULT_AUTHENTICATION; // ?? + } else if (mStatus != NAND_RESULT_ECC_CRIT && mStatus != NAND_RESULT_AUTHENTICATION) { + mStatus = res; + } + return true; +} + +void NandRequestLoadSaveFile::remove() { + if (mpBuf != nullptr) { + mpHeap->free(mpBuf); + mpBuf = nullptr; + mBufLen = 0; + } +} + +bool NandRequestLoadSaveFileHolder::loadSave(const char *path, s32 readSize, s32 mountDirection, EGG::Heap *heap) { + if (mpRequest != nullptr) { + return false; + } + NandRequestLoadSaveFile *req = new NandRequestLoadSaveFile(path, readSize, mountDirection, heap); + if (req == nullptr) { + return false; + } + NandRequestThread::GetInstance()->enqueueRequest(req); + mpRequest = req; + return true; +} + +void *NandRequestLoadSaveFileHolder::getBuf() const { + return static_cast(mpRequest)->mpBuf; +} + +u32 NandRequestLoadSaveFileHolder::getLen() const { + return static_cast(mpRequest)->mBufLen; +} + +void NandRequestLoadSaveFileHolder::remove() { + static_cast(mpRequest)->remove(); +} + +NandRequestDelete::NandRequestDelete(const char *path) { + mPath = path; +} + +bool NandRequestDelete::execute() { + mStatus = NANDDelete(mPath); + return true; +} + +bool NandRequestDeleteHolder::doDelete(const char *path) { + if (mpRequest != nullptr) { + return false; + } + NandRequestDelete *req = new NandRequestDelete(path); + if (req == nullptr) { + return false; + } + NandRequestThread::GetInstance()->enqueueRequest(req); + mpRequest = req; + return true; +}