From de8cc996c6e8cdf4ba117ac0b9f4d87d7cb02dfb Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 10 Aug 2025 02:47:49 +0200 Subject: [PATCH] d_lyt_pause largely done --- config/SOUE01/splits.txt | 1 + config/SOUE01/symbols.txt | 298 +++++----- include/d/d_cs_game.h | 12 +- include/d/d_pad_nav.h | 2 +- include/d/lyt/d_lyt_base.h | 25 + include/d/lyt/d_lyt_common_arrow.h | 12 +- include/d/lyt/d_lyt_control_game.h | 13 + include/d/lyt/d_lyt_pause.h | 138 ++++- include/d/lyt/d_lyt_pause_back.h | 4 + include/d/lyt/d_lyt_pause_disp_00.h | 8 +- include/d/lyt/d_lyt_pause_disp_01.h | 4 + include/d/lyt/d_lyt_pause_info.h | 4 + include/d/lyt/d_lyt_pause_text.h | 4 + include/d/lyt/meter/d_lyt_meter.h | 4 + src/d/lyt/d_lyt_common_arrow.cpp | 10 +- src/d/lyt/d_lyt_pause.cpp | 843 ++++++++++++++++++++++++++++ src/d/lyt/d_lyt_pause_disp_00.cpp | 79 ++- 17 files changed, 1253 insertions(+), 208 deletions(-) create mode 100644 include/d/lyt/d_lyt_base.h create mode 100644 src/d/lyt/d_lyt_pause.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 276d060c..af09ffa0 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1538,6 +1538,7 @@ d/lyt/d_lyt_pause.cpp: .text start:0x8027E9E0 end:0x80282678 align:16 .ctors start:0x804DB85C end:0x804DB860 .data start:0x80537310 end:0x80537970 + .sdata start:0x80573B48 end:0x80573B58 .sbss start:0x80575938 end:0x80575948 .bss start:0x805B5940 end:0x805B5D40 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 3dd520da..4b9f11bb 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -309,12 +309,12 @@ setAngleT2__11FileManagerFs = .text:0x8000AFD0; // type:function size:0x30 getAngleT2__11FileManagerFv = .text:0x8000B000; // type:function size:0x44 setAngleT3__11FileManagerFs = .text:0x8000B050; // type:function size:0x30 getAngleT3__11FileManagerFv = .text:0x8000B080; // type:function size:0x44 -setPouchData__11FileManagerFiUl = .text:0x8000B0D0; // type:function size:0x54 -getPouchData__11FileManagerFi = .text:0x8000B130; // type:function size:0x74 -setPouchItem__11FileManagerFi7ITEM_ID = .text:0x8000B1B0; // type:function size:0x6C +setPouchData__11FileManagerFlUl = .text:0x8000B0D0; // type:function size:0x54 +getPouchData__11FileManagerFl = .text:0x8000B130; // type:function size:0x74 +setPouchItem__11FileManagerFl7ITEM_ID = .text:0x8000B1B0; // type:function size:0x6C getPouchItem__11FileManagerFl = .text:0x8000B220; // type:function size:0x24 -setPouchUpperData__11FileManagerFii = .text:0x8000B250; // type:function size:0x6C -getPouchUpperData__11FileManagerFi = .text:0x8000B2C0; // type:function size:0x24 +setPouchUpperData__11FileManagerFll = .text:0x8000B250; // type:function size:0x6C +getPouchUpperData__11FileManagerFl = .text:0x8000B2C0; // type:function size:0x24 setItemCheckData__11FileManagerFUlUl = .text:0x8000B2F0; // type:function size:0x70 getItemCheckData__11FileManagerFUl = .text:0x8000B360; // type:function size:0x88 setItemCheckItem__11FileManagerFUl7ITEM_ID = .text:0x8000B3F0; // type:function size:0x84 @@ -4288,11 +4288,11 @@ fn_800C4270 = .text:0x800C4270; // type:function size:0x54 fn_800C42D0 = .text:0x800C42D0; // type:function size:0xF8 fn_800C43D0 = .text:0x800C43D0; // type:function size:0x48 fn_800C4420 = .text:0x800C4420; // type:function size:0x5C -ActorLytBase__ctor = .text:0x800C4480; // type:function size:0x54 -ActorLytBase__dtor = .text:0x800C44E0; // type:function size:0x94 -ActorLytBase__allocateLytWork1Heap = .text:0x800C4580; // type:function size:0xB4 +__ct__10dLytBase_cFv = .text:0x800C4480; // type:function size:0x54 +__dt__10dLytBase_cFv = .text:0x800C44E0; // type:function size:0x94 +allocateLytWork1Heap__10dLytBase_cFPCcb = .text:0x800C4580; // type:function size:0xB4 fn_800C4640 = .text:0x800C4640; // type:function size:0x8 -fn_800C4650 = .text:0x800C4650; // type:function size:0x14 +removeLyt__10dLytBase_cFv = .text:0x800C4650; // type:function size:0x14 fn_800C4670 = .text:0x800C4670; // type:function size:0x20 fn_800C4690 = .text:0x800C4690; // type:function size:0x14 fn_800C46B0 = .text:0x800C46B0; // type:function size:0xB0 @@ -8796,7 +8796,7 @@ drawDirectly__17dLytPauseDisp00_cFv = .text:0x8015A7B0; // type:function size:0x requestIn__17dLytPauseDisp00_cFb = .text:0x8015A7D0; // type:function size:0x14 requestOut__17dLytPauseDisp00_cFb = .text:0x8015A7F0; // type:function size:0x14 requestSelect__17dLytPauseDisp00_cFv = .text:0x8015A810; // type:function size:0x10 -requestRing__17dLytPauseDisp00_cFv = .text:0x8015A820; // type:function size:0x10 +requestRingToggle__17dLytPauseDisp00_cFv = .text:0x8015A820; // type:function size:0x10 requestUnselect__17dLytPauseDisp00_cFv = .text:0x8015A830; // type:function size:0x10 requestSelectGuide__17dLytPauseDisp00_cFv = .text:0x8015A840; // type:function size:0x68 requestSelectMpls__17dLytPauseDisp00_cFv = .text:0x8015A8B0; // type:function size:0x28 @@ -11312,8 +11312,8 @@ CsGame__draw = .text:0x801BF520; // type:function size:0xBC fn_801BF5E0__9dCsGame_cCFv = .text:0x801BF5E0; // type:function size:0x44 fn_801BF630 = .text:0x801BF630; // type:function size:0x288 setNextCursorType__9dCsGame_cFQ39dCsGame_c15lytItemCursor_c12CursorType_e = .text:0x801BF8C0; // type:function size:0x10 -fn_801BF8D0 = .text:0x801BF8D0; // type:function size:0x8 -fn_801BF8E0 = .text:0x801BF8E0; // type:function size:0x18 +setCursorTypeNoneMaybe__9dCsGame_cFv = .text:0x801BF8D0; // type:function size:0x8 +setCursorTypePointer__9dCsGame_cFv = .text:0x801BF8E0; // type:function size:0x18 fn_801BF900 = .text:0x801BF900; // type:function size:0x8 fn_801BF910 = .text:0x801BF910; // type:function size:0x58 CsGame__startDrawBow = .text:0x801BF970; // type:function size:0x58 @@ -14801,90 +14801,90 @@ fn_8027E8C0 = .text:0x8027E8C0; // type:function size:0x88 fn_8027E950 = .text:0x8027E950; // type:function size:0x30 fn_8027E980 = .text:0x8027E980; // type:function size:0x30 fn_8027E9B0 = .text:0x8027E9B0; // type:function size:0x30 -fn_8027E9E0 = .text:0x8027E9E0; // type:function size:0xB8 -fn_8027EAA0 = .text:0x8027EAA0; // type:function size:0xA4 -fn_8027EB50 = .text:0x8027EB50; // type:function size:0xA0 -fn_8027EBF0 = .text:0x8027EBF0; // type:function size:0x6C -fn_8027EC60 = .text:0x8027EC60; // type:function size:0x58 -fn_8027ECC0 = .text:0x8027ECC0; // type:function size:0x128 -fn_8027EDF0 = .text:0x8027EDF0; // type:function size:0x10 -fn_8027EE00 = .text:0x8027EE00; // type:function size:0x198 -fn_8027EFA0 = .text:0x8027EFA0; // type:function size:0x70 -fn_8027F010 = .text:0x8027F010; // type:function size:0x10 -fn_8027F020 = .text:0x8027F020; // type:function size:0x80 -fn_8027F0A0 = .text:0x8027F0A0; // type:function size:0x24 +__ct__15dLytPauseMain_cFv = .text:0x8027E9E0; // type:function size:0xB8 +__dt__54sFStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c>Fv = .text:0x8027EAA0; // type:function size:0xA4 +__dt__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8027EB50; // type:function size:0xA0 +__dt__31sFStateFct_c<15dLytPauseMain_c>Fv = .text:0x8027EBF0; // type:function size:0x6C +__dt__28sFState_c<15dLytPauseMain_c>Fv = .text:0x8027EC60; // type:function size:0x58 +build__15dLytPauseMain_cFv = .text:0x8027ECC0; // type:function size:0x128 +changeState__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8027EDF0; // type:function size:0x10 +remove__15dLytPauseMain_cFv = .text:0x8027EE00; // type:function size:0x198 +execute__15dLytPauseMain_cFv = .text:0x8027EFA0; // type:function size:0x70 +executeState__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8027F010; // type:function size:0x10 +draw__15dLytPauseMain_cFv = .text:0x8027F020; // type:function size:0x80 +drawDirectly__15dLytPauseMain_cFv = .text:0x8027F0A0; // type:function size:0x24 fn_8027F0D0 = .text:0x8027F0D0; // type:function size:0x4 fn_8027F0E0 = .text:0x8027F0E0; // type:function size:0x14 -fn_8027F100 = .text:0x8027F100; // type:function size:0xC -fn_8027F110 = .text:0x8027F110; // type:function size:0xC -fn_8027F120 = .text:0x8027F120; // type:function size:0xC -fn_8027F130 = .text:0x8027F130; // type:function size:0xC -fn_8027F140 = .text:0x8027F140; // type:function size:0xC -fn_8027F150 = .text:0x8027F150; // type:function size:0x34 -fn_8027F190 = .text:0x8027F190; // type:function size:0x14 -fn_8027F1B0 = .text:0x8027F1B0; // type:function size:0x2C -fn_8027F1E0 = .text:0x8027F1E0; // type:function size:0x98 -fn_8027F280 = .text:0x8027F280; // type:function size:0x4 -fn_8027F290 = .text:0x8027F290; // type:function size:0x10 -fn_8027F2A0 = .text:0x8027F2A0; // type:function size:0x134 -fn_8027F3E0 = .text:0x8027F3E0; // type:function size:0x10 -fn_8027F3F0 = .text:0x8027F3F0; // type:function size:0x18 -fn_8027F410 = .text:0x8027F410; // type:function size:0x128 -fn_8027F540 = .text:0x8027F540; // type:function size:0x4 -fn_8027F550 = .text:0x8027F550; // type:function size:0x78 -fn_8027F5D0 = .text:0x8027F5D0; // type:function size:0x7C -fn_8027F650 = .text:0x8027F650; // type:function size:0x4 -fn_8027F660 = .text:0x8027F660; // type:function size:0x11C -fn_8027F780 = .text:0x8027F780; // type:function size:0x20C -fn_8027F990 = .text:0x8027F990; // type:function size:0x18 -fn_8027F9B0 = .text:0x8027F9B0; // type:function size:0x20 -fn_8027F9D0 = .text:0x8027F9D0; // type:function size:0x9C -fn_8027FA70 = .text:0x8027FA70; // type:function size:0x4 -fn_8027FA80 = .text:0x8027FA80; // type:function size:0xC -fn_8027FA90 = .text:0x8027FA90; // type:function size:0x78 -fn_8027FB10 = .text:0x8027FB10; // type:function size:0x4 -fn_8027FB20 = .text:0x8027FB20; // type:function size:0x20 -fn_8027FB40 = .text:0x8027FB40; // type:function size:0xE0 -fn_8027FC20 = .text:0x8027FC20; // type:function size:0x4 -LytPauseDisp__ctor = .text:0x8027FC30; // type:function size:0x30 -LytPauseDisp__ctorCont = .text:0x8027FC60; // type:function size:0x124 -fn_8027FD90 = .text:0x8027FD90; // type:function size:0xB4 -fn_8027FE50 = .text:0x8027FE50; // type:function size:0x58 -fn_8027FEB0 = .text:0x8027FEB0; // type:function size:0x6C -fn_8027FF20 = .text:0x8027FF20; // type:function size:0xA0 -fn_8027FFC0 = .text:0x8027FFC0; // type:function size:0xA4 -fn_80280070 = .text:0x80280070; // type:function size:0x17C -fn_802801F0 = .text:0x802801F0; // type:function size:0x64 -fn_80280260 = .text:0x80280260; // type:function size:0x10 -fn_80280270 = .text:0x80280270; // type:function size:0x78 -fn_802802F0 = .text:0x802802F0; // type:function size:0x7C -fn_80280370 = .text:0x80280370; // type:function size:0x10 -fn_80280380 = .text:0x80280380; // type:function size:0x10 -fn_80280390 = .text:0x80280390; // type:function size:0x68 -fn_80280400 = .text:0x80280400; // type:function size:0x9C -fn_802804A0 = .text:0x802804A0; // type:function size:0xC4 -fn_80280570 = .text:0x80280570; // type:function size:0x4 -fn_80280580 = .text:0x80280580; // type:function size:0x4 -fn_80280590 = .text:0x80280590; // type:function size:0x78 -fn_80280610 = .text:0x80280610; // type:function size:0x4 -fn_80280620 = .text:0x80280620; // type:function size:0x74 -fn_802806A0 = .text:0x802806A0; // type:function size:0x2DC -fn_80280980 = .text:0x80280980; // type:function size:0xC -fn_80280990 = .text:0x80280990; // type:function size:0x60 -fn_802809F0 = .text:0x802809F0; // type:function size:0x70 -fn_80280A60 = .text:0x80280A60; // type:function size:0x4 -fn_80280A70 = .text:0x80280A70; // type:function size:0x38 -fn_80280AB0 = .text:0x80280AB0; // type:function size:0xF8 -fn_80280BB0 = .text:0x80280BB0; // type:function size:0x4 -fn_80280BC0 = .text:0x80280BC0; // type:function size:0x44 -fn_80280C10 = .text:0x80280C10; // type:function size:0xF4 -fn_80280D10 = .text:0x80280D10; // type:function size:0xC -fn_80280D20 = .text:0x80280D20; // type:function size:0x4 -fn_80280D30 = .text:0x80280D30; // type:function size:0x64 -fn_80280DA0 = .text:0x80280DA0; // type:function size:0x4 -fn_80280DB0 = .text:0x80280DB0; // type:function size:0x10 -fn_80280DC0 = .text:0x80280DC0; // type:function size:0x40 -fn_80280E00 = .text:0x80280E00; // type:function size:0x20 +requestIn__15dLytPauseMain_cFv = .text:0x8027F100; // type:function size:0xC +requestOut__15dLytPauseMain_cFv = .text:0x8027F110; // type:function size:0xC +requestChange__15dLytPauseMain_cFv = .text:0x8027F120; // type:function size:0xC +requestSelect__15dLytPauseMain_cFv = .text:0x8027F130; // type:function size:0xC +requestRingToggle__15dLytPauseMain_cFv = .text:0x8027F140; // type:function size:0xC +hasSelection__15dLytPauseMain_cCFv = .text:0x8027F150; // type:function size:0x34 +updateTitle__15dLytPauseMain_cFv = .text:0x8027F190; // type:function size:0x14 +initializeState_None__15dLytPauseMain_cFv = .text:0x8027F1B0; // type:function size:0x2C +executeState_None__15dLytPauseMain_cFv = .text:0x8027F1E0; // type:function size:0x98 +finalizeState_None__15dLytPauseMain_cFv = .text:0x8027F280; // type:function size:0x4 +initializeState_In__15dLytPauseMain_cFv = .text:0x8027F290; // type:function size:0x10 +executeState_In__15dLytPauseMain_cFv = .text:0x8027F2A0; // type:function size:0x134 +finalizeState_In__15dLytPauseMain_cFv = .text:0x8027F3E0; // type:function size:0x10 +initializeState_Wait__15dLytPauseMain_cFv = .text:0x8027F3F0; // type:function size:0x18 +executeState_Wait__15dLytPauseMain_cFv = .text:0x8027F410; // type:function size:0x128 +finalizeState_Wait__15dLytPauseMain_cFv = .text:0x8027F540; // type:function size:0x4 +initializeState_Change__15dLytPauseMain_cFv = .text:0x8027F550; // type:function size:0x78 +executeState_Change__15dLytPauseMain_cFv = .text:0x8027F5D0; // type:function size:0x7C +finalizeState_Change__15dLytPauseMain_cFv = .text:0x8027F650; // type:function size:0x4 +initializeState_Select__15dLytPauseMain_cFv = .text:0x8027F660; // type:function size:0x11C +executeState_Select__15dLytPauseMain_cFv = .text:0x8027F780; // type:function size:0x20C +finalizeState_Select__15dLytPauseMain_cFv = .text:0x8027F990; // type:function size:0x18 +initializeState_Ring__15dLytPauseMain_cFv = .text:0x8027F9B0; // type:function size:0x20 +executeState_Ring__15dLytPauseMain_cFv = .text:0x8027F9D0; // type:function size:0x9C +finalizeState_Ring__15dLytPauseMain_cFv = .text:0x8027FA70; // type:function size:0x4 +initializeState_GetDemo__15dLytPauseMain_cFv = .text:0x8027FA80; // type:function size:0xC +executeState_GetDemo__15dLytPauseMain_cFv = .text:0x8027FA90; // type:function size:0x78 +finalizeState_GetDemo__15dLytPauseMain_cFv = .text:0x8027FB10; // type:function size:0x4 +initializeState_Out__15dLytPauseMain_cFv = .text:0x8027FB20; // type:function size:0x20 +executeState_Out__15dLytPauseMain_cFv = .text:0x8027FB40; // type:function size:0xE0 +finalizeState_Out__15dLytPauseMain_cFv = .text:0x8027FC20; // type:function size:0x4 +dLytPauseMgr_c_classInit__Fv = .text:0x8027FC30; // type:function size:0x30 +__ct__14dLytPauseMgr_cFv = .text:0x8027FC60; // type:function size:0x124 +__dt__15dLytPauseMain_cFv = .text:0x8027FD90; // type:function size:0xB4 +__dt__27sFState_c<14dLytPauseMgr_c>Fv = .text:0x8027FE50; // type:function size:0x58 +__dt__30sFStateFct_c<14dLytPauseMgr_c>Fv = .text:0x8027FEB0; // type:function size:0x6C +__dt__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8027FF20; // type:function size:0xA0 +__dt__53sFStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c>Fv = .text:0x8027FFC0; // type:function size:0xA4 +__dt__14dLytPauseMgr_cFv = .text:0x80280070; // type:function size:0x17C +create__14dLytPauseMgr_cFv = .text:0x802801F0; // type:function size:0x64 +changeState__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x80280260; // type:function size:0x10 +doDelete__14dLytPauseMgr_cFv = .text:0x80280270; // type:function size:0x78 +execute__14dLytPauseMgr_cFv = .text:0x802802F0; // type:function size:0x7C +executeState__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80280370; // type:function size:0x10 +getStateID__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80280380; // type:function size:0x10 +draw__14dLytPauseMgr_cFv = .text:0x80280390; // type:function size:0x68 +initializeState_None__14dLytPauseMgr_cFv = .text:0x80280400; // type:function size:0x9C +executeState_None__14dLytPauseMgr_cFv = .text:0x802804A0; // type:function size:0xC4 +finalizeState_None__14dLytPauseMgr_cFv = .text:0x80280570; // type:function size:0x4 +initializeState_In__14dLytPauseMgr_cFv = .text:0x80280580; // type:function size:0x4 +executeState_In__14dLytPauseMgr_cFv = .text:0x80280590; // type:function size:0x78 +finalizeState_In__14dLytPauseMgr_cFv = .text:0x80280610; // type:function size:0x4 +initializeState_Wait__14dLytPauseMgr_cFv = .text:0x80280620; // type:function size:0x74 +executeState_Wait__14dLytPauseMgr_cFv = .text:0x802806A0; // type:function size:0x2DC +finalizeState_Wait__14dLytPauseMgr_cFv = .text:0x80280980; // type:function size:0xC +initializeState_Change__14dLytPauseMgr_cFv = .text:0x80280990; // type:function size:0x60 +executeState_Change__14dLytPauseMgr_cFv = .text:0x802809F0; // type:function size:0x70 +finalizeState_Change__14dLytPauseMgr_cFv = .text:0x80280A60; // type:function size:0x4 +initializeState_Select__14dLytPauseMgr_cFv = .text:0x80280A70; // type:function size:0x38 +executeState_Select__14dLytPauseMgr_cFv = .text:0x80280AB0; // type:function size:0xF8 +finalizeState_Select__14dLytPauseMgr_cFv = .text:0x80280BB0; // type:function size:0x4 +initializeState_Ring__14dLytPauseMgr_cFv = .text:0x80280BC0; // type:function size:0x44 +executeState_Ring__14dLytPauseMgr_cFv = .text:0x80280C10; // type:function size:0xF4 +finalizeState_Ring__14dLytPauseMgr_cFv = .text:0x80280D10; // type:function size:0xC +initializeState_GetDemo__14dLytPauseMgr_cFv = .text:0x80280D20; // type:function size:0x4 +executeState_GetDemo__14dLytPauseMgr_cFv = .text:0x80280D30; // type:function size:0x64 +finalizeState_GetDemo__14dLytPauseMgr_cFv = .text:0x80280DA0; // type:function size:0x4 +initializeState_Out__14dLytPauseMgr_cFv = .text:0x80280DB0; // type:function size:0x10 +executeState_Out__14dLytPauseMgr_cFv = .text:0x80280DC0; // type:function size:0x40 +finalizeState_Out__14dLytPauseMgr_cFv = .text:0x80280E00; // type:function size:0x20 fn_80280E20 = .text:0x80280E20; // type:function size:0x10 isStateWait__14dLytPauseMgr_cCFv = .text:0x80280E30; // type:function size:0x44 fn_80280E80 = .text:0x80280E80; // type:function size:0xB0 @@ -14892,47 +14892,47 @@ fn_80280F30 = .text:0x80280F30; // type:function size:0x9C getArrowBounding__14dLytPauseMgr_cCFi = .text:0x80280FD0; // type:function size:0x14 setSelectedArrowBounding__14dLytPauseMgr_cCFi = .text:0x80280FF0; // type:function size:0xC setSelection__14dLytPauseMgr_cFQ214dLytPauseMgr_c15SelectionType_eUsb = .text:0x80281000; // type:function size:0x3C -shouldShowGearWheel = .text:0x80281040; // type:function size:0x15C -fn_802811A0 = .text:0x802811A0; // type:function size:0x74 -fn_80281220 = .text:0x80281220; // type:function size:0x134 -fn_80281360 = .text:0x80281360; // type:function size:0x68 -fn_802813D0 = .text:0x802813D0; // type:function size:0x34 -fn_80281410 = .text:0x80281410; // type:function size:0xC8 -fn_802814E0 = .text:0x802814E0; // type:function size:0xC -fn_802814F0 = .text:0x802814F0; // type:function size:0x60 -fn_80281550 = .text:0x80281550; // type:function size:0xC -fn_80281560 = .text:0x80281560; // type:function size:0x60 -fn_802815C0 = .text:0x802815C0; // type:function size:0xC -fn_802815D0 = .text:0x802815D0; // type:function size:0x1C -fn_802815F0 = .text:0x802815F0; // type:function size:0x1C -fn_80281610 = .text:0x80281610; // type:function size:0x1C -fn_80281630 = .text:0x80281630; // type:function size:0x1C -fn_80281650 = .text:0x80281650; // type:function size:0x1C -fn_80281670 = .text:0x80281670; // type:function size:0x1C -fn_80281690 = .text:0x80281690; // type:function size:0x10 -fn_802816A0 = .text:0x802816A0; // type:function size:0x10 -fn_802816B0 = .text:0x802816B0; // type:function size:0x10 -fn_802816C0 = .text:0x802816C0; // type:function size:0x10 -fn_802816D0 = .text:0x802816D0; // type:function size:0x10 -fn_802816E0 = .text:0x802816E0; // type:function size:0x10 -fn_802816F0 = .text:0x802816F0; // type:function size:0x10 -fn_80281700 = .text:0x80281700; // type:function size:0x10 -fn_80281710 = .text:0x80281710; // type:function size:0x10 -fn_80281720 = .text:0x80281720; // type:function size:0x10 -fn_80281730 = .text:0x80281730; // type:function size:0x10 -fn_80281740 = .text:0x80281740; // type:function size:0x10 -fn_80281750 = .text:0x80281750; // type:function size:0x10 -fn_80281760 = .text:0x80281760; // type:function size:0x30 -fn_80281790 = .text:0x80281790; // type:function size:0x30 -fn_802817C0 = .text:0x802817C0; // type:function size:0x30 -fn_802817F0 = .text:0x802817F0; // type:function size:0x30 -fn_80281820 = .text:0x80281820; // type:function size:0x30 -fn_80281850 = .text:0x80281850; // type:function size:0x30 -LytPause__initStates = .text:0x80281880; // type:function size:0xC14 -LytPauseMain__dtor = .text:0x802824A0; // type:function size:0x58 -LytPauseMgr__dtor = .text:0x80282500; // type:function size:0x58 -fn_80282560 = .text:0x80282560; // type:function size:0x88 -fn_802825F0 = .text:0x802825F0; // type:function size:0x88 +checkSelectRing__14dLytPauseMgr_cFv = .text:0x80281040; // type:function size:0x15C +build__14dLytPauseMgr_cFv = .text:0x802811A0; // type:function size:0x74 +checkChangeGesture__14dLytPauseMgr_cFv = .text:0x80281220; // type:function size:0x134 +saveDispFlag__14dLytPauseMgr_cFv = .text:0x80281360; // type:function size:0x68 +saveTabFlag__14dLytPauseMgr_cFv = .text:0x802813D0; // type:function size:0x34 +checkRing__14dLytPauseMgr_cFv = .text:0x80281410; // type:function size:0xC8 +setSelectHand__14dLytPauseMgr_cFff = .text:0x802814E0; // type:function size:0xC +build__30sFStateFct_c<14dLytPauseMgr_c>FRC12sStateIDIf_c = .text:0x802814F0; // type:function size:0x60 +dispose__30sFStateFct_c<14dLytPauseMgr_c>FRP10sStateIf_c = .text:0x80281550; // type:function size:0xC +build__31sFStateFct_c<15dLytPauseMain_c>FRC12sStateIDIf_c = .text:0x80281560; // type:function size:0x60 +dispose__31sFStateFct_c<15dLytPauseMain_c>FRP10sStateIf_c = .text:0x802815C0; // type:function size:0xC +initialize__27sFState_c<14dLytPauseMgr_c>Fv = .text:0x802815D0; // type:function size:0x1C +execute__27sFState_c<14dLytPauseMgr_c>Fv = .text:0x802815F0; // type:function size:0x1C +finalize__27sFState_c<14dLytPauseMgr_c>Fv = .text:0x80281610; // type:function size:0x1C +initialize__28sFState_c<15dLytPauseMain_c>Fv = .text:0x80281630; // type:function size:0x1C +execute__28sFState_c<15dLytPauseMain_c>Fv = .text:0x80281650; // type:function size:0x1C +finalize__28sFState_c<15dLytPauseMain_c>Fv = .text:0x80281670; // type:function size:0x1C +initializeState__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80281690; // type:function size:0x10 +finalizeState__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802816A0; // type:function size:0x10 +refreshState__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802816B0; // type:function size:0x10 +getState__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x802816C0; // type:function size:0x10 +getNewStateID__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x802816D0; // type:function size:0x10 +getOldStateID__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x802816E0; // type:function size:0x10 +initializeState__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802816F0; // type:function size:0x10 +finalizeState__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80281700; // type:function size:0x10 +refreshState__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80281710; // type:function size:0x10 +getState__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80281720; // type:function size:0x10 +getNewStateID__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80281730; // type:function size:0x10 +getStateID__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80281740; // type:function size:0x10 +getOldStateID__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80281750; // type:function size:0x10 +finalizeState__30sFStateID_c<15dLytPauseMain_c>CFR15dLytPauseMain_c = .text:0x80281760; // type:function size:0x30 +executeState__30sFStateID_c<15dLytPauseMain_c>CFR15dLytPauseMain_c = .text:0x80281790; // type:function size:0x30 +initializeState__30sFStateID_c<15dLytPauseMain_c>CFR15dLytPauseMain_c = .text:0x802817C0; // type:function size:0x30 +finalizeState__29sFStateID_c<14dLytPauseMgr_c>CFR14dLytPauseMgr_c = .text:0x802817F0; // type:function size:0x30 +executeState__29sFStateID_c<14dLytPauseMgr_c>CFR14dLytPauseMgr_c = .text:0x80281820; // type:function size:0x30 +initializeState__29sFStateID_c<14dLytPauseMgr_c>CFR14dLytPauseMgr_c = .text:0x80281850; // type:function size:0x30 +__sinit_\d_lyt_pause_cpp = .text:0x80281880; // type:function size:0xC14 +__dt__30sFStateID_c<15dLytPauseMain_c>Fv = .text:0x802824A0; // type:function size:0x58 +__dt__29sFStateID_c<14dLytPauseMgr_c>Fv = .text:0x80282500; // type:function size:0x58 +isSameName__29sFStateID_c<14dLytPauseMgr_c>CFPCc = .text:0x80282560; // type:function size:0x88 +isSameName__30sFStateID_c<15dLytPauseMain_c>CFPCc = .text:0x802825F0; // type:function size:0x88 __ct__14dLytGameOver_cFv = .text:0x80282680; // type:function size:0x22C __dt__53sFStateMgr_c<14dLytGameOver_c,20sStateMethodUsr_FI_c>Fv = .text:0x802828B0; // type:function size:0xA4 __dt__83sStateMgr_c<14dLytGameOver_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80282960; // type:function size:0xA0 @@ -34479,7 +34479,9 @@ lbl_80525A18 = .data:0x80525A18; // type:object size:0x10 data:string jumptable_80525A28 = .data:0x80525A28; // type:object size:0x20 scope:local lbl_80525A48 = .data:0x80525A48; // type:object size:0x10 jumptable_80525A58 = .data:0x80525A58; // type:object size:0x54 scope:local -lbl_80525AAC = .data:0x80525AAC; // type:object size:0x28 +lbl_80525AAC = .data:0x80525AAC; // type:object size:0xC data:string +lbl_80525AB8 = .data:0x80525AB8; // type:object size:0x10 +lbl_80525AC8 = .data:0x80525AC8; // type:object size:0xC __vt__17dLytPauseDisp00_c = .data:0x80525AD4; // type:object size:0xC __vt__56sFStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c> = .data:0x80525AE0; // type:object size:0x30 __vt__86sStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80525B10; // type:object size:0x30 @@ -36218,18 +36220,18 @@ lbl_805372A8 = .data:0x805372A8; // type:object size:0x68 g_profile_LYT_PAUSE = .data:0x80537310; // type:object size:0xC lbl_8053731C = .data:0x8053731C; // type:object size:0xC lbl_80537328 = .data:0x80537328; // type:object size:0x10 -LytPauseDisp__vtable = .data:0x80537338; // type:object size:0x50 -lbl_80537388 = .data:0x80537388; // type:object size:0x30 -lbl_805373B8 = .data:0x805373B8; // type:object size:0x30 -lbl_805373E8 = .data:0x805373E8; // type:object size:0x18 -lbl_80537400 = .data:0x80537400; // type:object size:0x18 -lbl_80537418 = .data:0x80537418; // type:object size:0x10 -lbl_80537428 = .data:0x80537428; // type:object size:0x30 -lbl_80537458 = .data:0x80537458; // type:object size:0x30 -lbl_80537488 = .data:0x80537488; // type:object size:0x18 -lbl_805374A0 = .data:0x805374A0; // type:object size:0x464 -lbl_80537904 = .data:0x80537904; // type:object size:0x34 -lbl_80537938 = .data:0x80537938; // type:object size:0x38 +__vt__14dLytPauseMgr_c = .data:0x80537338; // type:object size:0x50 +__vt__53sFStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c> = .data:0x80537388; // type:object size:0x30 +__vt__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x805373B8; // type:object size:0x30 +__vt__30sFStateFct_c<14dLytPauseMgr_c> = .data:0x805373E8; // type:object size:0x18 +__vt__27sFState_c<14dLytPauseMgr_c> = .data:0x80537400; // type:object size:0x18 +__vt__15dLytPauseMain_c = .data:0x80537418; // type:object size:0x10 +__vt__54sFStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c> = .data:0x80537428; // type:object size:0x30 +__vt__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80537458; // type:object size:0x30 +__vt__31sFStateFct_c<15dLytPauseMain_c> = .data:0x80537488; // type:object size:0x18 +__vt__28sFState_c<15dLytPauseMain_c> = .data:0x805374A0; // type:object size:0x464 +__vt__29sFStateID_c<14dLytPauseMgr_c> = .data:0x80537904; // type:object size:0x34 +__vt__30sFStateID_c<15dLytPauseMain_c> = .data:0x80537938; // type:object size:0x38 lbl_80537970 = .data:0x80537970; // type:object size:0x1C lbl_8053798C = .data:0x8053798C; // type:object size:0x10 lbl_8053799C = .data:0x8053799C; // type:object size:0x18 diff --git a/include/d/d_cs_game.h b/include/d/d_cs_game.h index fddae87d..861a4a04 100644 --- a/include/d/d_cs_game.h +++ b/include/d/d_cs_game.h @@ -317,10 +317,14 @@ public: mCursorActive = val; } + // TODO - maybe a system for overriding cursor type void setNextCursorType(CursorType_e cs) { - mNextCursor = 1; + mNextCursor = true; mNextCursorType = cs; } + void offNextCursor() { + mNextCursor = false; + } void changeState(const sFStateID_c &newState); @@ -361,6 +365,12 @@ public: }; void setNextCursorType(lytItemCursor_c::CursorType_e); + void setCursorTypeNoneMaybe(); + void setCursorTypePointer(); + + void offNextCursor() { + mCursor.offNextCursor(); + } static dCsGame_c *sInstance; diff --git a/include/d/d_pad_nav.h b/include/d/d_pad_nav.h index da962fad..84b330f8 100644 --- a/include/d/d_pad_nav.h +++ b/include/d/d_pad_nav.h @@ -52,7 +52,7 @@ inline s32 getFSStickNavDirection() { void init(); void calc(); -void setNavEnabled(bool navEnabled, bool autoReturnToPointerNav); +void setNavEnabled(bool navEnabled, bool disableAutoReturnToPointerNav); // I really wish these returned enums but the codegen requires not-enums s32 getFSStickDirection(); diff --git a/include/d/lyt/d_lyt_base.h b/include/d/lyt/d_lyt_base.h new file mode 100644 index 00000000..fb4ffd8c --- /dev/null +++ b/include/d/lyt/d_lyt_base.h @@ -0,0 +1,25 @@ +#ifndef D_LYT_BASE_H +#define D_LYT_BASE_H + +#include "common.h" +#include "d/d_base.h" +#include "m/m_allocator.h" + +class dLytBase_c : public dBase_c { +public: + dLytBase_c(); + virtual ~dLytBase_c(); + + /* 0x4C */ virtual bool build(); + +protected: + bool allocateLytWork1Heap(const char *name, bool exp); + void removeLyt(); + +private: + /* 0x68 */ mHeapAllocator_c mAllocator; + /* 0x84 */ UNKWORD field_0x84; + /* 0x88 */ u8 field_0x88; +}; + +#endif diff --git a/include/d/lyt/d_lyt_common_arrow.h b/include/d/lyt/d_lyt_common_arrow.h index 2625b329..58cc00a0 100644 --- a/include/d/lyt/d_lyt_common_arrow.h +++ b/include/d/lyt/d_lyt_common_arrow.h @@ -29,6 +29,14 @@ public: bool requestIn(); bool requestOut(); + void unk() { + field_0x6B8 = mTargetedBounding; + } + + void setBackwards(bool b) { + mBackwards = b; + } + private: void setTranslate(const Vec *); bool fn_80168760(); @@ -52,8 +60,8 @@ private: /* 0x6C8 */ bool mInRequested; /* 0x6C9 */ bool mOutRequested; /* 0x6CA */ u8 field_0x6CA; - /* 0x6CB */ u8 field_0x6CB; - /* 0x6CC */ u8 field_0x6CC; + /* 0x6CB */ bool mVisible; + /* 0x6CC */ bool mBackwards; }; #endif diff --git a/include/d/lyt/d_lyt_control_game.h b/include/d/lyt/d_lyt_control_game.h index fb7a60c3..8948f6a3 100644 --- a/include/d/lyt/d_lyt_control_game.h +++ b/include/d/lyt/d_lyt_control_game.h @@ -25,6 +25,14 @@ public: return field_0x15C2C; } + void setField_0x15C2C(s32 value) { + field_0x15C2C = value; + } + + void setPauseDisp00Tab(s32 tab) { + mPauseDisp00Tab = tab; + } + s32 getPauseDisp00Tab() const { return mPauseDisp00Tab; } @@ -41,6 +49,10 @@ public: return field_0x15C67; } + bool getField_0x15C68() const { + return field_0x15C68; + } + STATE_FUNC_DECLARE(dLytControlGame_c, Normal); STATE_FUNC_DECLARE(dLytControlGame_c, Pause_SetRes); STATE_FUNC_DECLARE(dLytControlGame_c, Pause_SyncRes); @@ -71,6 +83,7 @@ private: /* 0x15C64 */ u16 mItemCountForPauseDemo; /* 0x15C66 */ u8 field_0x15C66; /* 0x15C67 */ bool field_0x15C67; + /* 0x15C68 */ bool field_0x15C68; static dLytControlGame_c *sInstance; }; diff --git a/include/d/lyt/d_lyt_pause.h b/include/d/lyt/d_lyt_pause.h index 88978cd7..0b69a363 100644 --- a/include/d/lyt/d_lyt_pause.h +++ b/include/d/lyt/d_lyt_pause.h @@ -1,12 +1,84 @@ #ifndef D_LYT_PAUSE_H #define D_LYT_PAUSE_H +#include "common.h" #include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_base.h" #include "egg/gfx/eggCpuTexture.h" +#include "egg/gfx/eggTextureBuffer.h" #include "nw4r/lyt/lyt_bounding.h" +#include "s/s_State.hpp" -class dLytPauseMgr_c { +class dLytPauseBack_c; +class dLytPauseInfo_c; +class dLytPauseText_c; +class dLytCommonArrow_c; +class dLytPauseDisp00_c; +class dLytPauseDisp01_c; + +class dLytPauseMain_c { public: + dLytPauseMain_c(); + virtual ~dLytPauseMain_c() {} + + bool build(); + bool remove(); + bool execute(); + bool draw(); + void drawDirectly(); + + void requestIn(); + void requestOut(); + void requestChange(); + void requestSelect(); + void requestRingToggle(); + + bool hasSelection() const; + void updateTitle(); + + bool getField_0x63() const { + return field_0x63; + } + +private: + STATE_FUNC_DECLARE(dLytPauseMain_c, None); + STATE_FUNC_DECLARE(dLytPauseMain_c, In); + STATE_FUNC_DECLARE(dLytPauseMain_c, Wait); + STATE_FUNC_DECLARE(dLytPauseMain_c, Change); + STATE_FUNC_DECLARE(dLytPauseMain_c, Select); + STATE_FUNC_DECLARE(dLytPauseMain_c, Ring); + STATE_FUNC_DECLARE(dLytPauseMain_c, GetDemo); + STATE_FUNC_DECLARE(dLytPauseMain_c, Out); + + /* 0x04 */ UI_STATE_MGR_DECLARE(dLytPauseMain_c); + /* 0x40 */ dLytPauseBack_c *mpPauseBack; + /* 0x44 */ dLytPauseDisp00_c *mpDisp00; + /* 0x48 */ dLytPauseDisp01_c *mpDisp01; + /* 0x4C */ dLytPauseInfo_c *mpPauseInfo; + /* 0x50 */ dLytPauseText_c *mpPauseText; + /* 0x54 */ dLytCommonArrow_c *mpArrow; + /* 0x58 */ s32 mTimer; + /* 0x5C */ s32 mStep; + /* 0x60 */ u8 mPartStateChangeFlags; + /* 0x61 */ bool mInRequest; + /* 0x62 */ bool mOutRequest; + /* 0x63 */ bool field_0x63; + /* 0x64 */ bool mChangeRequest; + /* 0x65 */ bool mSelectRequest; + /* 0x66 */ bool mRingToggleRequest; +}; + +class dLytPauseMgr_c : public dLytBase_c { +public: + dLytPauseMgr_c(); + ~dLytPauseMgr_c(); + + /* 0x08 */ virtual int create() override; + /* 0x14 */ virtual int doDelete() override; + /* 0x20 */ virtual int execute() override; + /* 0x2C */ virtual int draw() override; + /* 0x4C */ virtual bool build() override; + static dLytPauseMgr_c *GetInstance() { return sInstance; } @@ -43,10 +115,18 @@ public: return field_0x083B; } + bool getField_0x083C() const { + return field_0x083C; + } + void setField_0x083C(bool b) { field_0x083C = b; } + bool getField_0x083D() const { + return field_0x083D; + } + void setField_0x083D(bool b) { field_0x083D = b; } @@ -55,6 +135,10 @@ public: return field_0x083E; } + void setField_0x083E(bool b) { + field_0x083E = b; + } + bool getField_0x0840() const { return field_0x0840; } @@ -101,44 +185,56 @@ public: nw4r::lyt::Bounding *getArrowBounding(int idx) const; void setSelectedArrowBounding(int idx) const; - + + static void setSelectHand(f32 rotation, f32 length); + static f32 sDisp00ArrowRotation; static f32 sDisp00ArrowLength; private: + bool checkSelectRing(); + bool checkChangeGesture(); + bool checkRing(); + void saveDispFlag(); + void saveTabFlag(); + + STATE_FUNC_DECLARE(dLytPauseMgr_c, None); + STATE_FUNC_DECLARE(dLytPauseMgr_c, In); + STATE_FUNC_DECLARE(dLytPauseMgr_c, Wait); + STATE_FUNC_DECLARE(dLytPauseMgr_c, Change); + STATE_FUNC_DECLARE(dLytPauseMgr_c, Select); + STATE_FUNC_DECLARE(dLytPauseMgr_c, Ring); + STATE_FUNC_DECLARE(dLytPauseMgr_c, GetDemo); + STATE_FUNC_DECLARE(dLytPauseMgr_c, Out); + static dLytPauseMgr_c *sInstance; - /* 0x0000 */ u8 _0x0000[0x00C8 - 0x0000]; - + /* 0x008C */ UI_STATE_MGR_DECLARE(dLytPauseMgr_c); /* 0x00C8 */ d2d::ResAccIf_c mResAcc1; /* 0x0438 */ d2d::ResAccIf_c mResAcc2; + /* 0x07A8 */ dLytPauseMain_c mMain; - /* 0x07A8 */ u8 _0x0438[0x0814 - 0x07A8]; - - /* 0x0814 */ EGG::CpuTexture *mpBgTexture; + /* 0x0810 */ EGG::TextureBuffer *mpTexture0x0810; + /* 0x0814 */ EGG::TextureBuffer *mpBgTexture; /* 0x0818 */ SelectionType_e mCurrentSelectionType; - - /* 0x081C */ u8 _0x081C[0x0820 - 0x081C]; + /* 0x081C */ SelectionType_e mPrevSelectionType; /* 0x0820 */ s32 mCurrentDisp00Tab; - /* 0x0824 */ u8 _0x0824[0x082C - 0x0824]; - + /* 0x0824 */ UNKWORD field_0x0824; + /* 0x0828 */ UNKWORD field_0x0828; /* 0x082C */ u16 mCurrentSelectionId; - - /* 0x082E */ u8 _0x082E[0x0831 - 0x082E]; - + /* 0x082E */ u16 mPrevSelectionId; + /* 0x0830 */ bool mInRequest; /* 0x0831 */ bool field_0x0831; /* 0x0832 */ bool field_0x0832; /* 0x0833 */ u8 mCurrentSelectionTab; - - /* 0x0834 */ u8 _0x0834[0x0837 - 0x0834]; - + /* 0x0834 */ u8 mTimer; + /* 0x0835 */ u8 field_0x0835; + /* 0x0836 */ bool field_0x0836; /* 0x0837 */ bool field_0x0837; /* 0x0838 */ bool field_0x0838; - - /* 0x0839 */ u8 _0x0839[0x083B - 0x0839]; - + /* 0x0839 */ bool field_0x0839; + /* 0x083A */ bool field_0x083A; /* 0x083B */ bool field_0x083B; - /* 0x083C */ bool field_0x083C; /* 0x083D */ bool field_0x083D; /* 0x083E */ bool field_0x083E; diff --git a/include/d/lyt/d_lyt_pause_back.h b/include/d/lyt/d_lyt_pause_back.h index 641c7dcb..858dcc4e 100644 --- a/include/d/lyt/d_lyt_pause_back.h +++ b/include/d/lyt/d_lyt_pause_back.h @@ -19,6 +19,10 @@ public: void requestIn(); void requestOut(); + bool getField_0x156() const { + return field_0x156; + } + private: void startAnim(int idx); void stopAnim(int idx); diff --git a/include/d/lyt/d_lyt_pause_disp_00.h b/include/d/lyt/d_lyt_pause_disp_00.h index aa77d651..2ed2f451 100644 --- a/include/d/lyt/d_lyt_pause_disp_00.h +++ b/include/d/lyt/d_lyt_pause_disp_00.h @@ -21,7 +21,7 @@ public: void requestIn(bool scroll); void requestOut(bool scroll); void requestSelect(); - void requestRing(); + void requestRingToggle(); void requestUnselect(); bool requestSelectGuide(); @@ -35,6 +35,10 @@ public: STATE_FUNC_DECLARE(dLytPauseDisp00_c, GetDemo); STATE_FUNC_DECLARE(dLytPauseDisp00_c, Out); + bool getField_0xE36E() const { + return field_0xE36E; + } + private: void setAnm(int idx, f32 value); void stopAnm(int idx); @@ -98,7 +102,7 @@ private: /* 0xE373 */ bool mSelectGuideRequest; /* 0xE374 */ bool mStopCallRequest; /* 0xE375 */ bool mSelectMplsRequest; - /* 0xE376 */ bool field_0xE376; + /* 0xE376 */ bool mReverseTabChangeAnim; /* 0xE377 */ bool mRingToggleRequest; }; diff --git a/include/d/lyt/d_lyt_pause_disp_01.h b/include/d/lyt/d_lyt_pause_disp_01.h index 900f376d..90567be4 100644 --- a/include/d/lyt/d_lyt_pause_disp_01.h +++ b/include/d/lyt/d_lyt_pause_disp_01.h @@ -31,6 +31,10 @@ public: STATE_FUNC_DECLARE(dLytPauseDisp01_c, GetDemo); STATE_FUNC_DECLARE(dLytPauseDisp01_c, Out); + bool getField_0x98CE() const { + return field_0x98CE; + } + private: void setAnm(int idx, f32 value); void stopAnm(int idx); diff --git a/include/d/lyt/d_lyt_pause_info.h b/include/d/lyt/d_lyt_pause_info.h index 5212768a..91cffbc0 100644 --- a/include/d/lyt/d_lyt_pause_info.h +++ b/include/d/lyt/d_lyt_pause_info.h @@ -23,6 +23,10 @@ public: void setInputInOut(bool inOut); + bool getField_0x19A() const { + return field_0x19A; + } + private: void updateCaption(); void startAnim(int idx); diff --git a/include/d/lyt/d_lyt_pause_text.h b/include/d/lyt/d_lyt_pause_text.h index 2ca50b83..428fa8b8 100644 --- a/include/d/lyt/d_lyt_pause_text.h +++ b/include/d/lyt/d_lyt_pause_text.h @@ -25,6 +25,10 @@ public: void requestIn(); void requestOut(); + bool getField_0x6D7() const { + return field_0x6D7; + } + private: void startAnim(int idx); void stopAnim(int idx); diff --git a/include/d/lyt/meter/d_lyt_meter.h b/include/d/lyt/meter/d_lyt_meter.h index 00bc98d4..a5826546 100644 --- a/include/d/lyt/meter/d_lyt_meter.h +++ b/include/d/lyt/meter/d_lyt_meter.h @@ -264,6 +264,10 @@ public: return mMain.field_0x13750; } + void setMeterField_0x13750(s32 value) { + mMain.field_0x13750 = value; + } + u8 getMeterField_0x13770() const { return mMain.field_0x13770; } diff --git a/src/d/lyt/d_lyt_common_arrow.cpp b/src/d/lyt/d_lyt_common_arrow.cpp index c4c3b11a..138d8b97 100644 --- a/src/d/lyt/d_lyt_common_arrow.cpp +++ b/src/d/lyt/d_lyt_common_arrow.cpp @@ -85,7 +85,7 @@ bool dLytCommonArrow_c::execute() { } bool dLytCommonArrow_c::draw() { - if (field_0x6CB == 1) { + if (mVisible == true) { mLytBase.addToDrawList(); } return true; @@ -179,14 +179,14 @@ void dLytCommonArrow_c::initializeState_None() { mInRequested = false; mOutRequested = false; field_0x6CA = 0; - field_0x6CB = 0; + mVisible = false; mTargetedBounding = PANE_BOUNDING_NONE; field_0x6B8 = 2; field_0x6BC = 2; field_0x6C0 = 2; mTimer = 0; displayElement(ANIM_IN, 0.0f); - field_0x6CC = 1; + mBackwards = true; } void dLytCommonArrow_c::executeState_None() { if (mInRequested == true) { @@ -200,7 +200,7 @@ void dLytCommonArrow_c::finalizeState_None() { void dLytCommonArrow_c::initializeState_In() { mTimer = 0; - field_0x6CB = 1; + mVisible = true; f32 anmType = 0.0f; if (mType == 1) { anmType = 1.0f; @@ -256,7 +256,7 @@ void dLytCommonArrow_c::executeState_Wait() { } d2d::AnmGroup_c &g2 = mAnmGroups[ANIM_INPUT]; - if (field_0x6CC != 0) { + if (mBackwards) { tickDown(&g2); } else { g2.play(); diff --git a/src/d/lyt/d_lyt_pause.cpp b/src/d/lyt/d_lyt_pause.cpp new file mode 100644 index 00000000..626c56cb --- /dev/null +++ b/src/d/lyt/d_lyt_pause.cpp @@ -0,0 +1,843 @@ +#include "d/lyt/d_lyt_pause.h" + +#include "common.h" +#include "d/d_base.h" +#include "d/d_cs_game.h" +#include "d/d_heap.h" +#include "d/d_pad.h" +#include "d/d_pad_nav.h" +#include "d/d_pause.h" +#include "d/d_player.h" +#include "d/flag/storyflag_manager.h" +#include "d/lyt/d_lyt_common_arrow.h" +#include "d/lyt/d_lyt_control_game.h" +#include "d/lyt/d_lyt_pause_back.h" +#include "d/lyt/d_lyt_pause_disp_00.h" +#include "d/lyt/d_lyt_pause_disp_01.h" +#include "d/lyt/d_lyt_pause_info.h" +#include "d/lyt/d_lyt_pause_text.h" +#include "d/lyt/meter/d_lyt_meter.h" +#include "d/snd/d_snd_player_mgr.h" +#include "d/snd/d_snd_small_effect_mgr.h" +#include "d/snd/d_snd_wzsound.h" +#include "egg/gfx/eggTextureBuffer.h" +#include "m/m_pad.h" +#include "toBeSorted/arc_managers/layout_arc_manager.h" + +STATE_DEFINE(dLytPauseMain_c, None); +STATE_DEFINE(dLytPauseMain_c, In); +STATE_DEFINE(dLytPauseMain_c, Wait); +STATE_DEFINE(dLytPauseMain_c, Change); +STATE_DEFINE(dLytPauseMain_c, Select); +STATE_DEFINE(dLytPauseMain_c, Ring); +STATE_DEFINE(dLytPauseMain_c, GetDemo); +STATE_DEFINE(dLytPauseMain_c, Out); + +STATE_DEFINE(dLytPauseMgr_c, None); +STATE_DEFINE(dLytPauseMgr_c, In); +STATE_DEFINE(dLytPauseMgr_c, Wait); +STATE_DEFINE(dLytPauseMgr_c, Change); +STATE_DEFINE(dLytPauseMgr_c, Select); +STATE_DEFINE(dLytPauseMgr_c, Ring); +STATE_DEFINE(dLytPauseMgr_c, GetDemo); +STATE_DEFINE(dLytPauseMgr_c, Out); + +dLytPauseMain_c::dLytPauseMain_c() + : mStateMgr(*this), + mpPauseBack(nullptr), + mpDisp00(nullptr), + mpDisp01(nullptr), + mpPauseInfo(nullptr), + mpPauseText(nullptr), + mpArrow(nullptr) {} + +bool dLytPauseMain_c::build() { + mpPauseBack = new (dHeap::layoutEx2Heap.heap) dLytPauseBack_c(); + mpPauseBack->build(); + mpPauseInfo = new (dHeap::layoutEx2Heap.heap) dLytPauseInfo_c(); + mpPauseInfo->build(); + mpPauseText = new (dHeap::layoutEx2Heap.heap) dLytPauseText_c(); + mpPauseText->build(); + mpArrow = new (dHeap::layoutEx2Heap.heap) dLytCommonArrow_c(); + mpArrow->build(); + mpDisp00 = new (dHeap::layoutEx2Heap.heap) dLytPauseDisp00_c(); + mpDisp00->build(); + mpDisp01 = new (dHeap::layoutEx2Heap.heap) dLytPauseDisp01_c(); + mpDisp01->build(); + mStateMgr.changeState(StateID_None); + return true; +} + +bool dLytPauseMain_c::remove() { + if (mpArrow != nullptr) { + mpArrow->remove(); + delete mpArrow; + mpArrow = nullptr; + } + + if (mpPauseText != nullptr) { + mpPauseText->remove(); + delete mpPauseText; + mpPauseText = nullptr; + } + + if (mpPauseInfo != nullptr) { + mpPauseInfo->remove(); + delete mpPauseInfo; + mpPauseInfo = nullptr; + } + + if (mpDisp00 != nullptr) { + mpDisp00->remove(); + delete mpDisp00; + mpDisp00 = nullptr; + } + + if (mpDisp01 != nullptr) { + mpDisp01->remove(); + delete mpDisp01; + mpDisp01 = nullptr; + } + + if (mpPauseBack != nullptr) { + mpPauseBack->remove(); + delete mpPauseBack; + mpPauseBack = nullptr; + } + + dBase_c::s_NextExecuteControlFlags &= ~0x1; + dBase_c::s_DrawControlFlags &= ~0x1; + + return true; +} + +bool dLytPauseMain_c::execute() { + mStateMgr.executeState(); + mpPauseBack->execute(); + mpDisp00->execute(); + mpDisp01->execute(); + mpPauseInfo->execute(); + mpPauseText->execute(); + mpArrow->execute(); + return true; +} + +bool dLytPauseMain_c::draw() { + mpPauseBack->draw(); + if (mpDisp00 != nullptr) { + mpDisp00->draw(); + } + if (mpDisp01 != nullptr) { + mpDisp01->draw(); + } + if (!dLytControlGame_c::getInstance()->getField_0x15C67()) { + mpArrow->draw(); + } + mpPauseText->draw(); + mpPauseInfo->draw(); + return true; +} + +void dLytPauseMain_c::drawDirectly() { + if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + mpDisp00->drawDirectly(); + } else { + mpDisp01->drawDirectly(); + } +} + +void dLytPauseMain_c::requestIn() { + mInRequest = true; +} + +void dLytPauseMain_c::requestOut() { + mOutRequest = true; +} + +void dLytPauseMain_c::requestChange() { + mChangeRequest = true; +} + +void dLytPauseMain_c::requestSelect() { + mSelectRequest = true; +} + +void dLytPauseMain_c::requestRingToggle() { + mRingToggleRequest = true; +} + +void dLytPauseMain_c::initializeState_None() { + field_0x63 = false; + mInRequest = false; + mOutRequest = false; + mChangeRequest = false; + mSelectRequest = false; + mRingToggleRequest = false; + mPartStateChangeFlags = 0; + mStep = 0; + mTimer = 0; +} +void dLytPauseMain_c::executeState_None() { + if (mInRequest == true) { + mInRequest = false; + mpPauseBack->requestIn(); + if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + mpDisp00->requestIn(false); + } else { + mpDisp01->requestIn(false); + } + mpPauseInfo->requestIn(); + mStateMgr.changeState(StateID_In); + } +} +void dLytPauseMain_c::finalizeState_None() {} + +void dLytPauseMain_c::initializeState_In() { + mPartStateChangeFlags = 0; + mTimer = 0; +} +void dLytPauseMain_c::executeState_In() { + if (mTimer == 8) { + mpArrow->requestIn(); + } + mTimer++; + + if (mpPauseBack->getField_0x156() == true) { + mPartStateChangeFlags |= 0x1; + } + + if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + if (mpDisp00->getField_0xE36E() == true) { + mPartStateChangeFlags |= 0x2; + } + } else { + if (mpDisp01->getField_0x98CE() == true) { + mPartStateChangeFlags |= 0x2; + } + } + + if (mpPauseInfo->getField_0x19A() == true) { + mPartStateChangeFlags |= 0x4; + } + + if (mPartStateChangeFlags == (0x1 | 0x2 | 0x4)) { + if (dLytControlGame_c::getInstance()->getField_0x15C67()) { + mStateMgr.changeState(StateID_GetDemo); + } else { + mStateMgr.changeState(StateID_Wait); + } + } +} +void dLytPauseMain_c::finalizeState_In() { + dBase_c::s_DrawControlFlags |= 0x1; +} + +void dLytPauseMain_c::initializeState_Wait() { + mStep = 0; + mPartStateChangeFlags = 0; + field_0x63 = true; +} +void dLytPauseMain_c::executeState_Wait() { + field_0x63 = false; + if (mOutRequest == true) { + mOutRequest = false; + mpPauseBack->requestOut(); + if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + mpDisp00->requestOut(false); + } else { + mpDisp01->requestOut(false); + } + mpPauseInfo->requestOut(); + mStateMgr.changeState(StateID_Out); + } else if (mSelectRequest == true) { + mStateMgr.changeState(StateID_Select); + } else if (mChangeRequest == true) { + mChangeRequest = false; + mStateMgr.changeState(StateID_Change); + } else { + if (mRingToggleRequest == true) { + mRingToggleRequest = false; + mStateMgr.changeState(StateID_Ring); + } + mpArrow->unk(); + } +} +void dLytPauseMain_c::finalizeState_Wait() {} + +void dLytPauseMain_c::initializeState_Change() { + mStep = 0; + if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + mpDisp01->requestIn(true); + mpDisp00->requestOut(true); + } else { + mpDisp00->requestIn(true); + mpDisp01->requestOut(true); + } +} +void dLytPauseMain_c::executeState_Change() { + if (mStep != 0) { + return; + } + + bool change = false; + if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + if (mpDisp01->getField_0x98CE()) { + change = true; + } + } else { + if (mpDisp00->getField_0xE36E()) { + change = true; + } + } + + if (change == true) { + mStateMgr.changeState(StateID_Wait); + } +} +void dLytPauseMain_c::finalizeState_Change() {} + +void dLytPauseMain_c::initializeState_Select() { + mStep = 0; + mSelectRequest = false; + if (dLytPauseMgr_c::GetInstance()->getField_0x0838() == true) { + mStep = 10; + mpDisp00->requestSelect(); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_P1_SELECT_TOGGLE); + } else if (dLytPauseMgr_c::GetInstance()->getField_0x083C() == true) { + if (mpDisp00->requestSelectGuide()) { + mStep = 100; + } else { + mStep = 200; + } + } else if (dLytPauseMgr_c::GetInstance()->getField_0x083D() == true) { + if (mpDisp00->requestSelectMpls()) { + mStep = 300; + } else { + mStep = 200; + } + } else { + mpArrow->setBackwards(false); + mpPauseInfo->setInputInOut(false); + if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + mpDisp00->requestSelect(); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_P1_SELECT_ITEM); + } else { + mpDisp01->requestSelect(); + } + mpPauseText->requestIn(); + } +} +extern "C" void fn_80059F40(void *); +void dLytPauseMain_c::executeState_Select() { + switch (mStep) { + case 0: { + if (mpPauseText->getField_0x6D7()) { + mStep = 1; + } + break; + } + case 1: { + if (dPad::getDownTrigA() || dPad::getDownTrigB()) { + mStep = 2; + mpPauseText->requestOut(); + } + break; + } + case 2: { + if (mpPauseText->getField_0x6D7()) { + if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + mpDisp00->requestUnselect(); + } else { + mpDisp01->requestUnselect(); + } + mStateMgr.changeState(StateID_Wait); + } + break; + } + case 10: { + if (mpDisp00->getField_0xE36E() == true) { + mStateMgr.changeState(StateID_Wait); + } + break; + } + case 100: { + if (mpDisp00->getField_0xE36E() == true) { + mStateMgr.changeState(StateID_Wait); + u8 uiMode = dLytMeter_c::GetMain()->getUiMode() + 1; + if (uiMode >= 3) { + uiMode = 0; + } + dLytMeter_c::GetMain()->setUiMode(uiMode); + } + break; + } + case 200: { + mStateMgr.changeState(StateID_Wait); + break; + } + case 300: { + if (mpDisp00->getField_0xE36E() == true) { + mStep++; + // TODO - dPadManager_c + fn_80059F40(dPauseManager_c::GetInstance()); + } + break; + } + case 301: { + mStateMgr.changeState(StateID_Wait); + break; + } + } +} +void dLytPauseMain_c::finalizeState_Select() { + mpArrow->setBackwards(true); + mpPauseInfo->setInputInOut(true); +} + +void dLytPauseMain_c::initializeState_Ring() { + if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + mpDisp00->requestRingToggle(); + } +} +void dLytPauseMain_c::executeState_Ring() { + if (mSelectRequest == true) { + mStateMgr.changeState(StateID_Select); + } else if (mRingToggleRequest == true) { + mRingToggleRequest = false; + if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + mpDisp00->requestRingToggle(); + } + mStateMgr.changeState(StateID_Wait); + } +} +void dLytPauseMain_c::finalizeState_Ring() {} + +void dLytPauseMain_c::initializeState_GetDemo() { + field_0x63 = true; +} +void dLytPauseMain_c::executeState_GetDemo() { + field_0x63 = false; + if (dLytControlGame_c::getInstance()->getField_0x15C68()) { + if (mpDisp01->getField_0x98CE() == true) { + mStateMgr.changeState(StateID_Wait); + } + } else { + if (mpDisp00->getField_0xE36E() == true) { + mStateMgr.changeState(StateID_Wait); + } + } +} +void dLytPauseMain_c::finalizeState_GetDemo() {} + +void dLytPauseMain_c::initializeState_Out() { + mPartStateChangeFlags = 0; + mStep = 0; + dBase_c::s_DrawControlFlags &= ~0x1; + mpArrow->requestOut(); +} +void dLytPauseMain_c::executeState_Out() { + switch (mStep) { + case 0: { + if (mpPauseBack->getField_0x156() == true) { + mPartStateChangeFlags |= 0x1; + } + + if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + if (mpDisp00->getField_0xE36E() == true) { + mPartStateChangeFlags |= 0x2; + } + } else { + if (mpDisp01->getField_0x98CE() == true) { + mPartStateChangeFlags |= 0x2; + } + } + + if (mpPauseInfo->getField_0x19A() == true) { + mPartStateChangeFlags |= 0x4; + } + if (mPartStateChangeFlags == (0x1 | 0x2 | 0x4)) { + field_0x63 = true; + mStep = 1; + } + break; + } + case 1: { + mStateMgr.changeState(StateID_None); + break; + } + } +} +void dLytPauseMain_c::finalizeState_Out() {} + +SPECIAL_BASE_PROFILE(LYT_PAUSE, dLytPauseMgr_c, fProfile::LYT_PAUSE, 0x2B7, 1); + +dLytPauseMgr_c::dLytPauseMgr_c() : mStateMgr(*this), mpTexture0x0810(nullptr), mpBgTexture(nullptr) { + sInstance = this; + field_0x083A = false; +} + +dLytPauseMgr_c::~dLytPauseMgr_c() { + sInstance = nullptr; +} + +int dLytPauseMgr_c::create() { + bool ok = allocateLytWork1Heap("pause", true); + if (!ok) { + return FAILED; + } + + mStateMgr.changeState(StateID_None); + return SUCCEEDED; +} + +int dLytPauseMgr_c::doDelete() { + removeLyt(); + mMain.remove(); + mResAcc2.detach(); + mResAcc1.detach(); + if (mpTexture0x0810 != nullptr) { + mpTexture0x0810->free(); + mpTexture0x0810 = nullptr; + } + if (mpBgTexture != nullptr) { + mpBgTexture->free(); + mpBgTexture = nullptr; + } + return SUCCEEDED; +} + +int dLytPauseMgr_c::execute() { + mStateMgr.executeState(); + if (*mStateMgr.getStateID() != StateID_None) { + mMain.execute(); + } + return SUCCEEDED; +} + +int dLytPauseMgr_c::draw() { + if (*mStateMgr.getStateID() != StateID_None) { + mMain.draw(); + } + return SUCCEEDED; +} + +void dLytPauseMgr_c::initializeState_None() { + mInRequest = 0; + setSelection(SELECT_NONE, 0, false); + mPrevSelectionType = SELECT_NONE; + mCurrentSelectionId = 0; + mPrevSelectionId = 0; + field_0x083C = false; + field_0x083D = false; + field_0x0836 = false; + field_0x0837 = false; + field_0x0838 = false; + field_0x0831 = false; + field_0x0832 = false; + field_0x083E = false; + field_0x083F = false; + field_0x0840 = false; + mCurrentDisp00Tab = 0; + field_0x0824 = 3; + mCurrentSelectionTab = 0; + mCurrentSelectionIsRestricted = false; + mTimer = 0; + field_0x0835 = 0; +} +void dLytPauseMgr_c::executeState_None() { + if (mInRequest == true) { + mInRequest = false; + field_0x083A = true; + mMain.requestIn(); + mStateMgr.changeState(StateID_In); + dBase_c::s_NextExecuteControlFlags |= 0x1; + dLytMeter_c::GetInstance()->setMeterField_0x13750(3); + dLytControlGame_c *lytControl = dLytControlGame_c::getInstance(); + if (lytControl->getField_0x15C67()) { + field_0x0828 = lytControl->getField_0x15C2C(); + lytControl->setField_0x15C2C(lytControl->getField_0x15C68()); + } else { + StoryflagManager::sInstance->unsetFlag(571); + } + } +} +void dLytPauseMgr_c::finalizeState_None() {} + +void dLytPauseMgr_c::initializeState_In() {} +void dLytPauseMgr_c::executeState_In() { + if (mMain.getField_0x63() == true) { + if (dLytControlGame_c::getInstance()->getField_0x15C67()) { + mStateMgr.changeState(StateID_GetDemo); + } else { + mStateMgr.changeState(StateID_Wait); + dCsGame_c::GetInstance()->setCursorTypePointer(); + } + } +} +void dLytPauseMgr_c::finalizeState_In() {} + +void dLytPauseMgr_c::initializeState_Wait() { + dPadNav::setNavEnabled(true, false); + if (sInstance->getField_0x083E()) { + sInstance->setField_0x083E(false); + dPadNav::hidePointer(); + } + + if (field_0x083F == true) { + field_0x083F = false; + dPadNav::hidePointer(); + } + field_0x0840 = false; + field_0x0835 = 0; +} +void dLytPauseMgr_c::executeState_Wait() { + field_0x083B = false; + mPrevSelectionId = mCurrentSelectionId; + mPrevSelectionType = mCurrentSelectionType; + + if (dPad::getDownTrigDown()) { + dPad::ex_c::getInstance()->centerCursor(mPad::getCurrentCoreID(), true); + } + + dCsGame_c::GetInstance()->setCursorTypePointer(); + + if (dPad::getDownTrig1() || (dLytControlGame_c::getInstance()->getField_0x15C2C() != 0 && dPad::getDownTrigB())) { + dSndPlayerMgr_c::GetInstance()->leaveMenu(); + mMain.requestOut(); + (void)getLinkPtr(); // yes + mStateMgr.changeState(StateID_Out); + return; + } + + if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + bool b = false; + if (!StoryflagManager::sInstance->getFlag(58)) { + if (dPad::getDownTrigB()) { + b = true; + } + } else { + if (dPad::getUpTrigB() && field_0x0835 < 10) { + b = true; + } + } + + if (b) { + dSndPlayerMgr_c::GetInstance()->leaveMenu(); + mMain.requestOut(); + (void)getLinkPtr(); // yes + mStateMgr.changeState(StateID_Out); + return; + } + } + + if (mMain.hasSelection() && dPad::getDownTrigA()) { + if (field_0x0837 && !dPadNav::isPointerVisible()) { + field_0x083F = true; + } + (void)checkSelectRing(); + mStateMgr.changeState(StateID_Select); + return; + } + + if (checkChangeGesture()) { + mStateMgr.changeState(StateID_Change); + return; + } + + if ((dPad::getDownTrigB() || dPad::getDownTrigMinus() || dPad::getDownTrigC()) && checkSelectRing()) { + field_0x0837 = true; + mStateMgr.changeState(StateID_Select); + return; + } + + if (checkRing()) { + if (mTimer >= 10) { + mTimer = 0; + dCsGame_c::GetInstance()->setCursorTypeNoneMaybe(); + mStateMgr.changeState(StateID_Ring); + } else { + mTimer++; + } + + } else { + mTimer = 0; + } + if (dPad::getDownB()) { + field_0x0835++; + } else { + field_0x0835 = 0; + } + +} +void dLytPauseMgr_c::finalizeState_Wait() { + dPadNav::setNavEnabled(false, false); +} + +void dLytPauseMgr_c::initializeState_Change() { + mMain.requestChange(); + mMain.updateTitle(); + if (field_0x0831) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_TURN_PAGE_RIGHT); + } else { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_TURN_PAGE_LEFT); + } +} +void dLytPauseMgr_c::executeState_Change() { + if (!sInstance->getField_0x083E()) { + dCsGame_c::GetInstance()->setCursorTypePointer(); + } + + if (mMain.getField_0x63() == true) { + saveDispFlag(); + mStateMgr.changeState(StateID_Wait); + } +} +void dLytPauseMgr_c::finalizeState_Change() {} + +void dLytPauseMgr_c::initializeState_Select() { + mMain.requestSelect(); + field_0x0838 = field_0x0837; +} +void dLytPauseMgr_c::executeState_Select() { + if (mMain.getField_0x63() == true) { + if (field_0x0838) { + saveTabFlag(); + field_0x0838 = false; + } + mStateMgr.changeState(StateID_Wait); + } else if (field_0x0838) { + s32 tab = mCurrentDisp00Tab; + bool buttonHeld = false; + if (dPad::getDownB() && tab == 0) { + buttonHeld = true; + } + if (dPad::getDownMinus() && tab == 1) { + buttonHeld = true; + } + if (dPad::getDownC() && tab == 2) { + buttonHeld = true; + } + + if (buttonHeld) { + mTimer++; + } else { + mTimer = 0; + } + } +} +void dLytPauseMgr_c::finalizeState_Select() {} + +void dLytPauseMgr_c::initializeState_Ring() { + s32 controlGameTab = dLytControlGame_c::getInstance()->getPauseDisp00Tab(); + if (controlGameTab == 0) { + field_0x0824 = 0; + } else if (controlGameTab == 1) { + field_0x0824 = 1; + } else { + field_0x0824 = 2; + } + mMain.requestRingToggle(); +} +void dLytPauseMgr_c::executeState_Ring() { + field_0x083B = false; + mPrevSelectionId = mCurrentSelectionId; + mPrevSelectionType = mCurrentSelectionType; + bool buttonHeld = false; + if (field_0x0824 == 0) { + if (!dPad::getDownB()) { + buttonHeld = true; + } + } else if (field_0x0824 == 1) { + if (!dPad::getDownMinus()) { + buttonHeld = true; + } + } else { + if (!dPad::getDownC()) { + buttonHeld = true; + } + } + + if (buttonHeld == true) { + if (mMain.hasSelection()) { + mStateMgr.changeState(StateID_Select); + } else { + mMain.requestRingToggle(); + mStateMgr.changeState(StateID_Wait); + } + } +} +void dLytPauseMgr_c::finalizeState_Ring() { + mTimer = 0; +} + +void dLytPauseMgr_c::initializeState_GetDemo() {} +void dLytPauseMgr_c::executeState_GetDemo() { + if (mMain.getField_0x63() == true) { + dSndPlayerMgr_c::GetInstance()->leaveMenu(); + mMain.requestOut(); + (void)getLinkPtr(); + mStateMgr.changeState(StateID_Out); + } +} +void dLytPauseMgr_c::finalizeState_GetDemo() {} + +void dLytPauseMgr_c::initializeState_Out() { + dCsGame_c::GetInstance()->offNextCursor(); +} +void dLytPauseMgr_c::executeState_Out() { + if (mMain.getField_0x63() == true) { + dBase_c::s_NextExecuteControlFlags &= ~0x1; + dBase_c::s_DrawControlFlags &= ~0x1; + mStateMgr.changeState(StateID_None); + } +} +void dLytPauseMgr_c::finalizeState_Out() { + if (dLytControlGame_c::getInstance()->getField_0x15C67()) { + dLytControlGame_c::getInstance()->setField_0x15C2C(field_0x0828); + } +} + +bool dLytPauseMgr_c::isStateWait() const { + return mStateMgr.getStateID()->isEqual(StateID_Wait); +} + +bool dLytPauseMgr_c::build() { + void *data; + data = LayoutArcManager::GetInstance()->getLoadedData("MenuPause"); + mResAcc1.attach(data, ""); + data = LayoutArcManager::GetInstance()->getLoadedData("DoButton"); + mResAcc2.attach(data, ""); + mMain.build(); + return true; +} + +void dLytPauseMgr_c::saveTabFlag() { + dLytControlGame_c::getInstance()->setPauseDisp00Tab(mCurrentDisp00Tab); + StoryflagManager::sInstance->setFlagOrCounterToValue(846, mCurrentDisp00Tab); +} + +bool dLytPauseMgr_c::checkRing() { + dLytControlGame_c *lytControl = dLytControlGame_c::getInstance(); + if (lytControl->getField_0x15C2C() != 0) { + return false; + } + if (!StoryflagManager::sInstance->getFlag(30)) { + return false; + } + + s32 tab = lytControl->getPauseDisp00Tab(); + + if (dPad::getDownB() && tab == 0) { + return true; + } else if (dPad::getDownMinus() && tab == 1) { + return true; + } else if (dPad::getDownC() && tab == 2) { + return true; + } + return false; +} + +void dLytPauseMgr_c::setSelectHand(f32 rotation, f32 length) { + sDisp00ArrowRotation = rotation; + sDisp00ArrowLength = length; +} diff --git a/src/d/lyt/d_lyt_pause_disp_00.cpp b/src/d/lyt/d_lyt_pause_disp_00.cpp index 153cb74b..124190c6 100644 --- a/src/d/lyt/d_lyt_pause_disp_00.cpp +++ b/src/d/lyt/d_lyt_pause_disp_00.cpp @@ -329,8 +329,8 @@ static const d2d::LytBrlanMapping brlanMap[] = { #define PAUSE_DISP_00_NUM_SUBPANES 24 -#define navTargetToBounding(n) (s32)(n - 1) -#define boundingToNavTarget(n) (s32)(n + 1) +#define navTargetToBounding(n) ((s32)(n - 1)) +#define boundingToNavTarget(n) ((s32)(n + 1)) // clang-format off static const u8 iconVariants[] = { @@ -532,7 +532,7 @@ void dLytPauseDisp00_c::requestSelect() { mSelectToggleRequest = true; } -void dLytPauseDisp00_c::requestRing() { +void dLytPauseDisp00_c::requestRingToggle() { mRingToggleRequest = true; } @@ -614,7 +614,7 @@ void dLytPauseDisp00_c::initializeState_None() { setAnm(PAUSE_DISP_00_ANIM_LOOP, 0.0f); mSelectGuideRequest = false; mSelectToggleRequest = false; - field_0xE376 = false; + mReverseTabChangeAnim = false; mRingToggleRequest = false; } void dLytPauseDisp00_c::executeState_None() { @@ -803,19 +803,39 @@ void dLytPauseDisp00_c::executeState_Wait() { void dLytPauseDisp00_c::finalizeState_Wait() {} void dLytPauseDisp00_c::initializeState_Select() { - static const s32 sTabOrder[] = { + // Reminder: item=0, pouch=1, dowsing=2 + + // Subtle detail - the layout has three animations for changing tabs: + // 1. B-Wheel -> Pouch + // 2. Pouch -> Dowsing + // 3. Dowsing -> B-Wheel + // If we're changing tabs in this order, we can simply play the + // animation forward. If we're changing tabs in a different order, + // we need to play the reverse change animation, backwards. + + // For a given tab index, what's the natural next tab index? + static const s32 sNaturalTabOrder[] = { 1, 2, 0, }; - static const s32 sTabAnim[] = { + // For a given tab index, what's the change anim when changing to the natural next tab? + static const s32 sNaturalTabChangeAnim[] = { PAUSE_DISP_00_ANIM_RING_TO_POUCH, PAUSE_DISP_00_ANIM_RING_TO_SWORD, PAUSE_DISP_00_ANIM_RING_TO_ITEM, }; - static const s32 sTabAnim2[] = { + // TODO - possibly fakematch, but we need to force a reload. + // Note that this is part of a .rodata pool, so it + // must be const and in the same file... + + // For a given tab index, what's the change anim when changing to the *other* tab, + // in not-natural order? + static const volatile s32 sReverseTabChangeAnim[] = { + // E.g. we're on the item tab, and we're changing to dowsing, + // so we need to play the dowsing->item animation in reverse. PAUSE_DISP_00_ANIM_RING_TO_ITEM, PAUSE_DISP_00_ANIM_RING_TO_POUCH, PAUSE_DISP_00_ANIM_RING_TO_SWORD, @@ -830,18 +850,17 @@ void dLytPauseDisp00_c::initializeState_Select() { stopAnm(PAUSE_DISP_00_ANIM_RING_TO_SWORD); stopAnm(PAUSE_DISP_00_ANIM_RING_TO_ITEM); - // Of course dLytControlGame_c and dLytPause_c would use different IDs... - // TODO check if this ID mapping is consistently done - s32 controlGameTab = dLytControlGame_c::getInstance()->getPauseDisp00Tab(); - if (sTabOrder[controlGameTab] == pause->getCurrentDisp00Tab()) { - setAnm(sTabAnim[controlGameTab], 0.0f); - field_0xE376 = false; + s32 oldTab = dLytControlGame_c::getInstance()->getPauseDisp00Tab(); + if (sNaturalTabOrder[oldTab] == pause->getCurrentDisp00Tab()) { + // Natural + setAnm(sNaturalTabChangeAnim[oldTab], 0.0f); + mReverseTabChangeAnim = false; } else { - stopAnm(controlGameTab + PAUSE_DISP_00_ANIM_RING_BASE); - // TODO - nonmatching - setAnm(sTabAnim2[controlGameTab], 0.0f); - mAnm[sTabAnim2[controlGameTab]].setToEnd(); - field_0xE376 = true; + // Opposite order + stopAnm(oldTab + PAUSE_DISP_00_ANIM_RING_BASE); + setAnm(sReverseTabChangeAnim[oldTab], 0.0f); + mAnm[sReverseTabChangeAnim[oldTab]].setToEnd(); + mReverseTabChangeAnim = true; } for (int i = PAUSE_DISP_00_ANIM_ITEM_OFFSET; @@ -852,13 +871,18 @@ void dLytPauseDisp00_c::initializeState_Select() { mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].setFrame(0.0f); } void dLytPauseDisp00_c::executeState_Select() { - static const s32 sTabAnim2[] = { + static const s32 sReverseTabChangeAnim[] = { PAUSE_DISP_00_ANIM_RING_TO_ITEM, PAUSE_DISP_00_ANIM_RING_TO_POUCH, PAUSE_DISP_00_ANIM_RING_TO_SWORD, }; - static const s32 sTabAnim3[] = { + // When our normal tab change anim is done (frame == 1.0f), + // we change to the next anim with frame == 0.0f. + // Not entirely sure why. + static const s32 sNextTabChangeAnim[] = { + // E.g. we're changing from B-Wheel to Pouch. When + // we're done with that transition PAUSE_DISP_00_ANIM_RING_TO_SWORD, PAUSE_DISP_00_ANIM_RING_TO_ITEM, PAUSE_DISP_00_ANIM_RING_TO_POUCH, @@ -876,8 +900,8 @@ void dLytPauseDisp00_c::executeState_Select() { s32 controlGameTab = dLytControlGame_c::getInstance()->getPauseDisp00Tab(); s32 lytPauseTab = dLytPauseMgr_c::GetInstance()->getCurrentDisp00Tab(); d2d::AnmGroup_c *anm; - if (field_0xE376) { - anm = &mAnm[sTabAnim2[controlGameTab]]; + if (mReverseTabChangeAnim) { + anm = &mAnm[sReverseTabChangeAnim[controlGameTab]]; if (cM::isZero(anm->getFrame()) == true) { setupRingIcons(lytPauseTab); mStateMgr.changeState(StateID_Wait); @@ -887,7 +911,7 @@ void dLytPauseDisp00_c::executeState_Select() { anm = &mAnm[controlGameTab + PAUSE_DISP_00_ANIM_RING_BASE]; if (anm->isEndReached() == true) { stopAnm(controlGameTab + PAUSE_DISP_00_ANIM_RING_BASE); - setAnm(sTabAnim3[controlGameTab], 0.0f); + setAnm(sNextTabChangeAnim[controlGameTab], 0.0f); setupRingIcons(lytPauseTab); mStateMgr.changeState(StateID_Wait); } else { @@ -1591,6 +1615,7 @@ s32 dLytPauseDisp00_c::updateSelection() { dLytControlGame_c *lytControl = dLytControlGame_c::getInstance(); dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); d2d::AnmGroup_c *pAnm; + int i; if (!pause->isStateWait()) { pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); @@ -1753,9 +1778,8 @@ s32 dLytPauseDisp00_c::updateSelection() { // TODO: this part needs to be fixed before we can deal with the regswaps. // Part of the `mpBoundings[navTargetToBounding(target)]->IsVisible()` here is kept around // until the end of the function where the same call appears. - pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_TABLET]; - for (int i = PAUSE_DISP_00_BOUNDING_TABLETS; i < PAUSE_DISP_00_BOUNDING_HARP; i++) { + for (i = PAUSE_DISP_00_BOUNDING_TABLETS; i < PAUSE_DISP_00_BOUNDING_HARP; i++) { s32 anim = PAUSE_DISP_00_ANIM_ONOFF_TABLET + i; if (target != 0 && navTargetToBounding(target) == i && mpBoundings[navTargetToBounding(target)]->IsVisible()) { pAnm->play(); @@ -1775,7 +1799,7 @@ s32 dLytPauseDisp00_c::updateSelection() { } pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_HARP]; - for (int i = PAUSE_DISP_00_BOUNDING_HARP; i < PAUSE_DISP_00_BOUNDING_SHIREN + 1; i++) { + for (i = PAUSE_DISP_00_BOUNDING_HARP; i < PAUSE_DISP_00_BOUNDING_SHIREN + 1; i++) { if (target != 0 && navTargetToBounding(target) == i) { pAnm->play(); } else { @@ -1828,7 +1852,7 @@ s32 dLytPauseDisp00_c::updateSelection() { PAUSE_DISP_00_ANIM_ONOFF_ITEM_OFFSET; pAnm = &mAnm[anmIdx]; - for (int i = PAUSE_DISP_00_BOUNDING_RING_OFFSET; + for (i = PAUSE_DISP_00_BOUNDING_RING_OFFSET; i < PAUSE_DISP_00_BOUNDING_RING_OFFSET + PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { if (target != 0 && navTargetToBounding(target) == i) { f32 frame = pAnm->getFrame(); @@ -2124,7 +2148,6 @@ void dLytPauseDisp00_c::loadRingText(u32 cmd) { mLyt.loadTextVariant("T_decideS_00", 0); } else { s32 msgIdx = 1; - // TODO: Don't these use different IDs? s32 tab = dLytControlGame_c::getInstance()->getPauseDisp00Tab(); if (cmd == RING_TEXT_CURRENT_TAB) { tab = dLytPauseMgr_c::GetInstance()->getCurrentDisp00Tab();