summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config/SOUE01/splits.txt43
-rw-r--r--config/SOUE01/symbols.txt404
-rw-r--r--configure.py6
-rw-r--r--include/d/d_cs_base.h4
-rw-r--r--include/d/d_d2d.h10
-rw-r--r--include/d/d_dvd_unk.h47
-rw-r--r--include/d/d_gfx.h32
-rw-r--r--include/d/d_s_boot.h5
-rw-r--r--include/d/lyt/d_lyt_save_msg_window.h70
-rw-r--r--include/d/lyt/d_lyt_system_window.h35
-rw-r--r--include/d/lyt/msg_window/d_lyt_msg_window_select_btn.h25
-rw-r--r--include/rvl/NAND.h2
-rw-r--r--include/rvl/NAND/NANDOpenClose.h7
-rw-r--r--include/rvl/NAND/nand.h23
-rw-r--r--include/rvl/TPL.h2
-rw-r--r--include/toBeSorted/file_manager.h55
-rw-r--r--include/toBeSorted/nand_request_thread.h4
-rw-r--r--include/toBeSorted/nand_result_tracker.h15
-rw-r--r--include/toBeSorted/reload_color_fader.h3
-rw-r--r--include/toBeSorted/save_manager.h229
-rw-r--r--include/toBeSorted/some_gxf_thing.h28
-rw-r--r--src/REL/d/d_s_boot.cpp10
-rw-r--r--src/d/d_sc_game.cpp6
-rw-r--r--src/d/d_sc_title.cpp5
-rw-r--r--src/d/lyt/d_lyt_battery.cpp5
-rw-r--r--src/d/lyt/d_lyt_fader.cpp5
-rw-r--r--src/d/lyt/d_lyt_save_msg_window.cpp392
-rw-r--r--src/d/lyt/d_screen_fader.cpp5
-rw-r--r--src/d/lyt/msg_window/d_lyt_msg_window.cpp4
-rw-r--r--src/d/lyt/msg_window/d_lyt_msg_window_select_btn.cpp2
-rw-r--r--src/toBeSorted/file_manager.cpp12
-rw-r--r--src/toBeSorted/nand_request_thread.cpp11
-rw-r--r--src/toBeSorted/save_manager.cpp1758
33 files changed, 2961 insertions, 303 deletions
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<dScBoot_c>::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 <cstring>
@@ -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 <cstring>
+
+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<NandRequestCheckIsFile *>(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<NandRequestSaveBanner *>(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<NandRequestLoadSaveFile *>(mpRequest)->mpBuf;
+}
+
+u32 NandRequestLoadSaveFileHolder::getLen() const {
+ return static_cast<NandRequestLoadSaveFile *>(mpRequest)->mBufLen;
+}
+
+void NandRequestLoadSaveFileHolder::remove() {
+ static_cast<NandRequestLoadSaveFile *>(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;
+}