From b4200519b168b970b3afdccf357d1ef42001b52a Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 3 Aug 2025 12:35:45 +0200 Subject: [PATCH 01/14] d_lyt_pause_back OK --- config/SOUE01/splits.txt | 3 +- config/SOUE01/symbols.txt | 157 +++++++++++++++++------------- configure.py | 2 +- include/d/d_stage_mgr.h | 10 +- include/d/lyt/d_lyt_pause.h | 31 ++++++ include/d/lyt/d_lyt_pause_back.h | 41 ++++++++ src/d/lyt/d_lyt_pause_back.cpp | 159 +++++++++++++++++++++++++++++++ 7 files changed, 332 insertions(+), 71 deletions(-) create mode 100644 include/d/lyt/d_lyt_pause.h create mode 100644 include/d/lyt/d_lyt_pause_back.h create mode 100644 src/d/lyt/d_lyt_pause_back.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 4766f669..62f9579b 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1002,7 +1002,7 @@ d/lyt/d_lyt_deposit_stock.cpp: d/lyt/d_lyt_deposit_box.cpp: .text start:0x801578B0 end:0x80158288 align:16 - .rodata start:0x804E8218 end:0x804E8258 + .rodata start:0x804E8218 end:0x804E8248 .data start:0x80524BC8 end:0x80524CD0 .sdata start:0x80572990 end:0x80572998 .sdata2 start:0x8057A060 end:0x8057A078 @@ -1019,6 +1019,7 @@ d/lyt/d_lyt_boss_gauge.cpp: d/lyt/d_lyt_pause_back.cpp: .text start:0x80158E80 end:0x80159E78 align:16 .ctors start:0x804DB794 end:0x804DB798 + .rodata start:0x804E8248 end:0x804E8258 .data start:0x80524ED0 end:0x80525138 .sdata2 start:0x8057A090 end:0x8057A098 .bss start:0x805B1570 end:0x805B1670 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 46e0dadb..125ddcb9 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -8733,53 +8733,53 @@ fn_80158940__15dLytBossGauge_cFv = .text:0x80158940; // type:function size:0x108 __sinit_\d_lyt_boss_gauge_cpp = .text:0x80158A50; // type:function size:0x338 scope:local __dt__30sFStateID_c<15dLytBossGauge_c>Fv = .text:0x80158D90; // type:function size:0x58 isSameName__30sFStateID_c<15dLytBossGauge_c>CFPCc = .text:0x80158DF0; // type:function size:0x88 -LytPauseBack__ctor = .text:0x80158E80; // type:function size:0xC0 -fn_80158F40 = .text:0x80158F40; // type:function size:0xA4 -fn_80158FF0 = .text:0x80158FF0; // type:function size:0xA0 -fn_80159090 = .text:0x80159090; // type:function size:0x6C -fn_80159100 = .text:0x80159100; // type:function size:0x58 -fn_80159160 = .text:0x80159160; // type:function size:0xC0 -fn_80159220 = .text:0x80159220; // type:function size:0x10 -fn_80159230 = .text:0x80159230; // type:function size:0x5C -fn_80159290 = .text:0x80159290; // type:function size:0x54 -fn_801592F0 = .text:0x801592F0; // type:function size:0x10 -fn_80159300 = .text:0x80159300; // type:function size:0x34 -fn_80159340 = .text:0x80159340; // type:function size:0xC -fn_80159350 = .text:0x80159350; // type:function size:0xC -fn_80159360 = .text:0x80159360; // type:function size:0x48 -fn_801593B0 = .text:0x801593B0; // type:function size:0x30 -fn_801593E0 = .text:0x801593E0; // type:function size:0x4 -fn_801593F0 = .text:0x801593F0; // type:function size:0xAC -fn_801594A0 = .text:0x801594A0; // type:function size:0x80 -fn_80159520 = .text:0x80159520; // type:function size:0x4 -fn_80159530 = .text:0x80159530; // type:function size:0xC -fn_80159540 = .text:0x80159540; // type:function size:0x34 -fn_80159580 = .text:0x80159580; // type:function size:0x4 -fn_80159590 = .text:0x80159590; // type:function size:0x44 -fn_801595E0 = .text:0x801595E0; // type:function size:0xA8 -fn_80159690 = .text:0x80159690; // type:function size:0x4 -fn_801596A0 = .text:0x801596A0; // type:function size:0x50 -fn_801596F0 = .text:0x801596F0; // type:function size:0x10 -fn_80159700 = .text:0x80159700; // type:function size:0x98 -fn_801597A0 = .text:0x801597A0; // type:function size:0xD8 -fn_80159880 = .text:0x80159880; // type:function size:0x60 -fn_801598E0 = .text:0x801598E0; // type:function size:0xC -fn_801598F0 = .text:0x801598F0; // type:function size:0x1C -fn_80159910 = .text:0x80159910; // type:function size:0x1C -fn_80159930 = .text:0x80159930; // type:function size:0x1C -fn_80159950 = .text:0x80159950; // type:function size:0x10 -fn_80159960 = .text:0x80159960; // type:function size:0x10 -fn_80159970 = .text:0x80159970; // type:function size:0x10 -fn_80159980 = .text:0x80159980; // type:function size:0x10 -fn_80159990 = .text:0x80159990; // type:function size:0x10 -fn_801599A0 = .text:0x801599A0; // type:function size:0x10 -fn_801599B0 = .text:0x801599B0; // type:function size:0x10 -fn_801599C0 = .text:0x801599C0; // type:function size:0x30 -fn_801599F0 = .text:0x801599F0; // type:function size:0x30 -fn_80159A20 = .text:0x80159A20; // type:function size:0x30 -LytPauseBack__initStates = .text:0x80159A50; // type:function size:0x338 -LytPauseBack__dtor = .text:0x80159D90; // type:function size:0x58 -fn_80159DF0 = .text:0x80159DF0; // type:function size:0x88 +__ct__15dLytPauseBack_cFv = .text:0x80158E80; // type:function size:0xC0 +__dt__54sFStateMgr_c<15dLytPauseBack_c,20sStateMethodUsr_FI_c>Fv = .text:0x80158F40; // type:function size:0xA4 scope:weak +__dt__84sStateMgr_c<15dLytPauseBack_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80158FF0; // type:function size:0xA0 scope:weak +__dt__31sFStateFct_c<15dLytPauseBack_c>Fv = .text:0x80159090; // type:function size:0x6C scope:weak +__dt__28sFState_c<15dLytPauseBack_c>Fv = .text:0x80159100; // type:function size:0x58 scope:weak +build__15dLytPauseBack_cFv = .text:0x80159160; // type:function size:0xC0 +changeState__84sStateMgr_c<15dLytPauseBack_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x80159220; // type:function size:0x10 scope:weak +remove__15dLytPauseBack_cFv = .text:0x80159230; // type:function size:0x5C +execute__15dLytPauseBack_cFv = .text:0x80159290; // type:function size:0x54 +executeState__84sStateMgr_c<15dLytPauseBack_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801592F0; // type:function size:0x10 scope:weak +draw__15dLytPauseBack_cFv = .text:0x80159300; // type:function size:0x34 +requestIn__15dLytPauseBack_cFv = .text:0x80159340; // type:function size:0xC +requestOut__15dLytPauseBack_cFv = .text:0x80159350; // type:function size:0xC +initializeState_None__15dLytPauseBack_cFv = .text:0x80159360; // type:function size:0x48 +executeState_None__15dLytPauseBack_cFv = .text:0x801593B0; // type:function size:0x30 +finalizeState_None__15dLytPauseBack_cFv = .text:0x801593E0; // type:function size:0x4 +initializeState_In__15dLytPauseBack_cFv = .text:0x801593F0; // type:function size:0xAC +executeState_In__15dLytPauseBack_cFv = .text:0x801594A0; // type:function size:0x80 +finalizeState_In__15dLytPauseBack_cFv = .text:0x80159520; // type:function size:0x4 +initializeState_Wait__15dLytPauseBack_cFv = .text:0x80159530; // type:function size:0xC +executeState_Wait__15dLytPauseBack_cFv = .text:0x80159540; // type:function size:0x34 +finalizeState_Wait__15dLytPauseBack_cFv = .text:0x80159580; // type:function size:0x4 +initializeState_Out__15dLytPauseBack_cFv = .text:0x80159590; // type:function size:0x44 +executeState_Out__15dLytPauseBack_cFv = .text:0x801595E0; // type:function size:0xA8 +finalizeState_Out__15dLytPauseBack_cFv = .text:0x80159690; // type:function size:0x4 +startAnim__15dLytPauseBack_cFi = .text:0x801596A0; // type:function size:0x50 +stopAnim__15dLytPauseBack_cFi = .text:0x801596F0; // type:function size:0x10 +loadBgTexture__15dLytPauseBack_cFv = .text:0x80159700; // type:function size:0x98 +__dt__15dLytPauseBack_cFv = .text:0x801597A0; // type:function size:0xD8 scope:weak +build__31sFStateFct_c<15dLytPauseBack_c>FRC12sStateIDIf_c = .text:0x80159880; // type:function size:0x60 scope:weak +dispose__31sFStateFct_c<15dLytPauseBack_c>FRP10sStateIf_c = .text:0x801598E0; // type:function size:0xC scope:weak +initialize__28sFState_c<15dLytPauseBack_c>Fv = .text:0x801598F0; // type:function size:0x1C scope:weak +execute__28sFState_c<15dLytPauseBack_c>Fv = .text:0x80159910; // type:function size:0x1C scope:weak +finalize__28sFState_c<15dLytPauseBack_c>Fv = .text:0x80159930; // type:function size:0x1C scope:weak +initializeState__84sStateMgr_c<15dLytPauseBack_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80159950; // type:function size:0x10 scope:weak +finalizeState__84sStateMgr_c<15dLytPauseBack_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80159960; // type:function size:0x10 scope:weak +refreshState__84sStateMgr_c<15dLytPauseBack_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80159970; // type:function size:0x10 scope:weak +getState__84sStateMgr_c<15dLytPauseBack_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80159980; // type:function size:0x10 scope:weak +getNewStateID__84sStateMgr_c<15dLytPauseBack_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80159990; // type:function size:0x10 scope:weak +getStateID__84sStateMgr_c<15dLytPauseBack_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801599A0; // type:function size:0x10 scope:weak +getOldStateID__84sStateMgr_c<15dLytPauseBack_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801599B0; // type:function size:0x10 scope:weak +finalizeState__30sFStateID_c<15dLytPauseBack_c>CFR15dLytPauseBack_c = .text:0x801599C0; // type:function size:0x30 scope:weak +executeState__30sFStateID_c<15dLytPauseBack_c>CFR15dLytPauseBack_c = .text:0x801599F0; // type:function size:0x30 scope:weak +initializeState__30sFStateID_c<15dLytPauseBack_c>CFR15dLytPauseBack_c = .text:0x80159A20; // type:function size:0x30 scope:weak +__sinit_\d_lyt_pause_back_cpp = .text:0x80159A50; // type:function size:0x338 scope:local +__dt__30sFStateID_c<15dLytPauseBack_c>Fv = .text:0x80159D90; // type:function size:0x58 scope:weak +isSameName__30sFStateID_c<15dLytPauseBack_c>CFPCc = .text:0x80159DF0; // type:function size:0x88 scope:weak __ct__17dLytPauseDisp00_cFv = .text:0x80159E80; // type:function size:0x160 __dt__56sFStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c>Fv = .text:0x80159FE0; // type:function size:0xA4 __dt__86sStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8015A090; // type:function size:0xA0 @@ -28335,7 +28335,7 @@ brlanMap = .rodata:0x804E8138; // type:object size:0x18 scope:local data:4byte lbl_804E8150 = .rodata:0x804E8150; // type:object size:0xC8 data:4byte lbl_804E8218 = .rodata:0x804E8218; // type:object size:0x10 data:4byte lbl_804E8228 = .rodata:0x804E8228; // type:object size:0x20 data:4byte -lbl_804E8248 = .rodata:0x804E8248; // type:object size:0x10 data:4byte +brlanMap = .rodata:0x804E8248; // type:object size:0x10 scope:local data:4byte lbl_804E8258 = .rodata:0x804E8258; // type:object size:0x128 lbl_804E8380 = .rodata:0x804E8380; // type:object size:0x128 lbl_804E84A8 = .rodata:0x804E84A8; // type:object size:0x3F0 data:4byte @@ -34306,18 +34306,35 @@ lbl_80524D60 = .data:0x80524D60; // type:object size:0xC lbl_80524D6C = .data:0x80524D6C; // type:object size:0xC lbl_80524D78 = .data:0x80524D78; // type:object size:0x120 __vt__30sFStateID_c<15dLytBossGauge_c> = .data:0x80524E98; // type:object size:0x34 -lbl_80524ED0 = .data:0x80524ED0; // type:object size:0x18 -lbl_80524EE8 = .data:0x80524EE8; // type:object size:0xC -lbl_80524EF4 = .data:0x80524EF4; // type:object size:0x18 -lbl_80524F0C = .data:0x80524F0C; // type:object size:0x14 -lbl_80524F20 = .data:0x80524F20; // type:object size:0x10 -lbl_80524F30 = .data:0x80524F30; // type:object size:0x10 -lbl_80524F40 = .data:0x80524F40; // type:object size:0x10 -lbl_80524F50 = .data:0x80524F50; // type:object size:0x30 -lbl_80524F80 = .data:0x80524F80; // type:object size:0x30 -lbl_80524FB0 = .data:0x80524FB0; // type:object size:0x18 -lbl_80524FC8 = .data:0x80524FC8; // type:object size:0x13C -lbl_80525104 = .data:0x80525104; // type:object size:0x34 +@20998 = .data:0x80524ED0; // type:object size:0x16 scope:local data:string +...data.0 = .data:0x80524ED0; // type:label scope:local +@20999 = .data:0x80524EE8; // type:object size:0xB scope:local data:string +@21000 = .data:0x80524EF4; // type:object size:0x17 scope:local data:string +@21540 = .data:0x80524F0C; // type:object size:0x13 scope:local data:string +@21588 = .data:0x80524F20; // type:object size:0xD scope:local data:string +@21589 = .data:0x80524F30; // type:object size:0xD scope:local data:string +__vt__15dLytPauseBack_c = .data:0x80524F40; // type:object size:0xC scope:weak +__vt__54sFStateMgr_c<15dLytPauseBack_c,20sStateMethodUsr_FI_c> = .data:0x80524F50; // type:object size:0x30 scope:weak +__vt__84sStateMgr_c<15dLytPauseBack_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80524F80; // type:object size:0x30 scope:weak +__vt__31sFStateFct_c<15dLytPauseBack_c> = .data:0x80524FB0; // type:object size:0x14 scope:weak +__vt__28sFState_c<15dLytPauseBack_c> = .data:0x80524FC8; // type:object size:0x18 scope:weak +@21697 = .data:0x80524FF8; // type:object size:0xC scope:local +@21698 = .data:0x80525004; // type:object size:0xC scope:local +@21699 = .data:0x80525010; // type:object size:0xC scope:local +@21700 = .data:0x8052501C; // type:object size:0xC scope:local +@21701 = .data:0x80525028; // type:object size:0xC scope:local +@21702 = .data:0x80525034; // type:object size:0xC scope:local +@21703 = .data:0x80525040; // type:object size:0xC scope:local +@21704 = .data:0x8052504C; // type:object size:0xC scope:local +@21705 = .data:0x80525058; // type:object size:0xC scope:local +@21706 = .data:0x80525064; // type:object size:0xC scope:local +@21707 = .data:0x80525070; // type:object size:0xC scope:local +@21708 = .data:0x8052507C; // type:object size:0xC scope:local +@21710 = .data:0x80525088; // type:object size:0x1E scope:local data:string +@21711 = .data:0x805250A8; // type:object size:0x1C scope:local data:string +@21712 = .data:0x805250C4; // type:object size:0x1E scope:local data:string +@21713 = .data:0x805250E4; // type:object size:0x1D scope:local data:string +__vt__30sFStateID_c<15dLytPauseBack_c> = .data:0x80525104; // type:object size:0x34 scope:weak lbl_80525138 = .data:0x80525138; // type:object size:0x14 lbl_8052514C = .data:0x8052514C; // type:object size:0xC lbl_80525158 = .data:0x80525158; // type:object size:0x14 data:string @@ -41900,7 +41917,7 @@ sInstance__12dTgMassObj_c = .sbss:0x80575930; // type:object size:0x4 data:4byte lbl_80575934 = .sbss:0x80575934; // type:object size:0x4 data:4byte lbl_80575938 = .sbss:0x80575938; // type:object size:0x4 align:4 data:float lbl_8057593C = .sbss:0x8057593C; // type:object size:0x4 align:4 data:float -LYT_PAUSE_DISP = .sbss:0x80575940; // type:object size:0x8 data:4byte +sInstance__14dLytPauseMgr_c = .sbss:0x80575940; // type:object size:0x8 data:4byte sInstance__17dLytGameOverMgr_c = .sbss:0x80575948; // type:object size:0x8 data:4byte sInstance__13dLytSaveMgr_c = .sbss:0x80575950; // type:object size:0x8 data:4byte lbl_80575958 = .sbss:0x80575958; // type:object size:0x1 data:byte @@ -45087,8 +45104,8 @@ lbl_8057A07C = .sdata2:0x8057A07C; // type:object size:0x4 align:4 data:float lbl_8057A080 = .sdata2:0x8057A080; // type:object size:0x4 align:4 data:float lbl_8057A084 = .sdata2:0x8057A084; // type:object size:0x4 align:4 data:float lbl_8057A088 = .sdata2:0x8057A088; // type:object size:0x8 align:8 data:double -lbl_8057A090 = .sdata2:0x8057A090; // type:object size:0x4 align:4 data:float -lbl_8057A094 = .sdata2:0x8057A094; // type:object size:0x4 align:4 data:float +@21516 = .sdata2:0x8057A090; // type:object size:0x4 scope:local align:4 data:float +@21517 = .sdata2:0x8057A094; // type:object size:0x4 scope:local align:4 data:float lbl_8057A098 = .sdata2:0x8057A098; // type:object size:0x4 align:4 data:float lbl_8057A09C = .sdata2:0x8057A09C; // type:object size:0x4 align:4 data:float lbl_8057A0A0 = .sdata2:0x8057A0A0; // type:object size:0x4 align:4 data:float @@ -51374,11 +51391,15 @@ LytBossGauge__STATE_NONE = .bss:0x805B1480; // type:object size:0x40 data:4byte LytBossGauge__STATE_IN = .bss:0x805B14C0; // type:object size:0x40 data:4byte LytBossGauge__STATE_MOVE = .bss:0x805B1500; // type:object size:0x40 data:4byte LytBossGauge__STATE_OUT = .bss:0x805B1540; // type:object size:0x30 data:4byte -lbl_805B1570 = .bss:0x805B1570; // type:object size:0x10 -LytPauseBack__STATE_NONE = .bss:0x805B1580; // type:object size:0x40 data:4byte -LytPauseBack__STATE_IN = .bss:0x805B15C0; // type:object size:0x40 data:4byte -LytPauseBack__STATE_WAIT = .bss:0x805B1600; // type:object size:0x40 data:4byte -LytPauseBack__STATE_OUT = .bss:0x805B1640; // type:object size:0x30 data:4byte +@20985 = .bss:0x805B1570; // type:object size:0xC scope:local +...bss.0 = .bss:0x805B1570; // type:label scope:local +StateID_None__15dLytPauseBack_c = .bss:0x805B1580; // type:object size:0x30 data:4byte +@20989 = .bss:0x805B15B0; // type:object size:0xC scope:local +StateID_In__15dLytPauseBack_c = .bss:0x805B15C0; // type:object size:0x30 data:4byte +@20993 = .bss:0x805B15F0; // type:object size:0xC scope:local +StateID_Wait__15dLytPauseBack_c = .bss:0x805B1600; // type:object size:0x30 data:4byte +@20997 = .bss:0x805B1630; // type:object size:0xC scope:local +StateID_Out__15dLytPauseBack_c = .bss:0x805B1640; // type:object size:0x30 data:4byte lbl_805B1670 = .bss:0x805B1670; // type:object size:0x10 LytPauseDisp00__STATE_NONE = .bss:0x805B1680; // type:object size:0x40 data:4byte LytPauseDisp00__STATE_IN = .bss:0x805B16C0; // type:object size:0x40 data:4byte diff --git a/configure.py b/configure.py index 35fc5caf..fb558d74 100644 --- a/configure.py +++ b/configure.py @@ -545,7 +545,7 @@ config.libs = [ Object(NonMatching, "d/lyt/d_lyt_deposit_stock.cpp"), Object(NonMatching, "d/lyt/d_lyt_deposit_box.cpp"), Object(NonMatching, "d/lyt/d_lyt_boss_gauge.cpp"), - Object(NonMatching, "d/lyt/d_lyt_pause_back.cpp"), + Object(Matching, "d/lyt/d_lyt_pause_back.cpp"), Object(NonMatching, "d/lyt/d_lyt_pause_disp_00.cpp"), Object(NonMatching, "d/lyt/d_lyt_pause_disp_01.cpp"), Object(NonMatching, "d/lyt/d_lyt_pause_info.cpp"), diff --git a/include/d/d_stage_mgr.h b/include/d/d_stage_mgr.h index 49e97c78..57aad744 100644 --- a/include/d/d_stage_mgr.h +++ b/include/d/d_stage_mgr.h @@ -7,6 +7,7 @@ #include "d/d_bzs_types.h" #include "d/d_dylink.h" #include "d/d_fader.h" +#include "egg/gfx/eggCpuTexture.h" #include "egg/gfx/eggScreen.h" #include "m/m_allocator.h" #include "m/m_dvd.h" @@ -78,6 +79,10 @@ public: return sInstance; } + EGG::CpuTexture *getField_0x8898() { + return field_0x8898; + } + bool checkFlag0x88A0(u32 flag) const { return (field_0x88A0 & flag) != 0; } @@ -190,7 +195,10 @@ private: /* 0x8694 */ dTimeAreaMgr_c mTimeAreaMgr; // ... - u8 ___[446]; + u8 ___[438]; + /* 0x8898 */ EGG::CpuTexture *field_0x8898; + + u8 _0x889C[4]; /* 0x88A0 */ u32 field_0x88A0; /* 0x88A4 */ SizedString<16> mDemoName; diff --git a/include/d/lyt/d_lyt_pause.h b/include/d/lyt/d_lyt_pause.h new file mode 100644 index 00000000..ca02dcc1 --- /dev/null +++ b/include/d/lyt/d_lyt_pause.h @@ -0,0 +1,31 @@ +#ifndef D_LYT_PAUSE_H +#define D_LYT_PAUSE_H + +#include "d/lyt/d2d.h" +#include "egg/gfx/eggCpuTexture.h" + +class dLytPauseMgr_c { +public: + static dLytPauseMgr_c *GetInstance() { + return sInstance; + } + + d2d::ResAccIf_c *getResAcc1() { + return &mResAcc1; + } + + EGG::CpuTexture *getBgTexture() { + return mpBgTexture; + } + +private: + static dLytPauseMgr_c *sInstance; + + /* 0x0000 */ u8 _0x0000[0x00C8 - 0x0000]; + /* 0x00C8 */ d2d::ResAccIf_c mResAcc1; + /* 0x0438 */ u8 _0x0438[0x0814 - 0x0438]; + + /* 0x0814 */ EGG::CpuTexture *mpBgTexture; +}; + +#endif diff --git a/include/d/lyt/d_lyt_pause_back.h b/include/d/lyt/d_lyt_pause_back.h new file mode 100644 index 00000000..9085f6f0 --- /dev/null +++ b/include/d/lyt/d_lyt_pause_back.h @@ -0,0 +1,41 @@ +#ifndef D_LYT_PAUSE_BACK_H +#define D_LYT_PAUSE_BACK_H + +#include "d/lyt/d2d.h" +#include "s/s_State.hpp" + +class dLytPauseBack_c { +public: + dLytPauseBack_c(); + virtual ~dLytPauseBack_c() {} + + bool build(); + bool remove(); + bool execute(); + bool draw(); + + void loadBgTexture(); + void requestIn(); + void requestOut(); + +private: + void startAnim(int idx); + void stopAnim(int idx); + + STATE_FUNC_DECLARE(dLytPauseBack_c, None); + STATE_FUNC_DECLARE(dLytPauseBack_c, In); + STATE_FUNC_DECLARE(dLytPauseBack_c, Wait); + STATE_FUNC_DECLARE(dLytPauseBack_c, Out); + + /* 0x004 */ UI_STATE_MGR_DECLARE(dLytPauseBack_c); + /* 0x040 */ d2d::LytBase_c mLyt; + /* 0x0D0 */ d2d::AnmGroup_c mAnm[2]; + + /* 0x150 */ s32 mOutStep; + /* 0x154 */ bool mInRequest; + /* 0x155 */ bool mOutRequest; + /* 0x156 */ bool field_0x156; + /* 0x157 */ bool mVisible; +}; + +#endif diff --git a/src/d/lyt/d_lyt_pause_back.cpp b/src/d/lyt/d_lyt_pause_back.cpp new file mode 100644 index 00000000..c2070a61 --- /dev/null +++ b/src/d/lyt/d_lyt_pause_back.cpp @@ -0,0 +1,159 @@ +#include "d/lyt/d_lyt_pause_back.h" + +#include "common.h" +#include "d/d_stage_mgr.h" +#include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_pause.h" +#include "rvl/GX/GXTexture.h" + +STATE_DEFINE(dLytPauseBack_c, None); +STATE_DEFINE(dLytPauseBack_c, In); +STATE_DEFINE(dLytPauseBack_c, Wait); +STATE_DEFINE(dLytPauseBack_c, Out); + +static const d2d::LytBrlanMapping brlanMap[] = { + { "pauseBace_00_in.brlan", "G_inOut_00"}, + {"pauseBace_00_out.brlan", "G_inOut_00"}, +}; + +#define PAUSE_BACK_ANIM_IN 0 +#define PAUSE_BACK_ANIM_OUT 1 + +#define PAUSE_BACK_NUM_ANIMS 2 + +dLytPauseBack_c::dLytPauseBack_c() : mStateMgr(*this) {} + +bool dLytPauseBack_c::build() { + d2d::ResAccIf_c *resAcc = dLytPauseMgr_c::GetInstance()->getResAcc1(); + mLyt.setResAcc(resAcc); + mLyt.build("pauseBace_00.brlyt", nullptr); + mLyt.setPriority(0x86); + + for (int i = 0; i < PAUSE_BACK_NUM_ANIMS; i++) { + mAnm[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName); + } + + mStateMgr.changeState(StateID_None); + return true; +} + +bool dLytPauseBack_c::remove() { + mLyt.unbindAnims(); + for (int i = 0; i < PAUSE_BACK_NUM_ANIMS; i++) { + mAnm[i].remove(); + } + return true; +} + +bool dLytPauseBack_c::execute() { + mStateMgr.executeState(); + mLyt.calc(); + return true; +} + +bool dLytPauseBack_c::draw() { + if (mVisible == true) { + mLyt.addToDrawList(); + } + return true; +} + +void dLytPauseBack_c::requestIn() { + mInRequest = true; +} + +void dLytPauseBack_c::requestOut() { + mOutRequest = true; +} + +void dLytPauseBack_c::initializeState_None() { + mLyt.unbindAnims(); + field_0x156 = false; + mInRequest = false; + mOutRequest = false; + mVisible = false; + mOutStep = 0; +} +void dLytPauseBack_c::executeState_None() { + if (mInRequest == true) { + mInRequest = false; + mStateMgr.changeState(StateID_In); + } +} +void dLytPauseBack_c::finalizeState_None() {} + +void dLytPauseBack_c::initializeState_In() { + startAnim(PAUSE_BACK_ANIM_IN); + mVisible = true; + if (dStageMgr_c::GetInstance()->getField_0x8898() != nullptr) { + GXTexObj texObj; + dStageMgr_c::GetInstance()->getField_0x8898()->getTexObj(&texObj); + mLyt.findPicture("P_capture_00")->GetMaterial()->GetTexMapAry()->ReplaceImage(texObj); + mLyt.findPicture("P_capture_01")->GetMaterial()->GetTexMapAry()->ReplaceImage(texObj); + } +} +void dLytPauseBack_c::executeState_In() { + d2d::AnmGroup_c &anm = mAnm[PAUSE_BACK_ANIM_IN]; + if (anm.isEndReached() == true) { + mStateMgr.changeState(StateID_Wait); + } else { + anm.play(); + } +} +void dLytPauseBack_c::finalizeState_In() {} + +void dLytPauseBack_c::initializeState_Wait() { + field_0x156 = true; +} +void dLytPauseBack_c::executeState_Wait() { + field_0x156 = false; + if (mOutRequest == true) { + mOutRequest = false; + mStateMgr.changeState(StateID_Out); + } +} +void dLytPauseBack_c::finalizeState_Wait() {} + +void dLytPauseBack_c::initializeState_Out() { + stopAnim(PAUSE_BACK_ANIM_IN); + startAnim(PAUSE_BACK_ANIM_OUT); + mOutStep = 0; +} +void dLytPauseBack_c::executeState_Out() { + d2d::AnmGroup_c &anm = mAnm[PAUSE_BACK_ANIM_OUT]; + switch (mOutStep) { + case 0: { + if (anm.isEndReached() == true) { + mOutStep = 1; + field_0x156 = true; + } + break; + } + case 1: { + mStateMgr.changeState(StateID_None); + return; + } + } + anm.play(); +} +void dLytPauseBack_c::finalizeState_Out() {} + +void dLytPauseBack_c::startAnim(int idx) { + d2d::AnmGroup_c &anm = mAnm[idx]; + anm.bind(false); + anm.setFrame(0.0f); +} + +void dLytPauseBack_c::stopAnim(int idx) { + d2d::AnmGroup_c &anm = mAnm[idx]; + anm.unbind(); +} + +void dLytPauseBack_c::loadBgTexture() { + if (dLytPauseMgr_c::GetInstance()->getBgTexture() != nullptr) { + GXTexObj texObj; + dLytPauseMgr_c::GetInstance()->getBgTexture()->getTexObj(&texObj); + mLyt.findPicture("P_capture_00")->GetMaterial()->GetTexMapAry()->ReplaceImage(texObj); + mLyt.findPicture("P_capture_01")->GetMaterial()->GetTexMapAry()->ReplaceImage(texObj); + } +} From 402586bf5248a703934bd3cbcdc37c5285ec2fe3 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 3 Aug 2025 15:51:20 +0200 Subject: [PATCH 02/14] d_lyt_common_title OK --- config/SOUE01/symbols.txt | 224 ++++++------ configure.py | 2 +- include/d/lyt/d_lyt_common_title.h | 63 ++++ include/d/lyt/d_lyt_control_game.h | 7 +- include/sized_string.h | 4 + src/REL/d/d_s_boot.cpp | 6 +- src/d/lyt/d_lyt_common_title.cpp | 525 +++++++++++++++++++++++++++++ 7 files changed, 732 insertions(+), 99 deletions(-) create mode 100644 include/d/lyt/d_lyt_common_title.h create mode 100644 src/d/lyt/d_lyt_common_title.cpp diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 125ddcb9..ed6077a8 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -8957,11 +8957,11 @@ fn_80162230 = .text:0x80162230; // type:function size:0x58 fn_80162290 = .text:0x80162290; // type:function size:0xEC fn_80162380 = .text:0x80162380; // type:function size:0x10 fn_80162390 = .text:0x80162390; // type:function size:0x98 -fn_80162430 = .text:0x80162430; // type:function size:0x104 -fn_80162540 = .text:0x80162540; // type:function size:0xA4 -fn_801625F0 = .text:0x801625F0; // type:function size:0xA0 -fn_80162690 = .text:0x80162690; // type:function size:0x6C -fn_80162700 = .text:0x80162700; // type:function size:0x58 +__dt__17dLytCommonTitle_cFv = .text:0x80162430; // type:function size:0x104 +__dt__56sFStateMgr_c<17dLytCommonTitle_c,20sStateMethodUsr_FI_c>Fv = .text:0x80162540; // type:function size:0xA4 +__dt__86sStateMgr_c<17dLytCommonTitle_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801625F0; // type:function size:0xA0 +__dt__33sFStateFct_c<17dLytCommonTitle_c>Fv = .text:0x80162690; // type:function size:0x6C +__dt__30sFState_c<17dLytCommonTitle_c>Fv = .text:0x80162700; // type:function size:0x58 fn_80162760 = .text:0x80162760; // type:function size:0xC4 fn_80162830 = .text:0x80162830; // type:function size:0x10 fn_80162840 = .text:0x80162840; // type:function size:0x10 @@ -9249,58 +9249,58 @@ initializeState__32sFStateID_c<17dLytCommonArrow_c>CFR17dLytCommonArrow_c = .tex __sinit_\d_lyt_common_arrow_cpp = .text:0x801691C0; // type:function size:0x338 scope:local __dt__32sFStateID_c<17dLytCommonArrow_c>Fv = .text:0x80169500; // type:function size:0x58 scope:weak isSameName__32sFStateID_c<17dLytCommonArrow_c>CFPCc = .text:0x80169560; // type:function size:0x88 scope:weak -fn_801695F0 = .text:0x801695F0; // type:function size:0x110 -fn_80169700 = .text:0x80169700; // type:function size:0xF4 -fn_80169800 = .text:0x80169800; // type:function size:0x10 -fn_80169810 = .text:0x80169810; // type:function size:0x6C -fn_80169880 = .text:0x80169880; // type:function size:0xC4 -fn_80169950 = .text:0x80169950; // type:function size:0x10 -fn_80169960 = .text:0x80169960; // type:function size:0x10 -fn_80169970 = .text:0x80169970; // type:function size:0x34 -fn_801699B0 = .text:0x801699B0; // type:function size:0x1B4 -fn_80169B70 = .text:0x80169B70; // type:function size:0x60 -fn_80169BD0 = .text:0x80169BD0; // type:function size:0x60 -fn_80169C30 = .text:0x80169C30; // type:function size:0x60 -fn_80169C90 = .text:0x80169C90; // type:function size:0x18 -LytCommonTitle__stateNoneEnter = .text:0x80169CB0; // type:function size:0xA8 -LytCommonTitle__stateNoneUpdate = .text:0x80169D60; // type:function size:0x28 -LytCommonTitle__stateNoneLeave = .text:0x80169D90; // type:function size:0x44 -LytCommonTitle__stateInEnter = .text:0x80169DE0; // type:function size:0xD8 -LytCommonTitle__stateInUpdate = .text:0x80169EC0; // type:function size:0x128 -LytCommonTitle__stateInLeave = .text:0x80169FF0; // type:function size:0x64 -LytCommonTitle__stateWaitEnter = .text:0x8016A060; // type:function size:0x10 -LytCommonTitle__stateWaitUpdate = .text:0x8016A070; // type:function size:0x170 -LytCommonTitle__stateWaitLeave = .text:0x8016A1E0; // type:function size:0xC -LytCommonTitle__stateOutEnter = .text:0x8016A1F0; // type:function size:0x10 -LytCommonTitle__stateOutUpdate = .text:0x8016A200; // type:function size:0xA8 -LytCommonTitle__stateOutLeave = .text:0x8016A2B0; // type:function size:0x4 -LytCommonTitle__stateChangeEnter = .text:0x8016A2C0; // type:function size:0x74 -LytCommonTitle__stateChangeUpdate = .text:0x8016A340; // type:function size:0x1D8 -LytCommonTitle__stateChangeLeave = .text:0x8016A520; // type:function size:0x48 -fn_8016A570 = .text:0x8016A570; // type:function size:0x50 -fn_8016A5C0 = .text:0x8016A5C0; // type:function size:0x10 -fn_8016A5D0 = .text:0x8016A5D0; // type:function size:0x64 -fn_8016A640 = .text:0x8016A640; // type:function size:0x54 -fn_8016A6A0 = .text:0x8016A6A0; // type:function size:0x98 -fn_8016A740 = .text:0x8016A740; // type:function size:0x1E0 -fn_8016A920 = .text:0x8016A920; // type:function size:0x2D4 -fn_8016AC00 = .text:0x8016AC00; // type:function size:0x60 -fn_8016AC60 = .text:0x8016AC60; // type:function size:0xC -fn_8016AC70 = .text:0x8016AC70; // type:function size:0x1C -fn_8016AC90 = .text:0x8016AC90; // type:function size:0x1C -fn_8016ACB0 = .text:0x8016ACB0; // type:function size:0x1C -fn_8016ACD0 = .text:0x8016ACD0; // type:function size:0x10 -fn_8016ACE0 = .text:0x8016ACE0; // type:function size:0x10 -fn_8016ACF0 = .text:0x8016ACF0; // type:function size:0x10 -fn_8016AD00 = .text:0x8016AD00; // type:function size:0x10 -fn_8016AD10 = .text:0x8016AD10; // type:function size:0x10 -fn_8016AD20 = .text:0x8016AD20; // type:function size:0x10 -fn_8016AD30 = .text:0x8016AD30; // type:function size:0x30 -fn_8016AD60 = .text:0x8016AD60; // type:function size:0x30 -fn_8016AD90 = .text:0x8016AD90; // type:function size:0x30 -LytCommonTitle__initStates = .text:0x8016ADC0; // type:function size:0x3F4 -LytCommonTitle__state_dtor = .text:0x8016B1C0; // type:function size:0x58 -fn_8016B220 = .text:0x8016B220; // type:function size:0x88 +__ct__17dLytCommonTitle_cFv = .text:0x801695F0; // type:function size:0x110 +build__17dLytCommonTitle_cFv = .text:0x80169700; // type:function size:0xF4 +changeState__86sStateMgr_c<17dLytCommonTitle_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x80169800; // type:function size:0x10 scope:weak +remove__17dLytCommonTitle_cFv = .text:0x80169810; // type:function size:0x6C +execute__17dLytCommonTitle_cFv = .text:0x80169880; // type:function size:0xC4 +executeState__86sStateMgr_c<17dLytCommonTitle_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80169950; // type:function size:0x10 scope:weak +getStateID__86sStateMgr_c<17dLytCommonTitle_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80169960; // type:function size:0x10 scope:weak +draw__17dLytCommonTitle_cFv = .text:0x80169970; // type:function size:0x34 +set__17dLytCommonTitle_cFlPCcPCc = .text:0x801699B0; // type:function size:0x1B4 +setSubTitle__17dLytCommonTitle_cFl = .text:0x80169B70; // type:function size:0x60 +setSysTitle__17dLytCommonTitle_cFl = .text:0x80169BD0; // type:function size:0x60 +setSysCaption__17dLytCommonTitle_cFl = .text:0x80169C30; // type:function size:0x60 +gotoStateNone__17dLytCommonTitle_cFv = .text:0x80169C90; // type:function size:0x18 +initializeState_None__17dLytCommonTitle_cFv = .text:0x80169CB0; // type:function size:0xA8 +executeState_None__17dLytCommonTitle_cFv = .text:0x80169D60; // type:function size:0x28 +finalizeState_None__17dLytCommonTitle_cFv = .text:0x80169D90; // type:function size:0x44 +initializeState_In__17dLytCommonTitle_cFv = .text:0x80169DE0; // type:function size:0xD8 +executeState_In__17dLytCommonTitle_cFv = .text:0x80169EC0; // type:function size:0x128 +finalizeState_In__17dLytCommonTitle_cFv = .text:0x80169FF0; // type:function size:0x64 +initializeState_Wait__17dLytCommonTitle_cFv = .text:0x8016A060; // type:function size:0x10 +executeState_Wait__17dLytCommonTitle_cFv = .text:0x8016A070; // type:function size:0x170 +finalizeState_Wait__17dLytCommonTitle_cFv = .text:0x8016A1E0; // type:function size:0xC +initializeState_Out__17dLytCommonTitle_cFv = .text:0x8016A1F0; // type:function size:0x10 +executeState_Out__17dLytCommonTitle_cFv = .text:0x8016A200; // type:function size:0xA8 +finalizeState_Out__17dLytCommonTitle_cFv = .text:0x8016A2B0; // type:function size:0x4 +initializeState_Change__17dLytCommonTitle_cFv = .text:0x8016A2C0; // type:function size:0x74 +executeState_Change__17dLytCommonTitle_cFv = .text:0x8016A340; // type:function size:0x1D8 +finalizeState_Change__17dLytCommonTitle_cFv = .text:0x8016A520; // type:function size:0x48 +startAnim__17dLytCommonTitle_cFi = .text:0x8016A570; // type:function size:0x50 +stopAnim__17dLytCommonTitle_cFi = .text:0x8016A5C0; // type:function size:0x10 +playBackwards__17dLytCommonTitle_cFRQ23d2d10AnmGroup_c = .text:0x8016A5D0; // type:function size:0x64 +applyText__17dLytCommonTitle_cFv = .text:0x8016A640; // type:function size:0x54 +applyTextChange__17dLytCommonTitle_cFl = .text:0x8016A6A0; // type:function size:0x98 +applyTitle__17dLytCommonTitle_cFl = .text:0x8016A740; // type:function size:0x1E0 +applyCaption__17dLytCommonTitle_cFl = .text:0x8016A920; // type:function size:0x2D4 +build__33sFStateFct_c<17dLytCommonTitle_c>FRC12sStateIDIf_c = .text:0x8016AC00; // type:function size:0x60 scope:weak +dispose__33sFStateFct_c<17dLytCommonTitle_c>FRP10sStateIf_c = .text:0x8016AC60; // type:function size:0xC scope:weak +initialize__30sFState_c<17dLytCommonTitle_c>Fv = .text:0x8016AC70; // type:function size:0x1C scope:weak +execute__30sFState_c<17dLytCommonTitle_c>Fv = .text:0x8016AC90; // type:function size:0x1C scope:weak +finalize__30sFState_c<17dLytCommonTitle_c>Fv = .text:0x8016ACB0; // type:function size:0x1C scope:weak +initializeState__86sStateMgr_c<17dLytCommonTitle_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8016ACD0; // type:function size:0x10 scope:weak +finalizeState__86sStateMgr_c<17dLytCommonTitle_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8016ACE0; // type:function size:0x10 scope:weak +refreshState__86sStateMgr_c<17dLytCommonTitle_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8016ACF0; // type:function size:0x10 scope:weak +getState__86sStateMgr_c<17dLytCommonTitle_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8016AD00; // type:function size:0x10 scope:weak +getNewStateID__86sStateMgr_c<17dLytCommonTitle_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8016AD10; // type:function size:0x10 scope:weak +getOldStateID__86sStateMgr_c<17dLytCommonTitle_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8016AD20; // type:function size:0x10 scope:weak +finalizeState__32sFStateID_c<17dLytCommonTitle_c>CFR17dLytCommonTitle_c = .text:0x8016AD30; // type:function size:0x30 scope:weak +executeState__32sFStateID_c<17dLytCommonTitle_c>CFR17dLytCommonTitle_c = .text:0x8016AD60; // type:function size:0x30 scope:weak +initializeState__32sFStateID_c<17dLytCommonTitle_c>CFR17dLytCommonTitle_c = .text:0x8016AD90; // type:function size:0x30 scope:weak +__sinit_\d_lyt_common_title_cpp = .text:0x8016ADC0; // type:function size:0x3F4 scope:local +__dt__32sFStateID_c<17dLytCommonTitle_c>Fv = .text:0x8016B1C0; // type:function size:0x58 scope:weak +isSameName__32sFStateID_c<17dLytCommonTitle_c>CFPCc = .text:0x8016B220; // type:function size:0x88 scope:weak build__17dLytCursorStick_cFv = .text:0x8016B2B0; // type:function size:0x28 remove__17dLytCursorStick_cFv = .text:0x8016B2E0; // type:function size:0x38 execute__17dLytCursorStick_cFv = .text:0x8016B320; // type:function size:0x30 @@ -28366,7 +28366,7 @@ WALLET_ITEM_IDS = .rodata:0x804E8CF8; // type:object size:0x10 lbl_804E8D08 = .rodata:0x804E8D08; // type:object size:0x10 lbl_804E8D18 = .rodata:0x804E8D18; // type:object size:0x10 brlanMap = .rodata:0x804E8D28; // type:object size:0x48 scope:local data:4byte -lbl_804E8D70 = .rodata:0x804E8D70; // type:object size:0x40 data:4byte +brlanMap = .rodata:0x804E8D70; // type:object size:0x40 scope:local data:4byte ITEM_TO_MODEL_INDEX = .rodata:0x804E8DB0; // type:object size:0x400 @8849 = .rodata:0x804E91B0; // type:object size:0x20 scope:local data:4byte MODEL_ID_TO_PUT_ITEM_MODEL_IDX = .rodata:0x804E91D0; // type:object size:0xA8 @@ -34672,31 +34672,62 @@ __vt__30sFState_c<17dLytCommonArrow_c> = .data:0x80527460; // type:object size:0 @8410 = .data:0x80527588; // type:object size:0x20 scope:local data:string @8411 = .data:0x805275A8; // type:object size:0x1F scope:local data:string __vt__32sFStateID_c<17dLytCommonArrow_c> = .data:0x805275C8; // type:object size:0x34 scope:weak -lbl_80527600 = .data:0x80527600; // type:object size:0x18 data:string -lbl_80527618 = .data:0x80527618; // type:object size:0xC -lbl_80527624 = .data:0x80527624; // type:object size:0x1C -lbl_80527640 = .data:0x80527640; // type:object size:0x1C -lbl_8052765C = .data:0x8052765C; // type:object size:0xC -lbl_80527668 = .data:0x80527668; // type:object size:0x28 -lbl_80527690 = .data:0x80527690; // type:object size:0x10 data:string -lbl_805276A0 = .data:0x805276A0; // type:object size:0x1C data:string -lbl_805276BC = .data:0x805276BC; // type:object size:0x10 -lbl_805276CC = .data:0x805276CC; // type:object size:0x24 -lbl_805276F0 = .data:0x805276F0; // type:object size:0x20 data:string -lbl_80527710 = .data:0x80527710; // type:object size:0x1C -lbl_8052772C = .data:0x8052772C; // type:object size:0xC -lbl_80527738 = .data:0x80527738; // type:object size:0xC -lbl_80527744 = .data:0x80527744; // type:object size:0x18 -lbl_8052775C = .data:0x8052775C; // type:object size:0x10 -lbl_8052776C = .data:0x8052776C; // type:object size:0x10 -lbl_8052777C = .data:0x8052777C; // type:object size:0x14 -lbl_80527790 = .data:0x80527790; // type:object size:0xB4 -LytCommonTitle__vtable = .data:0x80527844; // type:object size:0xC -lbl_80527850 = .data:0x80527850; // type:object size:0x30 -lbl_80527880 = .data:0x80527880; // type:object size:0x30 -lbl_805278B0 = .data:0x805278B0; // type:object size:0x18 -lbl_805278C8 = .data:0x805278C8; // type:object size:0x19C -lbl_80527A64 = .data:0x80527A64; // type:object size:0x34 +@12144 = .data:0x80527600; // type:object size:0x18 scope:local data:string +...data.0 = .data:0x80527600; // type:label scope:local +@12145 = .data:0x80527618; // type:object size:0xB scope:local data:string +@12146 = .data:0x80527624; // type:object size:0x19 scope:local data:string +@12147 = .data:0x80527640; // type:object size:0x1A scope:local data:string +@12148 = .data:0x8052765C; // type:object size:0xA scope:local data:string +@12149 = .data:0x80527668; // type:object size:0x21 scope:local data:string +@12150 = .data:0x80527690; // type:object size:0x10 scope:local data:string +@12151 = .data:0x805276A0; // type:object size:0x1C scope:local data:string +@12152 = .data:0x805276BC; // type:object size:0xF scope:local data:string +@12153 = .data:0x805276CC; // type:object size:0x1D scope:local data:string +@12154 = .data:0x805276F0; // type:object size:0x20 scope:local data:string +@12155 = .data:0x80527710; // type:object size:0x1B scope:local data:string +@12156 = .data:0x8052772C; // type:object size:0xB scope:local data:string +@13196 = .data:0x80527738; // type:object size:0x9 scope:local data:string +@13198 = .data:0x80527744; // type:object size:0x15 scope:local data:string +@13238 = .data:0x8052775C; // type:object size:0xF scope:local data:string +@13248 = .data:0x8052776C; // type:object size:0xF scope:local data:string +@13254 = .data:0x8052777C; // type:object size:0x11 scope:local data:string +@13265 = .data:0x80527790; // type:object size:0xA scope:local data:string +@13424 = .data:0x8052779C; // type:object size:0xF scope:local data:string +@13425 = .data:0x805277B0; // type:object size:0x10 scope:local data:string +@13426 = .data:0x805277C0; // type:object size:0xF scope:local data:string +@13427 = .data:0x805277D0; // type:object size:0x10 scope:local data:string +@13452 = .data:0x805277E0; // type:object size:0x10 scope:local data:string +@13453 = .data:0x805277F0; // type:object size:0x11 scope:local data:string +@13454 = .data:0x80527808; // type:object size:0x10 scope:local data:string +@13455 = .data:0x80527818; // type:object size:0x11 scope:local data:string +@13456 = .data:0x8052782C; // type:object size:0x9 scope:local data:string +@13457 = .data:0x80527838; // type:object size:0x9 scope:local data:string +__vt__17dLytCommonTitle_c = .data:0x80527844; // type:object size:0xC scope:weak +__vt__56sFStateMgr_c<17dLytCommonTitle_c,20sStateMethodUsr_FI_c> = .data:0x80527850; // type:object size:0x30 scope:weak +__vt__86sStateMgr_c<17dLytCommonTitle_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80527880; // type:object size:0x30 scope:weak +__vt__33sFStateFct_c<17dLytCommonTitle_c> = .data:0x805278B0; // type:object size:0x14 scope:weak +__vt__30sFState_c<17dLytCommonTitle_c> = .data:0x805278C8; // type:object size:0x18 scope:weak +@13509 = .data:0x8052790C; // type:object size:0xC scope:local +@13510 = .data:0x80527918; // type:object size:0xC scope:local +@13511 = .data:0x80527924; // type:object size:0xC scope:local +@13512 = .data:0x80527930; // type:object size:0xC scope:local +@13513 = .data:0x8052793C; // type:object size:0xC scope:local +@13514 = .data:0x80527948; // type:object size:0xC scope:local +@13515 = .data:0x80527954; // type:object size:0xC scope:local +@13516 = .data:0x80527960; // type:object size:0xC scope:local +@13517 = .data:0x8052796C; // type:object size:0xC scope:local +@13518 = .data:0x80527978; // type:object size:0xC scope:local +@13519 = .data:0x80527984; // type:object size:0xC scope:local +@13520 = .data:0x80527990; // type:object size:0xC scope:local +@13521 = .data:0x8052799C; // type:object size:0xC scope:local +@13522 = .data:0x805279A8; // type:object size:0xC scope:local +@13523 = .data:0x805279B4; // type:object size:0xC scope:local +@13525 = .data:0x805279C0; // type:object size:0x20 scope:local data:string +@13526 = .data:0x805279E0; // type:object size:0x1E scope:local data:string +@13527 = .data:0x80527A00; // type:object size:0x20 scope:local data:string +@13528 = .data:0x80527A20; // type:object size:0x1F scope:local data:string +@13529 = .data:0x80527A40; // type:object size:0x22 scope:local data:string +__vt__32sFStateID_c<17dLytCommonTitle_c> = .data:0x80527A64; // type:object size:0x34 scope:weak @11234 = .data:0x80527A98; // type:object size:0x1A scope:local data:string ...data.0 = .data:0x80527A98; // type:label scope:local @11235 = .data:0x80527AB4; // type:object size:0xA scope:local data:string @@ -39873,8 +39904,8 @@ lbl_805729C4 = .sdata:0x805729C4; // type:object size:0x4 sGroupName = .sdata:0x805729C8; // type:object size:0x4 scope:local data:4byte @10137 = .sdata:0x805729CC; // type:object size:0x1 scope:local @8185 = .sdata:0x805729D0; // type:object size:0x1 scope:local -lbl_805729D8 = .sdata:0x805729D8; // type:object size:0x4 -lbl_805729DC = .sdata:0x805729DC; // type:object size:0x4 +@13197 = .sdata:0x805729D8; // type:object size:0x1 scope:local +@13428 = .sdata:0x805729DC; // type:object size:0x2 scope:local @11237 = .sdata:0x805729E0; // type:object size:0x8 scope:local data:string @11238 = .sdata:0x805729E8; // type:object size:0x8 scope:local data:string @11239 = .sdata:0x805729F0; // type:object size:0x8 scope:local data:string @@ -45149,9 +45180,9 @@ TABLET_ITEM_IDS = .sdata2:0x8057A170; // type:object size:0x8 TRIFORCE_PIECE_ITEM_IDS = .sdata2:0x8057A178; // type:object size:0x8 data:wstring @8160 = .sdata2:0x8057A180; // type:object size:0x4 scope:local align:4 data:float @8161 = .sdata2:0x8057A184; // type:object size:0x4 scope:local align:4 data:float -lbl_8057A188 = .sdata2:0x8057A188; // type:object size:0x4 align:4 data:float -lbl_8057A18C = .sdata2:0x8057A18C; // type:object size:0x4 align:4 data:float -lbl_8057A190 = .sdata2:0x8057A190; // type:object size:0x4 align:4 data:float +@13176 = .sdata2:0x8057A188; // type:object size:0x4 scope:local align:4 data:float +@13177 = .sdata2:0x8057A18C; // type:object size:0x4 scope:local align:4 data:float +@13458 = .sdata2:0x8057A190; // type:object size:0x4 scope:local align:4 data:float brlanMap = .sdata2:0x8057A198; // type:object size:0x8 scope:local data:4byte @11660 = .sdata2:0x8057A1A0; // type:object size:0x4 scope:local align:4 data:float @11740 = .sdata2:0x8057A1A4; // type:object size:0x4 scope:local align:4 data:float @@ -51441,12 +51472,17 @@ StateID_In__17dLytCommonArrow_c = .bss:0x805B1D00; // type:object size:0x30 data StateID_Wait__17dLytCommonArrow_c = .bss:0x805B1D40; // type:object size:0x30 data:4byte @7260 = .bss:0x805B1D70; // type:object size:0xC scope:local StateID_Out__17dLytCommonArrow_c = .bss:0x805B1D80; // type:object size:0x30 data:4byte -lbl_805B1DB0 = .bss:0x805B1DB0; // type:object size:0x10 -LytCommonTitle__STATE_NONE = .bss:0x805B1DC0; // type:object size:0x40 data:4byte -LytCommonTitle__STATE_IN = .bss:0x805B1E00; // type:object size:0x40 data:4byte -LytCommonTitle__STATE_WAIT = .bss:0x805B1E40; // type:object size:0x40 data:4byte -LytCommonTitle__STATE_OUT = .bss:0x805B1E80; // type:object size:0x40 data:4byte -LytCommonTitle__STATE_CHANGE = .bss:0x805B1EC0; // type:object size:0x30 data:4byte +@12127 = .bss:0x805B1DB0; // type:object size:0xC scope:local +...bss.0 = .bss:0x805B1DB0; // type:label scope:local +StateID_None__17dLytCommonTitle_c = .bss:0x805B1DC0; // type:object size:0x30 data:4byte +@12131 = .bss:0x805B1DF0; // type:object size:0xC scope:local +StateID_In__17dLytCommonTitle_c = .bss:0x805B1E00; // type:object size:0x30 data:4byte +@12135 = .bss:0x805B1E30; // type:object size:0xC scope:local +StateID_Wait__17dLytCommonTitle_c = .bss:0x805B1E40; // type:object size:0x30 data:4byte +@12139 = .bss:0x805B1E70; // type:object size:0xC scope:local +StateID_Out__17dLytCommonTitle_c = .bss:0x805B1E80; // type:object size:0x30 data:4byte +@12143 = .bss:0x805B1EB0; // type:object size:0xC scope:local +StateID_Change__17dLytCommonTitle_c = .bss:0x805B1EC0; // type:object size:0x30 data:4byte @11229 = .bss:0x805B1EF0; // type:object size:0xC scope:local ...bss.0 = .bss:0x805B1EF0; // type:label scope:local StateID_Off__17dLytCursorStick_c = .bss:0x805B1F00; // type:object size:0x30 data:4byte diff --git a/configure.py b/configure.py index fb558d74..985e446c 100644 --- a/configure.py +++ b/configure.py @@ -553,7 +553,7 @@ config.libs = [ Object(Matching, "d/lyt/d_lyt_save_msg_window.cpp"), Object(NonMatching, "d/lyt/d_lyt_util_items.cpp"), Object(Matching, "d/lyt/d_lyt_common_arrow.cpp"), - Object(NonMatching, "d/lyt/d_lyt_common_title.cpp"), + Object(Matching, "d/lyt/d_lyt_common_title.cpp"), Object(Matching, "d/lyt/d_lyt_cursor_stick.cpp"), Object(Matching, "toBeSorted/fi_context.cpp"), Object(NonMatching, "toBeSorted/item_mdl_name.cpp"), diff --git a/include/d/lyt/d_lyt_common_title.h b/include/d/lyt/d_lyt_common_title.h new file mode 100644 index 00000000..9b2261fd --- /dev/null +++ b/include/d/lyt/d_lyt_common_title.h @@ -0,0 +1,63 @@ +#ifndef D_LYT_COMMON_TITLE_H +#define D_LYT_COMMON_TITLE_H + +#include "common.h" +#include "d/lyt/d2d.h" +#include "s/s_State.hpp" +#include "sized_string.h" + +class dLytCommonTitle_c { +public: + dLytCommonTitle_c(); + virtual ~dLytCommonTitle_c() {} + + bool build(); + bool remove(); + bool execute(); + bool draw(); + + bool set(s32 arg, const char *title, const char *caption); + const char *setSubTitle(s32 msgIdx); + const char *setSysTitle(s32 msgIdx); + const char *setSysCaption(s32 msgIdx); + +private: + void gotoStateNone(); + void startAnim(int idx); + void stopAnim(int idx); + void playBackwards(d2d::AnmGroup_c &anm); + + void applyText(); + void applyTextChange(s32 arg); + + void applyTitle(s32 arg); + void applyCaption(s32 arg); + + d2d::AnmGroup_c &getAnm(int idx) { + return mAnm[idx]; + } + + STATE_FUNC_DECLARE(dLytCommonTitle_c, None); + STATE_FUNC_DECLARE(dLytCommonTitle_c, In); + STATE_FUNC_DECLARE(dLytCommonTitle_c, Wait); + STATE_FUNC_DECLARE(dLytCommonTitle_c, Out); + STATE_FUNC_DECLARE(dLytCommonTitle_c, Change); + + /* 0x004 */ UI_STATE_MGR_DECLARE(dLytCommonTitle_c); + /* 0x040 */ d2d::LytBase_c mLyt; + /* 0x0D0 */ d2d::ResAccIf_c mResAcc; + /* 0x440 */ d2d::AnmGroup_c mAnm[8]; + /* 0x640 */ SizedString<0x20> mTitle; + /* 0x660 */ SizedString<0x20> mCaption; + + /* 0x680 */ UNKWORD field_0x680; + /* 0x680 */ UNKWORD field_0x684; + /* 0x688 */ s32 mStep; + /* 0x68C */ bool mChangeRequest; + /* 0x68D */ bool field_0x68D; + /* 0x68E */ bool mVisible; + /* 0x68F */ bool field_0x68F; + /* 0x690 */ bool field_0x690; +}; + +#endif diff --git a/include/d/lyt/d_lyt_control_game.h b/include/d/lyt/d_lyt_control_game.h index 1c43e800..31858c3e 100644 --- a/include/d/lyt/d_lyt_control_game.h +++ b/include/d/lyt/d_lyt_control_game.h @@ -21,6 +21,10 @@ public: return sInstance; } + bool getField_0x15C67() const { + return field_0x15C67; + } + STATE_FUNC_DECLARE(dLytControlGame_c, Normal); STATE_FUNC_DECLARE(dLytControlGame_c, Pause_SetRes); STATE_FUNC_DECLARE(dLytControlGame_c, Pause_SyncRes); @@ -37,7 +41,8 @@ public: private: /* 0x00068 */ UI_STATE_MGR_DECLARE(dLytControlGame_c); - + /* 0x000A4 */ u8 _0x000A4[0x15C67 - 0x000A4]; + /* 0x15C67 */ bool field_0x15C67; static dLytControlGame_c *sInstance; }; diff --git a/include/sized_string.h b/include/sized_string.h index 44e26ebe..3d67e74a 100644 --- a/include/sized_string.h +++ b/include/sized_string.h @@ -37,6 +37,10 @@ struct SizedString { return mChars; } + void empty() { + mChars[0] = '\0'; + } + void operator=(const char *src) { if (src != mChars) { mChars[0] = '\0'; diff --git a/src/REL/d/d_s_boot.cpp b/src/REL/d/d_s_boot.cpp index 0fcb4d24..c72c7fc2 100644 --- a/src/REL/d/d_s_boot.cpp +++ b/src/REL/d/d_s_boot.cpp @@ -327,9 +327,9 @@ void dScBoot_c::drawCallback() { dScBoot_c::strap_c::strap_c() { SizedString<8> str; u8 langNum = getUsedLanguageNTSCNum(); - mArcName.mChars[0] = '\0'; - mLytFileName.mChars[0] = '\0'; - mAnimFileName.mChars[0] = '\0'; + mArcName.empty(); + mLytFileName.empty(); + mAnimFileName.empty(); if (langNum == 3) { str = "F"; } else if (langNum == 4) { diff --git a/src/d/lyt/d_lyt_common_title.cpp b/src/d/lyt/d_lyt_common_title.cpp new file mode 100644 index 00000000..d24eb52d --- /dev/null +++ b/src/d/lyt/d_lyt_common_title.cpp @@ -0,0 +1,525 @@ +#include "d/lyt/d_lyt_common_title.h" + +#include "common.h" +#include "d/d_message.h" +#include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_control_game.h" +#include "d/lyt/d_textbox.h" +#include "d/lyt/d_window.h" +#include "toBeSorted/arc_managers/layout_arc_manager.h" + +#include + +STATE_DEFINE(dLytCommonTitle_c, None); +STATE_DEFINE(dLytCommonTitle_c, In); +STATE_DEFINE(dLytCommonTitle_c, Wait); +STATE_DEFINE(dLytCommonTitle_c, Out); +STATE_DEFINE(dLytCommonTitle_c, Change); + +static const d2d::LytBrlanMapping brlanMap[] = { + { "commonTitle_00_in.brlan", "G_inOut_00"}, + { "commonTitle_00_out.brlan", "G_inOut_00"}, + { "commonTitle_00_loop.brlan", "G_loop_00"}, + {"commonTitle_00_titleChange.brlan", "G_titleInOut_00"}, + { "commonTitle_00_textIn.brlan", "G_textInOut_00"}, + { "commonTitle_00_textOut.brlan", "G_textInOut_00"}, + { "commonTitle_00_textChange.brlan", "G_textInOut_00"}, + { "commonTitle_00_input.brlan", "G_input_00"}, +}; + +#define COMMON_TITLE_ANIM_IN 0 +#define COMMON_TITLE_ANIM_OUT 1 +#define COMMON_TITLE_ANIM_LOOP 2 +#define COMMON_TITLE_ANIM_TITLE_CHANGE 3 +#define COMMON_TITLE_ANIM_TEXT_IN 4 +#define COMMON_TITLE_ANIM_TEXT_OUT 5 +#define COMMON_TITLE_ANIM_TEXT_CHANGE 6 +#define COMMON_TITLE_ANIM_INPUT 7 + +#define COMMON_TITLE_NUM_ANIMS 8 + +dLytCommonTitle_c::dLytCommonTitle_c() : mStateMgr(*this) {} + +bool dLytCommonTitle_c::build() { + void *data = LayoutArcManager::GetInstance()->getLoadedData("DoButton"); + mResAcc.attach(data, ""); + mLyt.build("commonTitle_00.brlyt", &mResAcc); + mLyt.setPriority(0x86); + + for (int i = 0; i < COMMON_TITLE_NUM_ANIMS; i++) { + mAnm[i].init(brlanMap[i].mFile, &mResAcc, mLyt.getLayout(), brlanMap[i].mName); + } + + mStateMgr.changeState(StateID_None); + field_0x680 = 0; + field_0x690 = true; + return true; +} + +bool dLytCommonTitle_c::remove() { + mLyt.unbindAnims(); + for (int i = 0; i < COMMON_TITLE_NUM_ANIMS; i++) { + mAnm[i].remove(); + } + mResAcc.detach(); + return true; +} + +bool dLytCommonTitle_c::execute() { + mStateMgr.executeState(); + if (!(mStateMgr.getStateID()->isEqual(StateID_None))) { + mAnm[COMMON_TITLE_ANIM_LOOP].play(); + if (field_0x690 == true) { + playBackwards(mAnm[COMMON_TITLE_ANIM_INPUT]); + } else { + mAnm[COMMON_TITLE_ANIM_INPUT].play(); + } + } + mLyt.calc(); + return true; +} + +bool dLytCommonTitle_c::draw() { + if (mVisible == true) { + mLyt.addToDrawList(); + } + return true; +} + +bool dLytCommonTitle_c::set(s32 arg, const char *title, const char *caption) { + if (!(mStateMgr.getStateID()->isEqual(StateID_Wait)) && !(mStateMgr.getStateID()->isEqual(StateID_None))) { + return false; + } + + field_0x684 = arg; + + if (title != nullptr) { + mTitle = title; + } else { + mTitle.empty(); + } + + if (caption != nullptr) { + mCaption = caption; + } else { + mCaption.empty(); + } + + mChangeRequest = true; + return true; +} + +const char *dLytCommonTitle_c::setSubTitle(s32 msgIdx) { + const char *ret = nullptr; + mCaption.empty(); + if (msgIdx != 0 && msgIdx <= 2) { + // "Gear", "Collection" + mCaption.sprintf("SUB_TITLE_%02d", msgIdx); + ret = mCaption; + } + return ret; +} + +const char *dLytCommonTitle_c::setSysTitle(s32 msgIdx) { + const char *ret = nullptr; + mTitle.empty(); + if (msgIdx != 0 && msgIdx <= 2) { + // "Quest Logs", "Your Name" + mTitle.sprintf("SYS_TITLE_%02d", msgIdx); + ret = mTitle; + } + return ret; +} + +const char *dLytCommonTitle_c::setSysCaption(s32 msgIdx) { + const char *ret = nullptr; + mCaption.empty(); + if (msgIdx != 0 && msgIdx <= 5) { + // "Select a file.", ... + mCaption.sprintf("SYS_CAPTION_%02d", msgIdx); + ret = mCaption; + } + return ret; +} + +void dLytCommonTitle_c::gotoStateNone() { + mStateMgr.changeState(StateID_None); +} + +void dLytCommonTitle_c::initializeState_None() { + mLyt.unbindAnims(); + mChangeRequest = false; + field_0x68D = false; + mVisible = false; + field_0x684 = 0; + mStep = 0; + mTitle.empty(); + mCaption.empty(); + field_0x68F = 0; + if (dLytControlGame_c::getInstance()->getField_0x15C67()) { + mLyt.findPane("N_next_01")->SetVisible(false); + } else { + mLyt.findPane("N_next_01")->SetVisible(true); + } +} +void dLytCommonTitle_c::executeState_None() { + if (mChangeRequest == true) { + mStateMgr.changeState(StateID_In); + } +} +void dLytCommonTitle_c::finalizeState_None() { + mChangeRequest = false; + startAnim(COMMON_TITLE_ANIM_LOOP); + startAnim(COMMON_TITLE_ANIM_INPUT); +} + +void dLytCommonTitle_c::initializeState_In() { + mStep = 0; + startAnim(COMMON_TITLE_ANIM_IN); + startAnim(COMMON_TITLE_ANIM_TITLE_CHANGE); + if (field_0x680 == 0) { + mLyt.setPriority(0x80); + startAnim(COMMON_TITLE_ANIM_TEXT_IN); + } else { + startAnim(COMMON_TITLE_ANIM_TEXT_CHANGE); + getAnm(COMMON_TITLE_ANIM_TEXT_CHANGE).setToEnd(); + startAnim(COMMON_TITLE_ANIM_TEXT_OUT); + getAnm(COMMON_TITLE_ANIM_TEXT_OUT).setToEnd(); + } + mVisible = true; + applyText(); +} +void dLytCommonTitle_c::executeState_In() { + switch (mStep) { + case 0: { + d2d::AnmGroup_c &anm = mAnm[COMMON_TITLE_ANIM_IN]; + if (anm.isEndReached() == true) { + if (field_0x680 == 0) { + mStep = 1; + } else { + mStep = 10; + field_0x68D = true; + } + } else { + anm.play(); + } + break; + } + case 1: { + d2d::AnmGroup_c &anm = mAnm[COMMON_TITLE_ANIM_TEXT_IN]; + if (anm.isEndReached() == true) { + mStep = 10; + field_0x68D = true; + } + anm.play(); + break; + } + case 10: { + field_0x68D = false; + mStateMgr.changeState(StateID_Wait); + break; + } + } +} +void dLytCommonTitle_c::finalizeState_In() { + stopAnim(COMMON_TITLE_ANIM_TITLE_CHANGE); + stopAnim(COMMON_TITLE_ANIM_IN); + if (field_0x680 == 0) { + stopAnim(COMMON_TITLE_ANIM_TEXT_IN); + } else { + stopAnim(COMMON_TITLE_ANIM_TEXT_CHANGE); + } +} + +void dLytCommonTitle_c::initializeState_Wait() { + mStep = 0; + field_0x68F = false; +} +void dLytCommonTitle_c::executeState_Wait() { + if (field_0x680 == 1) { + if (std::strlen(mCaption) != 0) { + field_0x68F = true; + mAnm[COMMON_TITLE_ANIM_TEXT_OUT].setFrame(0.0f); + } else { + mAnm[COMMON_TITLE_ANIM_TEXT_OUT].play(); + if (field_0x68F == true && mAnm[COMMON_TITLE_ANIM_TEXT_OUT].isEndReached() == true) { + applyCaption(0); + field_0x68F = false; + } + } + } + + if (mChangeRequest == true) { + if (field_0x684 == 3) { + mStateMgr.changeState(StateID_Out); + } else if (field_0x680 == 0) { + mStateMgr.changeState(StateID_Change); + } else if (field_0x684 == 1) { + mStateMgr.changeState(StateID_Change); + } else { + mChangeRequest = false; + if (std::strlen(mCaption) != 0) { + applyCaption(0); + } + } + } +} +void dLytCommonTitle_c::finalizeState_Wait() { + mChangeRequest = false; +} + +void dLytCommonTitle_c::initializeState_Out() { + mStep = 0; + startAnim(COMMON_TITLE_ANIM_OUT); +} +void dLytCommonTitle_c::executeState_Out() { + d2d::AnmGroup_c &anm = mAnm[COMMON_TITLE_ANIM_OUT]; + switch (mStep) { + case 0: { + if (anm.isEndReached() == true) { + mStep = 1; + field_0x68D = true; + } + break; + } + case 1: { + mStateMgr.changeState(StateID_None); + return; + } + } + anm.play(); +} +void dLytCommonTitle_c::finalizeState_Out() {} + +void dLytCommonTitle_c::initializeState_Change() { + applyTextChange(0); + if (field_0x684 == 1) { + startAnim(COMMON_TITLE_ANIM_TITLE_CHANGE); + } + + if (field_0x680 == 0) { + mStep = 0; + startAnim(COMMON_TITLE_ANIM_TEXT_CHANGE); + } else { + mStep = 10; + } +} +void dLytCommonTitle_c::executeState_Change() { + switch (mStep) { + case 0: { + d2d::AnmGroup_c &anm = mAnm[COMMON_TITLE_ANIM_TEXT_CHANGE]; + if (anm.isEndReached() == true) { + mStep++; + } + anm.play(); + if (field_0x684 == 1) { + getAnm(COMMON_TITLE_ANIM_TITLE_CHANGE).play(); + } + break; + } + case 1: { + applyTextChange(1); + getAnm(COMMON_TITLE_ANIM_TEXT_CHANGE).setFrame(0.0f); + if (field_0x684 == 1) { + getAnm(COMMON_TITLE_ANIM_TITLE_CHANGE).setFrame(0.0f); + } + field_0x68D = true; + mStep++; + // fall-through + } + case 2: { + mStateMgr.changeState(StateID_Wait); + break; + } + case 10: { + d2d::AnmGroup_c &anm = mAnm[COMMON_TITLE_ANIM_TITLE_CHANGE]; + if (anm.isEndReached() == true) { + mStep++; + } + anm.play(); + break; + } + case 11: { + applyTextChange(1); + mAnm[COMMON_TITLE_ANIM_TITLE_CHANGE].setFrame(0.0f); + mAnm[COMMON_TITLE_ANIM_TEXT_OUT].setToEnd(); + mStep = 2; + field_0x68D = true; + break; + } + } +} +void dLytCommonTitle_c::finalizeState_Change() { + stopAnim(COMMON_TITLE_ANIM_TEXT_CHANGE); + if (field_0x684 == 1) { + stopAnim(COMMON_TITLE_ANIM_TITLE_CHANGE); + } +} + +void dLytCommonTitle_c::startAnim(int idx) { + d2d::AnmGroup_c &anm = mAnm[idx]; + anm.bind(false); + anm.setFrame(0.0f); +} + +void dLytCommonTitle_c::stopAnim(int idx) { + d2d::AnmGroup_c &anm = mAnm[idx]; + anm.unbind(); +} + +void dLytCommonTitle_c::playBackwards(d2d::AnmGroup_c &anm) { + f32 frame = anm.getFrame(); + if (frame) { + frame -= 1.0f; + if (frame <= 0.0f) { + frame = 0.0f; + } + anm.setFrame(frame); + } +} + +void dLytCommonTitle_c::applyText() { + if (field_0x684 == 2) { + applyCaption(0); + } else { + applyTitle(0); + applyCaption(0); + } +} + +void dLytCommonTitle_c::applyTextChange(s32 arg) { + switch (arg) { + case 0: { + if (field_0x684 == 2) { + applyCaption(1); + } else { + applyTitle(1); + applyCaption(1); + } + break; + } + case 1: { + if (field_0x684 == 2) { + applyCaption(2); + } else { + applyTitle(2); + applyCaption(2); + } + break; + } + } +} + +void dLytCommonTitle_c::applyTitle(s32 arg) { + dTextBox_c *mainTitle0 = mLyt.getTextBox("T_mainTitle_00"); + dTextBox_c *mainTitleS0 = mLyt.getTextBox("T_mainTitleS_00"); + dTextBox_c *mainTitle1 = mLyt.getTextBox("T_mainTitle_01"); + dTextBox_c *mainTitleS1 = mLyt.getTextBox("T_mainTitleS_01"); + + switch (arg) { + case 0: { + if (std::strlen(mTitle) != 0) { + const wchar_t *text = dMessage_c::getTextMessageByLabel(mTitle, true, nullptr, 0); + mainTitle0->setTextWithGlobalTextProcessor(text); + mainTitleS0->setTextWithGlobalTextProcessor(text); + mainTitle1->setTextWithGlobalTextProcessor(text); + mainTitleS1->setTextWithGlobalTextProcessor(text); + } else { + mainTitle0->setTextWithGlobalTextProcessor(L""); + mainTitleS0->setTextWithGlobalTextProcessor(L""); + mainTitle1->setTextWithGlobalTextProcessor(L""); + mainTitleS1->setTextWithGlobalTextProcessor(L""); + } + // @bug missing break, ends up doing duplicate work + // break; + } + case 1: { + if (std::strlen(mTitle) != 0) { + const wchar_t *text = dMessage_c::getTextMessageByLabel(mTitle, true, nullptr, 0); + mainTitle0->setTextWithGlobalTextProcessor(text); + mainTitleS0->setTextWithGlobalTextProcessor(text); + } else { + mainTitle0->setTextWithGlobalTextProcessor(L""); + mainTitleS0->setTextWithGlobalTextProcessor(L""); + } + break; + } + case 2: { + if (std::strlen(mTitle) != 0) { + const wchar_t *text = dMessage_c::getTextMessageByLabel(mTitle, true, nullptr, 0); + mainTitle1->setTextWithGlobalTextProcessor(text); + mainTitleS1->setTextWithGlobalTextProcessor(text); + } else { + mainTitle1->setTextWithGlobalTextProcessor(L""); + mainTitleS1->setTextWithGlobalTextProcessor(L""); + } + break; + } + } +} + +void dLytCommonTitle_c::applyCaption(s32 arg) { + dTextBox_c *mainTitle0 = mLyt.getTextBox("T_changeText_00"); + dTextBox_c *mainTitleS0 = mLyt.getTextBox("T_changeTextS_00"); + dTextBox_c *mainTitle1 = mLyt.getTextBox("T_changeText_01"); + dTextBox_c *mainTitleS1 = mLyt.getTextBox("T_changeTextS_01"); + dWindow_c *window0 = mLyt.getWindow("W_bgP_00"); + dWindow_c *window1 = mLyt.getWindow("W_bgP_01"); + + switch (arg) { + case 0: { + if (std::strlen(mCaption) != 0) { + const wchar_t *text = dMessage_c::getTextMessageByLabel(mCaption, true, nullptr, 0); + mainTitle0->setTextWithGlobalTextProcessor(text); + mainTitleS0->setTextWithGlobalTextProcessor(text); + mainTitle1->setTextWithGlobalTextProcessor(text); + mainTitleS1->setTextWithGlobalTextProcessor(text); + if (field_0x680 == 0) { + window0->SetVisible(false); + window1->SetVisible(true); + } else { + window0->SetVisible(true); + window1->SetVisible(false); + } + } else { + mainTitle0->setTextWithGlobalTextProcessor(L""); + mainTitleS0->setTextWithGlobalTextProcessor(L""); + mainTitle1->setTextWithGlobalTextProcessor(L""); + mainTitleS1->setTextWithGlobalTextProcessor(L""); + window0->SetVisible(false); + window1->SetVisible(false); + } + + break; + } + case 1: { + if (std::strlen(mCaption) != 0) { + const wchar_t *text = dMessage_c::getTextMessageByLabel(mCaption, true, nullptr, 0); + mainTitle1->setTextWithGlobalTextProcessor(text); + mainTitleS1->setTextWithGlobalTextProcessor(text); + window0->SetVisible(true); + } else { + mainTitle1->setTextWithGlobalTextProcessor(L""); + mainTitleS1->setTextWithGlobalTextProcessor(L""); + window0->SetVisible(false); + } + break; + } + case 2: { + if (std::strlen(mCaption) != 0) { + window1->SetVisible(true); + const wchar_t *text = dMessage_c::getTextMessageByLabel(mCaption, true, nullptr, 0); + mainTitle0->setTextWithGlobalTextProcessor(text); + mainTitleS0->setTextWithGlobalTextProcessor(text); + } else { + window1->SetVisible(false); + mainTitle0->setTextWithGlobalTextProcessor(L""); + mainTitleS0->setTextWithGlobalTextProcessor(L""); + } + break; + } + } + + window0->UpdateSize(mLyt.getSizeBoxInWindow("W_bgP_00"), 32.0f); + window1->UpdateSize(mLyt.getSizeBoxInWindow("W_bgP_01"), 32.0f); +} From 90866457f1222fe62445b19cd75b96db5339d92b Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 3 Aug 2025 18:53:22 +0200 Subject: [PATCH 03/14] d_lyt_pause_info OK --- config/SOUE01/splits.txt | 6 +- config/SOUE01/symbols.txt | 175 ++++++++++++--------- configure.py | 2 +- include/d/lyt/d_lyt_common_title.h | 19 ++- include/d/lyt/d_lyt_control_game.h | 19 ++- include/d/lyt/d_lyt_pause.h | 8 + include/d/lyt/d_lyt_pause_info.h | 48 ++++++ include/d/lyt/d_lyt_pause_text.h | 13 ++ include/d/lyt/d_lyt_util_items.h | 3 + src/d/lyt/d_lyt_common_title.cpp | 26 +-- src/d/lyt/d_lyt_pause_info.cpp | 245 +++++++++++++++++++++++++++++ 11 files changed, 468 insertions(+), 96 deletions(-) create mode 100644 include/d/lyt/d_lyt_pause_info.h create mode 100644 include/d/lyt/d_lyt_pause_text.h create mode 100644 src/d/lyt/d_lyt_pause_info.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 62f9579b..276d060c 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1002,7 +1002,7 @@ d/lyt/d_lyt_deposit_stock.cpp: d/lyt/d_lyt_deposit_box.cpp: .text start:0x801578B0 end:0x80158288 align:16 - .rodata start:0x804E8218 end:0x804E8248 + .rodata start:0x804E8218 end:0x804E8228 .data start:0x80524BC8 end:0x80524CD0 .sdata start:0x80572990 end:0x80572998 .sdata2 start:0x8057A060 end:0x8057A078 @@ -1010,6 +1010,7 @@ d/lyt/d_lyt_deposit_box.cpp: d/lyt/d_lyt_boss_gauge.cpp: .text start:0x80158290 end:0x80158E78 align:16 .ctors start:0x804DB790 end:0x804DB794 + .rodata start:0x804E8228 end:0x804E8248 .data start:0x80524CD0 end:0x80524ED0 .sdata start:0x80572998 end:0x805729A0 .sbss start:0x805754F0 end:0x805754F8 @@ -1045,7 +1046,7 @@ d/lyt/d_lyt_pause_disp_01.cpp: d/lyt/d_lyt_pause_info.cpp: .text start:0x80161FA0 end:0x80163568 align:16 .ctors start:0x804DB7A0 end:0x804DB7A4 - .rodata start:0x804E8B30 end:0x804E8B60 + .rodata start:0x804E8B30 end:0x804E8B48 .data start:0x80526610 end:0x80526880 .sdata2 start:0x8057A0F8 end:0x8057A100 .bss start:0x805B19B0 end:0x805B1AB0 @@ -1053,6 +1054,7 @@ d/lyt/d_lyt_pause_info.cpp: d/lyt/d_lyt_pause_text.cpp: .text start:0x80163570 end:0x80164F88 align:16 .ctors start:0x804DB7A4 end:0x804DB7A8 + .rodata start:0x804E8B48 end:0x804E8B60 .data start:0x80526880 end:0x80526D10 .sdata start:0x805729C0 end:0x805729C8 .sdata2 start:0x8057A100 end:0x8057A108 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index ed6077a8..d9d60419 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -8949,61 +8949,61 @@ initializeState__32sFStateID_c<17dLytPauseDisp01_c>CFR17dLytPauseDisp01_c = .tex __sinit_\d_lyt_pause_disp_01_cpp = .text:0x80161A00; // type:function size:0x4B0 __dt__32sFStateID_c<17dLytPauseDisp01_c>Fv = .text:0x80161EB0; // type:function size:0x58 isSameName__32sFStateID_c<17dLytPauseDisp01_c>CFPCc = .text:0x80161F10; // type:function size:0x88 -LytPauseInfo__ctor = .text:0x80161FA0; // type:function size:0xCC -fn_80162070 = .text:0x80162070; // type:function size:0xA4 -fn_80162120 = .text:0x80162120; // type:function size:0xA0 -fn_801621C0 = .text:0x801621C0; // type:function size:0x6C -fn_80162230 = .text:0x80162230; // type:function size:0x58 -fn_80162290 = .text:0x80162290; // type:function size:0xEC -fn_80162380 = .text:0x80162380; // type:function size:0x10 -fn_80162390 = .text:0x80162390; // type:function size:0x98 -__dt__17dLytCommonTitle_cFv = .text:0x80162430; // type:function size:0x104 -__dt__56sFStateMgr_c<17dLytCommonTitle_c,20sStateMethodUsr_FI_c>Fv = .text:0x80162540; // type:function size:0xA4 -__dt__86sStateMgr_c<17dLytCommonTitle_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801625F0; // type:function size:0xA0 -__dt__33sFStateFct_c<17dLytCommonTitle_c>Fv = .text:0x80162690; // type:function size:0x6C -__dt__30sFState_c<17dLytCommonTitle_c>Fv = .text:0x80162700; // type:function size:0x58 -fn_80162760 = .text:0x80162760; // type:function size:0xC4 -fn_80162830 = .text:0x80162830; // type:function size:0x10 -fn_80162840 = .text:0x80162840; // type:function size:0x10 -fn_80162850 = .text:0x80162850; // type:function size:0x64 -fn_801628C0 = .text:0x801628C0; // type:function size:0xC -fn_801628D0 = .text:0x801628D0; // type:function size:0xC -fn_801628E0 = .text:0x801628E0; // type:function size:0x80 -fn_80162960 = .text:0x80162960; // type:function size:0x18 -LytPauseInfo__stateNoneEnter = .text:0x80162980; // type:function size:0x48 -LytPauseInfo__stateNoneUpdate = .text:0x801629D0; // type:function size:0x30 -LytPauseInfo__stateNoneLeave = .text:0x80162A00; // type:function size:0x4 -LytPauseInfo__stateInEnter = .text:0x80162A10; // type:function size:0x11C -LytPauseInfo__stateInUpdate = .text:0x80162B30; // type:function size:0x80 -LytPauseInfo__stateInLeave = .text:0x80162BB0; // type:function size:0x4 -LytPauseInfo__stateWaitEnter = .text:0x80162BC0; // type:function size:0xC -LytPauseInfo__stateWaitUpdate = .text:0x80162BD0; // type:function size:0x60 -LytPauseInfo__stateWaitLeave = .text:0x80162C30; // type:function size:0x4 -LytPauseInfo__stateOutEnter = .text:0x80162C40; // type:function size:0x58 -LytPauseInfo__stateOutUpdate = .text:0x80162CA0; // type:function size:0xA8 -LytPauseInfo__stateOutLeave = .text:0x80162D50; // type:function size:0x4 -fn_80162D60 = .text:0x80162D60; // type:function size:0x50 -fn_80162DB0 = .text:0x80162DB0; // type:function size:0x10 -fn_80162DC0 = .text:0x80162DC0; // type:function size:0x64 -fn_80162E30 = .text:0x80162E30; // type:function size:0x70 -fn_80162EA0 = .text:0x80162EA0; // type:function size:0xD8 -fn_80162F80 = .text:0x80162F80; // type:function size:0x60 -fn_80162FE0 = .text:0x80162FE0; // type:function size:0xC -fn_80162FF0 = .text:0x80162FF0; // type:function size:0x1C -fn_80163010 = .text:0x80163010; // type:function size:0x1C -fn_80163030 = .text:0x80163030; // type:function size:0x1C -fn_80163050 = .text:0x80163050; // type:function size:0x10 -fn_80163060 = .text:0x80163060; // type:function size:0x10 -fn_80163070 = .text:0x80163070; // type:function size:0x10 -fn_80163080 = .text:0x80163080; // type:function size:0x10 -fn_80163090 = .text:0x80163090; // type:function size:0x10 -fn_801630A0 = .text:0x801630A0; // type:function size:0x10 -fn_801630B0 = .text:0x801630B0; // type:function size:0x30 -fn_801630E0 = .text:0x801630E0; // type:function size:0x30 -fn_80163110 = .text:0x80163110; // type:function size:0x30 -LytPauseInfo__initStates = .text:0x80163140; // type:function size:0x338 -LytPauseInfo__state_dtor = .text:0x80163480; // type:function size:0x58 -fn_801634E0 = .text:0x801634E0; // type:function size:0x88 +__ct__15dLytPauseInfo_cFv = .text:0x80161FA0; // type:function size:0xCC +__dt__54sFStateMgr_c<15dLytPauseInfo_c,20sStateMethodUsr_FI_c>Fv = .text:0x80162070; // type:function size:0xA4 scope:weak +__dt__84sStateMgr_c<15dLytPauseInfo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80162120; // type:function size:0xA0 scope:weak +__dt__31sFStateFct_c<15dLytPauseInfo_c>Fv = .text:0x801621C0; // type:function size:0x6C scope:weak +__dt__28sFState_c<15dLytPauseInfo_c>Fv = .text:0x80162230; // type:function size:0x58 scope:weak +build__15dLytPauseInfo_cFv = .text:0x80162290; // type:function size:0xEC +changeState__84sStateMgr_c<15dLytPauseInfo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x80162380; // type:function size:0x10 scope:weak +remove__15dLytPauseInfo_cFv = .text:0x80162390; // type:function size:0x98 +__dt__17dLytCommonTitle_cFv = .text:0x80162430; // type:function size:0x104 scope:weak +__dt__56sFStateMgr_c<17dLytCommonTitle_c,20sStateMethodUsr_FI_c>Fv = .text:0x80162540; // type:function size:0xA4 scope:weak +__dt__86sStateMgr_c<17dLytCommonTitle_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801625F0; // type:function size:0xA0 scope:weak +__dt__33sFStateFct_c<17dLytCommonTitle_c>Fv = .text:0x80162690; // type:function size:0x6C scope:weak +__dt__30sFState_c<17dLytCommonTitle_c>Fv = .text:0x80162700; // type:function size:0x58 scope:weak +execute__15dLytPauseInfo_cFv = .text:0x80162760; // type:function size:0xC4 +executeState__84sStateMgr_c<15dLytPauseInfo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80162830; // type:function size:0x10 scope:weak +getStateID__84sStateMgr_c<15dLytPauseInfo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80162840; // type:function size:0x10 scope:weak +draw__15dLytPauseInfo_cFv = .text:0x80162850; // type:function size:0x64 +requestIn__15dLytPauseInfo_cFv = .text:0x801628C0; // type:function size:0xC +requestOut__15dLytPauseInfo_cFv = .text:0x801628D0; // type:function size:0xC +updateTitle__15dLytPauseInfo_cFv = .text:0x801628E0; // type:function size:0x80 +setInputInOut__15dLytPauseInfo_cFb = .text:0x80162960; // type:function size:0x18 +initializeState_None__15dLytPauseInfo_cFv = .text:0x80162980; // type:function size:0x48 +executeState_None__15dLytPauseInfo_cFv = .text:0x801629D0; // type:function size:0x30 +finalizeState_None__15dLytPauseInfo_cFv = .text:0x80162A00; // type:function size:0x4 +initializeState_In__15dLytPauseInfo_cFv = .text:0x80162A10; // type:function size:0x11C +executeState_In__15dLytPauseInfo_cFv = .text:0x80162B30; // type:function size:0x80 +finalizeState_In__15dLytPauseInfo_cFv = .text:0x80162BB0; // type:function size:0x4 +initializeState_Wait__15dLytPauseInfo_cFv = .text:0x80162BC0; // type:function size:0xC +executeState_Wait__15dLytPauseInfo_cFv = .text:0x80162BD0; // type:function size:0x60 +finalizeState_Wait__15dLytPauseInfo_cFv = .text:0x80162C30; // type:function size:0x4 +initializeState_Out__15dLytPauseInfo_cFv = .text:0x80162C40; // type:function size:0x58 +executeState_Out__15dLytPauseInfo_cFv = .text:0x80162CA0; // type:function size:0xA8 +finalizeState_Out__15dLytPauseInfo_cFv = .text:0x80162D50; // type:function size:0x4 +startAnim__15dLytPauseInfo_cFi = .text:0x80162D60; // type:function size:0x50 +stopAnim__15dLytPauseInfo_cFi = .text:0x80162DB0; // type:function size:0x10 +playBackwards__15dLytPauseInfo_cFRQ23d2d10AnmGroup_c = .text:0x80162DC0; // type:function size:0x64 +updateCaption__15dLytPauseInfo_cFv = .text:0x80162E30; // type:function size:0x70 +__dt__15dLytPauseInfo_cFv = .text:0x80162EA0; // type:function size:0xD8 scope:weak +build__31sFStateFct_c<15dLytPauseInfo_c>FRC12sStateIDIf_c = .text:0x80162F80; // type:function size:0x60 scope:weak +dispose__31sFStateFct_c<15dLytPauseInfo_c>FRP10sStateIf_c = .text:0x80162FE0; // type:function size:0xC scope:weak +initialize__28sFState_c<15dLytPauseInfo_c>Fv = .text:0x80162FF0; // type:function size:0x1C scope:weak +execute__28sFState_c<15dLytPauseInfo_c>Fv = .text:0x80163010; // type:function size:0x1C scope:weak +finalize__28sFState_c<15dLytPauseInfo_c>Fv = .text:0x80163030; // type:function size:0x1C scope:weak +initializeState__84sStateMgr_c<15dLytPauseInfo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80163050; // type:function size:0x10 scope:weak +finalizeState__84sStateMgr_c<15dLytPauseInfo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80163060; // type:function size:0x10 scope:weak +refreshState__84sStateMgr_c<15dLytPauseInfo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80163070; // type:function size:0x10 scope:weak +getState__84sStateMgr_c<15dLytPauseInfo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80163080; // type:function size:0x10 scope:weak +getNewStateID__84sStateMgr_c<15dLytPauseInfo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80163090; // type:function size:0x10 scope:weak +getOldStateID__84sStateMgr_c<15dLytPauseInfo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801630A0; // type:function size:0x10 scope:weak +finalizeState__30sFStateID_c<15dLytPauseInfo_c>CFR15dLytPauseInfo_c = .text:0x801630B0; // type:function size:0x30 scope:weak +executeState__30sFStateID_c<15dLytPauseInfo_c>CFR15dLytPauseInfo_c = .text:0x801630E0; // type:function size:0x30 scope:weak +initializeState__30sFStateID_c<15dLytPauseInfo_c>CFR15dLytPauseInfo_c = .text:0x80163110; // type:function size:0x30 scope:weak +__sinit_\d_lyt_pause_info_cpp = .text:0x80163140; // type:function size:0x338 scope:local +__dt__30sFStateID_c<15dLytPauseInfo_c>Fv = .text:0x80163480; // type:function size:0x58 scope:weak +isSameName__30sFStateID_c<15dLytPauseInfo_c>CFPCc = .text:0x801634E0; // type:function size:0x88 scope:weak LytPauseText__ctor = .text:0x80163570; // type:function size:0x17C fn_801636F0 = .text:0x801636F0; // type:function size:0xA4 fn_801637A0 = .text:0x801637A0; // type:function size:0xA0 @@ -9032,7 +9032,7 @@ LytPauseText__stateOutLeave = .text:0x80163FE0; // type:function size:0x4 fn_80163FF0 = .text:0x80163FF0; // type:function size:0x50 fn_80164040 = .text:0x80164040; // type:function size:0x10 LytPauseText__setupPauseMenuTextMaybe = .text:0x80164050; // type:function size:0x168 -fn_801641C0 = .text:0x801641C0; // type:function size:0x14C +getCurrentPauseLabel__15dLytPauseText_cFR15SizedString<32> = .text:0x801641C0; // type:function size:0x14C fn_80164310 = .text:0x80164310; // type:function size:0xC8 lytPauseDisplayShowItemCaption = .text:0x801643E0; // type:function size:0x394 fn_80164780 = .text:0x80164780; // type:function size:0x54 @@ -9165,7 +9165,7 @@ getDowsingItemIdForIndex__Fl = .text:0x801677C0; // type:function size:0x30 dowsingSlotForIndex__Fl = .text:0x801677F0; // type:function size:0x24 fn_80167820 = .text:0x80167820; // type:function size:0x34 getLytIndexForDowsingIndex__Fl = .text:0x80167860; // type:function size:0x5C -fn_801678C0 = .text:0x801678C0; // type:function size:0x2C +getItemLabel__FlR15SizedString<32> = .text:0x801678C0; // type:function size:0x2C fn_801678F0 = .text:0x801678F0; // type:function size:0x2C fn_80167920 = .text:0x80167920; // type:function size:0x24 fn_80167950 = .text:0x80167950; // type:function size:0x2C @@ -28352,7 +28352,7 @@ lbl_804E8AC8 = .rodata:0x804E8AC8; // type:object size:0x18 lbl_804E8AE0 = .rodata:0x804E8AE0; // type:object size:0x20 lbl_804E8B00 = .rodata:0x804E8B00; // type:object size:0x10 lbl_804E8B10 = .rodata:0x804E8B10; // type:object size:0x20 -lbl_804E8B30 = .rodata:0x804E8B30; // type:object size:0x18 data:4byte +brlanMap = .rodata:0x804E8B30; // type:object size:0x18 scope:local data:4byte lbl_804E8B48 = .rodata:0x804E8B48; // type:object size:0x18 data:4byte brlanMap = .rodata:0x804E8B60; // type:object size:0x48 scope:local data:4byte @LOCAL@updateSaveText__19dLytSaveMsgWindow_cFv@sInts = .rodata:0x804E8BA8; // type:object size:0x10 scope:local @@ -34547,18 +34547,35 @@ __vt__37sFState_c<24dLytCommonIconMaterial_c> = .data:0x80526378; // type:object __vt__29dLytCommonIconMaterialPart2_c = .data:0x80526390; // type:object size:0x18 __vt__29dLytCommonIconMaterialPart1_c = .data:0x805263A8; // type:object size:0x230 lbl_805265D8 = .data:0x805265D8; // type:object size:0x38 -lbl_80526610 = .data:0x80526610; // type:object size:0x18 -lbl_80526628 = .data:0x80526628; // type:object size:0xC -lbl_80526634 = .data:0x80526634; // type:object size:0x18 -lbl_8052664C = .data:0x8052664C; // type:object size:0x1C -lbl_80526668 = .data:0x80526668; // type:object size:0xC -lbl_80526674 = .data:0x80526674; // type:object size:0x14 -lbl_80526688 = .data:0x80526688; // type:object size:0x10 -lbl_80526698 = .data:0x80526698; // type:object size:0x30 -lbl_805266C8 = .data:0x805266C8; // type:object size:0x30 -lbl_805266F8 = .data:0x805266F8; // type:object size:0x18 -lbl_80526710 = .data:0x80526710; // type:object size:0x13C -lbl_8052684C = .data:0x8052684C; // type:object size:0x34 +@17534 = .data:0x80526610; // type:object size:0x16 scope:local data:string +...data.0 = .data:0x80526610; // type:label scope:local +@17535 = .data:0x80526628; // type:object size:0xB scope:local data:string +@17536 = .data:0x80526634; // type:object size:0x17 scope:local data:string +@17537 = .data:0x8052664C; // type:object size:0x19 scope:local data:string +@17538 = .data:0x80526668; // type:object size:0xB scope:local data:string +@18266 = .data:0x80526674; // type:object size:0x13 scope:local data:string +__vt__15dLytPauseInfo_c = .data:0x80526688; // type:object size:0xC scope:weak +__vt__54sFStateMgr_c<15dLytPauseInfo_c,20sStateMethodUsr_FI_c> = .data:0x80526698; // type:object size:0x30 scope:weak +__vt__84sStateMgr_c<15dLytPauseInfo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x805266C8; // type:object size:0x30 scope:weak +__vt__31sFStateFct_c<15dLytPauseInfo_c> = .data:0x805266F8; // type:object size:0x14 scope:weak +__vt__28sFState_c<15dLytPauseInfo_c> = .data:0x80526710; // type:object size:0x18 scope:weak +@18511 = .data:0x80526740; // type:object size:0xC scope:local +@18512 = .data:0x8052674C; // type:object size:0xC scope:local +@18513 = .data:0x80526758; // type:object size:0xC scope:local +@18514 = .data:0x80526764; // type:object size:0xC scope:local +@18515 = .data:0x80526770; // type:object size:0xC scope:local +@18516 = .data:0x8052677C; // type:object size:0xC scope:local +@18517 = .data:0x80526788; // type:object size:0xC scope:local +@18518 = .data:0x80526794; // type:object size:0xC scope:local +@18519 = .data:0x805267A0; // type:object size:0xC scope:local +@18520 = .data:0x805267AC; // type:object size:0xC scope:local +@18521 = .data:0x805267B8; // type:object size:0xC scope:local +@18522 = .data:0x805267C4; // type:object size:0xC scope:local +@18524 = .data:0x805267D0; // type:object size:0x1E scope:local data:string +@18525 = .data:0x805267F0; // type:object size:0x1C scope:local data:string +@18526 = .data:0x8052680C; // type:object size:0x1E scope:local data:string +@18527 = .data:0x8052682C; // type:object size:0x1D scope:local data:string +__vt__30sFStateID_c<15dLytPauseInfo_c> = .data:0x8052684C; // type:object size:0x34 scope:weak lbl_80526880 = .data:0x80526880; // type:object size:0x18 lbl_80526898 = .data:0x80526898; // type:object size:0xC lbl_805268A4 = .data:0x805268A4; // type:object size:0x18 @@ -45157,8 +45174,8 @@ lbl_8057A0E0 = .sdata2:0x8057A0E0; // type:object size:0x4 align:4 data:float lbl_8057A0E4 = .sdata2:0x8057A0E4; // type:object size:0x4 align:4 data:float lbl_8057A0E8 = .sdata2:0x8057A0E8; // type:object size:0x4 align:4 data:float lbl_8057A0F0 = .sdata2:0x8057A0F0; // type:object size:0x8 -lbl_8057A0F8 = .sdata2:0x8057A0F8; // type:object size:0x4 align:4 data:float -lbl_8057A0FC = .sdata2:0x8057A0FC; // type:object size:0x4 align:4 data:float +@18239 = .sdata2:0x8057A0F8; // type:object size:0x4 scope:local align:4 data:float +@18240 = .sdata2:0x8057A0FC; // type:object size:0x4 scope:local align:4 data:float lbl_8057A100 = .sdata2:0x8057A100; // type:object size:0x4 align:4 data:float lbl_8057A104 = .sdata2:0x8057A104; // type:object size:0x4 align:4 data:float @9991 = .sdata2:0x8057A108; // type:object size:0x4 scope:local align:4 data:float @@ -51444,11 +51461,15 @@ LytPauseDisp01__STATE_WAIT = .bss:0x805B18C0; // type:object size:0x40 data:4byt LytPauseDisp01__STATE_SELECT = .bss:0x805B1900; // type:object size:0x40 data:4byte LytPauseDisp01__STATE_GET_DEMO = .bss:0x805B1940; // type:object size:0x40 data:4byte LytPauseDisp01__STATE_OUT = .bss:0x805B1980; // type:object size:0x30 data:4byte -lbl_805B19B0 = .bss:0x805B19B0; // type:object size:0x10 -LytPauseInfo__STATE_NONE = .bss:0x805B19C0; // type:object size:0x40 data:4byte -LytPauseInfo__STATE_IN = .bss:0x805B1A00; // type:object size:0x40 data:4byte -LytPauseInfo__STATE_WAIT = .bss:0x805B1A40; // type:object size:0x40 data:4byte -LytPauseInfo__STATE_OUT = .bss:0x805B1A80; // type:object size:0x30 data:4byte +@17521 = .bss:0x805B19B0; // type:object size:0xC scope:local +...bss.0 = .bss:0x805B19B0; // type:label scope:local +StateID_None__15dLytPauseInfo_c = .bss:0x805B19C0; // type:object size:0x30 data:4byte +@17525 = .bss:0x805B19F0; // type:object size:0xC scope:local +StateID_In__15dLytPauseInfo_c = .bss:0x805B1A00; // type:object size:0x30 data:4byte +@17529 = .bss:0x805B1A30; // type:object size:0xC scope:local +StateID_Wait__15dLytPauseInfo_c = .bss:0x805B1A40; // type:object size:0x30 data:4byte +@17533 = .bss:0x805B1A70; // type:object size:0xC scope:local +StateID_Out__15dLytPauseInfo_c = .bss:0x805B1A80; // type:object size:0x30 data:4byte lbl_805B1AB0 = .bss:0x805B1AB0; // type:object size:0x10 LytPauseText__STATE_NONE = .bss:0x805B1AC0; // type:object size:0x40 data:4byte LytPauseText__STATE_IN = .bss:0x805B1B00; // type:object size:0x40 data:4byte diff --git a/configure.py b/configure.py index 985e446c..cc098464 100644 --- a/configure.py +++ b/configure.py @@ -548,7 +548,7 @@ config.libs = [ Object(Matching, "d/lyt/d_lyt_pause_back.cpp"), Object(NonMatching, "d/lyt/d_lyt_pause_disp_00.cpp"), Object(NonMatching, "d/lyt/d_lyt_pause_disp_01.cpp"), - Object(NonMatching, "d/lyt/d_lyt_pause_info.cpp"), + Object(Matching, "d/lyt/d_lyt_pause_info.cpp"), Object(NonMatching, "d/lyt/d_lyt_pause_text.cpp"), Object(Matching, "d/lyt/d_lyt_save_msg_window.cpp"), Object(NonMatching, "d/lyt/d_lyt_util_items.cpp"), diff --git a/include/d/lyt/d_lyt_common_title.h b/include/d/lyt/d_lyt_common_title.h index 9b2261fd..3e7c5105 100644 --- a/include/d/lyt/d_lyt_common_title.h +++ b/include/d/lyt/d_lyt_common_title.h @@ -16,11 +16,26 @@ public: bool execute(); bool draw(); + enum SetMode_e { + SET_00 = 0, + SET_01 = 1, + SET_CAPTION_IMMEDIATELY = 2, + SET_OUT = 3, + }; + bool set(s32 arg, const char *title, const char *caption); const char *setSubTitle(s32 msgIdx); const char *setSysTitle(s32 msgIdx); const char *setSysCaption(s32 msgIdx); + void setField_0x680(UNKWORD val) { + field_0x680 = val; + } + + void setInputInOut(bool inOut) { + mInputInOut = inOut; + } + private: void gotoStateNone(); void startAnim(int idx); @@ -51,13 +66,13 @@ private: /* 0x660 */ SizedString<0x20> mCaption; /* 0x680 */ UNKWORD field_0x680; - /* 0x680 */ UNKWORD field_0x684; + /* 0x680 */ UNKWORD mSetMode; /* 0x688 */ s32 mStep; /* 0x68C */ bool mChangeRequest; /* 0x68D */ bool field_0x68D; /* 0x68E */ bool mVisible; /* 0x68F */ bool field_0x68F; - /* 0x690 */ bool field_0x690; + /* 0x690 */ bool mInputInOut; }; #endif diff --git a/include/d/lyt/d_lyt_control_game.h b/include/d/lyt/d_lyt_control_game.h index 31858c3e..dc552d18 100644 --- a/include/d/lyt/d_lyt_control_game.h +++ b/include/d/lyt/d_lyt_control_game.h @@ -21,6 +21,14 @@ public: return sInstance; } + s32 getField_0x15C2C() const { + return field_0x15C2C; + } + + u16 getItemForPauseDemo() const { + return mItemForPauseDemo; + } + bool getField_0x15C67() const { return field_0x15C67; } @@ -41,7 +49,16 @@ public: private: /* 0x00068 */ UI_STATE_MGR_DECLARE(dLytControlGame_c); - /* 0x000A4 */ u8 _0x000A4[0x15C67 - 0x000A4]; + /* 0x000A4 */ u8 _0x000A4[0x15C2C - 0x000A4]; + + /* 0x15C2C */ s32 field_0x15C2C; + + /* 0x15C30 */ u8 _0x15C23[0x15C60 - 0x15C30]; + + /* 0x15C60 */ u16 mItemForPauseDemo; + + /* 0x15C62 */ u8 _0x15C62[0x15C67 - 0x15C62]; + /* 0x15C67 */ bool field_0x15C67; static dLytControlGame_c *sInstance; diff --git a/include/d/lyt/d_lyt_pause.h b/include/d/lyt/d_lyt_pause.h index ca02dcc1..7e248b41 100644 --- a/include/d/lyt/d_lyt_pause.h +++ b/include/d/lyt/d_lyt_pause.h @@ -18,6 +18,10 @@ public: return mpBgTexture; } + bool getField_0x083B() const { + return field_0x083B; + } + private: static dLytPauseMgr_c *sInstance; @@ -26,6 +30,10 @@ private: /* 0x0438 */ u8 _0x0438[0x0814 - 0x0438]; /* 0x0814 */ EGG::CpuTexture *mpBgTexture; + + /* 0x0818 */ u8 _0x0818[0x083B - 0x0818]; + + /* 0x083B */ bool field_0x083B; }; #endif diff --git a/include/d/lyt/d_lyt_pause_info.h b/include/d/lyt/d_lyt_pause_info.h new file mode 100644 index 00000000..a07f11a8 --- /dev/null +++ b/include/d/lyt/d_lyt_pause_info.h @@ -0,0 +1,48 @@ +#ifndef D_LYT_PAUSE_INFO_H +#define D_LYT_PAUSE_INFO_H + +#include "d/lyt/d2d.h" +#include "s/s_State.hpp" + +class dLytCommonTitle_c; + +class dLytPauseInfo_c { +public: + dLytPauseInfo_c(); + virtual ~dLytPauseInfo_c() {} + + bool build(); + bool remove(); + bool execute(); + bool draw(); + + void requestIn(); + void requestOut(); + void updateTitle(); + + void setInputInOut(bool inOut); + +private: + void updateCaption(); + void startAnim(int idx); + void stopAnim(int idx); + void playBackwards(d2d::AnmGroup_c &anm); + + STATE_FUNC_DECLARE(dLytPauseInfo_c, None); + STATE_FUNC_DECLARE(dLytPauseInfo_c, In); + STATE_FUNC_DECLARE(dLytPauseInfo_c, Wait); + STATE_FUNC_DECLARE(dLytPauseInfo_c, Out); + + /* 0x004 */ UI_STATE_MGR_DECLARE(dLytPauseInfo_c); + /* 0x040 */ dLytCommonTitle_c *mpTitle; + /* 0x044 */ d2d::LytBase_c mLyt; + /* 0x0D4 */ d2d::AnmGroup_c mAnm[3]; + /* 0x194 */ s32 mStep; + /* 0x198 */ bool mInRequest; + /* 0x199 */ bool mOutRequest; + /* 0x19A */ bool field_0x19A; + /* 0x19B */ bool field_0x19B; + /* 0x19C */ bool mInputInOut; +}; + +#endif diff --git a/include/d/lyt/d_lyt_pause_text.h b/include/d/lyt/d_lyt_pause_text.h new file mode 100644 index 00000000..296f6932 --- /dev/null +++ b/include/d/lyt/d_lyt_pause_text.h @@ -0,0 +1,13 @@ +#ifndef D_LYT_PAUSE_TEXT_H +#define D_LYT_PAUSE_TEXT_H + +#include "sized_string.h" + +class dLytPauseText_c { +public: + static const char *getCurrentPauseLabel(SizedString<32> &buf); + +private: +}; + +#endif diff --git a/include/d/lyt/d_lyt_util_items.h b/include/d/lyt/d_lyt_util_items.h index 7f832a40..2a2c048b 100644 --- a/include/d/lyt/d_lyt_util_items.h +++ b/include/d/lyt/d_lyt_util_items.h @@ -2,8 +2,11 @@ #define D_LYT_UTIL_ITEMS_H #include "common.h" +#include "sized_string.h" #include "toBeSorted/dowsing_target.h" +void getItemLabel(s32 itemId, SizedString<32> &buf); + bool isPouchBocoburinLocked(); u8 getPouchItemForSlot(s32 slot, bool unk); diff --git a/src/d/lyt/d_lyt_common_title.cpp b/src/d/lyt/d_lyt_common_title.cpp index d24eb52d..97ca263b 100644 --- a/src/d/lyt/d_lyt_common_title.cpp +++ b/src/d/lyt/d_lyt_common_title.cpp @@ -52,7 +52,7 @@ bool dLytCommonTitle_c::build() { mStateMgr.changeState(StateID_None); field_0x680 = 0; - field_0x690 = true; + mInputInOut = true; return true; } @@ -69,7 +69,7 @@ bool dLytCommonTitle_c::execute() { mStateMgr.executeState(); if (!(mStateMgr.getStateID()->isEqual(StateID_None))) { mAnm[COMMON_TITLE_ANIM_LOOP].play(); - if (field_0x690 == true) { + if (mInputInOut == true) { playBackwards(mAnm[COMMON_TITLE_ANIM_INPUT]); } else { mAnm[COMMON_TITLE_ANIM_INPUT].play(); @@ -91,7 +91,7 @@ bool dLytCommonTitle_c::set(s32 arg, const char *title, const char *caption) { return false; } - field_0x684 = arg; + mSetMode = arg; if (title != nullptr) { mTitle = title; @@ -151,7 +151,7 @@ void dLytCommonTitle_c::initializeState_None() { mChangeRequest = false; field_0x68D = false; mVisible = false; - field_0x684 = 0; + mSetMode = SET_00; mStep = 0; mTitle.empty(); mCaption.empty(); @@ -250,11 +250,11 @@ void dLytCommonTitle_c::executeState_Wait() { } if (mChangeRequest == true) { - if (field_0x684 == 3) { + if (mSetMode == SET_OUT) { mStateMgr.changeState(StateID_Out); } else if (field_0x680 == 0) { mStateMgr.changeState(StateID_Change); - } else if (field_0x684 == 1) { + } else if (mSetMode == SET_01) { mStateMgr.changeState(StateID_Change); } else { mChangeRequest = false; @@ -293,7 +293,7 @@ void dLytCommonTitle_c::finalizeState_Out() {} void dLytCommonTitle_c::initializeState_Change() { applyTextChange(0); - if (field_0x684 == 1) { + if (mSetMode == SET_01) { startAnim(COMMON_TITLE_ANIM_TITLE_CHANGE); } @@ -312,7 +312,7 @@ void dLytCommonTitle_c::executeState_Change() { mStep++; } anm.play(); - if (field_0x684 == 1) { + if (mSetMode == SET_01) { getAnm(COMMON_TITLE_ANIM_TITLE_CHANGE).play(); } break; @@ -320,7 +320,7 @@ void dLytCommonTitle_c::executeState_Change() { case 1: { applyTextChange(1); getAnm(COMMON_TITLE_ANIM_TEXT_CHANGE).setFrame(0.0f); - if (field_0x684 == 1) { + if (mSetMode == SET_01) { getAnm(COMMON_TITLE_ANIM_TITLE_CHANGE).setFrame(0.0f); } field_0x68D = true; @@ -351,7 +351,7 @@ void dLytCommonTitle_c::executeState_Change() { } void dLytCommonTitle_c::finalizeState_Change() { stopAnim(COMMON_TITLE_ANIM_TEXT_CHANGE); - if (field_0x684 == 1) { + if (mSetMode == SET_01) { stopAnim(COMMON_TITLE_ANIM_TITLE_CHANGE); } } @@ -379,7 +379,7 @@ void dLytCommonTitle_c::playBackwards(d2d::AnmGroup_c &anm) { } void dLytCommonTitle_c::applyText() { - if (field_0x684 == 2) { + if (mSetMode == SET_CAPTION_IMMEDIATELY) { applyCaption(0); } else { applyTitle(0); @@ -390,7 +390,7 @@ void dLytCommonTitle_c::applyText() { void dLytCommonTitle_c::applyTextChange(s32 arg) { switch (arg) { case 0: { - if (field_0x684 == 2) { + if (mSetMode == SET_CAPTION_IMMEDIATELY) { applyCaption(1); } else { applyTitle(1); @@ -399,7 +399,7 @@ void dLytCommonTitle_c::applyTextChange(s32 arg) { break; } case 1: { - if (field_0x684 == 2) { + if (mSetMode == SET_CAPTION_IMMEDIATELY) { applyCaption(2); } else { applyTitle(2); diff --git a/src/d/lyt/d_lyt_pause_info.cpp b/src/d/lyt/d_lyt_pause_info.cpp new file mode 100644 index 00000000..97e294ac --- /dev/null +++ b/src/d/lyt/d_lyt_pause_info.cpp @@ -0,0 +1,245 @@ +#include "d/lyt/d_lyt_pause_info.h" + +#include "common.h" +#include "d/a/d_a_itembase.h" +#include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_common_title.h" +#include "d/lyt/d_lyt_control_game.h" +#include "d/lyt/d_lyt_pause.h" +#include "d/lyt/d_lyt_pause_text.h" +#include "d/lyt/d_lyt_util_items.h" +#include "sized_string.h" + +#include + + +STATE_DEFINE(dLytPauseInfo_c, None); +STATE_DEFINE(dLytPauseInfo_c, In); +STATE_DEFINE(dLytPauseInfo_c, Wait); +STATE_DEFINE(dLytPauseInfo_c, Out); + +static const d2d::LytBrlanMapping brlanMap[] = { + { "pauseInfo_00_in.brlan", "G_inOut_00"}, + { "pauseInfo_00_out.brlan", "G_inOut_00"}, + {"pauseInfo_00_input.brlan", "G_input_00"}, +}; + +#define PAUSE_INFO_ANIM_IN 0 +#define PAUSE_INFO_ANIM_OUT 1 +#define PAUSE_INFO_ANIM_INPUT 2 + +#define PAUSE_INFO_NUM_ANIMS 3 + +dLytPauseInfo_c::dLytPauseInfo_c() : mStateMgr(*this) { + mpTitle = nullptr; +} + +bool dLytPauseInfo_c::build() { + d2d::ResAccIf_c *resAcc = dLytPauseMgr_c::GetInstance()->getResAcc1(); + mLyt.setResAcc(resAcc); + mLyt.build("pauseInfo_00.brlyt", nullptr); + mLyt.setPriority(0x86); + + for (int i = 0; i < PAUSE_INFO_NUM_ANIMS; i++) { + mAnm[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName); + } + + mStateMgr.changeState(StateID_None); + + mpTitle = new dLytCommonTitle_c(); + mpTitle->build(); + mpTitle->setField_0x680(1); + mInputInOut = true; + return true; +} + +bool dLytPauseInfo_c::remove() { + if (mpTitle != nullptr) { + mpTitle->remove(); + delete mpTitle; + mpTitle = nullptr; + } + mLyt.unbindAnims(); + for (int i = 0; i < PAUSE_INFO_NUM_ANIMS; i++) { + mAnm[i].remove(); + } + return true; +} + +bool dLytPauseInfo_c::execute() { + mStateMgr.executeState(); + if (!mStateMgr.getStateID()->isEqual(StateID_None)) { + if (mInputInOut == true) { + playBackwards(mAnm[PAUSE_INFO_ANIM_INPUT]); + } else { + mAnm[PAUSE_INFO_ANIM_INPUT].play(); + } + } + mLyt.calc(); + if (mpTitle != nullptr) { + mpTitle->execute(); + } + return true; +} + +bool dLytPauseInfo_c::draw() { + if (field_0x19B == true) { + if (mpTitle != nullptr) { + mpTitle->draw(); + } + if (!dLytControlGame_c::getInstance()->getField_0x15C67()) { + mLyt.addToDrawList(); + } + } + return true; +} + +void dLytPauseInfo_c::requestIn() { + mInRequest = true; +} + +void dLytPauseInfo_c::requestOut() { + mOutRequest = true; +} + +void dLytPauseInfo_c::updateTitle() { + if (dLytControlGame_c::getInstance()->getField_0x15C2C()) { + // "Gear" + mpTitle->set(dLytCommonTitle_c::SET_01, mpTitle->setSubTitle(1), nullptr); + } else { + // "Collection" + mpTitle->set(dLytCommonTitle_c::SET_01, mpTitle->setSubTitle(2), nullptr); + } +} + +void dLytPauseInfo_c::setInputInOut(bool inOut) { + if (mpTitle == nullptr) { + return; + } + mpTitle->setInputInOut(inOut); + mInputInOut = inOut; +} + +void dLytPauseInfo_c::initializeState_None() { + mLyt.unbindAnims(); + field_0x19A = false; + mInRequest = false; + mOutRequest = false; + field_0x19B = false; + mStep = 0; +} +void dLytPauseInfo_c::executeState_None() { + if (mInRequest == true) { + mInRequest = false; + mStateMgr.changeState(StateID_In); + } +} +void dLytPauseInfo_c::finalizeState_None() {} + +void dLytPauseInfo_c::initializeState_In() { + startAnim(PAUSE_INFO_ANIM_IN); + startAnim(PAUSE_INFO_ANIM_INPUT); + field_0x19B = true; + + s32 msgIdx = 1; // "Gear" + if (dLytControlGame_c::getInstance()->getField_0x15C2C() != 0) { + msgIdx = 2; // "Collection" + } + if (dLytControlGame_c::getInstance()->getField_0x15C67()) { + SizedString<32> label; + if (dLytControlGame_c::getInstance()->getItemForPauseDemo() == ITEM_5_CRYSTALS) { + getItemLabel(ITEM_1_CRYSTAL, label); + } else { + getItemLabel(dLytControlGame_c::getInstance()->getItemForPauseDemo(), label); + } + + if (std::strlen(label) != 0) { + const char *msgLabel = mpTitle->setSubTitle(msgIdx); + mpTitle->set(dLytCommonTitle_c::SET_00, msgLabel, label); + } else { + const char *msgLabel = mpTitle->setSubTitle(msgIdx); + mpTitle->set(dLytCommonTitle_c::SET_00, msgLabel, nullptr); + } + } else { + const char *msgLabel = mpTitle->setSubTitle(msgIdx); + mpTitle->set(dLytCommonTitle_c::SET_00, msgLabel, nullptr); + } +} +void dLytPauseInfo_c::executeState_In() { + d2d::AnmGroup_c &anm = mAnm[PAUSE_INFO_ANIM_IN]; + if (anm.isEndReached() == true) { + mStateMgr.changeState(StateID_Wait); + } else { + anm.play(); + } +} +void dLytPauseInfo_c::finalizeState_In() {} + +void dLytPauseInfo_c::initializeState_Wait() { + field_0x19A = true; +} +void dLytPauseInfo_c::executeState_Wait() { + updateCaption(); + field_0x19A = false; + if (mOutRequest == true) { + mOutRequest = false; + mStateMgr.changeState(StateID_Out); + } +} +void dLytPauseInfo_c::finalizeState_Wait() {} + +void dLytPauseInfo_c::initializeState_Out() { + stopAnim(PAUSE_INFO_ANIM_IN); + startAnim(PAUSE_INFO_ANIM_OUT); + mpTitle->set(dLytCommonTitle_c::SET_OUT, nullptr, nullptr); + mStep = 0; +} +void dLytPauseInfo_c::executeState_Out() { + d2d::AnmGroup_c &anm = mAnm[PAUSE_INFO_ANIM_OUT]; + switch (mStep) { + case 0: { + if (anm.isEndReached() == true) { + mStep = 1; + field_0x19A = true; + } + break; + } + case 1: { + mStateMgr.changeState(StateID_None); + return; + } + } + anm.play(); +} +void dLytPauseInfo_c::finalizeState_Out() {} + +void dLytPauseInfo_c::startAnim(int idx) { + d2d::AnmGroup_c &anm = mAnm[idx]; + anm.bind(false); + anm.setFrame(0.0f); +} + +void dLytPauseInfo_c::stopAnim(int idx) { + d2d::AnmGroup_c &anm = mAnm[idx]; + anm.unbind(); +} + +void dLytPauseInfo_c::playBackwards(d2d::AnmGroup_c &anm) { + f32 frame = anm.getFrame(); + if (frame) { + frame -= 1.0f; + if (frame <= 0.0f) { + frame = 0.0f; + } + anm.setFrame(frame); + } +} + +void dLytPauseInfo_c::updateCaption() { + if (dLytControlGame_c::getInstance()->getField_0x15C67() != true && + dLytPauseMgr_c::GetInstance()->getField_0x083B() == true) { + SizedString<32> buf; + const char *label = dLytPauseText_c::getCurrentPauseLabel(buf); + mpTitle->set(dLytCommonTitle_c::SET_CAPTION_IMMEDIATELY, nullptr, label); + } +} From 66a653a2f64cb4e0bded89246fd5d384aeac226f Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 3 Aug 2025 22:08:11 +0200 Subject: [PATCH 04/14] d_lyt_pause_text OK --- config/SOUE01/symbols.txt | 209 +++++++------ configure.py | 2 +- include/d/a/d_a_item.h | 2 + include/d/lyt/d_lyt_common_title.h | 5 + include/d/lyt/d_lyt_pause.h | 33 ++- include/d/lyt/d_lyt_pause_back.h | 1 + include/d/lyt/d_lyt_pause_info.h | 1 + include/d/lyt/d_lyt_pause_text.h | 44 +++ include/d/lyt/d_lyt_util_items.h | 8 + src/d/lyt/d_lyt_common_title.cpp | 14 +- src/d/lyt/d_lyt_pause_info.cpp | 5 +- src/d/lyt/d_lyt_pause_text.cpp | 454 +++++++++++++++++++++++++++++ 12 files changed, 682 insertions(+), 96 deletions(-) create mode 100644 src/d/lyt/d_lyt_pause_text.cpp diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index d9d60419..8981092a 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -9004,58 +9004,58 @@ initializeState__30sFStateID_c<15dLytPauseInfo_c>CFR15dLytPauseInfo_c = .text:0x __sinit_\d_lyt_pause_info_cpp = .text:0x80163140; // type:function size:0x338 scope:local __dt__30sFStateID_c<15dLytPauseInfo_c>Fv = .text:0x80163480; // type:function size:0x58 scope:weak isSameName__30sFStateID_c<15dLytPauseInfo_c>CFPCc = .text:0x801634E0; // type:function size:0x88 scope:weak -LytPauseText__ctor = .text:0x80163570; // type:function size:0x17C -fn_801636F0 = .text:0x801636F0; // type:function size:0xA4 -fn_801637A0 = .text:0x801637A0; // type:function size:0xA0 -fn_80163840 = .text:0x80163840; // type:function size:0x6C -fn_801638B0 = .text:0x801638B0; // type:function size:0x58 -fn_80163910 = .text:0x80163910; // type:function size:0x150 -fn_80163A60 = .text:0x80163A60; // type:function size:0x10 -fn_80163A70 = .text:0x80163A70; // type:function size:0xD4 -fn_80163B50 = .text:0x80163B50; // type:function size:0x68 -fn_80163BC0 = .text:0x80163BC0; // type:function size:0x10 -fn_80163BD0 = .text:0x80163BD0; // type:function size:0x34 -fn_80163C10 = .text:0x80163C10; // type:function size:0xC -fn_80163C20 = .text:0x80163C20; // type:function size:0xC -LytPauseText__stateNoneEnter = .text:0x80163C30; // type:function size:0x58 -LytPauseText__stateNoneUpdate = .text:0x80163C90; // type:function size:0x30 -LytPauseText__stateNoneLeave = .text:0x80163CC0; // type:function size:0x4 -LytPauseText__stateInEnter = .text:0x80163CD0; // type:function size:0x54 -LytPauseText__stateInUpdate = .text:0x80163D30; // type:function size:0xAC -LytPauseText__stateInLeave = .text:0x80163DE0; // type:function size:0x4 -LytPauseText__stateWaitEnter = .text:0x80163DF0; // type:function size:0xC -LytPauseText__stateWaitUpdate = .text:0x80163E00; // type:function size:0x88 -LytPauseText__stateWaitLeave = .text:0x80163E90; // type:function size:0x4 -LytPauseText__stateOutEnter = .text:0x80163EA0; // type:function size:0x44 -LytPauseText__stateOutUpdate = .text:0x80163EF0; // type:function size:0xE8 -LytPauseText__stateOutLeave = .text:0x80163FE0; // type:function size:0x4 -fn_80163FF0 = .text:0x80163FF0; // type:function size:0x50 -fn_80164040 = .text:0x80164040; // type:function size:0x10 -LytPauseText__setupPauseMenuTextMaybe = .text:0x80164050; // type:function size:0x168 +__ct__15dLytPauseText_cFv = .text:0x80163570; // type:function size:0x17C +__dt__54sFStateMgr_c<15dLytPauseText_c,20sStateMethodUsr_FI_c>Fv = .text:0x801636F0; // type:function size:0xA4 scope:weak +__dt__84sStateMgr_c<15dLytPauseText_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801637A0; // type:function size:0xA0 scope:weak +__dt__31sFStateFct_c<15dLytPauseText_c>Fv = .text:0x80163840; // type:function size:0x6C scope:weak +__dt__28sFState_c<15dLytPauseText_c>Fv = .text:0x801638B0; // type:function size:0x58 scope:weak +build__15dLytPauseText_cFv = .text:0x80163910; // type:function size:0x150 +changeState__84sStateMgr_c<15dLytPauseText_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x80163A60; // type:function size:0x10 scope:weak +remove__15dLytPauseText_cFv = .text:0x80163A70; // type:function size:0xD4 +execute__15dLytPauseText_cFv = .text:0x80163B50; // type:function size:0x68 +executeState__84sStateMgr_c<15dLytPauseText_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80163BC0; // type:function size:0x10 scope:weak +draw__15dLytPauseText_cFv = .text:0x80163BD0; // type:function size:0x34 +requestIn__15dLytPauseText_cFv = .text:0x80163C10; // type:function size:0xC +requestOut__15dLytPauseText_cFv = .text:0x80163C20; // type:function size:0xC +initializeState_None__15dLytPauseText_cFv = .text:0x80163C30; // type:function size:0x58 +executeState_None__15dLytPauseText_cFv = .text:0x80163C90; // type:function size:0x30 +finalizeState_None__15dLytPauseText_cFv = .text:0x80163CC0; // type:function size:0x4 +initializeState_In__15dLytPauseText_cFv = .text:0x80163CD0; // type:function size:0x54 +executeState_In__15dLytPauseText_cFv = .text:0x80163D30; // type:function size:0xAC +finalizeState_In__15dLytPauseText_cFv = .text:0x80163DE0; // type:function size:0x4 +initializeState_Wait__15dLytPauseText_cFv = .text:0x80163DF0; // type:function size:0xC +executeState_Wait__15dLytPauseText_cFv = .text:0x80163E00; // type:function size:0x88 +finalizeState_Wait__15dLytPauseText_cFv = .text:0x80163E90; // type:function size:0x4 +initializeState_Out__15dLytPauseText_cFv = .text:0x80163EA0; // type:function size:0x44 +executeState_Out__15dLytPauseText_cFv = .text:0x80163EF0; // type:function size:0xE8 +finalizeState_Out__15dLytPauseText_cFv = .text:0x80163FE0; // type:function size:0x4 +startAnim__15dLytPauseText_cFi = .text:0x80163FF0; // type:function size:0x50 +stopAnim__15dLytPauseText_cFi = .text:0x80164040; // type:function size:0x10 +updateText__15dLytPauseText_cFv = .text:0x80164050; // type:function size:0x168 getCurrentPauseLabel__15dLytPauseText_cFR15SizedString<32> = .text:0x801641C0; // type:function size:0x14C -fn_80164310 = .text:0x80164310; // type:function size:0xC8 -lytPauseDisplayShowItemCaption = .text:0x801643E0; // type:function size:0x394 -fn_80164780 = .text:0x80164780; // type:function size:0x54 -fn_801647E0 = .text:0x801647E0; // type:function size:0x50 -fn_80164830 = .text:0x80164830; // type:function size:0x15C -fn_80164990 = .text:0x80164990; // type:function size:0x60 -fn_801649F0 = .text:0x801649F0; // type:function size:0xC -fn_80164A00 = .text:0x80164A00; // type:function size:0x1C -fn_80164A20 = .text:0x80164A20; // type:function size:0x1C -fn_80164A40 = .text:0x80164A40; // type:function size:0x1C -fn_80164A60 = .text:0x80164A60; // type:function size:0x10 -fn_80164A70 = .text:0x80164A70; // type:function size:0x10 -fn_80164A80 = .text:0x80164A80; // type:function size:0x10 -fn_80164A90 = .text:0x80164A90; // type:function size:0x10 -fn_80164AA0 = .text:0x80164AA0; // type:function size:0x10 -fn_80164AB0 = .text:0x80164AB0; // type:function size:0x10 -fn_80164AC0 = .text:0x80164AC0; // type:function size:0x10 -fn_80164AD0 = .text:0x80164AD0; // type:function size:0x30 -fn_80164B00 = .text:0x80164B00; // type:function size:0x30 -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 +getCurrentPausePopupName__15dLytPauseText_cFv = .text:0x80164310; // type:function size:0xC8 +getCurrentPausePopupCaption__15dLytPauseText_cFv = .text:0x801643E0; // type:function size:0x394 +calcTextLines__15dLytPauseText_cFP10dTextBox_cPCw = .text:0x80164780; // type:function size:0x54 +isCurrentItemWallet__15dLytPauseText_cCFv = .text:0x801647E0; // type:function size:0x50 +__dt__15dLytPauseText_cFv = .text:0x80164830; // type:function size:0x15C scope:weak +build__31sFStateFct_c<15dLytPauseText_c>FRC12sStateIDIf_c = .text:0x80164990; // type:function size:0x60 scope:weak +dispose__31sFStateFct_c<15dLytPauseText_c>FRP10sStateIf_c = .text:0x801649F0; // type:function size:0xC scope:weak +initialize__28sFState_c<15dLytPauseText_c>Fv = .text:0x80164A00; // type:function size:0x1C scope:weak +execute__28sFState_c<15dLytPauseText_c>Fv = .text:0x80164A20; // type:function size:0x1C scope:weak +finalize__28sFState_c<15dLytPauseText_c>Fv = .text:0x80164A40; // type:function size:0x1C scope:weak +initializeState__84sStateMgr_c<15dLytPauseText_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80164A60; // type:function size:0x10 scope:weak +finalizeState__84sStateMgr_c<15dLytPauseText_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80164A70; // type:function size:0x10 scope:weak +refreshState__84sStateMgr_c<15dLytPauseText_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80164A80; // type:function size:0x10 scope:weak +getState__84sStateMgr_c<15dLytPauseText_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80164A90; // type:function size:0x10 scope:weak +getNewStateID__84sStateMgr_c<15dLytPauseText_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80164AA0; // type:function size:0x10 scope:weak +getStateID__84sStateMgr_c<15dLytPauseText_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80164AB0; // type:function size:0x10 scope:weak +getOldStateID__84sStateMgr_c<15dLytPauseText_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80164AC0; // type:function size:0x10 scope:weak +finalizeState__30sFStateID_c<15dLytPauseText_c>CFR15dLytPauseText_c = .text:0x80164AD0; // type:function size:0x30 scope:weak +executeState__30sFStateID_c<15dLytPauseText_c>CFR15dLytPauseText_c = .text:0x80164B00; // type:function size:0x30 scope:weak +initializeState__30sFStateID_c<15dLytPauseText_c>CFR15dLytPauseText_c = .text:0x80164B30; // type:function size:0x30 scope:weak +__sinit_\d_lyt_pause_text_cpp = .text:0x80164B60; // type:function size:0x338 scope:local +__dt__30sFStateID_c<15dLytPauseText_c>Fv = .text:0x80164EA0; // type:function size:0x58 scope:weak +isSameName__30sFStateID_c<15dLytPauseText_c>CFPCc = .text:0x80164F00; // type:function size:0x88 scope:weak __ct__19dLytSaveMsgWindow_cFv = .text:0x80164F90; // type:function size:0x204 __ct__29dLytMsgWindowSelectBtnParts_cFv = .text:0x801651A0; // type:function size:0x8C scope:weak build__19dLytSaveMsgWindow_cFb = .text:0x80165230; // type:function size:0x168 @@ -9167,12 +9167,12 @@ fn_80167820 = .text:0x80167820; // type:function size:0x34 getLytIndexForDowsingIndex__Fl = .text:0x80167860; // type:function size:0x5C getItemLabel__FlR15SizedString<32> = .text:0x801678C0; // type:function size:0x2C fn_801678F0 = .text:0x801678F0; // type:function size:0x2C -fn_80167920 = .text:0x80167920; // type:function size:0x24 -fn_80167950 = .text:0x80167950; // type:function size:0x2C -fn_80167980 = .text:0x80167980; // type:function size:0x54 -fn_801679E0 = .text:0x801679E0; // type:function size:0x54 -fn_80167A40 = .text:0x80167A40; // type:function size:0x40 -fn_80167A80 = .text:0x80167A80; // type:function size:0x5C +getDowsingLabel__FlR15SizedString<32> = .text:0x80167920; // type:function size:0x24 +getPauseCategoryLabel__FlR15SizedString<32> = .text:0x80167950; // type:function size:0x2C +getItemText__Fl = .text:0x80167980; // type:function size:0x54 +getCaptionItemText__Fl = .text:0x801679E0; // type:function size:0x54 +getDowsingText__Fl = .text:0x80167A40; // type:function size:0x40 +getPauseCategoryText__Fl = .text:0x80167A80; // type:function size:0x5C getCurrentWalletType = .text:0x80167AE0; // type:function size:0x88 getCurrentWalletItemId = .text:0x80167B70; // type:function size:0x30 fn_80167BA0 = .text:0x80167BA0; // type:function size:0x8 @@ -13588,7 +13588,7 @@ getAdditionalPouchSlotCounter = .text:0x80252330; // type:function size:0x8 addToAdditionalAdventurePouchCounter = .text:0x80252340; // type:function size:0xC AcItem__getNumOfRemainingHeartPiecesForHeart = .text:0x80252350; // type:function size:0x8 addToHeartPieceCounter = .text:0x80252360; // type:function size:0xC -getHeartContainerHealthCount = .text:0x80252370; // type:function size:0x8 +getHeartContainerHealthCount__9dAcItem_cFv = .text:0x80252370; // type:function size:0x8 addToHeartPieceCounter2 = .text:0x80252380; // type:function size:0xC getFaronGrasshopperCount = .text:0x80252390; // type:function size:0x8 increaseFaronGrasshopperCounter = .text:0x802523A0; // type:function size:0xC @@ -28353,7 +28353,7 @@ lbl_804E8AE0 = .rodata:0x804E8AE0; // type:object size:0x20 lbl_804E8B00 = .rodata:0x804E8B00; // type:object size:0x10 lbl_804E8B10 = .rodata:0x804E8B10; // type:object size:0x20 brlanMap = .rodata:0x804E8B30; // type:object size:0x18 scope:local data:4byte -lbl_804E8B48 = .rodata:0x804E8B48; // type:object size:0x18 data:4byte +brlanMap = .rodata:0x804E8B48; // type:object size:0x18 scope:local data:4byte brlanMap = .rodata:0x804E8B60; // type:object size:0x48 scope:local data:4byte @LOCAL@updateSaveText__19dLytSaveMsgWindow_cFv@sInts = .rodata:0x804E8BA8; // type:object size:0x10 scope:local lbl_804E8BB8 = .rodata:0x804E8BB8; // type:object size:0x60 data:byte @@ -34576,21 +34576,60 @@ __vt__28sFState_c<15dLytPauseInfo_c> = .data:0x80526710; // type:object size:0x1 @18526 = .data:0x8052680C; // type:object size:0x1E scope:local data:string @18527 = .data:0x8052682C; // type:object size:0x1D scope:local data:string __vt__30sFStateID_c<15dLytPauseInfo_c> = .data:0x8052684C; // type:object size:0x34 scope:weak -lbl_80526880 = .data:0x80526880; // type:object size:0x18 -lbl_80526898 = .data:0x80526898; // type:object size:0xC -lbl_805268A4 = .data:0x805268A4; // type:object size:0x18 -lbl_805268BC = .data:0x805268BC; // type:object size:0xC -lbl_805268C8 = .data:0x805268C8; // type:object size:0x18 -lbl_805268E0 = .data:0x805268E0; // type:object size:0x68 -lbl_80526948 = .data:0x80526948; // type:object size:0x10 -lbl_80526958 = .data:0x80526958; // type:object size:0x10 -lbl_80526968 = .data:0x80526968; // type:object size:0x148 -lbl_80526AB0 = .data:0x80526AB0; // type:object size:0x10 -lbl_80526AC0 = .data:0x80526AC0; // type:object size:0x30 -lbl_80526AF0 = .data:0x80526AF0; // type:object size:0x30 -lbl_80526B20 = .data:0x80526B20; // type:object size:0x18 -lbl_80526B38 = .data:0x80526B38; // type:object size:0x1A0 -lbl_80526CD8 = .data:0x80526CD8; // type:object size:0x38 +@22271 = .data:0x80526880; // type:object size:0x15 scope:local data:string +...data.0 = .data:0x80526880; // type:label scope:local +@22272 = .data:0x80526898; // type:object size:0xB scope:local data:string +@22273 = .data:0x805268A4; // type:object size:0x17 scope:local data:string +@22274 = .data:0x805268BC; // type:object size:0xA scope:local data:string +@22275 = .data:0x805268C8; // type:object size:0x16 scope:local data:string +@22276 = .data:0x805268E0; // type:object size:0x9 scope:local data:string +@23697 = .data:0x805268EC; // type:object size:0x12 scope:local data:string +@23698 = .data:0x80526900; // type:object size:0x9 scope:local data:string +@23700 = .data:0x8052690C; // type:object size:0xA scope:local data:string +@23844 = .data:0x80526918; // type:object size:0xB scope:local data:string +@23845 = .data:0x80526924; // type:object size:0xA scope:local data:string +@23846 = .data:0x80526930; // type:object size:0xB scope:local data:string +@23847 = .data:0x8052693C; // type:object size:0xA scope:local +@23898 = .data:0x80526948; // type:object size:0xF scope:local data:string +@23899 = .data:0x80526958; // type:object size:0xE scope:local data:string +@23932 = .data:0x80526968; // type:object size:0xE scope:local data:string +@23992 = .data:0x80526978; // type:object size:0x14 scope:local data:string +@23993 = .data:0x8052698C; // type:object size:0x17 scope:local data:string +@23994 = .data:0x805269A4; // type:object size:0x14 scope:local data:string +@23995 = .data:0x805269B8; // type:object size:0x17 scope:local data:string +@23996 = .data:0x805269D0; // type:object size:0x14 scope:local data:string +@23997 = .data:0x805269E4; // type:object size:0x15 scope:local data:string +@23998 = .data:0x805269FC; // type:object size:0x11 scope:local data:string +@23999 = .data:0x80526A10; // type:object size:0x14 scope:local data:string +@24000 = .data:0x80526A24; // type:object size:0x14 scope:local data:string +@24001 = .data:0x80526A38; // type:object size:0x14 scope:local data:string +@24002 = .data:0x80526A4C; // type:object size:0x12 scope:local data:string +@24003 = .data:0x80526A60; // type:object size:0x14 scope:local data:string +@24004 = .data:0x80526A74; // type:object size:0x14 scope:local data:string +@24005 = .data:0x80526A88; // type:object size:0x14 scope:local data:string +@24006 = .data:0x80526A9C; // type:object size:0x14 scope:local data:string +__vt__15dLytPauseText_c = .data:0x80526AB0; // type:object size:0xC scope:weak +__vt__54sFStateMgr_c<15dLytPauseText_c,20sStateMethodUsr_FI_c> = .data:0x80526AC0; // type:object size:0x30 scope:weak +__vt__84sStateMgr_c<15dLytPauseText_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80526AF0; // type:object size:0x30 scope:weak +__vt__31sFStateFct_c<15dLytPauseText_c> = .data:0x80526B20; // type:object size:0x14 scope:weak +__vt__28sFState_c<15dLytPauseText_c> = .data:0x80526B38; // type:object size:0x18 scope:weak +@24115 = .data:0x80526BCC; // type:object size:0xC scope:local +@24116 = .data:0x80526BD8; // type:object size:0xC scope:local +@24117 = .data:0x80526BE4; // type:object size:0xC scope:local +@24118 = .data:0x80526BF0; // type:object size:0xC scope:local +@24119 = .data:0x80526BFC; // type:object size:0xC scope:local +@24120 = .data:0x80526C08; // type:object size:0xC scope:local +@24121 = .data:0x80526C14; // type:object size:0xC scope:local +@24122 = .data:0x80526C20; // type:object size:0xC scope:local +@24123 = .data:0x80526C2C; // type:object size:0xC scope:local +@24124 = .data:0x80526C38; // type:object size:0xC scope:local +@24125 = .data:0x80526C44; // type:object size:0xC scope:local +@24126 = .data:0x80526C50; // type:object size:0xC scope:local +@24128 = .data:0x80526C5C; // type:object size:0x1E scope:local data:string +@24129 = .data:0x80526C7C; // type:object size:0x1C scope:local data:string +@24130 = .data:0x80526C98; // type:object size:0x1E scope:local data:string +@24131 = .data:0x80526CB8; // type:object size:0x1D scope:local data:string +__vt__30sFStateID_c<15dLytPauseText_c> = .data:0x80526CD8; // type:object size:0x34 scope:weak @8387 = .data:0x80526D10; // type:object size:0x11 scope:local data:string ...data.0 = .data:0x80526D10; // type:label scope:local @8388 = .data:0x80526D24; // type:object size:0xB scope:local data:string @@ -39916,8 +39955,8 @@ lbl_805729A0 = .sdata:0x805729A0; // type:object size:0x8 data:4byte lbl_805729A8 = .sdata:0x805729A8; // type:object size:0x8 data:wstring lbl_805729B0 = .sdata:0x805729B0; // type:object size:0x4 data:4byte lbl_805729B4 = .sdata:0x805729B4; // type:object size:0xC -lbl_805729C0 = .sdata:0x805729C0; // type:object size:0x4 data:4byte -lbl_805729C4 = .sdata:0x805729C4; // type:object size:0x4 +sGroupName = .sdata:0x805729C0; // type:object size:0x4 scope:local data:4byte +@23699 = .sdata:0x805729C4; // type:object size:0x1 scope:local sGroupName = .sdata:0x805729C8; // type:object size:0x4 scope:local data:4byte @10137 = .sdata:0x805729CC; // type:object size:0x1 scope:local @8185 = .sdata:0x805729D0; // type:object size:0x1 scope:local @@ -45176,8 +45215,8 @@ lbl_8057A0E8 = .sdata2:0x8057A0E8; // type:object size:0x4 align:4 data:float lbl_8057A0F0 = .sdata2:0x8057A0F0; // type:object size:0x8 @18239 = .sdata2:0x8057A0F8; // type:object size:0x4 scope:local align:4 data:float @18240 = .sdata2:0x8057A0FC; // type:object size:0x4 scope:local align:4 data:float -lbl_8057A100 = .sdata2:0x8057A100; // type:object size:0x4 align:4 data:float -lbl_8057A104 = .sdata2:0x8057A104; // type:object size:0x4 align:4 data:float +@23584 = .sdata2:0x8057A100; // type:object size:0x4 scope:local align:4 data:float +@23585 = .sdata2:0x8057A104; // type:object size:0x4 scope:local align:4 data:float @9991 = .sdata2:0x8057A108; // type:object size:0x4 scope:local align:4 data:float @9992 = .sdata2:0x8057A10C; // type:object size:0x4 scope:local align:4 data:float @10252 = .sdata2:0x8057A110; // type:object size:0x8 scope:local align:8 data:double @@ -51470,11 +51509,15 @@ StateID_In__15dLytPauseInfo_c = .bss:0x805B1A00; // type:object size:0x30 data:4 StateID_Wait__15dLytPauseInfo_c = .bss:0x805B1A40; // type:object size:0x30 data:4byte @17533 = .bss:0x805B1A70; // type:object size:0xC scope:local StateID_Out__15dLytPauseInfo_c = .bss:0x805B1A80; // type:object size:0x30 data:4byte -lbl_805B1AB0 = .bss:0x805B1AB0; // type:object size:0x10 -LytPauseText__STATE_NONE = .bss:0x805B1AC0; // type:object size:0x40 data:4byte -LytPauseText__STATE_IN = .bss:0x805B1B00; // type:object size:0x40 data:4byte -LytPauseText__STATE_WAIT = .bss:0x805B1B40; // type:object size:0x40 data:4byte -LytPauseText__STATE_OUT = .bss:0x805B1B80; // type:object size:0x30 data:4byte +@22258 = .bss:0x805B1AB0; // type:object size:0xC scope:local +...bss.0 = .bss:0x805B1AB0; // type:label scope:local +StateID_None__15dLytPauseText_c = .bss:0x805B1AC0; // type:object size:0x30 data:4byte +@22262 = .bss:0x805B1AF0; // type:object size:0xC scope:local +StateID_In__15dLytPauseText_c = .bss:0x805B1B00; // type:object size:0x30 data:4byte +@22266 = .bss:0x805B1B30; // type:object size:0xC scope:local +StateID_Wait__15dLytPauseText_c = .bss:0x805B1B40; // type:object size:0x30 data:4byte +@22270 = .bss:0x805B1B70; // type:object size:0xC scope:local +StateID_Out__15dLytPauseText_c = .bss:0x805B1B80; // type:object size:0x30 data:4byte @8339 = .bss:0x805B1BB0; // type:object size:0xC scope:local ...bss.0 = .bss:0x805B1BB0; // type:label scope:local StateID_Init__19dLytSaveMsgWindow_c = .bss:0x805B1BC0; // type:object size:0x30 data:4byte diff --git a/configure.py b/configure.py index cc098464..9a526a07 100644 --- a/configure.py +++ b/configure.py @@ -549,7 +549,7 @@ config.libs = [ Object(NonMatching, "d/lyt/d_lyt_pause_disp_00.cpp"), Object(NonMatching, "d/lyt/d_lyt_pause_disp_01.cpp"), Object(Matching, "d/lyt/d_lyt_pause_info.cpp"), - Object(NonMatching, "d/lyt/d_lyt_pause_text.cpp"), + Object(Matching, "d/lyt/d_lyt_pause_text.cpp"), Object(Matching, "d/lyt/d_lyt_save_msg_window.cpp"), Object(NonMatching, "d/lyt/d_lyt_util_items.cpp"), Object(Matching, "d/lyt/d_lyt_common_arrow.cpp"), diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index 25bdf8f5..3341db31 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -69,6 +69,8 @@ public: static s32 getRupeeCounter(); static u32 getCurrentWalletCapacity(); + static u32 getHeartContainerHealthCount(); + static u32 getKeyPieceCount(); static u32 getSmallKeyCount(); diff --git a/include/d/lyt/d_lyt_common_title.h b/include/d/lyt/d_lyt_common_title.h index 3e7c5105..9d74f6bf 100644 --- a/include/d/lyt/d_lyt_common_title.h +++ b/include/d/lyt/d_lyt_common_title.h @@ -6,6 +6,11 @@ #include "s/s_State.hpp" #include "sized_string.h" +/** + * 2D UI - Common - Title + * + * Used on title screen and pause menu. + */ class dLytCommonTitle_c { public: dLytCommonTitle_c(); diff --git a/include/d/lyt/d_lyt_pause.h b/include/d/lyt/d_lyt_pause.h index 7e248b41..5aeda5ab 100644 --- a/include/d/lyt/d_lyt_pause.h +++ b/include/d/lyt/d_lyt_pause.h @@ -22,18 +22,49 @@ public: return field_0x083B; } + bool getField_0x0841() const { + return field_0x0841; + } + + enum SelectionType_e { + SELECT_DOWSING = 2, + SELECT_ITEM = 6, + SELECT_CATEGORY = 7, + SELECT_FIRE = 8, + SELECT_RING = 9, + }; + + SelectionType_e getCurrentSelectionType() const { + return mCurrentSelectionType; + } + + s32 getCurrentSelectionId() const { + return mCurrentSelectionId; + } + private: static dLytPauseMgr_c *sInstance; /* 0x0000 */ u8 _0x0000[0x00C8 - 0x0000]; + /* 0x00C8 */ d2d::ResAccIf_c mResAcc1; + /* 0x0438 */ u8 _0x0438[0x0814 - 0x0438]; /* 0x0814 */ EGG::CpuTexture *mpBgTexture; + /* 0x0818 */ SelectionType_e mCurrentSelectionType; - /* 0x0818 */ u8 _0x0818[0x083B - 0x0818]; + /* 0x081C */ u8 _0x081C[0x082C - 0x081C]; + + /* 0x082C */ u16 mCurrentSelectionId; + + /* 0x0830 */ u8 _0x0830[0x083B - 0x082E]; /* 0x083B */ bool field_0x083B; + + /* 0x083D */ u8 _0x083D[0x0841 - 0x083C]; + + /* 0x0841 */ bool field_0x0841; }; #endif diff --git a/include/d/lyt/d_lyt_pause_back.h b/include/d/lyt/d_lyt_pause_back.h index 9085f6f0..641c7dcb 100644 --- a/include/d/lyt/d_lyt_pause_back.h +++ b/include/d/lyt/d_lyt_pause_back.h @@ -4,6 +4,7 @@ #include "d/lyt/d2d.h" #include "s/s_State.hpp" +/** 2D UI - Pause menu - Background */ class dLytPauseBack_c { public: dLytPauseBack_c(); diff --git a/include/d/lyt/d_lyt_pause_info.h b/include/d/lyt/d_lyt_pause_info.h index a07f11a8..5212768a 100644 --- a/include/d/lyt/d_lyt_pause_info.h +++ b/include/d/lyt/d_lyt_pause_info.h @@ -6,6 +6,7 @@ class dLytCommonTitle_c; +/** 2D UI - Pause menu - title and button help */ class dLytPauseInfo_c { public: dLytPauseInfo_c(); diff --git a/include/d/lyt/d_lyt_pause_text.h b/include/d/lyt/d_lyt_pause_text.h index 296f6932..a7f96bf2 100644 --- a/include/d/lyt/d_lyt_pause_text.h +++ b/include/d/lyt/d_lyt_pause_text.h @@ -1,13 +1,57 @@ #ifndef D_LYT_PAUSE_TEXT_H #define D_LYT_PAUSE_TEXT_H +#include "common.h" +#include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_common_a_btn.h" +#include "s/s_State.hpp" #include "sized_string.h" +/** 2D UI - Pause menu - item info popup */ class dLytPauseText_c { public: static const char *getCurrentPauseLabel(SizedString<32> &buf); + static const wchar_t *getCurrentPausePopupName(); + static const wchar_t *getCurrentPausePopupCaption(); + + dLytPauseText_c(); + virtual ~dLytPauseText_c() {} + + bool build(); + bool remove(); + bool execute(); + bool draw(); + + void requestIn(); + void requestOut(); private: + void startAnim(int idx); + void stopAnim(int idx); + void updateText(); + + bool isCurrentItemWallet() const; + void calcTextLines(dTextBox_c *textBox, const wchar_t *text); + + STATE_FUNC_DECLARE(dLytPauseText_c, None); + STATE_FUNC_DECLARE(dLytPauseText_c, In); + STATE_FUNC_DECLARE(dLytPauseText_c, Wait); + STATE_FUNC_DECLARE(dLytPauseText_c, Out); + + /* 0x004 */ UI_STATE_MGR_DECLARE(dLytPauseText_c); + /* 0x040 */ d2d::LytBase_c mLyt; + /* 0x0D0 */ d2d::AnmGroup_c mAnm[3]; + /* 0x190 */ d2d::ResAccIf_c mResAcc; + /* 0x500 */ dLytCommonABtn_c mABtn; + /* 0x6B0 */ d2d::SubPaneList mSubpaneList; + /* 0x6BC */ d2d::SubPaneListNode mSubpanes[1]; + /* 0x6CC */ UNKWORD mStep; + /* 0x6D0 */ f32 mLineSpace; + /* 0x6D4 */ u8 mNumTextLines; + /* 0x6D5 */ bool mInRequest; + /* 0x6D6 */ bool mOutRequest; + /* 0x6D7 */ bool field_0x6D7; + /* 0x6D8 */ bool field_0x6D8; }; #endif diff --git a/include/d/lyt/d_lyt_util_items.h b/include/d/lyt/d_lyt_util_items.h index 2a2c048b..657ff83d 100644 --- a/include/d/lyt/d_lyt_util_items.h +++ b/include/d/lyt/d_lyt_util_items.h @@ -6,6 +6,14 @@ #include "toBeSorted/dowsing_target.h" void getItemLabel(s32 itemId, SizedString<32> &buf); +void getCaptionItemLabel(s32 itemId, SizedString<32> &buf); +void getDowsingLabel(s32 itemId, SizedString<32> &buf); +void getPauseCategoryLabel(s32 itemId, SizedString<32> &buf); + +const wchar_t *getItemText(s32 itemId); +const wchar_t *getCaptionItemText(s32 itemId); +const wchar_t *getDowsingText(s32 itemId); +const wchar_t *getPauseCategoryText(s32 itemId); bool isPouchBocoburinLocked(); diff --git a/src/d/lyt/d_lyt_common_title.cpp b/src/d/lyt/d_lyt_common_title.cpp index 97ca263b..dd1453c0 100644 --- a/src/d/lyt/d_lyt_common_title.cpp +++ b/src/d/lyt/d_lyt_common_title.cpp @@ -237,7 +237,7 @@ void dLytCommonTitle_c::initializeState_Wait() { } void dLytCommonTitle_c::executeState_Wait() { if (field_0x680 == 1) { - if (std::strlen(mCaption) != 0) { + if (mCaption.len() != 0) { field_0x68F = true; mAnm[COMMON_TITLE_ANIM_TEXT_OUT].setFrame(0.0f); } else { @@ -258,7 +258,7 @@ void dLytCommonTitle_c::executeState_Wait() { mStateMgr.changeState(StateID_Change); } else { mChangeRequest = false; - if (std::strlen(mCaption) != 0) { + if (mCaption.len() != 0) { applyCaption(0); } } @@ -418,7 +418,7 @@ void dLytCommonTitle_c::applyTitle(s32 arg) { switch (arg) { case 0: { - if (std::strlen(mTitle) != 0) { + if (mTitle.len() != 0) { const wchar_t *text = dMessage_c::getTextMessageByLabel(mTitle, true, nullptr, 0); mainTitle0->setTextWithGlobalTextProcessor(text); mainTitleS0->setTextWithGlobalTextProcessor(text); @@ -434,7 +434,7 @@ void dLytCommonTitle_c::applyTitle(s32 arg) { // break; } case 1: { - if (std::strlen(mTitle) != 0) { + if (mTitle.len() != 0) { const wchar_t *text = dMessage_c::getTextMessageByLabel(mTitle, true, nullptr, 0); mainTitle0->setTextWithGlobalTextProcessor(text); mainTitleS0->setTextWithGlobalTextProcessor(text); @@ -445,7 +445,7 @@ void dLytCommonTitle_c::applyTitle(s32 arg) { break; } case 2: { - if (std::strlen(mTitle) != 0) { + if (mTitle.len() != 0) { const wchar_t *text = dMessage_c::getTextMessageByLabel(mTitle, true, nullptr, 0); mainTitle1->setTextWithGlobalTextProcessor(text); mainTitleS1->setTextWithGlobalTextProcessor(text); @@ -468,7 +468,7 @@ void dLytCommonTitle_c::applyCaption(s32 arg) { switch (arg) { case 0: { - if (std::strlen(mCaption) != 0) { + if (mCaption.len() != 0) { const wchar_t *text = dMessage_c::getTextMessageByLabel(mCaption, true, nullptr, 0); mainTitle0->setTextWithGlobalTextProcessor(text); mainTitleS0->setTextWithGlobalTextProcessor(text); @@ -493,7 +493,7 @@ void dLytCommonTitle_c::applyCaption(s32 arg) { break; } case 1: { - if (std::strlen(mCaption) != 0) { + if (mCaption.len() != 0) { const wchar_t *text = dMessage_c::getTextMessageByLabel(mCaption, true, nullptr, 0); mainTitle1->setTextWithGlobalTextProcessor(text); mainTitleS1->setTextWithGlobalTextProcessor(text); diff --git a/src/d/lyt/d_lyt_pause_info.cpp b/src/d/lyt/d_lyt_pause_info.cpp index 97e294ac..4500d9fc 100644 --- a/src/d/lyt/d_lyt_pause_info.cpp +++ b/src/d/lyt/d_lyt_pause_info.cpp @@ -10,9 +10,6 @@ #include "d/lyt/d_lyt_util_items.h" #include "sized_string.h" -#include - - STATE_DEFINE(dLytPauseInfo_c, None); STATE_DEFINE(dLytPauseInfo_c, In); STATE_DEFINE(dLytPauseInfo_c, Wait); @@ -153,7 +150,7 @@ void dLytPauseInfo_c::initializeState_In() { getItemLabel(dLytControlGame_c::getInstance()->getItemForPauseDemo(), label); } - if (std::strlen(label) != 0) { + if (label.len() != 0) { const char *msgLabel = mpTitle->setSubTitle(msgIdx); mpTitle->set(dLytCommonTitle_c::SET_00, msgLabel, label); } else { diff --git a/src/d/lyt/d_lyt_pause_text.cpp b/src/d/lyt/d_lyt_pause_text.cpp new file mode 100644 index 00000000..7550e801 --- /dev/null +++ b/src/d/lyt/d_lyt_pause_text.cpp @@ -0,0 +1,454 @@ +#include "d/lyt/d_lyt_pause_text.h" + +#include "common.h" +#include "d/a/d_a_item.h" +#include "d/a/d_a_itembase.h" +#include "d/d_message.h" +#include "d/flag/itemflag_manager.h" +#include "d/flag/storyflag_manager.h" +#include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_pause.h" +#include "d/lyt/d_lyt_util_items.h" +#include "d/lyt/d_textbox.h" +#include "nw4r/lyt/lyt_group.h" +#include "sized_string.h" +#include "toBeSorted/arc_managers/layout_arc_manager.h" + +STATE_DEFINE(dLytPauseText_c, None); +STATE_DEFINE(dLytPauseText_c, In); +STATE_DEFINE(dLytPauseText_c, Wait); +STATE_DEFINE(dLytPauseText_c, Out); + +static const d2d::LytBrlanMapping brlanMap[] = { + { "iconText_00_in.brlan", "G_inOut_00"}, + {"iconText_00_loop.brlan", "G_loop_00"}, + { "iconText_00_out.brlan", "G_inOut_00"}, +}; + +#define PAUSE_TEXT_ANIM_IN 0 +#define PAUSE_TEXT_ANIM_LOOP 1 +#define PAUSE_TEXT_ANIM_OUT 2 + +#define PAUSE_TEXT_NUM_ANIMS 3 + +static const char *sGroupName = "G_ref_00"; + +dLytPauseText_c::dLytPauseText_c() : mStateMgr(*this) {} + +bool dLytPauseText_c::build() { + d2d::ResAccIf_c *resAcc = dLytPauseMgr_c::GetInstance()->getResAcc1(); + mLyt.setResAcc(resAcc); + mLyt.build("iconText_00.brlyt", nullptr); + mLyt.setPriority(0x86); + + for (int i = 0; i < PAUSE_TEXT_NUM_ANIMS; i++) { + mAnm[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName); + } + + void *data = LayoutArcManager::GetInstance()->getLoadedData("System2D"); + mResAcc.attach(data, ""); + + mSubpanes[0].mpLytPane = &mABtn; + for (int i = 0; i < 1; i++) { + mSubpanes[i].mpLytPane->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); + } + } + + mLineSpace = mLyt.getTextBox("T_text_00")->GetLineSpace(); + mStateMgr.changeState(StateID_None); + + return true; +} + +bool dLytPauseText_c::remove() { + mLyt.unbindAnims(); + + 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(); + } + for (int i = 0; i < PAUSE_TEXT_NUM_ANIMS; i++) { + mAnm[i].remove(); + } + + mResAcc.detach(); + + return true; +} + +bool dLytPauseText_c::execute() { + mStateMgr.executeState(); + for (int i = 0; i < 1; i++) { + mSubpanes[i].mpLytPane->execute(); + } + mLyt.calc(); + return true; +} + +bool dLytPauseText_c::draw() { + if (field_0x6D8 == true) { + mLyt.addToDrawList(); + } + return true; +} + +void dLytPauseText_c::requestIn() { + mInRequest = true; +} + +void dLytPauseText_c::requestOut() { + mOutRequest = true; +} + +void dLytPauseText_c::initializeState_None() { + mLyt.unbindAnims(); + field_0x6D7 = false; + mInRequest = false; + mOutRequest = false; + field_0x6D8 = false; + mStep = 0; + mABtn.resetToInvisble(); + updateText(); +} +void dLytPauseText_c::executeState_None() { + if (mInRequest == true) { + mInRequest = false; + mStateMgr.changeState(StateID_In); + } +} +void dLytPauseText_c::finalizeState_None() {} + +void dLytPauseText_c::initializeState_In() { + updateText(); + startAnim(PAUSE_TEXT_ANIM_IN); + startAnim(PAUSE_TEXT_ANIM_LOOP); + mABtn.requestIn(); + field_0x6D8 = true; +} +void dLytPauseText_c::executeState_In() { + d2d::AnmGroup_c &anm = mAnm[PAUSE_TEXT_ANIM_IN]; + if (anm.isEndReached() == true) { + mStateMgr.changeState(StateID_Wait); + mAnm[PAUSE_TEXT_ANIM_LOOP].play(); + } else { + anm.play(); + mAnm[PAUSE_TEXT_ANIM_LOOP].play(); + } +} +void dLytPauseText_c::finalizeState_In() {} + +void dLytPauseText_c::initializeState_Wait() { + field_0x6D7 = true; +} +void dLytPauseText_c::executeState_Wait() { + mAnm[PAUSE_TEXT_ANIM_LOOP].play(); + field_0x6D7 = false; + if (mOutRequest == true && mABtn.requestOut(false)) { + mOutRequest = false; + mStateMgr.changeState(StateID_Out); + } +} +void dLytPauseText_c::finalizeState_Wait() {} + +void dLytPauseText_c::initializeState_Out() { + stopAnim(PAUSE_TEXT_ANIM_IN); + startAnim(PAUSE_TEXT_ANIM_OUT); + mStep = 0; +} +void dLytPauseText_c::executeState_Out() { + d2d::AnmGroup_c &anm = mAnm[PAUSE_TEXT_ANIM_OUT]; + switch (mStep) { + case 0: { + if (mABtn.isDoneOut()) { + mStep = 1; + } + return; + } + case 1: { + if (anm.isEndReached() == true) { + mStep = 2; + field_0x6D7 = true; + } + break; + } + case 2: { + mStateMgr.changeState(StateID_None); + return; + } + } + anm.play(); + mAnm[PAUSE_TEXT_ANIM_LOOP].play(); +} +void dLytPauseText_c::finalizeState_Out() {} + +void dLytPauseText_c::startAnim(int idx) { + d2d::AnmGroup_c &anm = mAnm[idx]; + anm.bind(false); + anm.setFrame(0.0f); +} + +void dLytPauseText_c::stopAnim(int idx) { + d2d::AnmGroup_c &anm = mAnm[idx]; + anm.unbind(); +} + +void dLytPauseText_c::updateText() { +// "planned implementation" +#define TODO_TEXT (L"実装予定") + dTextBox_c *text0 = mLyt.getTextBox("T_text_00"); + dTextBox_c *text0S = mLyt.getTextBox("T_textS_00"); + dTextBox_c *name0 = mLyt.getTextBox("T_name_00"); + dTextBox_c *name0S = mLyt.getTextBox("T_nameS_00"); + + const wchar_t *text = getCurrentPausePopupName(); + if (text != nullptr) { + name0->setTextWithGlobalTextProcessor(text); + name0S->setTextWithGlobalTextProcessor(text); + } else { + name0->setTextWithGlobalTextProcessor(TODO_TEXT); + name0S->setTextWithGlobalTextProcessor(TODO_TEXT); + } + + if (isCurrentItemWallet() && dMessage_c::getGlobalTagProcessor() != nullptr) { + dMessage_c::getGlobalTagProcessor()->setNumericArg0(dAcItem_c::getCurrentWalletCapacity()); + } + + text = getCurrentPausePopupCaption(); + calcTextLines(text0, text); + if (text != nullptr) { + if (mNumTextLines == 1) { + text0->SetLineSpace(0.0f); + text0S->SetLineSpace(0.0f); + } else { + text0->SetLineSpace(mLineSpace); + text0S->SetLineSpace(mLineSpace); + } + text0->setTextWithGlobalTextProcessor(text); + text0S->setTextWithGlobalTextProcessor(text); + } else { + text0->setTextWithGlobalTextProcessor(TODO_TEXT); + text0S->setTextWithGlobalTextProcessor(TODO_TEXT); + } + +#undef TODO_TEXT +} + +const char *dLytPauseText_c::getCurrentPauseLabel(SizedString<32> &buf) { + // This is for the title - it's used by a different component (dLytPauseInfo_c) + const char *result = nullptr; + dLytPauseMgr_c::SelectionType_e selectionType = dLytPauseMgr_c::GetInstance()->getCurrentSelectionType(); + s32 id = dLytPauseMgr_c::GetInstance()->getCurrentSelectionId(); + + switch (selectionType) { + case dLytPauseMgr_c::SELECT_DOWSING: { + getDowsingLabel(id, buf); + if (buf.len() != 0) { + result = buf; + } + break; + } + case dLytPauseMgr_c::SELECT_CATEGORY: { + getPauseCategoryLabel(id, buf); + if (buf.len() != 0) { + result = buf; + } + break; + } + case dLytPauseMgr_c::SELECT_ITEM: { + switch (id) { + case ITEM_TRI_COURAGE: + case ITEM_TRI_POWER: + case ITEM_TRI_WISDOM: id = ITEM_COMPLETE_TRIFORCE; break; + } + getItemLabel(id, buf); + if (buf.len() != 0) { + result = buf; + } + break; + } + case dLytPauseMgr_c::SELECT_FIRE: { + buf.empty(); + buf.sprintf("NAME_FIRE_%03d", id); + result = buf; + break; + } + case dLytPauseMgr_c::SELECT_RING: { + buf.empty(); + buf.sprintf("SUB_RING_%02d", id); + result = buf; + break; + } + default: + getItemLabel(id, buf); + if (buf.len() != 0) { + result = buf; + } + break; + } + + return result; +} + +const wchar_t *dLytPauseText_c::getCurrentPausePopupName() { + dLytPauseMgr_c::SelectionType_e selectionType = dLytPauseMgr_c::GetInstance()->getCurrentSelectionType(); + s32 id = dLytPauseMgr_c::GetInstance()->getCurrentSelectionId(); + + switch (selectionType) { + case dLytPauseMgr_c::SELECT_DOWSING: return getDowsingText(id); + case dLytPauseMgr_c::SELECT_ITEM: + switch (id) { + case ITEM_TRI_COURAGE: + case ITEM_TRI_POWER: + case ITEM_TRI_WISDOM: return dMessage_c::getTextMessageByLabel("NAME_ITEM_005", true, nullptr, 0); + default: return getItemText(id); + } + case dLytPauseMgr_c::SELECT_CATEGORY: return getPauseCategoryText(id); + case dLytPauseMgr_c::SELECT_FIRE: { + SizedString<32> buf; + buf.sprintf("NAME_FIRE_%03d", id); + return dMessage_c::getTextMessageByLabel(buf, true, nullptr, 0); + } + default: return getItemText(id); + } +} + +const wchar_t *dLytPauseText_c::getCurrentPausePopupCaption() { + // TODO - bunch of unresolved IDs here + dLytPauseMgr_c::SelectionType_e selectionType = dLytPauseMgr_c::GetInstance()->getCurrentSelectionType(); + + if (dLytPauseMgr_c::GetInstance()->getField_0x0841()) { + // "It has been stolen by monsters! You've got to get it back." + return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_STOLEN", true, nullptr, 0); + } + + s32 id = dLytPauseMgr_c::GetInstance()->getCurrentSelectionId(); + + switch (selectionType) { + case dLytPauseMgr_c::SELECT_DOWSING: { + if (id == 12) { + if (ItemflagManager::sInstance->getFlagDirect(502) == 80) { + // "You've collected all the Gratitude Crystals. There are none left for your sword to react to." + return dMessage_c::getTextMessageByLabel("CAPTION_DOWSING_012_02", true, nullptr, 0); + } else { + // "Use your dowsing ability to detect the Gratitude Crystals that the demon Batreaux wants to see." + return dMessage_c::getTextMessageByLabel("CAPTION_DOWSING_012", true, nullptr, 0); + } + } else if (id == 14) { + if (StoryflagManager::sInstance->getCounterOrFlag(1087) == 27) { + // "You've activated all of the Goddess Cubes. There are none left for your sword to react to." + return dMessage_c::getTextMessageByLabel("CAPTION_DOWSING_014_02", true, nullptr, 0); + } else { + // "Use your dowsing ability to detect Goddess Cubes and their corresponding treasure chests in the + // sky above." + return dMessage_c::getTextMessageByLabel("CAPTION_DOWSING_014", true, nullptr, 0); + } + } else { + SizedString<32> buf; + buf.sprintf("CAPTION_DOWSING_%03d", id); + return dMessage_c::getTextMessageByLabel(buf, true, nullptr, 0); + } + } + case dLytPauseMgr_c::SELECT_ITEM: { + if (id == ITEM_TRI_COURAGE || id == ITEM_TRI_POWER || id == ITEM_TRI_WISDOM) { + if (id == ITEM_TRI_COURAGE) { + return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_005", true, nullptr, 0); + } else if (id == ITEM_TRI_POWER) { + return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_005_02", true, nullptr, 0); + } else { + return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_005_03", true, nullptr, 0); + } + } else if (id == ITEM_HEART_PIECE) { + if (dAcItem_c::getHeartContainerHealthCount() == 24) { + // "You've collected all the Pieces of Heart." + return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_094_02", true, nullptr, 0); + } else { + return getCaptionItemText(id); + } + } else { + return getCaptionItemText(id); + } + } + case dLytPauseMgr_c::SELECT_FIRE: { + SizedString<32> buf; + buf.sprintf("CAPTION_FIRE_%03d", id); + return dMessage_c::getTextMessageByLabel(buf, true, nullptr, 0); + } + default: { + if (id == ITEM_CAWLIN_LETTER) { + if (StoryflagManager::sInstance->getFlag(552) || StoryflagManager::sInstance->getFlag(555)) { + // "A heartfelt letter from Cawlin that you were able to somewhat successfully deliver..." + return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_158_02", true, nullptr, 0); + } else { + return getCaptionItemText(id); + } + } else if (id == ITEM_BEEDLE_INSECT_CAGE) { + if (StoryflagManager::sInstance->getFlag(477)) { + // "Formerly contained Beedle's beloved insect. You successfully returned it to its owner." + return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_159_02", true, nullptr, 0); + } else { + return getCaptionItemText(id); + } + } else if (id == ITEM_RATTLE) { + if (StoryflagManager::sInstance->getFlag(387)) { + // "This toy belongs to the baby of Bertie, who runs the Potion Shop. You've successfully returned it to its owner." + return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_160_02", true, nullptr, 0); + } else { + return getCaptionItemText(id); + } + } else if (id == ITEM_1_CRYSTAL) { + if (StoryflagManager::sInstance->getFlag(360)) { + // "Crystallized gratitude from the people of the land. This power of thankfulness turned Batreaux into a human." + return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_048_02", true, nullptr, 0); + } else { + return getCaptionItemText(id); + } + } else { + return getCaptionItemText(id); + } + } + } +} + +void dLytPauseText_c::calcTextLines(dTextBox_c *textBox, const wchar_t *text) { + if (text != nullptr) { + mNumTextLines = textBox->calcTextLines(text, dMessage_c::getGlobalTagProcessor()); + } else { + mNumTextLines = 2; + } +} + +bool dLytPauseText_c::isCurrentItemWallet() const { + dLytPauseMgr_c::SelectionType_e selectionType = dLytPauseMgr_c::GetInstance()->getCurrentSelectionType(); + if (dLytPauseMgr_c::GetInstance()->getField_0x0841()) { + return false; + } + + s32 id = dLytPauseMgr_c::GetInstance()->getCurrentSelectionId(); + + if (selectionType != dLytPauseMgr_c::SELECT_ITEM) { + return false; + } + + switch (id) { + case ITEM_UNK_107: + case ITEM_MEDIUM_WALLET: + case ITEM_BIG_WALLET: + case ITEM_GIANT_WALLET: + case ITEM_TYCOON_WALLET: return true; + default: return false; + } +} From 106a89883d70a48bd074099a6a2c1b48f04bf8f1 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 3 Aug 2025 22:22:07 +0200 Subject: [PATCH 05/14] Cleanup --- config/SOUE01/symbols.txt | 2 +- include/d/lyt/d_lyt_pause_text.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 8981092a..2ec353e0 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -8917,7 +8917,7 @@ fn_801614C0 = .text:0x801614C0; // type:function size:0x98 fn_80161560 = .text:0x80161560; // type:function size:0x14 fn_80161580 = .text:0x80161580; // type:function size:0x10 fn_80161590 = .text:0x80161590; // type:function size:0x14 -fn_801615B0 = .text:0x801615B0; // type:function size:0x130 +__dt__17dLytPauseDisp01_cFv = .text:0x801615B0; // type:function size:0x130 changeState__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x801616E0; // type:function size:0x10 getStateID__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801616F0; // type:function size:0x10 build__33sFStateFct_c<17dLytPauseDisp01_c>FRC12sStateIDIf_c = .text:0x80161700; // type:function size:0x60 diff --git a/include/d/lyt/d_lyt_pause_text.h b/include/d/lyt/d_lyt_pause_text.h index a7f96bf2..2ca50b83 100644 --- a/include/d/lyt/d_lyt_pause_text.h +++ b/include/d/lyt/d_lyt_pause_text.h @@ -45,7 +45,7 @@ private: /* 0x500 */ dLytCommonABtn_c mABtn; /* 0x6B0 */ d2d::SubPaneList mSubpaneList; /* 0x6BC */ d2d::SubPaneListNode mSubpanes[1]; - /* 0x6CC */ UNKWORD mStep; + /* 0x6CC */ s32 mStep; /* 0x6D0 */ f32 mLineSpace; /* 0x6D4 */ u8 mNumTextLines; /* 0x6D5 */ bool mInRequest; From 2dd4f06992498edb0f611c6bc98e2699e84a65ed Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 7 Aug 2025 14:54:05 +0200 Subject: [PATCH 06/14] d_lyt_pause_disp_01 OK --- config/SOUE01/symbols.txt | 352 ++++--- configure.py | 2 +- include/d/a/d_a_item.h | 7 + include/d/a/d_a_itembase.h | 2 +- include/d/d_cs_base.h | 5 + include/d/d_pad_nav.h | 8 + include/d/lyt/d_lyt_common_arrow.h | 30 +- include/d/lyt/d_lyt_common_icon_item_maps.h | 22 +- include/d/lyt/d_lyt_common_icon_material.h | 27 +- include/d/lyt/d_lyt_control_game.h | 8 +- include/d/lyt/d_lyt_cursor_stick.h | 4 +- include/d/lyt/d_lyt_pause.h | 59 +- include/d/lyt/d_lyt_pause_disp_01.h | 63 +- src/d/lyt/d_lyt_common_arrow.cpp | 42 +- src/d/lyt/d_lyt_cursor_stick.cpp | 2 +- src/d/lyt/d_lyt_pause_disp_01.cpp | 1022 ++++++++++++++++++- src/d/lyt/d_lyt_pause_text.cpp | 4 +- 17 files changed, 1407 insertions(+), 252 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 2ec353e0..bea8aede 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -8864,23 +8864,23 @@ __sinit_\d_lyt_pause_disp_00_cpp = .text:0x8015E790; // type:function size:0x56C __dt__32sFStateID_c<17dLytPauseDisp00_c>Fv = .text:0x8015ED00; // type:function size:0x58 isSameName__32sFStateID_c<17dLytPauseDisp00_c>CFPCc = .text:0x8015ED60; // type:function size:0x88 __ct__17dLytPauseDisp01_cFv = .text:0x8015EDF0; // type:function size:0x160 -__dt__56sFStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c>Fv = .text:0x8015EF50; // type:function size:0xA4 -__dt__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8015F000; // type:function size:0xA0 -__dt__33sFStateFct_c<17dLytPauseDisp01_c>Fv = .text:0x8015F0A0; // type:function size:0x6C -__dt__30sFState_c<17dLytPauseDisp01_c>Fv = .text:0x8015F110; // type:function size:0x58 -__ct__24dLytCommonIconMaterial_cFv = .text:0x8015F170; // type:function size:0x1A0 -fn_8015F310 = .text:0x8015F310; // type:function size:0x210 -changeState__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8015F520; // type:function size:0x10 -fn_8015F530 = .text:0x8015F530; // type:function size:0xFC -fn_8015F630 = .text:0x8015F630; // type:function size:0xF4 -executeState__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8015F730; // type:function size:0x10 -getStateID__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8015F740; // type:function size:0x10 -fn_8015F750 = .text:0x8015F750; // type:function size:0x38 -fn_8015F790 = .text:0x8015F790; // type:function size:0x14 -fn_8015F7B0 = .text:0x8015F7B0; // type:function size:0x14 -fn_8015F7D0 = .text:0x8015F7D0; // type:function size:0x14 -fn_8015F7F0 = .text:0x8015F7F0; // type:function size:0x10 -fn_8015F800 = .text:0x8015F800; // type:function size:0x10 +__dt__56sFStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c>Fv = .text:0x8015EF50; // type:function size:0xA4 scope:weak +__dt__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8015F000; // type:function size:0xA0 scope:weak +__dt__33sFStateFct_c<17dLytPauseDisp01_c>Fv = .text:0x8015F0A0; // type:function size:0x6C scope:weak +__dt__30sFState_c<17dLytPauseDisp01_c>Fv = .text:0x8015F110; // type:function size:0x58 scope:weak +__ct__24dLytCommonIconMaterial_cFv = .text:0x8015F170; // type:function size:0x1A0 scope:weak +build__17dLytPauseDisp01_cFv = .text:0x8015F310; // type:function size:0x210 +changeState__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8015F520; // type:function size:0x10 scope:weak +remove__17dLytPauseDisp01_cFv = .text:0x8015F530; // type:function size:0xFC +execute__17dLytPauseDisp01_cFv = .text:0x8015F630; // type:function size:0xF4 +executeState__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8015F730; // type:function size:0x10 scope:weak +getStateID__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8015F740; // type:function size:0x10 scope:weak +draw__17dLytPauseDisp01_cFv = .text:0x8015F750; // type:function size:0x38 +drawDirectly__17dLytPauseDisp01_cFv = .text:0x8015F790; // type:function size:0x14 +requestIn__17dLytPauseDisp01_cFb = .text:0x8015F7B0; // type:function size:0x14 +requestOut__17dLytPauseDisp01_cFb = .text:0x8015F7D0; // type:function size:0x14 +requestSelect__17dLytPauseDisp01_cFv = .text:0x8015F7F0; // type:function size:0x10 +requestUnselect__17dLytPauseDisp01_cFv = .text:0x8015F800; // type:function size:0x10 initializeState_None__17dLytPauseDisp01_cFv = .text:0x8015F810; // type:function size:0x1D4 executeState_None__17dLytPauseDisp01_cFv = .text:0x8015F9F0; // type:function size:0x34 finalizeState_None__17dLytPauseDisp01_cFv = .text:0x8015FA30; // type:function size:0x4 @@ -8899,56 +8899,56 @@ finalizeState_GetDemo__17dLytPauseDisp01_cFv = .text:0x801604E0; // type:functio initializeState_Out__17dLytPauseDisp01_cFv = .text:0x801604F0; // type:function size:0x94 executeState_Out__17dLytPauseDisp01_cFv = .text:0x80160590; // type:function size:0xE0 finalizeState_Out__17dLytPauseDisp01_cFv = .text:0x80160670; // type:function size:0x4 -fn_80160680 = .text:0x80160680; // type:function size:0x68 -fn_801606F0 = .text:0x801606F0; // type:function size:0x10 -LytPauseDisp01__setupPauseMenuDisplayMaybe = .text:0x80160700; // type:function size:0x3E0 -pauseDisplayBugsMaybe = .text:0x80160AE0; // type:function size:0x10C -fn_80160BF0 = .text:0x80160BF0; // type:function size:0x114 -fn_80160D10 = .text:0x80160D10; // type:function size:0x80 -fn_80160D90 = .text:0x80160D90; // type:function size:0x4A0 -fn_80161230 = .text:0x80161230; // type:function size:0x100 -fn_80161330 = .text:0x80161330; // type:function size:0x58 -fn_80161390 = .text:0x80161390; // type:function size:0xCC -fn_80161460 = .text:0x80161460; // type:function size:0x14 -fn_80161480 = .text:0x80161480; // type:function size:0x10 -fn_80161490 = .text:0x80161490; // type:function size:0x14 -fn_801614B0 = .text:0x801614B0; // type:function size:0x10 -fn_801614C0 = .text:0x801614C0; // type:function size:0x98 -fn_80161560 = .text:0x80161560; // type:function size:0x14 -fn_80161580 = .text:0x80161580; // type:function size:0x10 -fn_80161590 = .text:0x80161590; // type:function size:0x14 -__dt__17dLytPauseDisp01_cFv = .text:0x801615B0; // type:function size:0x130 -changeState__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x801616E0; // type:function size:0x10 -getStateID__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801616F0; // type:function size:0x10 -build__33sFStateFct_c<17dLytPauseDisp01_c>FRC12sStateIDIf_c = .text:0x80161700; // type:function size:0x60 -dispose__33sFStateFct_c<17dLytPauseDisp01_c>FRP10sStateIf_c = .text:0x80161760; // type:function size:0xC -build__40sFStateFct_c<24dLytCommonIconMaterial_c>FRC12sStateIDIf_c = .text:0x80161770; // type:function size:0x60 -dispose__40sFStateFct_c<24dLytCommonIconMaterial_c>FRP10sStateIf_c = .text:0x801617D0; // type:function size:0xC -initialize__30sFState_c<17dLytPauseDisp01_c>Fv = .text:0x801617E0; // type:function size:0x1C -execute__30sFState_c<17dLytPauseDisp01_c>Fv = .text:0x80161800; // type:function size:0x1C -finalize__30sFState_c<17dLytPauseDisp01_c>Fv = .text:0x80161820; // type:function size:0x1C -initialize__37sFState_c<24dLytCommonIconMaterial_c>Fv = .text:0x80161840; // type:function size:0x1C -execute__37sFState_c<24dLytCommonIconMaterial_c>Fv = .text:0x80161860; // type:function size:0x1C -finalize__37sFState_c<24dLytCommonIconMaterial_c>Fv = .text:0x80161880; // type:function size:0x1C -initializeState__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801618A0; // type:function size:0x10 -finalizeState__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801618B0; // type:function size:0x10 -refreshState__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801618C0; // type:function size:0x10 -getState__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801618D0; // type:function size:0x10 -getNewStateID__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801618E0; // type:function size:0x10 -getOldStateID__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801618F0; // type:function size:0x10 -initializeState__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80161900; // type:function size:0x10 -executeState__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80161910; // type:function size:0x10 -finalizeState__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80161920; // type:function size:0x10 -refreshState__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80161930; // type:function size:0x10 -getState__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80161940; // type:function size:0x10 -getNewStateID__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80161950; // type:function size:0x10 -getOldStateID__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80161960; // type:function size:0x10 -finalizeState__32sFStateID_c<17dLytPauseDisp01_c>CFR17dLytPauseDisp01_c = .text:0x80161970; // type:function size:0x30 -executeState__32sFStateID_c<17dLytPauseDisp01_c>CFR17dLytPauseDisp01_c = .text:0x801619A0; // type:function size:0x30 -initializeState__32sFStateID_c<17dLytPauseDisp01_c>CFR17dLytPauseDisp01_c = .text:0x801619D0; // type:function size:0x30 -__sinit_\d_lyt_pause_disp_01_cpp = .text:0x80161A00; // type:function size:0x4B0 -__dt__32sFStateID_c<17dLytPauseDisp01_c>Fv = .text:0x80161EB0; // type:function size:0x58 -isSameName__32sFStateID_c<17dLytPauseDisp01_c>CFPCc = .text:0x80161F10; // type:function size:0x88 +setAnm__17dLytPauseDisp01_cFif = .text:0x80160680; // type:function size:0x68 +stopAnm__17dLytPauseDisp01_cFi = .text:0x801606F0; // type:function size:0x10 +setupDisp__17dLytPauseDisp01_cFv = .text:0x80160700; // type:function size:0x3E0 +setupInsects__17dLytPauseDisp01_cFv = .text:0x80160AE0; // type:function size:0x10C +setupMaterials__17dLytPauseDisp01_cFv = .text:0x80160BF0; // type:function size:0x114 +showInsectsAndMaterials__17dLytPauseDisp01_cFv = .text:0x80160D10; // type:function size:0x80 +updateSelection__17dLytPauseDisp01_cFv = .text:0x80160D90; // type:function size:0x4A0 +getPointerPane__17dLytPauseDisp01_cCFv = .text:0x80161230; // type:function size:0x100 +hideInsectsAndMaterials__17dLytPauseDisp01_cFv = .text:0x80161330; // type:function size:0x58 +shouldInsectBeDisplayed__17dLytPauseDisp01_cCFl = .text:0x80161390; // type:function size:0xCC +getInsectItemId__17dLytPauseDisp01_cCFl = .text:0x80161460; // type:function size:0x14 +getInsectIcon__17dLytPauseDisp01_cCFl = .text:0x80161480; // type:function size:0x10 +getInsectCountByIndex__17dLytPauseDisp01_cCFl = .text:0x80161490; // type:function size:0x14 +getQuestItemId__17dLytPauseDisp01_cCFl = .text:0x801614B0; // type:function size:0x10 +shouldMaterialBeDisplayed__17dLytPauseDisp01_cCFl = .text:0x801614C0; // type:function size:0x98 +getMaterialItemId__17dLytPauseDisp01_cCFl = .text:0x80161560; // type:function size:0x14 +getMaterialIcon__17dLytPauseDisp01_cCFl = .text:0x80161580; // type:function size:0x10 +getMaterialCountByIndex__17dLytPauseDisp01_cCFl = .text:0x80161590; // type:function size:0x14 +__dt__17dLytPauseDisp01_cFv = .text:0x801615B0; // type:function size:0x130 scope:weak +changeState__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x801616E0; // type:function size:0x10 scope:weak +getStateID__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801616F0; // type:function size:0x10 scope:weak +build__33sFStateFct_c<17dLytPauseDisp01_c>FRC12sStateIDIf_c = .text:0x80161700; // type:function size:0x60 scope:weak +dispose__33sFStateFct_c<17dLytPauseDisp01_c>FRP10sStateIf_c = .text:0x80161760; // type:function size:0xC scope:weak +build__40sFStateFct_c<24dLytCommonIconMaterial_c>FRC12sStateIDIf_c = .text:0x80161770; // type:function size:0x60 scope:weak +dispose__40sFStateFct_c<24dLytCommonIconMaterial_c>FRP10sStateIf_c = .text:0x801617D0; // type:function size:0xC scope:weak +initialize__30sFState_c<17dLytPauseDisp01_c>Fv = .text:0x801617E0; // type:function size:0x1C scope:weak +execute__30sFState_c<17dLytPauseDisp01_c>Fv = .text:0x80161800; // type:function size:0x1C scope:weak +finalize__30sFState_c<17dLytPauseDisp01_c>Fv = .text:0x80161820; // type:function size:0x1C scope:weak +initialize__37sFState_c<24dLytCommonIconMaterial_c>Fv = .text:0x80161840; // type:function size:0x1C scope:weak +execute__37sFState_c<24dLytCommonIconMaterial_c>Fv = .text:0x80161860; // type:function size:0x1C scope:weak +finalize__37sFState_c<24dLytCommonIconMaterial_c>Fv = .text:0x80161880; // type:function size:0x1C scope:weak +initializeState__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801618A0; // type:function size:0x10 scope:weak +finalizeState__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801618B0; // type:function size:0x10 scope:weak +refreshState__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x801618C0; // type:function size:0x10 scope:weak +getState__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801618D0; // type:function size:0x10 scope:weak +getNewStateID__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801618E0; // type:function size:0x10 scope:weak +getOldStateID__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x801618F0; // type:function size:0x10 scope:weak +initializeState__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80161900; // type:function size:0x10 scope:weak +executeState__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80161910; // type:function size:0x10 scope:weak +finalizeState__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80161920; // type:function size:0x10 scope:weak +refreshState__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80161930; // type:function size:0x10 scope:weak +getState__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80161940; // type:function size:0x10 scope:weak +getNewStateID__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80161950; // type:function size:0x10 scope:weak +getOldStateID__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80161960; // type:function size:0x10 scope:weak +finalizeState__32sFStateID_c<17dLytPauseDisp01_c>CFR17dLytPauseDisp01_c = .text:0x80161970; // type:function size:0x30 scope:weak +executeState__32sFStateID_c<17dLytPauseDisp01_c>CFR17dLytPauseDisp01_c = .text:0x801619A0; // type:function size:0x30 scope:weak +initializeState__32sFStateID_c<17dLytPauseDisp01_c>CFR17dLytPauseDisp01_c = .text:0x801619D0; // type:function size:0x30 scope:weak +__sinit_\d_lyt_pause_disp_01_cpp = .text:0x80161A00; // type:function size:0x4B0 scope:local +__dt__32sFStateID_c<17dLytPauseDisp01_c>Fv = .text:0x80161EB0; // type:function size:0x58 scope:weak +isSameName__32sFStateID_c<17dLytPauseDisp01_c>CFPCc = .text:0x80161F10; // type:function size:0x88 scope:weak __ct__15dLytPauseInfo_cFv = .text:0x80161FA0; // type:function size:0xCC __dt__54sFStateMgr_c<15dLytPauseInfo_c,20sStateMethodUsr_FI_c>Fv = .text:0x80162070; // type:function size:0xA4 scope:weak __dt__84sStateMgr_c<15dLytPauseInfo_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80162120; // type:function size:0xA0 scope:weak @@ -9320,7 +9320,7 @@ finalizeState_Off__17dLytCursorStick_cFv = .text:0x8016B6D0; // type:function si initializeState_On__17dLytCursorStick_cFv = .text:0x8016B6E0; // type:function size:0x4 executeState_On__17dLytCursorStick_cFv = .text:0x8016B6F0; // type:function size:0x94 finalizeState_On__17dLytCursorStick_cFv = .text:0x8016B790; // type:function size:0x4 -setTargetPane__17dLytCursorStick_cFPQ34nw4r3lyt4Pane = .text:0x8016B7A0; // type:function size:0x8 +setTargetPane__17dLytCursorStick_cFPCQ34nw4r3lyt4Pane = .text:0x8016B7A0; // type:function size:0x8 positionToTarget__17dLytCursorStick_cFv = .text:0x8016B7B0; // type:function size:0x1EC finalizeState__32sFStateID_c<17dLytCursorStick_c>CFR17dLytCursorStick_c = .text:0x8016B9A0; // type:function size:0x30 scope:weak executeState__32sFStateID_c<17dLytCursorStick_c>CFR17dLytCursorStick_c = .text:0x8016B9D0; // type:function size:0x30 scope:weak @@ -13646,7 +13646,7 @@ getGoldenSkullCount = .text:0x802526D0; // type:function size:0x8 increaseGoldenSkullCounter = .text:0x802526E0; // type:function size:0xC getGoddesPlumeCount = .text:0x802526F0; // type:function size:0x8 increaseGoddessPlumeCounter = .text:0x80252700; // type:function size:0xC -getGratitudeCrystalCount = .text:0x80252710; // type:function size:0x8 +getGratitudeCrystalCount__9dAcItem_cFv = .text:0x80252710; // type:function size:0x8 increaseGratitudeCrystalCounter = .text:0x80252720; // type:function size:0xC ActorLink__hasLifeTreeSeeding = .text:0x80252730; // type:function size:0x38 AcItem__giveLifeTreeSeedling = .text:0x80252770; // type:function size:0x94 @@ -14886,12 +14886,12 @@ fn_80280DB0 = .text:0x80280DB0; // type:function size:0x10 fn_80280DC0 = .text:0x80280DC0; // type:function size:0x40 fn_80280E00 = .text:0x80280E00; // type:function size:0x20 fn_80280E20 = .text:0x80280E20; // type:function size:0x10 -fn_80280E30 = .text:0x80280E30; // type:function size:0x44 +isStateWait__14dLytPauseMgr_cCFv = .text:0x80280E30; // type:function size:0x44 fn_80280E80 = .text:0x80280E80; // type:function size:0xB0 fn_80280F30 = .text:0x80280F30; // type:function size:0x9C -fn_80280FD0 = .text:0x80280FD0; // type:function size:0x14 -fn_80280FF0 = .text:0x80280FF0; // type:function size:0xC -fn_80281000 = .text:0x80281000; // type:function size:0x3C +getArrowBounding__14dLytPauseMgr_cCFi = .text:0x80280FD0; // type:function size:0x14 +setSelectedArrowBounding__14dLytPauseMgr_cCFi = .text:0x80280FF0; // type:function size:0xC +setSelection__14dLytPauseMgr_cFQ214dLytPauseMgr_c15SelectionType_elb = .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 @@ -28344,14 +28344,14 @@ lbl_804E88D4 = .rodata:0x804E88D4; // type:object size:0xC lbl_804E88E0 = .rodata:0x804E88E0; // type:object size:0xC TRIFORCE_PAUSE_MENU_INDEX = .rodata:0x804E88EC; // type:object size:0xC data:4byte lbl_804E88F8 = .rodata:0x804E88F8; // type:object size:0x20 -lbl_804E8918 = .rodata:0x804E8918; // type:object size:0x78 data:4byte -lbl_804E8990 = .rodata:0x804E8990; // type:object size:0x110 -lbl_804E8AA0 = .rodata:0x804E8AA0; // type:object size:0x18 -lbl_804E8AB8 = .rodata:0x804E8AB8; // type:object size:0x10 -lbl_804E8AC8 = .rodata:0x804E8AC8; // type:object size:0x18 -lbl_804E8AE0 = .rodata:0x804E8AE0; // type:object size:0x20 -lbl_804E8B00 = .rodata:0x804E8B00; // type:object size:0x10 -lbl_804E8B10 = .rodata:0x804E8B10; // type:object size:0x20 +brlanMap = .rodata:0x804E8918; // type:object size:0x78 scope:local data:4byte +sNavTable = .rodata:0x804E8990; // type:object size:0x110 scope:local +@LOCAL@getInsectItemId__17dLytPauseDisp01_cCFl@sInsectItemTable = .rodata:0x804E8AA0; // type:object size:0x18 scope:local +@LOCAL@getInsectIcon__17dLytPauseDisp01_cCFl@sInsectIconTable = .rodata:0x804E8AB8; // type:object size:0xC scope:local +@LOCAL@getInsectCountByIndex__17dLytPauseDisp01_cCFl@sInsectCounterTable = .rodata:0x804E8AC8; // type:object size:0x18 scope:local +@LOCAL@getMaterialItemId__17dLytPauseDisp01_cCFl@sMaterialItemTable = .rodata:0x804E8AE0; // type:object size:0x20 scope:local +@LOCAL@getMaterialIcon__17dLytPauseDisp01_cCFl@sMaterialIconTable = .rodata:0x804E8B00; // type:object size:0x10 scope:local +@LOCAL@getMaterialCountByIndex__17dLytPauseDisp01_cCFl@sMaterialCounterTable = .rodata:0x804E8B10; // type:object size:0x20 scope:local brlanMap = .rodata:0x804E8B30; // type:object size:0x18 scope:local data:4byte brlanMap = .rodata:0x804E8B48; // type:object size:0x18 scope:local data:4byte brlanMap = .rodata:0x804E8B60; // type:object size:0x48 scope:local data:4byte @@ -34482,71 +34482,97 @@ __vt__86sStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13 __vt__33sFStateFct_c<17dLytPauseDisp00_c> = .data:0x80525B40; // type:object size:0x18 __vt__30sFState_c<17dLytPauseDisp00_c> = .data:0x80525B58; // type:object size:0x354 lbl_80525EAC = .data:0x80525EAC; // type:object size:0x34 -lbl_80525EE0 = .data:0x80525EE0; // type:object size:0x14 -lbl_80525EF4 = .data:0x80525EF4; // type:object size:0xC -lbl_80525F00 = .data:0x80525F00; // type:object size:0x18 -lbl_80525F18 = .data:0x80525F18; // type:object size:0x10 -lbl_80525F28 = .data:0x80525F28; // type:object size:0x10 -lbl_80525F38 = .data:0x80525F38; // type:object size:0x10 -lbl_80525F48 = .data:0x80525F48; // type:object size:0xC -lbl_80525F54 = .data:0x80525F54; // type:object size:0x14 -lbl_80525F68 = .data:0x80525F68; // type:object size:0x14 data:string -lbl_80525F7C = .data:0x80525F7C; // type:object size:0x14 data:string -lbl_80525F90 = .data:0x80525F90; // type:object size:0xC -lbl_80525F9C = .data:0x80525F9C; // type:object size:0x1C -lbl_80525FB8 = .data:0x80525FB8; // type:object size:0xC data:string -lbl_80525FC4 = .data:0x80525FC4; // type:object size:0x1C -lbl_80525FE0 = .data:0x80525FE0; // type:object size:0x1C -lbl_80525FFC = .data:0x80525FFC; // type:object size:0x1C -lbl_80526018 = .data:0x80526018; // type:object size:0xC -lbl_80526024 = .data:0x80526024; // type:object size:0x10 -lbl_80526034 = .data:0x80526034; // type:object size:0x10 -lbl_80526044 = .data:0x80526044; // type:object size:0x10 -lbl_80526054 = .data:0x80526054; // type:object size:0xC -lbl_80526060 = .data:0x80526060; // type:object size:0x18 data:4byte -lbl_80526078 = .data:0x80526078; // type:object size:0x10 -lbl_80526088 = .data:0x80526088; // type:object size:0xC -lbl_80526094 = .data:0x80526094; // type:object size:0xC data:string -lbl_805260A0 = .data:0x805260A0; // type:object size:0xC -lbl_805260AC = .data:0x805260AC; // type:object size:0xC -lbl_805260B8 = .data:0x805260B8; // type:object size:0xC -lbl_805260C4 = .data:0x805260C4; // type:object size:0xC -lbl_805260D0 = .data:0x805260D0; // type:object size:0xC -lbl_805260DC = .data:0x805260DC; // type:object size:0xC -lbl_805260E8 = .data:0x805260E8; // type:object size:0xC -lbl_805260F4 = .data:0x805260F4; // type:object size:0xC -lbl_80526100 = .data:0x80526100; // type:object size:0xC -lbl_8052610C = .data:0x8052610C; // type:object size:0xC -lbl_80526118 = .data:0x80526118; // type:object size:0xC -lbl_80526124 = .data:0x80526124; // type:object size:0xC -lbl_80526130 = .data:0x80526130; // type:object size:0xC -lbl_8052613C = .data:0x8052613C; // type:object size:0xC -lbl_80526148 = .data:0x80526148; // type:object size:0xC -lbl_80526154 = .data:0x80526154; // type:object size:0xC -lbl_80526160 = .data:0x80526160; // type:object size:0xC -lbl_8052616C = .data:0x8052616C; // type:object size:0xC -lbl_80526178 = .data:0x80526178; // type:object size:0xC -lbl_80526184 = .data:0x80526184; // type:object size:0xC -lbl_80526190 = .data:0x80526190; // type:object size:0xC -lbl_8052619C = .data:0x8052619C; // type:object size:0xC -lbl_805261A8 = .data:0x805261A8; // type:object size:0xC -lbl_805261B4 = .data:0x805261B4; // type:object size:0xC -lbl_805261C0 = .data:0x805261C0; // type:object size:0xC -lbl_805261CC = .data:0x805261CC; // type:object size:0xC -lbl_805261D8 = .data:0x805261D8; // type:object size:0xC -lbl_805261E4 = .data:0x805261E4; // type:object size:0x7C -__vt__17dLytPauseDisp01_c = .data:0x80526260; // type:object size:0x10 -__vt__56sFStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c> = .data:0x80526270; // type:object size:0x30 -__vt__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x805262A0; // type:object size:0x30 -__vt__33sFStateFct_c<17dLytPauseDisp01_c> = .data:0x805262D0; // type:object size:0x18 -__vt__30sFState_c<17dLytPauseDisp01_c> = .data:0x805262E8; // type:object size:0x18 -__vt__63sFStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c> = .data:0x80526300; // type:object size:0x30 -__vt__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80526330; // type:object size:0x30 -__vt__40sFStateFct_c<24dLytCommonIconMaterial_c> = .data:0x80526360; // type:object size:0x18 -__vt__37sFState_c<24dLytCommonIconMaterial_c> = .data:0x80526378; // type:object size:0x18 -__vt__29dLytCommonIconMaterialPart2_c = .data:0x80526390; // type:object size:0x18 -__vt__29dLytCommonIconMaterialPart1_c = .data:0x805263A8; // type:object size:0x230 -lbl_805265D8 = .data:0x805265D8; // type:object size:0x38 +@22677 = .data:0x80525EE0; // type:object size:0x12 scope:local data:string +...data.0 = .data:0x80525EE0; // type:label scope:local +@22678 = .data:0x80525EF4; // type:object size:0xB scope:local data:string +@22679 = .data:0x80525F00; // type:object size:0x15 scope:local data:string +@22680 = .data:0x80525F18; // type:object size:0xD scope:local data:string +@22681 = .data:0x80525F28; // type:object size:0xE scope:local data:string +@22682 = .data:0x80525F38; // type:object size:0xE scope:local data:string +@22683 = .data:0x80525F48; // type:object size:0xB scope:local data:string +@22684 = .data:0x80525F54; // type:object size:0x13 scope:local data:string +@22685 = .data:0x80525F68; // type:object size:0x14 scope:local data:string +@22686 = .data:0x80525F7C; // type:object size:0x14 scope:local data:string +@22687 = .data:0x80525F90; // type:object size:0xA scope:local data:string +@22688 = .data:0x80525F9C; // type:object size:0x19 scope:local data:string +@22689 = .data:0x80525FB8; // type:object size:0xC scope:local data:string +@22690 = .data:0x80525FC4; // type:object size:0x1A scope:local data:string +@22691 = .data:0x80525FE0; // type:object size:0x19 scope:local data:string +@22692 = .data:0x80525FFC; // type:object size:0x1A scope:local data:string +@22693 = .data:0x80526018; // type:object size:0x9 scope:local data:string +@22694 = .data:0x80526024; // type:object size:0xD scope:local data:string +@22695 = .data:0x80526034; // type:object size:0xE scope:local data:string +@22696 = .data:0x80526044; // type:object size:0xE scope:local data:string +@22697 = .data:0x80526054; // type:object size:0xB scope:local data:string +sPaneNames = .data:0x80526060; // type:object size:0x18 scope:local data:4byte +@25173 = .data:0x80526078; // type:object size:0xF scope:local data:string +@25480 = .data:0x80526088; // type:object size:0xB scope:local data:string +@25481 = .data:0x80526094; // type:object size:0xC scope:local data:string +@23229 = .data:0x805260A0; // type:object size:0x9 scope:local data:string +@23230 = .data:0x805260AC; // type:object size:0x9 scope:local data:string +@23231 = .data:0x805260B8; // type:object size:0x9 scope:local data:string +@23232 = .data:0x805260C4; // type:object size:0x9 scope:local data:string +@23233 = .data:0x805260D0; // type:object size:0x9 scope:local data:string +@23234 = .data:0x805260DC; // type:object size:0x9 scope:local data:string +@23235 = .data:0x805260E8; // type:object size:0x9 scope:local data:string +@23236 = .data:0x805260F4; // type:object size:0x9 scope:local data:string +@23237 = .data:0x80526100; // type:object size:0x9 scope:local data:string +@23238 = .data:0x8052610C; // type:object size:0x9 scope:local data:string +@23239 = .data:0x80526118; // type:object size:0x9 scope:local data:string +@23240 = .data:0x80526124; // type:object size:0x9 scope:local data:string +@23241 = .data:0x80526130; // type:object size:0xB scope:local data:string +@23242 = .data:0x8052613C; // type:object size:0xB scope:local data:string +@23243 = .data:0x80526148; // type:object size:0xB scope:local data:string +@23244 = .data:0x80526154; // type:object size:0xB scope:local data:string +@23245 = .data:0x80526160; // type:object size:0xB scope:local data:string +@23246 = .data:0x8052616C; // type:object size:0xB scope:local data:string +@23247 = .data:0x80526178; // type:object size:0xB scope:local data:string +@23248 = .data:0x80526184; // type:object size:0xB scope:local data:string +@23249 = .data:0x80526190; // type:object size:0xB scope:local data:string +@23250 = .data:0x8052619C; // type:object size:0xB scope:local data:string +@23251 = .data:0x805261A8; // type:object size:0xB scope:local data:string +@23252 = .data:0x805261B4; // type:object size:0xB scope:local data:string +@23253 = .data:0x805261C0; // type:object size:0xB scope:local data:string +@23254 = .data:0x805261CC; // type:object size:0xB scope:local data:string +@23255 = .data:0x805261D8; // type:object size:0xB scope:local data:string +@23256 = .data:0x805261E4; // type:object size:0xB scope:local data:string +@LOCAL@setupDisp__17dLytPauseDisp01_cFv@sPaneTable = .data:0x805261F0; // type:object size:0x70 scope:local +__vt__17dLytPauseDisp01_c = .data:0x80526260; // type:object size:0xC scope:weak +__vt__56sFStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c> = .data:0x80526270; // type:object size:0x30 scope:weak +__vt__86sStateMgr_c<17dLytPauseDisp01_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x805262A0; // type:object size:0x30 scope:weak +__vt__33sFStateFct_c<17dLytPauseDisp01_c> = .data:0x805262D0; // type:object size:0x14 scope:weak +__vt__30sFState_c<17dLytPauseDisp01_c> = .data:0x805262E8; // type:object size:0x18 scope:weak +__vt__63sFStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c> = .data:0x80526300; // type:object size:0x30 scope:weak +__vt__93sStateMgr_c<24dLytCommonIconMaterial_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80526330; // type:object size:0x30 scope:weak +__vt__40sFStateFct_c<24dLytCommonIconMaterial_c> = .data:0x80526360; // type:object size:0x14 scope:weak +__vt__37sFState_c<24dLytCommonIconMaterial_c> = .data:0x80526378; // type:object size:0x18 scope:weak +__vt__29dLytCommonIconMaterialPart2_c = .data:0x80526390; // type:object size:0x18 scope:weak +__vt__29dLytCommonIconMaterialPart1_c = .data:0x805263A8; // type:object size:0x18 scope:weak +@25909 = .data:0x80526438; // type:object size:0xC scope:local +@25910 = .data:0x80526444; // type:object size:0xC scope:local +@25911 = .data:0x80526450; // type:object size:0xC scope:local +@25912 = .data:0x8052645C; // type:object size:0xC scope:local +@25913 = .data:0x80526468; // type:object size:0xC scope:local +@25914 = .data:0x80526474; // type:object size:0xC scope:local +@25915 = .data:0x80526480; // type:object size:0xC scope:local +@25916 = .data:0x8052648C; // type:object size:0xC scope:local +@25917 = .data:0x80526498; // type:object size:0xC scope:local +@25918 = .data:0x805264A4; // type:object size:0xC scope:local +@25919 = .data:0x805264B0; // type:object size:0xC scope:local +@25920 = .data:0x805264BC; // type:object size:0xC scope:local +@25921 = .data:0x805264C8; // type:object size:0xC scope:local +@25922 = .data:0x805264D4; // type:object size:0xC scope:local +@25923 = .data:0x805264E0; // type:object size:0xC scope:local +@25924 = .data:0x805264EC; // type:object size:0xC scope:local +@25925 = .data:0x805264F8; // type:object size:0xC scope:local +@25926 = .data:0x80526504; // type:object size:0xC scope:local +@25928 = .data:0x80526510; // type:object size:0x20 scope:local data:string +@25929 = .data:0x80526530; // type:object size:0x1E scope:local data:string +@25930 = .data:0x80526550; // type:object size:0x20 scope:local data:string +@25931 = .data:0x80526570; // type:object size:0x22 scope:local data:string +@25932 = .data:0x80526594; // type:object size:0x23 scope:local data:string +@25933 = .data:0x805265B8; // type:object size:0x1F scope:local data:string +__vt__32sFStateID_c<17dLytPauseDisp01_c> = .data:0x805265D8; // type:object size:0x34 scope:weak @17534 = .data:0x80526610; // type:object size:0x16 scope:local data:string ...data.0 = .data:0x80526610; // type:label scope:local @17535 = .data:0x80526628; // type:object size:0xB scope:local data:string @@ -39953,8 +39979,8 @@ lbl_80572994 = .sdata:0x80572994; // type:object size:0x4 lbl_80572998 = .sdata:0x80572998; // type:object size:0x8 lbl_805729A0 = .sdata:0x805729A0; // type:object size:0x8 data:4byte lbl_805729A8 = .sdata:0x805729A8; // type:object size:0x8 data:wstring -lbl_805729B0 = .sdata:0x805729B0; // type:object size:0x4 data:4byte -lbl_805729B4 = .sdata:0x805729B4; // type:object size:0xC +sGroupName = .sdata:0x805729B0; // type:object size:0x4 scope:local data:4byte +@25479 = .sdata:0x805729B4; // type:object size:0x6 scope:local data:wstring sGroupName = .sdata:0x805729C0; // type:object size:0x4 scope:local data:4byte @23699 = .sdata:0x805729C4; // type:object size:0x1 scope:local sGroupName = .sdata:0x805729C8; // type:object size:0x4 scope:local data:4byte @@ -41974,7 +42000,7 @@ lbl_805758BC = .sbss:0x805758BC; // type:object size:0x4 align:4 data:float sItemList__9dAcItem_c = .sbss:0x805758C0; // type:object size:0x8 data:4byte lbl_805758C8 = .sbss:0x805758C8; // type:object size:0x8 data:4byte NUMBER_OF_ITEMS = .sbss:0x805758D0; // type:object size:0x4 data:4byte -lbl_805758D4 = .sbss:0x805758D4; // type:object size:0x1 data:byte +sIsPerformingInitialCollection__9dAcItem_c = .sbss:0x805758D4; // type:object size:0x1 data:byte TREASURE_TEMP_COLLECT = .sbss:0x805758D8; // type:object size:0x4 data:4byte CURRENT_COUNT_VALUE = .sbss:0x805758DC; // type:object size:0x4 data:4byte lbl_805758E0 = .sbss:0x805758E0; // type:object size:0x4 align:4 data:float @@ -45209,10 +45235,10 @@ lbl_8057A0D4 = .sdata2:0x8057A0D4; // type:object size:0x1 data:byte lbl_8057A0D5 = .sdata2:0x8057A0D5; // type:object size:0x3 data:string lbl_8057A0D8 = .sdata2:0x8057A0D8; // type:object size:0x4 align:4 data:float lbl_8057A0DC = .sdata2:0x8057A0DC; // type:object size:0x4 align:4 data:float -lbl_8057A0E0 = .sdata2:0x8057A0E0; // type:object size:0x4 align:4 data:float -lbl_8057A0E4 = .sdata2:0x8057A0E4; // type:object size:0x4 align:4 data:float -lbl_8057A0E8 = .sdata2:0x8057A0E8; // type:object size:0x4 align:4 data:float -lbl_8057A0F0 = .sdata2:0x8057A0F0; // type:object size:0x8 +@24993 = .sdata2:0x8057A0E0; // type:object size:0x4 scope:local align:4 data:float +@24994 = .sdata2:0x8057A0E4; // type:object size:0x4 scope:local align:4 data:float +@25578 = .sdata2:0x8057A0E8; // type:object size:0x4 scope:local align:4 data:float +@LOCAL@getQuestItemId__17dLytPauseDisp01_cCFl@sQuestItemTable = .sdata2:0x8057A0F0; // type:object size:0x8 scope:local @18239 = .sdata2:0x8057A0F8; // type:object size:0x4 scope:local align:4 data:float @18240 = .sdata2:0x8057A0FC; // type:object size:0x4 scope:local align:4 data:float @23584 = .sdata2:0x8057A100; // type:object size:0x4 scope:local align:4 data:float @@ -51493,13 +51519,19 @@ LytPauseDisp00__STATE_IN = .bss:0x805B16C0; // type:object size:0x40 data:4byte LytPauseDisp00__STATE_WAIT = .bss:0x805B1700; // type:object size:0x40 data:4byte LytPauseDisp00__STATE_SELECT = .bss:0x805B1740; // type:object size:0x80 data:4byte LytPauseDisp00__STATE_GET_DEMO = .bss:0x805B17C0; // type:object size:0x70 data:4byte -lbl_805B1830 = .bss:0x805B1830; // type:object size:0x10 -LytPauseDisp01__STATE_NONE = .bss:0x805B1840; // type:object size:0x40 data:4byte -LytPauseDisp01__STATE_IN = .bss:0x805B1880; // type:object size:0x40 data:4byte -LytPauseDisp01__STATE_WAIT = .bss:0x805B18C0; // type:object size:0x40 data:4byte -LytPauseDisp01__STATE_SELECT = .bss:0x805B1900; // type:object size:0x40 data:4byte -LytPauseDisp01__STATE_GET_DEMO = .bss:0x805B1940; // type:object size:0x40 data:4byte -LytPauseDisp01__STATE_OUT = .bss:0x805B1980; // type:object size:0x30 data:4byte +@22656 = .bss:0x805B1830; // type:object size:0xC scope:local +...bss.0 = .bss:0x805B1830; // type:label scope:local +StateID_None__17dLytPauseDisp01_c = .bss:0x805B1840; // type:object size:0x30 data:4byte +@22660 = .bss:0x805B1870; // type:object size:0xC scope:local +StateID_In__17dLytPauseDisp01_c = .bss:0x805B1880; // type:object size:0x30 data:4byte +@22664 = .bss:0x805B18B0; // type:object size:0xC scope:local +StateID_Wait__17dLytPauseDisp01_c = .bss:0x805B18C0; // type:object size:0x30 data:4byte +@22668 = .bss:0x805B18F0; // type:object size:0xC scope:local +StateID_Select__17dLytPauseDisp01_c = .bss:0x805B1900; // type:object size:0x30 data:4byte +@22672 = .bss:0x805B1930; // type:object size:0xC scope:local +StateID_GetDemo__17dLytPauseDisp01_c = .bss:0x805B1940; // type:object size:0x30 data:4byte +@22676 = .bss:0x805B1970; // type:object size:0xC scope:local +StateID_Out__17dLytPauseDisp01_c = .bss:0x805B1980; // type:object size:0x30 data:4byte @17521 = .bss:0x805B19B0; // type:object size:0xC scope:local ...bss.0 = .bss:0x805B19B0; // type:label scope:local StateID_None__15dLytPauseInfo_c = .bss:0x805B19C0; // type:object size:0x30 data:4byte diff --git a/configure.py b/configure.py index 9a526a07..bc7d98a3 100644 --- a/configure.py +++ b/configure.py @@ -547,7 +547,7 @@ config.libs = [ Object(NonMatching, "d/lyt/d_lyt_boss_gauge.cpp"), Object(Matching, "d/lyt/d_lyt_pause_back.cpp"), Object(NonMatching, "d/lyt/d_lyt_pause_disp_00.cpp"), - Object(NonMatching, "d/lyt/d_lyt_pause_disp_01.cpp"), + Object(Matching, "d/lyt/d_lyt_pause_disp_01.cpp"), Object(Matching, "d/lyt/d_lyt_pause_info.cpp"), Object(Matching, "d/lyt/d_lyt_pause_text.cpp"), Object(Matching, "d/lyt/d_lyt_save_msg_window.cpp"), diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index 3341db31..669673f5 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -70,6 +70,7 @@ public: static u32 getCurrentWalletCapacity(); static u32 getHeartContainerHealthCount(); + static u32 getGratitudeCrystalCount(); static u32 getKeyPieceCount(); static u32 getSmallKeyCount(); @@ -96,7 +97,13 @@ public: static void healLink(u32 amount, bool); // move to dAcPy_c + static bool isPerformingInitialCollection() { + return sIsPerformingInitialCollection; + } + private: + static bool sIsPerformingInitialCollection; + /* 0x334 */ UNKTYPE *mpMdl; // Model has its own handling system /* 0x338 */ dShadowCircle_c mShdw; /* 0x340 */ mVec3_c mField_0x340; diff --git a/include/d/a/d_a_itembase.h b/include/d/a/d_a_itembase.h index 90e81c14..231f92f8 100644 --- a/include/d/a/d_a_itembase.h +++ b/include/d/a/d_a_itembase.h @@ -148,7 +148,7 @@ enum ITEM_ID { /* 0x08C */ ITEM_BIG_BUG_NET = 140, /* 0x08D */ ITEM_FARON_GRASSHOPPER = 141, /* 0x08E */ ITEM_WOODLAND_RHINO_BEETLE = 142, - /* 0x08F */ ITEM_DEKU_HORNET_ = 143, + /* 0x08F */ ITEM_DEKU_HORNET = 143, /* 0x090 */ ITEM_SKYLOFT_MANTIS = 144, /* 0x091 */ ITEM_VOLCANIC_LADYBUG = 145, /* 0x092 */ ITEM_BLESSED_BUTTERFLY = 146, diff --git a/include/d/d_cs_base.h b/include/d/d_cs_base.h index 54eedd01..7bce9e41 100644 --- a/include/d/d_cs_base.h +++ b/include/d/d_cs_base.h @@ -9,6 +9,7 @@ #include "m/m2d.h" #include "m/m_angle.h" #include "m/m_vec.h" +#include "nw4r/lyt/lyt_pane.h" class dCsBase_c : public dCs_c { public: @@ -47,6 +48,10 @@ public: mCursorStick.setShouldBeOn(visible); } + void setCursorStickTargetPane(const nw4r::lyt::Pane *target) { + mCursorStick.setTargetPane(target); + } + private: static dCsBase_c *sInstance; void setCurrentLyt(int lyt); diff --git a/include/d/d_pad_nav.h b/include/d/d_pad_nav.h index d481f0d0..da962fad 100644 --- a/include/d/d_pad_nav.h +++ b/include/d/d_pad_nav.h @@ -38,10 +38,18 @@ inline bool isPointerVisible() { return sIsPointerVisible; } +inline bool isPrevPointerVisible() { + return sPrevIsPointerVisible; +} + inline bool isCursorStickVisible() { return sIsCursorStickVisible; } +inline s32 getFSStickNavDirection() { + return sFSStickNavDirection; +} + void init(); void calc(); void setNavEnabled(bool navEnabled, bool autoReturnToPointerNav); diff --git a/include/d/lyt/d_lyt_common_arrow.h b/include/d/lyt/d_lyt_common_arrow.h index 1cfe53b7..2625b329 100644 --- a/include/d/lyt/d_lyt_common_arrow.h +++ b/include/d/lyt/d_lyt_common_arrow.h @@ -36,24 +36,24 @@ private: void unbindAt(s32); void tickDown(d2d::AnmGroup_c *); void fn_80168880(); - UI_STATE_MGR_DECLARE(dLytCommonArrow_c); + + /* 0x04 */ UI_STATE_MGR_DECLARE(dLytCommonArrow_c); /* 0x40 */ d2d::LytBase_c mLytBase; d2d::ResAccIf_c mResAcc; - d2d::AnmGroup_c mAnmGroups[0x9]; + d2d::AnmGroup_c mAnmGroups[9]; dCursorHitCheckLyt_c mCsHitCheck; - nw4r::lyt::Bounding *mBoundingL; - nw4r::lyt::Bounding *mBoundingR; - s32 mType; - s32 field_0x6B4; - s32 field_0x6B8; - s32 field_0x6BC; - s32 field_0x6C0; - s32 mTimer; - u8 mInRequested; - u8 mOutRequested; - u8 field_0x6CA; - u8 field_0x6CB; - u8 field_0x6CC; + /* 0x6A8 */ nw4r::lyt::Bounding *mpBoundings[2]; + /* 0x6B0 */ s32 mType; + /* 0x6B4 */ s32 mTargetedBounding; + /* 0x6B8 */ s32 field_0x6B8; + /* 0x6BC */ s32 field_0x6BC; + /* 0x6C0 */ s32 field_0x6C0; + /* 0x6C4 */ s32 mTimer; + /* 0x6C8 */ bool mInRequested; + /* 0x6C9 */ bool mOutRequested; + /* 0x6CA */ u8 field_0x6CA; + /* 0x6CB */ u8 field_0x6CB; + /* 0x6CC */ u8 field_0x6CC; }; #endif diff --git a/include/d/lyt/d_lyt_common_icon_item_maps.h b/include/d/lyt/d_lyt_common_icon_item_maps.h index 52456d34..248ada9c 100644 --- a/include/d/lyt/d_lyt_common_icon_item_maps.h +++ b/include/d/lyt/d_lyt_common_icon_item_maps.h @@ -15,6 +15,24 @@ #define LYT_CMN_BugLanayruAnt (10) // [10] tr_bugIcon_10.tpl #define LYT_CMN_BugEldinRoller (11) // [11] tr_bugIcon_11.tpl +// Treasure +#define LYT_CMN_HORNET_LARVAE (0) // [ 1] uk_soaHachisu_00.tpl +#define LYT_CMN_BIRD_FEATHER (1) // [ 2] uk_sobHaneA_00.tpl +#define LYT_CMN_TUMBLEWEED (2) // [ 3] uk_socTumble_00.tpl +#define LYT_CMN_LIZALFOS_TAIL (3) // [ 0] tr_sozaiIcon_03.tpl +#define LYT_CMN_ELDIN_ORE (4) // [ 4] uk_soeKoseki_00.tpl +#define LYT_CMN_ANCIENT_FLOWER (5) // [ 5] uk_sofHana_00.tpl +#define LYT_CMN_AMBER_RELIC (6) // [ 6] uk_sogMagatamaA_00.tpl +#define LYT_CMN_DUSK_RELOC (7) // [ 7] uk_sohMagatamaB_00.tpl +#define LYT_CMN_JELLY_BLOB (8) // [ 8] uk_soiPuyo_00.tpl +#define LYT_CMN_MONSTER_CLAW (9) // [ 9] uk_sojClaw_00.tpl +#define LYT_CMN_MONSTER_HORN (10) // [11] uk_solHorn_00.tpl +#define LYT_CMN_ORNAMENTAL_SKULL (11) // [10] uk_sokDokuroA_00.tpl +#define LYT_CMN_EVIL_CRYSTAL (12) // [12] uk_somEvil_00.tpl +#define LYT_CMN_BLUE_BIRD_FEATHER (13) // [13] uk_sonHaneB_00.tpl +#define LYT_CMN_GOLDEN_SKULL (14) // [14] uk_sooDokuroB_00.tpl +#define LYT_CMN_GODDESS_PLUME (15) // [15] uk_sopGoddess_00.tpl + // Items #define LYT_CMN_ItemBombBag (0) // [ 8] uc_bomb_00.tpl #define LYT_CMN_ItemBow (1) // [ 9] uc_bowA_00.tpl @@ -34,7 +52,7 @@ #define LYT_CMN_ItemBigBugnet (15) // [14] uc_netB_00.tpl #define LYT_CMN_ItemBoatCannon (16) // [ 7] uc_boatCannon_00.tpl #define LYT_CMN_ItemHarp (17) // [ 0] tr_tategoto_00.tpl -#define LYT_CMN_ItemInvalid (18) // ------------------------- +#define LYT_CMN_ItemInvalid (18) // ------------------------- // Pouch Items #define LYT_CMN_PouchPotionHealyh (0) // [12] uc_bottleKusuriA_00.tpl @@ -113,6 +131,6 @@ #define LYT_CMN_DowsingZelda (19) // [13] tr_dauzTarget_19.tpl #define LYT_CMN_DowsingTrialGate (20) // [14] tr_dauzTarget_20.tpl #define LYT_CMN_DowsingNewPlantSpecies (21) // [15] tr_dauzTarget_21.tpl -#define LYT_CMN_DowsingInvalid (22) // ------------------------- +#define LYT_CMN_DowsingInvalid (22) // ------------------------- #endif diff --git a/include/d/lyt/d_lyt_common_icon_material.h b/include/d/lyt/d_lyt_common_icon_material.h index a6922592..8febea8a 100644 --- a/include/d/lyt/d_lyt_common_icon_material.h +++ b/include/d/lyt/d_lyt_common_icon_material.h @@ -8,26 +8,18 @@ #include "nw4r/lyt/lyt_bounding.h" #include "s/s_State.hpp" -class dLytCommonIconMaterialPartBase_c { -public: - virtual ~dLytCommonIconMaterialPartBase_c() {} - virtual nw4r::lyt::Pane *getPane() = 0; - virtual d2d::LytBase_c *getLyt() = 0; - virtual const char *getName() const = 0; -}; - /** Material - Bug */ -class dLytCommonIconMaterialPart1_c : public dLytCommonIconMaterialPartBase_c { +class dLytCommonIconMaterialPart1_c { public: dLytCommonIconMaterialPart1_c() {} virtual ~dLytCommonIconMaterialPart1_c() {} - virtual nw4r::lyt::Pane *getPane() override { + virtual nw4r::lyt::Pane *getPane() { return mLyt.getLayout()->GetRootPane(); } - virtual d2d::LytBase_c *getLyt() override { + virtual d2d::LytBase_c *getLyt() { return &mLyt; } - virtual const char *getName() const override { + virtual const char *getName() const { return mLyt.getName(); } @@ -78,17 +70,17 @@ private: }; /** Material - Treasure */ -class dLytCommonIconMaterialPart2_c : public dLytCommonIconMaterialPartBase_c { +class dLytCommonIconMaterialPart2_c { public: dLytCommonIconMaterialPart2_c() {} virtual ~dLytCommonIconMaterialPart2_c() {} - virtual nw4r::lyt::Pane *getPane() override { + virtual nw4r::lyt::Pane *getPane() { return mLyt.getLayout()->GetRootPane(); } - virtual d2d::LytBase_c *getLyt() override { + virtual d2d::LytBase_c *getLyt() { return &mLyt; } - virtual const char *getName() const override { + virtual const char *getName() const { return mLyt.getName(); } @@ -185,6 +177,9 @@ public: const nw4r::lyt::Bounding *getBounding() const; + STATE_MGR_DEFINE_UTIL_CHANGESTATE(dLytCommonIconMaterial_c); + STATE_MGR_DEFINE_UTIL_ISSTATE(dLytCommonIconMaterial_c); + private: STATE_FUNC_DECLARE(dLytCommonIconMaterial_c, None); STATE_FUNC_DECLARE(dLytCommonIconMaterial_c, In); diff --git a/include/d/lyt/d_lyt_control_game.h b/include/d/lyt/d_lyt_control_game.h index dc552d18..0278133a 100644 --- a/include/d/lyt/d_lyt_control_game.h +++ b/include/d/lyt/d_lyt_control_game.h @@ -29,6 +29,10 @@ public: return mItemForPauseDemo; } + u16 getItemCountForPauseDemo() const { + return mItemCountForPauseDemo; + } + bool getField_0x15C67() const { return field_0x15C67; } @@ -57,8 +61,10 @@ private: /* 0x15C60 */ u16 mItemForPauseDemo; - /* 0x15C62 */ u8 _0x15C62[0x15C67 - 0x15C62]; + /* 0x15C62 */ u8 _0x15C62[0x15C64 - 0x15C62]; + /* 0x15C64 */ u16 mItemCountForPauseDemo; + /* 0x15C66 */ u8 field_0x15C66; /* 0x15C67 */ bool field_0x15C67; static dLytControlGame_c *sInstance; diff --git a/include/d/lyt/d_lyt_cursor_stick.h b/include/d/lyt/d_lyt_cursor_stick.h index 1d24cd50..ab8bdb6b 100644 --- a/include/d/lyt/d_lyt_cursor_stick.h +++ b/include/d/lyt/d_lyt_cursor_stick.h @@ -23,7 +23,7 @@ public: static bool drawDirectly(); void setPriority(u8 priority); - void setTargetPane(nw4r::lyt::Pane *pane); + void setTargetPane(const nw4r::lyt::Pane *pane); void setShouldBeOn(bool value) { mShouldBeOn = value; @@ -47,7 +47,7 @@ private: /* 0x3AC */ d2d::dLytSub mLyt; /* 0x440 */ d2d::AnmGroup_c mAnm[1]; /* 0x480 */ nw4r::lyt::Pane *mpPanes[5]; - /* 0x494 */ nw4r::lyt::Pane *mpTargetPane; + /* 0x494 */ const nw4r::lyt::Pane *mpTargetPane; /* 0x498 */ bool mShouldBeOn; }; diff --git a/include/d/lyt/d_lyt_pause.h b/include/d/lyt/d_lyt_pause.h index 5aeda5ab..6614007d 100644 --- a/include/d/lyt/d_lyt_pause.h +++ b/include/d/lyt/d_lyt_pause.h @@ -3,6 +3,7 @@ #include "d/lyt/d2d.h" #include "egg/gfx/eggCpuTexture.h" +#include "nw4r/lyt/lyt_pane.h" class dLytPauseMgr_c { public: @@ -14,26 +15,52 @@ public: return &mResAcc1; } + d2d::ResAccIf_c *getResAcc2() { + return &mResAcc2; + } + EGG::CpuTexture *getBgTexture() { return mpBgTexture; } + bool getField_0x0831() const { + return field_0x0831; + } + + bool getField_0x0832() const { + return field_0x0832; + } + bool getField_0x083B() const { return field_0x083B; } - bool getField_0x0841() const { - return field_0x0841; + bool getField_0x083E() const { + return field_0x083E; } + bool getField_0x0840() const { + return field_0x0840; + } + + bool isStateWait() const; + enum SelectionType_e { SELECT_DOWSING = 2, + SELECT_INSECT = 4, + SELECT_QUEST_MATERIAL = 5, SELECT_ITEM = 6, SELECT_CATEGORY = 7, SELECT_FIRE = 8, SELECT_RING = 9, + SELECT_NONE = 10, }; + void setSelection(SelectionType_e type, s32 id, bool restricted); + + bool isCurrentSelectionRestricted() const { + return mCurrentSelectionIsRestricted; + } SelectionType_e getCurrentSelectionType() const { return mCurrentSelectionType; } @@ -42,29 +69,41 @@ public: return mCurrentSelectionId; } + nw4r::lyt::Pane *getArrowBounding(int idx) const; + nw4r::lyt::Pane *setSelectedArrowBounding(int idx) const; + private: static dLytPauseMgr_c *sInstance; /* 0x0000 */ u8 _0x0000[0x00C8 - 0x0000]; - - /* 0x00C8 */ d2d::ResAccIf_c mResAcc1; - /* 0x0438 */ u8 _0x0438[0x0814 - 0x0438]; + /* 0x00C8 */ d2d::ResAccIf_c mResAcc1; + /* 0x0438 */ d2d::ResAccIf_c mResAcc2; + + /* 0x07A8 */ u8 _0x0438[0x0814 - 0x07A8]; /* 0x0814 */ EGG::CpuTexture *mpBgTexture; /* 0x0818 */ SelectionType_e mCurrentSelectionType; /* 0x081C */ u8 _0x081C[0x082C - 0x081C]; - + /* 0x082C */ u16 mCurrentSelectionId; - - /* 0x0830 */ u8 _0x0830[0x083B - 0x082E]; + + /* 0x082E */ u8 _0x082E[0x0831 - 0x082E]; + + /* 0x0831 */ bool field_0x0831; + /* 0x0832 */ bool field_0x0832; + + /* 0x0832 */ u8 _0x0832[0x083B - 0x0833]; /* 0x083B */ bool field_0x083B; - /* 0x083D */ u8 _0x083D[0x0841 - 0x083C]; + /* 0x083C */ u8 _0x083C[0x083E - 0x083C]; - /* 0x0841 */ bool field_0x0841; + /* 0x083E */ bool field_0x083E; + /* 0x083F */ bool field_0x083F; + /* 0x0840 */ bool field_0x0840; + /* 0x0841 */ bool mCurrentSelectionIsRestricted; }; #endif diff --git a/include/d/lyt/d_lyt_pause_disp_01.h b/include/d/lyt/d_lyt_pause_disp_01.h index 49b4cd97..41d2e769 100644 --- a/include/d/lyt/d_lyt_pause_disp_01.h +++ b/include/d/lyt/d_lyt_pause_disp_01.h @@ -1,9 +1,11 @@ #ifndef LYT_PAUSE_DISP_01_H #define LYT_PAUSE_DISP_01_H +#include "common.h" #include "d/d_cursor_hit_check.h" #include "d/lyt/d2d.h" #include "d/lyt/d_lyt_common_icon_material.h" +#include "nw4r/lyt/lyt_pane.h" #include "s/s_State.hpp" class dLytPauseDisp01_c { @@ -11,7 +13,16 @@ public: dLytPauseDisp01_c(); virtual ~dLytPauseDisp01_c() {} - void init(); + bool build(); + bool remove(); + bool execute(); + bool draw(); + + void drawDirectly(); + void requestIn(bool scroll); + void requestOut(bool scroll); + void requestSelect(); + void requestUnselect(); STATE_FUNC_DECLARE(dLytPauseDisp01_c, None); STATE_FUNC_DECLARE(dLytPauseDisp01_c, In); @@ -21,15 +32,49 @@ public: STATE_FUNC_DECLARE(dLytPauseDisp01_c, Out); private: - void displayElement(int idx, float value); + void setAnm(int idx, f32 value); + void stopAnm(int idx); - /* 0x0004 */ STATE_MGR_DECLARE(dLytPauseDisp01_c); - /* 0x0040 */ d2d::LytBase_c mLytBase; - /* 0x00D0 */ d2d::AnmGroup_c field_0x00D0[15]; - /* 0x0490 */ dLytCommonIconMaterial_c field_0x2050[28]; - /* 0x96B0 */ d2d::SubPaneList mSubpanes; - /* 0x96BC */ d2d::SubPaneListNode field_0xE11C[28]; - /* 0x987C */ dCursorHitCheckLyt_c field_0xE29C; + void setupDisp(); + void setupInsects(); + void setupMaterials(); + + void showInsectsAndMaterials(); + s32 updateSelection(); + s32 getPointerPane() const; + void hideInsectsAndMaterials(); + + bool shouldInsectBeDisplayed(s32 insectIdx) const; + u16 getInsectItemId(s32 insectIdx) const; + s32 getInsectIcon(s32 insectIdx) const; + s32 getInsectCountByIndex(s32 insectIdx) const; + + u16 getQuestItemId(s32 questItemIndex) const; + + bool shouldMaterialBeDisplayed(s32 materialIdx) const; + u16 getMaterialItemId(s32 materialIdx) const; + s32 getMaterialIcon(s32 materialIdx) const; + s32 getMaterialCountByIndex(s32 materialIdx) const; + + /* 0x0004 */ UI_STATE_MGR_DECLARE(dLytPauseDisp01_c); + /* 0x0040 */ d2d::LytBase_c mLyt; + /* 0x00D0 */ d2d::AnmGroup_c mAnm[15]; + /* 0x0490 */ dLytCommonIconMaterial_c mIcons[28]; + /* 0x96B0 */ d2d::SubPaneList mSubpaneList; + /* 0x96BC */ d2d::SubPaneListNode mSubpanes[28]; + /* 0x987C */ dCursorHitCheckLyt_c mCsHitCheck; + /* 0x98A4 */ nw4r::lyt::Pane *mpPanes[6]; + /* 0x98BC */ s32 mStep; + /* 0x98C0 */ s32 mPrevNavTarget; + /* 0x98C4 */ s32 mCurrentNavTarget; + /* 0x98C8 */ s32 mTimer; + /* 0x98CC */ bool mInRequest; + /* 0x98CD */ bool mOutRequest; + /* 0x98CE */ bool field_0x98CE; + /* 0x98CF */ bool mIsVisible; + /* 0x98D0 */ bool mDoScrollAnim; + /* 0x98D1 */ bool field_0x98D1; + /* 0x98D2 */ bool mSelectToggle; }; #endif diff --git a/src/d/lyt/d_lyt_common_arrow.cpp b/src/d/lyt/d_lyt_common_arrow.cpp index 024e81ab..c4c3b11a 100644 --- a/src/d/lyt/d_lyt_common_arrow.cpp +++ b/src/d/lyt/d_lyt_common_arrow.cpp @@ -37,6 +37,12 @@ static const d2d::LytBrlanMapping brlanMap[] = { #define ANIM_INPUT 7 #define ANIM_OUT 8 +#define NUM_ANIMS 9 + +#define PANE_BOUNDING_L 0 +#define PANE_BOUNDING_R 1 +#define PANE_BOUNDING_NONE 2 + dLytCommonArrow_c::dLytCommonArrow_c() : mStateMgr(*this, sStateID::null) {} bool dLytCommonArrow_c::build() { @@ -45,13 +51,13 @@ bool dLytCommonArrow_c::build() { mLytBase.build("commonArrow_00.brlyt", &mResAcc); mLytBase.setPriority(0x86); - for (int i = 0; i < 9; i++) { + for (int i = 0; i < NUM_ANIMS; i++) { mAnmGroups[i].init(brlanMap[i].mFile, &mResAcc, mLytBase.getLayout(), brlanMap[i].mName); } mCsHitCheck.init(mLytBase.getLayout()->GetRootPane(), 1, 0, 0); dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitCheck); - mBoundingL = mLytBase.findBounding("B_arrowL_00"); - mBoundingR = mLytBase.findBounding("B_arrowR_00"); + mpBoundings[PANE_BOUNDING_L] = mLytBase.findBounding("B_arrowL_00"); + mpBoundings[PANE_BOUNDING_R] = mLytBase.findBounding("B_arrowR_00"); mStateMgr.changeState(StateID_None); setState(0); return true; @@ -60,7 +66,7 @@ bool dLytCommonArrow_c::build() { bool dLytCommonArrow_c::remove() { dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitCheck); mLytBase.unbindAnims(); - for (int i = 0; i < 9; i++) { + for (int i = 0; i < NUM_ANIMS; i++) { mAnmGroups[i].remove(); } return true; @@ -104,7 +110,7 @@ bool dLytCommonArrow_c::requestIn() { if (!mStateMgr.getStateID()->isEqual(StateID_None)) { return false; } - mInRequested = 1; + mInRequested = true; return true; } @@ -148,33 +154,33 @@ void dLytCommonArrow_c::tickDown(d2d::AnmGroup_c *ctrl) { void dLytCommonArrow_c::fn_80168880() { int i = -1; if (!dPadNav::isPointerVisible()) { - field_0x6B4 = 2; + mTargetedBounding = PANE_BOUNDING_NONE; return; } dCursorHitCheck_c *d = dCsBase_c::GetInstance()->getHitCheck(); if (d != nullptr && d->getType() == 'lyt ') { - if (static_cast(d)->getHitPane() == mBoundingL) { + if (static_cast(d)->getHitPane() == mpBoundings[PANE_BOUNDING_L]) { i = 0; - } else if (static_cast(d)->getHitPane() == mBoundingR) { + } else if (static_cast(d)->getHitPane() == mpBoundings[PANE_BOUNDING_R]) { i = 1; } } if (i >= 0) { - field_0x6B4 = i; + mTargetedBounding = i; } else { - field_0x6B4 = 2; + mTargetedBounding = PANE_BOUNDING_NONE; } } void dLytCommonArrow_c::initializeState_None() { mLytBase.unbindAnims(); - mInRequested = 0; - mOutRequested = 0; + mInRequested = false; + mOutRequested = false; field_0x6CA = 0; field_0x6CB = 0; - field_0x6B4 = 2; + mTargetedBounding = PANE_BOUNDING_NONE; field_0x6B8 = 2; field_0x6BC = 2; field_0x6C0 = 2; @@ -183,12 +189,12 @@ void dLytCommonArrow_c::initializeState_None() { field_0x6CC = 1; } void dLytCommonArrow_c::executeState_None() { - if (mInRequested == 1) { + if (mInRequested == true) { mStateMgr.changeState(StateID_In); } } void dLytCommonArrow_c::finalizeState_None() { - mInRequested = 0; + mInRequested = false; displayElement(ANIM_LOOP, 0.0f); } @@ -230,7 +236,7 @@ void dLytCommonArrow_c::initializeState_Wait() { } void dLytCommonArrow_c::executeState_Wait() { - if (mOutRequested == 1) { + if (mOutRequested == true) { mStateMgr.changeState(StateID_Out); return; } @@ -297,13 +303,13 @@ void dLytCommonArrow_c::finalizeState_Wait() {} void dLytCommonArrow_c::initializeState_Out() { mTimer = 0; displayElement(ANIM_OUT, 0.0f); - mOutRequested = 0; + mOutRequested = false; } void dLytCommonArrow_c::executeState_Out() { switch (mTimer) { case 0: { d2d::AnmGroup_c *s = &mAnmGroups[ANIM_OUT]; - if (s->isEndReached() == 1) { + if (s->isEndReached() == true) { mTimer = 1; field_0x6CA = 1; } diff --git a/src/d/lyt/d_lyt_cursor_stick.cpp b/src/d/lyt/d_lyt_cursor_stick.cpp index a5749057..25be21e1 100644 --- a/src/d/lyt/d_lyt_cursor_stick.cpp +++ b/src/d/lyt/d_lyt_cursor_stick.cpp @@ -150,7 +150,7 @@ void dLytCursorStick_c::executeState_On() { } void dLytCursorStick_c::finalizeState_On() {} -void dLytCursorStick_c::setTargetPane(nw4r::lyt::Pane *pane) { +void dLytCursorStick_c::setTargetPane(const nw4r::lyt::Pane *pane) { mpTargetPane = pane; positionToTarget(); } diff --git a/src/d/lyt/d_lyt_pause_disp_01.cpp b/src/d/lyt/d_lyt_pause_disp_01.cpp index 4d790486..5b315c2d 100644 --- a/src/d/lyt/d_lyt_pause_disp_01.cpp +++ b/src/d/lyt/d_lyt_pause_disp_01.cpp @@ -1,5 +1,30 @@ #include "d/lyt/d_lyt_pause_disp_01.h" +#include "common.h" +#include "d/a/d_a_item.h" +#include "d/a/d_a_itembase.h" +#include "d/d_cs_base.h" +#include "d/d_cursor_hit_check.h" +#include "d/d_pad_nav.h" +#include "d/d_rumble.h" +#include "d/flag/storyflag_manager.h" +#include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_common_icon_item_maps.h" +#include "d/lyt/d_lyt_common_icon_material.h" +#include "d/lyt/d_lyt_control_game.h" +#include "d/lyt/d_lyt_pause.h" +#include "d/lyt/d_textbox.h" +#include "d/snd/d_snd_small_effect_mgr.h" +#include "d/snd/d_snd_wzsound.h" +#include "m/m_vec.h" +#include "nw4r/lyt/lyt_bounding.h" +#include "nw4r/lyt/lyt_group.h" +#include "nw4r/math/math_types.h" +#include "rvl/MTX/mtxvec.h" +#include "sized_string.h" +#include "toBeSorted/counters/counter.h" +#include "toBeSorted/d_emitter.h" + STATE_DEFINE(dLytPauseDisp01_c, None); STATE_DEFINE(dLytPauseDisp01_c, In); STATE_DEFINE(dLytPauseDisp01_c, Wait); @@ -7,28 +32,997 @@ STATE_DEFINE(dLytPauseDisp01_c, Select); STATE_DEFINE(dLytPauseDisp01_c, GetDemo); STATE_DEFINE(dLytPauseDisp01_c, Out); +static const d2d::LytBrlanMapping brlanMap[] = { + { "pause_01_in.brlan", "G_inOut_00"}, + { "pause_01_onOff.brlan", "G_tegamiB_00"}, + { "pause_01_onOff.brlan", "G_terryBug_00"}, + { "pause_01_onOff.brlan", "G_garagara_00"}, + { "pause_01_onOff.brlan", "G_genki_00"}, + { "pause_01_out.brlan", "G_inOut_00"}, + { "pause_01_have.brlan", "G_tegamiB_00"}, + { "pause_01_have.brlan", "G_terryBug_00"}, + { "pause_01_have.brlan", "G_garagara_00"}, + { "pause_01_have.brlan", "G_genki_00"}, + { "pause_01_loop.brlan", "G_loop_00"}, + { "pause_01_scrollRIn.brlan", "G_scroll_00"}, + {"pause_01_scrollROut.brlan", "G_scroll_00"}, + { "pause_01_scrollLIn.brlan", "G_scroll_00"}, + {"pause_01_scrollLOut.brlan", "G_scroll_00"}, +}; + +#define PAUSE_DISP_01_ANIM_IN 0 +#define PAUSE_DISP_01_ANIM_ONOFF_TEGAMI 1 +#define PAUSE_DISP_01_ANIM_ONOFF_TERRY_BUG 2 +#define PAUSE_DISP_01_ANIM_ONOFF_GARAGARA 3 +#define PAUSE_DISP_01_ANIM_ONOFF_GENKI 4 +#define PAUSE_DISP_01_ANIM_OUT 5 +#define PAUSE_DISP_01_ANIM_HAVE_TEGAMI 6 +#define PAUSE_DISP_01_ANIM_HAVE_TERRY_BUG 7 +#define PAUSE_DISP_01_ANIM_HAVE_GARAGARA 8 +#define PAUSE_DISP_01_ANIM_HAVE_GENKI 9 +#define PAUSE_DISP_01_ANIM_LOOP 10 +#define PAUSE_DISP_01_ANIM_SCROLL_R_IN 11 +#define PAUSE_DISP_01_ANIM_SCROLL_R_OUT 12 +#define PAUSE_DISP_01_ANIM_SCROLL_L_IN 13 +#define PAUSE_DISP_01_ANIM_SCROLL_L_OUT 14 + +#define PAUSE_DISP_01_ANIM_OFFSET_ONOFF PAUSE_DISP_01_ANIM_ONOFF_TEGAMI +#define PAUSE_DISP_01_ANIM_OFFSET_HAVE PAUSE_DISP_01_ANIM_HAVE_TEGAMI +#define PAUSE_DISP_01_NUM_ANIMS 15 + +#define PAUSE_DISP_01_NUM_SUBPANES 28 + +#define PAUSE_DISP_01_OFFSET_INSECTS 0 +#define PAUSE_DISP_01_NUM_INSECTS 12 +#define PAUSE_DISP_01_OFFSET_MATERIALS PAUSE_DISP_01_NUM_INSECTS +#define PAUSE_DISP_01_NUM_MATERIALS 16 + +static const char *sGroupName = "G_ref_00"; + +static const char *sPaneNames[] = { + "B_tegamiB_00", "B_terryBug_00", "B_garagara_00", "B_genki_00", nullptr, nullptr, +}; + +#define PAUSE_DISP_01_PANE_TEGAMI 0 +#define PAUSE_DISP_01_PANE_TERRY_BUG 1 +#define PAUSE_DISP_01_PANE_GARAGARA 2 +#define PAUSE_DISP_01_PANE_GENKI 3 +#define PAUSE_DISP_01_PANE_LEFT 4 +#define PAUSE_DISP_01_PANE_RIGHT 5 + +#define PAUSE_DISP_01_NUM_SPECIAL_ICON_PANES 4 +#define PAUSE_DISP_01_NUM_MY_PANES 6 + +#define PAUSE_DISP_01_NUM_COMBINED_PANES (PAUSE_DISP_01_NUM_MY_PANES + PAUSE_DISP_01_NUM_SUBPANES) +#define PAUSE_DISP_01_OFFSET_MY_PANES PAUSE_DISP_01_NUM_SUBPANES + dLytPauseDisp01_c::dLytPauseDisp01_c() : mStateMgr(*this, sStateID::null) {} -void dLytPauseDisp01_c::initializeState_None() {} -void dLytPauseDisp01_c::executeState_None() {} +bool dLytPauseDisp01_c::build() { + dLytPauseMgr_c *pauseMgr = dLytPauseMgr_c::GetInstance(); + d2d::ResAccIf_c *resAcc = pauseMgr->getResAcc1(); + mLyt.setResAcc(resAcc); + mLyt.build("pause_01.brlyt", nullptr); + mLyt.setPriority(0x86); + + for (int i = 0; i < PAUSE_DISP_01_NUM_ANIMS; i++) { + mAnm[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName); + } + + resAcc = pauseMgr->getResAcc2(); + + for (int i = 0; i < PAUSE_DISP_01_NUM_SUBPANES; i++) { + if (i < PAUSE_DISP_01_NUM_INSECTS) { + mIcons[i].build(resAcc, 0); + } else { + mIcons[i].build(resAcc, 1); + } + mSubpanes[i].mpLytPane = &mIcons[i]; + 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); + } + } + + mCsHitCheck.init(mLyt.getLayout()->GetRootPane(), 1, 0, 0); + dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitCheck); + + for (int i = 0; i < PAUSE_DISP_01_NUM_MY_PANES; i++) { + if (i < PAUSE_DISP_01_NUM_SPECIAL_ICON_PANES) { + mpPanes[i] = mLyt.findBounding(sPaneNames[i]); + mpPanes[i]->SetVisible(true); + } else { + mpPanes[i] = pauseMgr->getArrowBounding(i - PAUSE_DISP_01_NUM_SPECIAL_ICON_PANES); + } + } + + mLyt.calc(); + mStateMgr.changeState(StateID_None); + + return true; +} + +bool dLytPauseDisp01_c::remove() { + dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitCheck); + 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 < PAUSE_DISP_01_NUM_SUBPANES; i++) { + mSubpanes[i].mpLytPane->remove(); + } + + mLyt.unbindAnims(); + + for (int i = 0; i < PAUSE_DISP_01_NUM_ANIMS; i++) { + mAnm[i].remove(); + } + + return true; +} + +bool dLytPauseDisp01_c::execute() { + field_0x98D1 = false; + mStateMgr.executeState(); + for (int i = 0; i < PAUSE_DISP_01_NUM_SUBPANES; i++) { + mSubpanes[i].mpLytPane->execute(); + } + mLyt.calc(); + mCsHitCheck.resetCachedHitboxes(); + mCsHitCheck.execute(); + if (!mStateMgr.getStateID()->isEqual(StateID_None)) { + mAnm[PAUSE_DISP_01_ANIM_LOOP].play(); + } + + return true; +} + +bool dLytPauseDisp01_c::draw() { + if (mIsVisible == true) { + mLyt.addToDrawList(); + } + return true; +} + +void dLytPauseDisp01_c::drawDirectly() { + mLyt.draw(); +} + +void dLytPauseDisp01_c::requestIn(bool scroll) { + mInRequest = true; + mDoScrollAnim = scroll; +} + +void dLytPauseDisp01_c::requestOut(bool scroll) { + mOutRequest = true; + mDoScrollAnim = scroll; +} + +void dLytPauseDisp01_c::requestSelect() { + mSelectToggle = true; +} + +void dLytPauseDisp01_c::requestUnselect() { + mSelectToggle = true; +} + +void dLytPauseDisp01_c::initializeState_None() { + for (int i = 0; i < PAUSE_DISP_01_NUM_ANIMS; i++) { + mAnm[i].unbind(); + } + + field_0x98CE = false; + mInRequest = false; + mOutRequest = false; + mIsVisible = false; + field_0x98D1 = false; + mStep = 0; + mPrevNavTarget = 0; + mCurrentNavTarget = 0; + mTimer = 0; + + for (int i = 0; i < PAUSE_DISP_01_NUM_SUBPANES; i++) { + mIcons[i].reset(); + mIcons[i].setVisible(true); + } + + setAnm(PAUSE_DISP_01_ANIM_ONOFF_TEGAMI, 0.0f); + setAnm(PAUSE_DISP_01_ANIM_ONOFF_TERRY_BUG, 0.0f); + setAnm(PAUSE_DISP_01_ANIM_ONOFF_GARAGARA, 0.0f); + setAnm(PAUSE_DISP_01_ANIM_ONOFF_GENKI, 0.0f); + + for (int i = 0; i < PAUSE_DISP_01_NUM_MY_PANES; i++) { + if (i < PAUSE_DISP_01_NUM_SPECIAL_ICON_PANES) { + mpPanes[i]->SetVisible(false); + } + } + + setAnm(PAUSE_DISP_01_ANIM_LOOP, 0.0f); +} +void dLytPauseDisp01_c::executeState_None() { + if (mInRequest == true) { + mInRequest = false; + mStateMgr.changeState(StateID_In); + } +} void dLytPauseDisp01_c::finalizeState_None() {} -void dLytPauseDisp01_c::initializeState_In() {} -void dLytPauseDisp01_c::executeState_In() {} -void dLytPauseDisp01_c::finalizeState_In() {} +void dLytPauseDisp01_c::initializeState_In() { + dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); + if (mDoScrollAnim == true) { + setAnm(PAUSE_DISP_01_ANIM_IN, 0.0f); + mAnm[PAUSE_DISP_01_ANIM_IN].setFrame(mAnm[PAUSE_DISP_01_ANIM_IN].getAnimDuration()); + if (pause->getField_0x0831()) { + setAnm(PAUSE_DISP_01_ANIM_SCROLL_L_IN, 0.0f); + } else { + setAnm(PAUSE_DISP_01_ANIM_SCROLL_R_IN, 0.0f); + } -void dLytPauseDisp01_c::initializeState_Wait() {} -void dLytPauseDisp01_c::executeState_Wait() {} + if (pause->getField_0x0840()) { + if (pause->getField_0x0831()) { + mPrevNavTarget = PAUSE_DISP_01_OFFSET_MY_PANES + PAUSE_DISP_01_PANE_LEFT + 1; + } else { + mPrevNavTarget = PAUSE_DISP_01_OFFSET_MY_PANES + PAUSE_DISP_01_PANE_RIGHT + 1; + } + } + } else { + setAnm(PAUSE_DISP_01_ANIM_IN, 0.0f); + } + mIsVisible = true; + setupDisp(); +} +void dLytPauseDisp01_c::executeState_In() { + dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); + + s32 anim = PAUSE_DISP_01_ANIM_IN; + if (mDoScrollAnim == true) { + anim = pause->getField_0x0831() ? PAUSE_DISP_01_ANIM_SCROLL_L_IN : PAUSE_DISP_01_ANIM_SCROLL_R_IN; + } + + d2d::AnmGroup_c &anm = mAnm[anim]; + + if (anm.isEndReached() == true) { + if (dLytControlGame_c::getInstance()->getField_0x15C67()) { + mStateMgr.changeState(StateID_GetDemo); + } else { + mStateMgr.changeState(StateID_Wait); + } + } else { + anm.play(); + } +} +void dLytPauseDisp01_c::finalizeState_In() { + dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); + if (pause->getField_0x0831()) { + stopAnm(PAUSE_DISP_01_ANIM_SCROLL_L_IN); + } else { + stopAnm(PAUSE_DISP_01_ANIM_SCROLL_R_IN); + } + + mDoScrollAnim = false; + if (pause->getField_0x083E()) { + if (!pause->getField_0x0832()) { + // TODO id + mCurrentNavTarget = 34; + } else { + // TODO id + mCurrentNavTarget = 33; + } + mPrevNavTarget = mCurrentNavTarget; + } +} + +void dLytPauseDisp01_c::initializeState_Wait() { + field_0x98CE = true; + showInsectsAndMaterials(); +} +void dLytPauseDisp01_c::executeState_Wait() { + field_0x98CE = false; + if (mOutRequest == true) { + mOutRequest = false; + hideInsectsAndMaterials(); + mStateMgr.changeState(StateID_Out); + } else if (mSelectToggle == true) { + mStateMgr.changeState(StateID_Select); + dSndSmallEffectMgr_c *mgr = dSndSmallEffectMgr_c::GetInstance(); + s32 itemIdx = mCurrentNavTarget - 1; + if (itemIdx < PAUSE_DISP_01_NUM_INSECTS) { + mgr->playSound(SE_S_MENU_P2_SELECT_INSECT); + } else if (itemIdx < PAUSE_DISP_01_NUM_INSECTS + PAUSE_DISP_01_NUM_MATERIALS) { + mgr->playSound(SE_S_MENU_P2_SELECT_MATERIAL); + } else if (itemIdx < + PAUSE_DISP_01_NUM_INSECTS + PAUSE_DISP_01_NUM_MATERIALS + PAUSE_DISP_01_NUM_SPECIAL_ICON_PANES) { + mgr->playSound(SE_S_MENU_P2_SELECT_IMPORTANT); + } + + } else if (updateSelection() != 0) { + field_0x98D1 = true; + } +} void dLytPauseDisp01_c::finalizeState_Wait() {} -void dLytPauseDisp01_c::initializeState_Select() {} -void dLytPauseDisp01_c::executeState_Select() {} -void dLytPauseDisp01_c::finalizeState_Select() {} +void dLytPauseDisp01_c::initializeState_Select() { + mSelectToggle = false; +} +void dLytPauseDisp01_c::executeState_Select() { + if (mSelectToggle == true) { + mStateMgr.changeState(StateID_Wait); + } +} +void dLytPauseDisp01_c::finalizeState_Select() { + mSelectToggle = false; +} -void dLytPauseDisp01_c::initializeState_GetDemo() {} -void dLytPauseDisp01_c::executeState_GetDemo() {} +void dLytPauseDisp01_c::initializeState_GetDemo() { + field_0x98CE = true; + mStep = 0; + mTimer = 0; +} +void dLytPauseDisp01_c::executeState_GetDemo() { + switch (mStep) { + case 0: { + field_0x98CE = false; + if (mTimer < 2) { + mTimer++; + } else { + mTimer = 0; + mStep = 1; + } + break; + } + case 1: { + s32 thingIdx = 0; + mStep = 2; + u16 item = dLytControlGame_c::getInstance()->getItemForPauseDemo(); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_ITEM_SET_FX); + if (item == ITEM_1_CRYSTAL || item == ITEM_5_CRYSTALS) { + // gratitude crystal + mAnm[PAUSE_DISP_01_ANIM_HAVE_GENKI].setFrame(1.0f); + nw4r::math::MTX34 mtx = mpPanes[PAUSE_DISP_01_PANE_GENKI]->GetGlobalMtx(); + nw4r::math::VEC3 v(0.0f, 0.0f, 0.0f); + MTXMultVec(mtx, v, v); + mVec3_c v1; + v1.set(v.x, v.y, v.z); + dJEffManager_c::spawnUIEffect( + PARTICLE_RESOURCE_ID_MAPPING_989_, v1, nullptr, nullptr, nullptr, nullptr + ); + } else if (item >= ITEM_HORNET_LARVAE) { + // material + s32 thingIdx; + for (s32 idx = 0; idx < PAUSE_DISP_01_NUM_MATERIALS; idx++) { + if (getMaterialItemId(idx) == item) { + thingIdx = idx; + break; + } + } + s32 iconIdx = PAUSE_DISP_01_OFFSET_MATERIALS + thingIdx; + if (dAcItem_c::isPerformingInitialCollection()) { + mIcons[iconIdx].setShadow(false); + mIcons[iconIdx].setHasNumber(false); + s32 count = getMaterialCountByIndex(thingIdx); + mIcons[iconIdx].setNumber(count); + s32 icon = getMaterialIcon(thingIdx); + mIcons[iconIdx].setItem(icon); + } + nw4r::math::MTX34 mtx = mIcons[iconIdx].getBounding()->GetGlobalMtx(); + nw4r::math::VEC3 v(0.0f, 0.0f, 0.0f); + MTXMultVec(mtx, v, v); + mVec3_c v1; + v1.set(v.x, v.y, v.z); + dJEffManager_c::spawnUIEffect( + PARTICLE_RESOURCE_ID_MAPPING_989_, v1, nullptr, nullptr, nullptr, nullptr + ); + } else { + // insect + for (s32 idx = 0; idx < PAUSE_DISP_01_NUM_INSECTS; idx++) { + if (getInsectItemId(idx) == item) { + thingIdx = idx; + break; + } + } + s32 iconIdx = PAUSE_DISP_01_OFFSET_INSECTS + thingIdx; + if (dAcItem_c::isPerformingInitialCollection()) { + mIcons[iconIdx].setShadow(false); + mIcons[iconIdx].setHasNumber(false); + s32 count = getInsectCountByIndex(thingIdx); + mIcons[iconIdx].setNumber(count); + s32 icon = getInsectIcon(thingIdx); + mIcons[iconIdx].setItem(icon); + } + nw4r::math::MTX34 mtx = mIcons[iconIdx].getBounding()->GetGlobalMtx(); + nw4r::math::VEC3 v(0.0f, 0.0f, 0.0f); + MTXMultVec(mtx, v, v); + mVec3_c v1; + v1.set(v.x, v.y, v.z); + dJEffManager_c::spawnUIEffect( + PARTICLE_RESOURCE_ID_MAPPING_989_, v1, nullptr, nullptr, nullptr, nullptr + ); + } + break; + } + case 2: { + if (mTimer < 35) { + mTimer++; + } else { + mTimer = 0; + mStep = 3; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_ITEM_SET_COUNT_UP); + u16 item = dLytControlGame_c::getInstance()->getItemForPauseDemo(); + s32 thingIdx = 0; + if (item == ITEM_1_CRYSTAL || item == ITEM_5_CRYSTALS) { + dTextBox_c *box; + s32 count = dAcItem_c::getGratitudeCrystalCount(); + SizedWString<32> buf; + buf.sprintf(L"%d", count); + box = mLyt.getTextBox("T_count_28"); + box->setTextWithGlobalTextProcessor(buf); + box->SetVisible(true); + box = mLyt.getTextBox("T_countS_28"); + box->setTextWithGlobalTextProcessor(buf); + box->SetVisible(true); + } else if (item >= ITEM_HORNET_LARVAE) { + // material + for (s32 idx = 0; idx < PAUSE_DISP_01_NUM_MATERIALS; idx++) { + if (getMaterialItemId(idx) == item) { + thingIdx = idx; + break; + } + } + s32 iconIdx = PAUSE_DISP_01_OFFSET_MATERIALS + thingIdx; + mIcons[iconIdx].setShadow(false); + mIcons[iconIdx].setHasNumber(true); + s32 count = getMaterialCountByIndex(thingIdx); + mIcons[iconIdx].setNumber(count); + s32 icon = getMaterialIcon(thingIdx); + mIcons[iconIdx].setItem(icon); + } else { + // insect + for (s32 idx = 0; idx < PAUSE_DISP_01_NUM_INSECTS; idx++) { + if (getInsectItemId(idx) == item) { + thingIdx = idx; + break; + } + } + s32 iconIdx = PAUSE_DISP_01_OFFSET_INSECTS + thingIdx; + mIcons[iconIdx].setShadow(false); + mIcons[iconIdx].setHasNumber(true); + s32 count = getInsectCountByIndex(thingIdx); + mIcons[iconIdx].setNumber(count); + s32 icon = getInsectIcon(thingIdx); + mIcons[iconIdx].setItem(icon); + } + } + break; + } + case 3: { + if (mTimer < 37) { + mTimer++; + } else { + mTimer = 0; + mStateMgr.changeState(StateID_Wait); + } + break; + } + } +} void dLytPauseDisp01_c::finalizeState_GetDemo() {} -void dLytPauseDisp01_c::initializeState_Out() {} -void dLytPauseDisp01_c::executeState_Out() {} +void dLytPauseDisp01_c::initializeState_Out() { + stopAnm(PAUSE_DISP_01_ANIM_IN); + if (mDoScrollAnim == true) { + if (dLytPauseMgr_c::GetInstance()->getField_0x0831()) { + setAnm(PAUSE_DISP_01_ANIM_SCROLL_R_OUT, 0.0f); + } else { + setAnm(PAUSE_DISP_01_ANIM_SCROLL_L_OUT, 0.0f); + } + } else { + setAnm(PAUSE_DISP_01_ANIM_OUT, 0.0f); + } + mStep = 0; +} +void dLytPauseDisp01_c::executeState_Out() { + s32 anim = PAUSE_DISP_01_ANIM_OUT; + if (mDoScrollAnim == true) { + anim = dLytPauseMgr_c::GetInstance()->getField_0x0831() ? PAUSE_DISP_01_ANIM_SCROLL_R_OUT : + PAUSE_DISP_01_ANIM_SCROLL_L_OUT; + } + + d2d::AnmGroup_c &anm = mAnm[anim]; + + switch (mStep) { + case 0: { + if (anm.isEndReached() == true) { + mStep = 1; + field_0x98CE = true; + } + break; + } + case 1: { + mStateMgr.changeState(StateID_None); + return; + } + } + + anm.play(); +} void dLytPauseDisp01_c::finalizeState_Out() {} + +void dLytPauseDisp01_c::setAnm(int idx, f32 value) { + d2d::AnmGroup_c &anm = mAnm[idx]; + anm.setAnimEnable(true); + anm.bind(false); + anm.setFrame(value); +} + +void dLytPauseDisp01_c::stopAnm(int idx) { + d2d::AnmGroup_c &anm = mAnm[idx]; + anm.unbind(); +} + +void dLytPauseDisp01_c::setupDisp() { + static const char *sPaneTable[] = { + "N_bug_00", "N_bug_01", "N_bug_02", "N_bug_03", "N_bug_04", "N_bug_05", "N_bug_06", + "N_bug_07", "N_bug_08", "N_bug_09", "N_bug_10", "N_bug_11", "N_sozai_00", "N_sozai_01", + "N_sozai_02", "N_sozai_03", "N_sozai_04", "N_sozai_05", "N_sozai_06", "N_sozai_07", "N_sozai_08", + "N_sozai_09", "N_sozai_10", "N_sozai_11", "N_sozai_12", "N_sozai_13", "N_sozai_14", "N_sozai_15", + }; + + // Fixes a regswap... + const char **name = sPaneTable; + for (int i = 0; i < PAUSE_DISP_01_NUM_SUBPANES; i++) { + mLyt.findPane(*name)->SetVisible(true); + name++; + } + + setupInsects(); + setupMaterials(); + + if (StoryflagManager::sInstance->getFlag(552) || StoryflagManager::sInstance->getFlag(555)) { + setAnm(PAUSE_DISP_01_ANIM_HAVE_TEGAMI, 2.0f); + mpPanes[PAUSE_DISP_01_PANE_TEGAMI]->SetVisible(true); + } else if (dAcItem_c::checkFlag(ITEM_CAWLIN_LETTER)) { + setAnm(PAUSE_DISP_01_ANIM_HAVE_TEGAMI, 1.0f); + mpPanes[PAUSE_DISP_01_PANE_TEGAMI]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_01_ANIM_HAVE_TEGAMI, 0.0f); + } + + if (StoryflagManager::sInstance->getFlag(477)) { + setAnm(PAUSE_DISP_01_ANIM_HAVE_TERRY_BUG, 2.0f); + mpPanes[PAUSE_DISP_01_PANE_TERRY_BUG]->SetVisible(true); + } else if (StoryflagManager::sInstance->getFlag(476)) { + setAnm(PAUSE_DISP_01_ANIM_HAVE_TERRY_BUG, 1.0f); + mpPanes[PAUSE_DISP_01_PANE_TERRY_BUG]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_01_ANIM_HAVE_TERRY_BUG, 0.0f); + } + + if (StoryflagManager::sInstance->getFlag(387)) { + setAnm(PAUSE_DISP_01_ANIM_HAVE_GARAGARA, 2.0f); + mpPanes[PAUSE_DISP_01_PANE_GARAGARA]->SetVisible(true); + } else if (dAcItem_c::checkFlag(ITEM_RATTLE)) { + setAnm(PAUSE_DISP_01_ANIM_HAVE_GARAGARA, 1.0f); + mpPanes[PAUSE_DISP_01_PANE_GARAGARA]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_01_ANIM_HAVE_GARAGARA, 0.0f); + } + + dLytControlGame_c *lytControl = dLytControlGame_c::getInstance(); + u16 demoItem = lytControl->getItemForPauseDemo(); + u32 crystalCount = dAcItem_c::getGratitudeCrystalCount(); + if (crystalCount != 0) { + bool isDemo = false; + if (lytControl->getField_0x15C67() && (demoItem == ITEM_1_CRYSTAL || demoItem == ITEM_5_CRYSTALS)) { + isDemo = true; + crystalCount = demoItem == ITEM_1_CRYSTAL ? crystalCount - 1 : crystalCount - 5; + } + + if (StoryflagManager::sInstance->getFlag(360)) { + setAnm(PAUSE_DISP_01_ANIM_HAVE_GENKI, 2.0f); + } else if (isDemo && crystalCount == 0) { + setAnm(PAUSE_DISP_01_ANIM_HAVE_GENKI, 0.0f); + } else { + setAnm(PAUSE_DISP_01_ANIM_HAVE_GENKI, 1.0f); + } + + SizedWString<32> buf; + buf.sprintf(L"%d", crystalCount); + dTextBox_c *box; + box = mLyt.getTextBox("T_count_28"); + box->setTextWithGlobalTextProcessor(buf); + if (isDemo && crystalCount == 0) { + box->SetVisible(false); + } + + box = mLyt.getTextBox("T_countS_28"); + box->setTextWithGlobalTextProcessor(buf); + if (isDemo && crystalCount == 0) { + box->SetVisible(false); + } + + mpPanes[PAUSE_DISP_01_PANE_GENKI]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_01_ANIM_HAVE_GENKI, 0.0f); + } +} + +void dLytPauseDisp01_c::setupInsects() { + dLytControlGame_c *lytControl = dLytControlGame_c::getInstance(); + int insectIdx = 0; + for (int i = PAUSE_DISP_01_OFFSET_INSECTS; i < PAUSE_DISP_01_OFFSET_INSECTS + PAUSE_DISP_01_NUM_INSECTS; i++) { + mIcons[i].setBg(true); + if (shouldInsectBeDisplayed(insectIdx)) { + mIcons[i].setShadow(false); + mIcons[i].setHasNumber(true); + } else { + mIcons[i].setShadow(true); + mIcons[i].setHasNumber(false); + } + + s32 count = getInsectCountByIndex(insectIdx); + if (lytControl->getField_0x15C67() && lytControl->getItemForPauseDemo() == getInsectItemId(insectIdx)) { + count = lytControl->getItemCountForPauseDemo(); + } + + mIcons[i].setNumber(count); + s32 icon = getInsectIcon(insectIdx); + mIcons[i].setItem(icon); + + insectIdx++; + } +} + +void dLytPauseDisp01_c::setupMaterials() { + dLytControlGame_c *lytControl = dLytControlGame_c::getInstance(); + int materialIdx = 0; + for (int i = PAUSE_DISP_01_OFFSET_MATERIALS; i < PAUSE_DISP_01_OFFSET_MATERIALS + PAUSE_DISP_01_NUM_MATERIALS; + i++) { + mIcons[i].setBg(true); + if (shouldMaterialBeDisplayed(materialIdx)) { + mIcons[i].setShadow(false); + mIcons[i].setHasNumber(true); + } else { + mIcons[i].setShadow(true); + mIcons[i].setHasNumber(false); + } + + s32 count = getMaterialCountByIndex(materialIdx); + if (lytControl->getField_0x15C67() && lytControl->getItemForPauseDemo() == getMaterialItemId(materialIdx)) { + count = lytControl->getItemCountForPauseDemo(); + } + + mIcons[i].setNumber(count); + s32 icon = getMaterialIcon(materialIdx); + mIcons[i].setItem(icon); + + materialIdx++; + } +} + +void dLytPauseDisp01_c::showInsectsAndMaterials() { + for (int i = PAUSE_DISP_01_OFFSET_INSECTS; i < PAUSE_DISP_01_OFFSET_INSECTS + PAUSE_DISP_01_NUM_INSECTS; i++) { + mIcons[i].setVisible(true); + } + + for (int i = PAUSE_DISP_01_OFFSET_MATERIALS; i < PAUSE_DISP_01_OFFSET_MATERIALS + PAUSE_DISP_01_NUM_MATERIALS; + i++) { + mIcons[i].setVisible(true); + } +} + +// A matrix controlling navigation with the Nunchuk stick. +// The row index is the currently selected target, and the row contains +// the list of targets, one entry per stick direction (starting up and going clockwise) +// +// If someone was really bored they could probably replace all of these +// with constants... +static const u8 sNavTable[34][8] = { + { 0, 2, 2, 6, 5, 5, 33, 0}, + { 0, 3, 3, 7, 6, 5, 1, 1}, + { 0, 4, 4, 8, 7, 6, 2, 2}, + { 0, 13, 13, 17, 8, 7, 3, 3}, + { 1, 2, 6, 10, 9, 33, 33, 1}, + { 2, 3, 7, 11, 10, 9, 5, 1}, + { 3, 4, 8, 12, 11, 10, 6, 2}, + { 4, 13, 17, 21, 12, 11, 7, 3}, + { 5, 6, 10, 30, 29, 29, 33, 33}, + { 6, 7, 11, 31, 30, 29, 9, 5}, + { 7, 8, 12, 32, 31, 30, 10, 6}, + { 8, 17, 21, 25, 32, 31, 11, 7}, + { 0, 14, 14, 18, 17, 8, 4, 4}, + { 0, 15, 15, 19, 18, 17, 13, 13}, + { 0, 16, 16, 20, 19, 18, 14, 14}, + { 0, 0, 34, 20, 20, 19, 15, 15}, + {13, 14, 18, 22, 21, 12, 8, 4}, + {14, 15, 19, 23, 22, 21, 17, 13}, + {15, 16, 20, 24, 23, 22, 18, 14}, + {16, 16, 34, 34, 24, 23, 19, 15}, + {17, 18, 22, 26, 25, 32, 12, 8}, + {18, 19, 23, 27, 26, 25, 21, 17}, + {19, 20, 24, 28, 27, 26, 22, 18}, + {20, 34, 34, 28, 28, 27, 23, 19}, + {21, 22, 26, 26, 0, 32, 32, 12}, + {22, 23, 27, 27, 0, 25, 25, 21}, + {23, 24, 28, 28, 0, 26, 26, 22}, + {24, 24, 34, 0, 0, 27, 27, 23}, + { 9, 10, 30, 30, 0, 0, 33, 9}, + {10, 11, 31, 31, 0, 29, 29, 9}, + {11, 12, 32, 32, 0, 30, 30, 10}, + {12, 21, 25, 25, 0, 31, 31, 11}, + { 1, 1, 5, 9, 9, 0, 0, 0}, + {16, 0, 0, 0, 24, 24, 20, 16}, +}; + +s32 dLytPauseDisp01_c::updateSelection() { + dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); + if (!pause->isStateWait()) { + pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); + return 0; + } + + s32 target = 0; + if (dPadNav::isPointerVisible()) { + for (int i = 0; i < PAUSE_DISP_01_NUM_SUBPANES; i++) { + if (mIcons[i].isCursorOver()) { + target = i + 1; + // missed optimization + // break; + } + } + if (target == 0) { + s32 myPane = getPointerPane(); + if (myPane >= 0) { + target = myPane + PAUSE_DISP_01_OFFSET_MY_PANES + 1; + } + } + } else { + if (mCurrentNavTarget != 0) { + if (!dPadNav::isPrevPointerVisible() && dPadNav::getFSStickNavDirection() != dPadNav::FS_STICK_NONE) { + const u8 *directions = sNavTable[mCurrentNavTarget - 1]; + s32 newTarget = directions[dPadNav::getFSStickNavDirection() - 1]; + if (newTarget != 0) { + mCurrentNavTarget = newTarget; + } + } + } else { + mCurrentNavTarget = PAUSE_DISP_01_OFFSET_MY_PANES + PAUSE_DISP_01_PANE_TEGAMI + 1; + } + + target = mCurrentNavTarget; + } + + // Cursor outline + if (target != 0) { + if (target - 1 >= PAUSE_DISP_01_OFFSET_MY_PANES + PAUSE_DISP_01_NUM_SPECIAL_ICON_PANES) { + // left-right boundings + s32 paneIdx = target - PAUSE_DISP_01_OFFSET_MY_PANES - 1; + dCsBase_c::GetInstance()->setCursorStickTargetPane(mpPanes[paneIdx]); + pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); + pause->setSelectedArrowBounding( + target - (PAUSE_DISP_01_OFFSET_MY_PANES + PAUSE_DISP_01_NUM_SPECIAL_ICON_PANES + 1) + ); + } else if (target - 1 >= PAUSE_DISP_01_NUM_SUBPANES) { + // quest items + s32 paneIdx = target - PAUSE_DISP_01_NUM_SUBPANES - 1; + dCsBase_c::GetInstance()->setCursorStickTargetPane(mpPanes[paneIdx]); + s32 itemId = getQuestItemId(target - PAUSE_DISP_01_NUM_SUBPANES - 1); + pause->setSelection(dLytPauseMgr_c::SELECT_QUEST_MATERIAL, itemId, false); + } else { + const nw4r::lyt::Bounding *bounding = mIcons[target - 1].getBounding(); + dCsBase_c::GetInstance()->setCursorStickTargetPane(bounding); + + if (target - 1 >= PAUSE_DISP_01_OFFSET_MATERIALS) { + // materials + s32 paneIdx = target - PAUSE_DISP_01_OFFSET_MATERIALS - 1; + s32 itemId = getMaterialItemId(paneIdx); + pause->setSelection(dLytPauseMgr_c::SELECT_QUEST_MATERIAL, itemId, false); + } else { + // insects + s32 paneIdx = target - PAUSE_DISP_01_OFFSET_INSECTS - 1; + s32 itemId = getInsectItemId(paneIdx); + pause->setSelection(dLytPauseMgr_c::SELECT_INSECT, itemId, false); + } + } + } + + // make the selected item slightly larger + for (int i = 0; i < PAUSE_DISP_01_NUM_SUBPANES; i++) { + if (target != 0 && target - 1 == i) { + if (i >= PAUSE_DISP_01_OFFSET_MATERIALS) { + if (shouldMaterialBeDisplayed(i - PAUSE_DISP_01_OFFSET_MATERIALS)) { + mIcons[i].setOn(); + } else { + mIcons[i].setOff(); + } + } else { + if (shouldInsectBeDisplayed(i)) { + mIcons[i].setOn(); + } else { + mIcons[i].setOff(); + } + } + } else { + mIcons[i].setOff(); + } + } + + // TODO - loop strength reduction doesn't seem to work here + int i; + d2d::AnmGroup_c *anm = &mAnm[PAUSE_DISP_01_ANIM_OFFSET_ONOFF]; + for (i = 0; i < PAUSE_DISP_01_NUM_SPECIAL_ICON_PANES; i++) { + if (target == i + PAUSE_DISP_01_OFFSET_MY_PANES + 1) { + anm->play(); + } else { + f32 frame = anm->getFrame(); + if (frame) { + frame -= 1.0f; + if (frame <= 0.0f) { + frame = 0.0f; + } + anm->setFrame(frame); + } + } + anm++; + } + + if (target != 0) { + mCurrentNavTarget = target; + } + + if (target != 0 && mPrevNavTarget != target) { + dRumble_c::start(dRumble_c::sRumblePreset1, 0x1); + + dSndSmallEffectMgr_c *mgr = dSndSmallEffectMgr_c::GetInstance(); + if (target - 1 < PAUSE_DISP_01_OFFSET_MATERIALS) { + // insect + mgr->playSound(SE_S_MENU_P2_POINT_INSECT); + } else if (target - 1 < PAUSE_DISP_01_OFFSET_MY_PANES) { + // materials + mgr->playSound(SE_S_MENU_P2_POINT_MATERIAL); + } else if (target - 1 < PAUSE_DISP_01_OFFSET_MY_PANES + PAUSE_DISP_01_NUM_SPECIAL_ICON_PANES) { + // quest + mgr->playSound(SE_S_MENU_P2_POINT_IMPORTANT); + } + } + + mPrevNavTarget = target; + if (target == 0) { + pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); + } + + if (target != 0) { + s32 pane = target - 1; + if (pane < PAUSE_DISP_01_NUM_SUBPANES) { + if (pane < PAUSE_DISP_01_OFFSET_MATERIALS) { + if (!shouldInsectBeDisplayed(pane)) { + target = 0; + } + } else { + if (!shouldMaterialBeDisplayed(pane - PAUSE_DISP_01_OFFSET_MATERIALS)) { + target = 0; + } + } + } else if (pane >= PAUSE_DISP_01_OFFSET_MY_PANES + PAUSE_DISP_01_NUM_SPECIAL_ICON_PANES) { + pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); + target = 0; + } else { + s32 paneIdx = pane - PAUSE_DISP_01_OFFSET_MY_PANES; + if (!mpPanes[paneIdx]->IsVisible()) { + pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); + target = 0; + } + } + } + + return target; +} + +s32 dLytPauseDisp01_c::getPointerPane() const { + int idx = -1; + dCursorHitCheck_c *d = dCsBase_c::GetInstance()->getHitCheck(); + if (d != nullptr && d->getType() == 'lyt ') { + for (int i = 0; i < PAUSE_DISP_01_NUM_MY_PANES; i++) { + if (static_cast(d)->getHitPane() == mpPanes[i]) { + idx = i; + // missed optimization: + // break; + } + } + } + return idx; +} + +void dLytPauseDisp01_c::hideInsectsAndMaterials() { + for (int i = 0; i < PAUSE_DISP_01_NUM_SUBPANES; i++) { + mIcons[i].setOff(); + mIcons[i].setVisible(false); + } +} + +bool dLytPauseDisp01_c::shouldInsectBeDisplayed(s32 insectIdx) const { + if (dLytControlGame_c::getInstance()->getField_0x15C67() && + dLytControlGame_c::getInstance()->getItemForPauseDemo() == getInsectItemId(insectIdx) && + dAcItem_c::isPerformingInitialCollection()) { + return false; + } + + if (insectIdx != 0) { + return dAcItem_c::checkFlag(getInsectItemId(insectIdx)); + } else { + return StoryflagManager::sInstance->getFlag(122); + } +} + +u16 dLytPauseDisp01_c::getInsectItemId(s32 insectIdx) const { + static const u16 sInsectItemTable[] = { + ITEM_DEKU_HORNET, ITEM_BLESSED_BUTTERFLY, ITEM_GERUDO_DRAGONFLY, ITEM_STARRY_FIREFLY, + ITEM_WOODLAND_RHINO_BEETLE, ITEM_VOLCANIC_LADYBUG, ITEM_SAND_CICADA, ITEM_SKY_STAG_BEETLE, + ITEM_FARON_GRASSHOPPER, ITEM_SKYLOFT_MANTIS, ITEM_LANAYRU_ANT, ITEM_ELDIN_ROLLER, + }; + return sInsectItemTable[insectIdx]; +} + +s32 dLytPauseDisp01_c::getInsectIcon(s32 insectIdx) const { + static const u8 sInsectIconTable[] = { + LYT_CMN_BugDekuHornet, LYT_CMN_BugBlessedButterfly, LYT_CMN_BugGerudoDragonfly, + LYT_CMN_BugStarryFirefly, LYT_CMN_BugWoodlandRhinoBetle, LYT_CMN_BugVolcanicLadyBug, + LYT_CMN_BugSandCicada, LYT_CMN_BugSkyStagBeetle, LYT_CMN_BugFaronGrasshopper, + LYT_CMN_BugSkyloftMantis, LYT_CMN_BugLanayruAnt, LYT_CMN_BugEldinRoller, + }; + return sInsectIconTable[insectIdx]; +} + +s32 dLytPauseDisp01_c::getInsectCountByIndex(s32 insectIdx) const { + // TODO - ids + static const u16 sInsectCounterTable[] = {12, 15, 18, 21, 11, 14, 17, 20, 10, 13, 16, 19}; + return getCounterByIndex(sInsectCounterTable[insectIdx]); +} + +u16 dLytPauseDisp01_c::getQuestItemId(s32 questItemIndex) const { + static const u16 sQuestItemTable[] = {ITEM_CAWLIN_LETTER, ITEM_BEEDLE_INSECT_CAGE, ITEM_RATTLE, ITEM_1_CRYSTAL}; + return sQuestItemTable[questItemIndex]; +} + +bool dLytPauseDisp01_c::shouldMaterialBeDisplayed(s32 materialIdx) const { + if (dLytControlGame_c::getInstance()->getField_0x15C67() && + dLytControlGame_c::getInstance()->getItemForPauseDemo() == getMaterialItemId(materialIdx) && + dAcItem_c::isPerformingInitialCollection()) { + return false; + } + return dAcItem_c::checkFlag(getMaterialItemId(materialIdx)); +} + +u16 dLytPauseDisp01_c::getMaterialItemId(s32 materialIdx) const { + static const u16 sMaterialItemTable[] = { + ITEM_HORNET_LARVAE, ITEM_BIRD_FEATHER, ITEM_TUMBLE_WEED, ITEM_LIZARD_TAIL, + ITEM_ELDIN_ORE, ITEM_ANCIENT_FLOWER, ITEM_AMBER_RELIC, ITEM_DUSK_RELIC, + ITEM_JELLY_BLOB, ITEM_MONSTER_CLAW, ITEM_MONSTER_HORN, ITEM_ORNAMENTAL_SKULL, + ITEM_EVIL_CRYSTAL, ITEM_BLUE_BIRD_FEATHER, ITEM_GOLDEN_SKULL, ITEM_GODDESS_PLUME, + }; + return sMaterialItemTable[materialIdx]; +} + +s32 dLytPauseDisp01_c::getMaterialIcon(s32 materialIdx) const { + static const u8 sMaterialIconTable[] = { + LYT_CMN_HORNET_LARVAE, LYT_CMN_BIRD_FEATHER, LYT_CMN_TUMBLEWEED, LYT_CMN_LIZALFOS_TAIL, + LYT_CMN_ELDIN_ORE, LYT_CMN_ANCIENT_FLOWER, LYT_CMN_AMBER_RELIC, LYT_CMN_DUSK_RELOC, + LYT_CMN_JELLY_BLOB, LYT_CMN_MONSTER_CLAW, LYT_CMN_MONSTER_HORN, LYT_CMN_ORNAMENTAL_SKULL, + LYT_CMN_EVIL_CRYSTAL, LYT_CMN_BLUE_BIRD_FEATHER, LYT_CMN_GOLDEN_SKULL, LYT_CMN_GODDESS_PLUME, + }; + return sMaterialIconTable[materialIdx]; +} + +s32 dLytPauseDisp01_c::getMaterialCountByIndex(s32 materialIdx) const { + // TODO - ids + static const u16 sMaterialCounterTable[] = { + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + }; + return getCounterByIndex(sMaterialCounterTable[materialIdx]); +} diff --git a/src/d/lyt/d_lyt_pause_text.cpp b/src/d/lyt/d_lyt_pause_text.cpp index 7550e801..0a806bc1 100644 --- a/src/d/lyt/d_lyt_pause_text.cpp +++ b/src/d/lyt/d_lyt_pause_text.cpp @@ -330,7 +330,7 @@ const wchar_t *dLytPauseText_c::getCurrentPausePopupCaption() { // TODO - bunch of unresolved IDs here dLytPauseMgr_c::SelectionType_e selectionType = dLytPauseMgr_c::GetInstance()->getCurrentSelectionType(); - if (dLytPauseMgr_c::GetInstance()->getField_0x0841()) { + if (dLytPauseMgr_c::GetInstance()->isCurrentSelectionRestricted()) { // "It has been stolen by monsters! You've got to get it back." return dMessage_c::getTextMessageByLabel("CAPTION_ITEM_STOLEN", true, nullptr, 0); } @@ -433,7 +433,7 @@ void dLytPauseText_c::calcTextLines(dTextBox_c *textBox, const wchar_t *text) { bool dLytPauseText_c::isCurrentItemWallet() const { dLytPauseMgr_c::SelectionType_e selectionType = dLytPauseMgr_c::GetInstance()->getCurrentSelectionType(); - if (dLytPauseMgr_c::GetInstance()->getField_0x0841()) { + if (dLytPauseMgr_c::GetInstance()->isCurrentSelectionRestricted()) { return false; } From e7495a950ef8c2ae134692587fb1568d2487b5b3 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 9 Aug 2025 01:18:43 +0200 Subject: [PATCH 07/14] wip --- config/SOUE01/symbols.txt | 156 +- include/d/a/d_a_item.h | 1 + include/d/a/d_a_player.h | 3 + include/d/lyt/d2d.h | 28 +- include/d/lyt/d_lyt_control_game.h | 7 +- include/d/lyt/d_lyt_pause.h | 38 +- include/d/lyt/d_lyt_pause_disp_00.h | 75 +- include/d/lyt/d_lyt_pause_disp_01.h | 2 +- include/d/lyt/d_lyt_util_items.h | 52 +- include/d/lyt/meter/d_lyt_meter_item_select.h | 4 +- include/sized_string.h | 6 +- src/d/lyt/d2d.cpp | 46 +- src/d/lyt/d_lyt_pause_disp_00.cpp | 1656 ++++++++++++++++- src/d/lyt/d_lyt_pause_disp_01.cpp | 28 +- src/d/lyt/meter/d_lyt_meter.cpp | 5 +- src/d/lyt/meter/d_lyt_meter_event_skip.cpp | 6 +- src/d/lyt/meter/d_lyt_meter_item_select.cpp | 25 +- .../d_lyt_msg_window_select_btn.cpp | 6 +- 18 files changed, 1954 insertions(+), 190 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index bea8aede..0d7c709b 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3758,11 +3758,11 @@ getSizeBoxInWindow__Q23d2d9LytBase_cFPCc = .text:0x800AB190; // type:function si getTextBoxViaUserData__Q23d2d9LytBase_cFPQ34nw4r3lyt4PanePCc = .text:0x800AB240; // type:function size:0x94 setPropertiesRecursive__Q23d2d9LytBase_cFPQ34nw4r3lyt4Panefffff = .text:0x800AB2E0; // type:function size:0x294 setProperties__Q23d2d9LytBase_cFPQ34nw4r3lyt4Panefffff = .text:0x800AB580; // type:function size:0x3A4 -fn_800AB930__Q23d2d9LytBase_cFP10dTextBox_c = .text:0x800AB930; // type:function size:0x8 -fn_800AB940__Q23d2d9LytBase_cFPCci = .text:0x800AB940; // type:function size:0x58 -fn_800AB9A0__Q23d2d9LytBase_cFP10dTextBox_ci = .text:0x800AB9A0; // type:function size:0x1DC -fn_800ABB80__Q23d2d9LytBase_cFP10dTextBox_cP10dTextBox_ci = .text:0x800ABB80; // type:function size:0x158 -fn_800ABCE0__Q23d2d9LytBase_cFPCQ44nw4r3lyt3res11ExtUserDataP10dTextBox_cP10dTextBox_ci = .text:0x800ABCE0; // type:function size:0x170 +loadText__Q23d2d9LytBase_cFP10dTextBox_c = .text:0x800AB930; // type:function size:0x8 +loadTextVariant__Q23d2d9LytBase_cFPCci = .text:0x800AB940; // type:function size:0x58 +loadTextVariant__Q23d2d9LytBase_cFP10dTextBox_ci = .text:0x800AB9A0; // type:function size:0x1DC +loadTextVariantCopy__Q23d2d9LytBase_cFP10dTextBox_cP10dTextBox_ci = .text:0x800ABB80; // type:function size:0x158 +setText__Q23d2d9LytBase_cFPCQ44nw4r3lyt3res11ExtUserDataP10dTextBox_cP10dTextBox_ci = .text:0x800ABCE0; // type:function size:0x170 fn_800ABE50__Q23d2d9LytBase_cFP10dTextBox_cPwUl = .text:0x800ABE50; // type:function size:0x1E8 fn_800AC040__Q23d2d9LytBase_cFP10dTextBox_cP10dTextBox_cPwUl = .text:0x800AC040; // type:function size:0x160 fn_800AC1AC__Q23d2d9LytBase_cFPCQ44nw4r3lyt3res11ExtUserDataP10dTextBox_cP10dTextBox_cPwUl = .text:0x800AC1A0; // type:function size:0x158 @@ -5828,8 +5828,8 @@ fn_800F0030__21dLytMeterItemSelect_cCFv = .text:0x800F0030; // type:function siz getBaseItemForBWheelSlot__21dLytMeterItemSelect_cFl = .text:0x800F0150; // type:function size:0x14 fn_800F0170__21dLytMeterItemSelect_cCFl = .text:0x800F0170; // type:function size:0x14 getInternalBaseItemForSlot__21dLytMeterItemSelect_cCFl = .text:0x800F0190; // type:function size:0x18 -fn_800F01B0__21dLytMeterItemSelect_cCFl = .text:0x800F01B0; // type:function size:0x30 -fn_800F01E0__21dLytMeterItemSelect_cCFl = .text:0x800F01E0; // type:function size:0xC +hasBWheelItem__21dLytMeterItemSelect_cCFl = .text:0x800F01B0; // type:function size:0x30 +isBocoburinLocked__21dLytMeterItemSelect_cCFl = .text:0x800F01E0; // type:function size:0xC isSlotBocoburinLocked__21dLytMeterItemSelect_cFl = .text:0x800F01F0; // type:function size:0x28 fn_800F0220__21dLytMeterItemSelect_cFl = .text:0x800F0220; // type:function size:0xC8 fn_800F02F0__21dLytMeterItemSelect_cCFv = .text:0x800F02F0; // type:function size:0x14 @@ -8785,13 +8785,13 @@ __dt__56sFStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c>Fv = .text:0x801 __dt__86sStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8015A090; // type:function size:0xA0 __dt__33sFStateFct_c<17dLytPauseDisp00_c>Fv = .text:0x8015A130; // type:function size:0x6C __dt__30sFState_c<17dLytPauseDisp00_c>Fv = .text:0x8015A1A0; // type:function size:0x58 -init__17dLytPauseDisp00_cFv = .text:0x8015A200; // type:function size:0x310 +build__17dLytPauseDisp00_cFv = .text:0x8015A200; // type:function size:0x310 changeState__86sStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8015A510; // type:function size:0x10 -fn_8015A520 = .text:0x8015A520; // type:function size:0x118 -fn_8015A640 = .text:0x8015A640; // type:function size:0x10C +remove__17dLytPauseDisp00_cFv = .text:0x8015A520; // type:function size:0x118 +execute__17dLytPauseDisp00_cFv = .text:0x8015A640; // type:function size:0x10C executeState__86sStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8015A750; // type:function size:0x10 getStateID__86sStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8015A760; // type:function size:0x10 -fn_8015A770 = .text:0x8015A770; // type:function size:0x38 +draw__17dLytPauseDisp00_cFv = .text:0x8015A770; // type:function size:0x38 fn_8015A7B0 = .text:0x8015A7B0; // type:function size:0x14 fn_8015A7D0 = .text:0x8015A7D0; // type:function size:0x14 fn_8015A7F0 = .text:0x8015A7F0; // type:function size:0x14 @@ -8800,51 +8800,51 @@ fn_8015A820 = .text:0x8015A820; // type:function size:0x10 fn_8015A830 = .text:0x8015A830; // type:function size:0x10 fn_8015A840 = .text:0x8015A840; // type:function size:0x68 fn_8015A8B0 = .text:0x8015A8B0; // type:function size:0x28 -LytPauseDisp00__stateNoneEnter = .text:0x8015A8E0; // type:function size:0x2B8 -LytPauseDisp00__stateNoneUpdate = .text:0x8015ABA0; // type:function size:0x34 -LytPauseDisp00__stateNoneLeave = .text:0x8015ABE0; // type:function size:0x8 -LytPauseDisp00__stateInEnter = .text:0x8015ABF0; // type:function size:0x2A8 -LytPauseDisp00__stateInUpdate = .text:0x8015AEA0; // type:function size:0xE4 -LytPauseDisp00__stateInLeave = .text:0x8015AF90; // type:function size:0x98 -LytPauseDisp00__stateWaitEnter = .text:0x8015B030; // type:function size:0x18 -LytPauseDisp00__stateWaitUpdate = .text:0x8015B050; // type:function size:0x2D4 -LytPauseDisp00__stateWaitLeave = .text:0x8015B330; // type:function size:0x4 -LytPauseDisp00__stateSelectEnter = .text:0x8015B340; // type:function size:0x160 -LytPauseDisp00__stateSelectUpdate = .text:0x8015B4A0; // type:function size:0x1C0 -LytPauseDisp00__stateSelectLeave = .text:0x8015B660; // type:function size:0x24 -LytPauseDisp00__stateRingEnter = .text:0x8015B690; // type:function size:0x88 -LytPauseDisp00__stateRingUpdate = .text:0x8015B720; // type:function size:0x34C -LytPauseDisp00__stateRingLeave = .text:0x8015BA70; // type:function size:0x50 -LytPauseDisp00__stateGetDemoEnter = .text:0x8015BAC0; // type:function size:0x1C -LytPauseDisp00__stateGetDemoUpdate = .text:0x8015BAE0; // type:function size:0x25C -LytPauseDisp00__stateGetDemoLeave = .text:0x8015BD40; // type:function size:0x4 -LytPauseDisp00__stateOutEnter = .text:0x8015BD50; // type:function size:0x94 -LytPauseDisp00__stateOutUpdate = .text:0x8015BDF0; // type:function size:0xE0 -LytPauseDisp00__stateOutLeave = .text:0x8015BED0; // type:function size:0x4 -displayElement__17dLytPauseDisp00_cFif = .text:0x8015BEE0; // type:function size:0x68 -fn_8015BF50 = .text:0x8015BF50; // type:function size:0x10 -fn_8015BF60 = .text:0x8015BF60; // type:function size:0x64 -pauseDisplayMainInventory = .text:0x8015BFD0; // type:function size:0x160 -pauseDisplayInventoryWheel = .text:0x8015C130; // type:function size:0x368 -pauseDisplayHeartPieces = .text:0x8015C4A0; // type:function size:0x104 -pauseDisplayWallets = .text:0x8015C5B0; // type:function size:0x1C8 -pauseDisplayMitts = .text:0x8015C780; // type:function size:0xD0 -pauseDisplaySailcloth = .text:0x8015C850; // type:function size:0x80 -pauseDisplayWaterDragonScale = .text:0x8015C8D0; // type:function size:0xA0 -pauseDisplayFireshieldEarrings = .text:0x8015C970; // type:function size:0x74 -pauseDisplaySongsAndLifeTree = .text:0x8015C9F0; // type:function size:0x2DC -pauseDisplayTabletTriforce = .text:0x8015CCD0; // type:function size:0x1B0 -pauseDisplaySword = .text:0x8015CE80; // type:function size:0x284 -pauseDsiplayStoneOfTrials = .text:0x8015D110; // type:function size:0xC0 -fn_8015D1D0 = .text:0x8015D1D0; // type:function size:0x130 -fn_8015D300 = .text:0x8015D300; // type:function size:0xA04 -fn_8015DD10 = .text:0x8015DD10; // type:function size:0x160 +initializeState_None__17dLytPauseDisp00_cFv = .text:0x8015A8E0; // type:function size:0x2B8 +executeState_None__17dLytPauseDisp00_cFv = .text:0x8015ABA0; // type:function size:0x34 +finalizeState_None__17dLytPauseDisp00_cFv = .text:0x8015ABE0; // type:function size:0x8 +initializeState_In__17dLytPauseDisp00_cFv = .text:0x8015ABF0; // type:function size:0x2A8 +executeState_In__17dLytPauseDisp00_cFv = .text:0x8015AEA0; // type:function size:0xE4 +finalizeState_In__17dLytPauseDisp00_cFv = .text:0x8015AF90; // type:function size:0x98 +initializeState_Wait__17dLytPauseDisp00_cFv = .text:0x8015B030; // type:function size:0x18 +executeState_Wait__17dLytPauseDisp00_cFv = .text:0x8015B050; // type:function size:0x2D4 +finalizeState_Wait__17dLytPauseDisp00_cFv = .text:0x8015B330; // type:function size:0x4 +initializeState_Select__17dLytPauseDisp00_cFv = .text:0x8015B340; // type:function size:0x160 +executeState_Select__17dLytPauseDisp00_cFv = .text:0x8015B4A0; // type:function size:0x1C0 +finalizeState_Select__17dLytPauseDisp00_cFv = .text:0x8015B660; // type:function size:0x24 +initializeState_Ring__17dLytPauseDisp00_cFv = .text:0x8015B690; // type:function size:0x88 +executeState_Ring__17dLytPauseDisp00_cFv = .text:0x8015B720; // type:function size:0x34C +finalizeState_Ring__17dLytPauseDisp00_cFv = .text:0x8015BA70; // type:function size:0x50 +initializeState_GetDemo__17dLytPauseDisp00_cFv = .text:0x8015BAC0; // type:function size:0x1C +executeState_GetDemo__17dLytPauseDisp00_cFv = .text:0x8015BAE0; // type:function size:0x25C +finalizeState_GetDemo__17dLytPauseDisp00_cFv = .text:0x8015BD40; // type:function size:0x4 +initializeState_Out__17dLytPauseDisp00_cFv = .text:0x8015BD50; // type:function size:0x94 +executeState_Out__17dLytPauseDisp00_cFv = .text:0x8015BDF0; // type:function size:0xE0 +finalizeState_Out__17dLytPauseDisp00_cFv = .text:0x8015BED0; // type:function size:0x4 +setAnm__17dLytPauseDisp00_cFif = .text:0x8015BEE0; // type:function size:0x68 +stopAnm__17dLytPauseDisp00_cFi = .text:0x8015BF50; // type:function size:0x10 +playBackwards__17dLytPauseDisp00_cFRQ23d2d10AnmGroup_c = .text:0x8015BF60; // type:function size:0x64 +setupDisp__17dLytPauseDisp00_cFv = .text:0x8015BFD0; // type:function size:0x160 +setupInventoryWheel__17dLytPauseDisp00_cFv = .text:0x8015C130; // type:function size:0x368 +setupHeartPieces__17dLytPauseDisp00_cFv = .text:0x8015C4A0; // type:function size:0x104 +setupWallets__17dLytPauseDisp00_cFv = .text:0x8015C5B0; // type:function size:0x1C8 +setupMitts__17dLytPauseDisp00_cFv = .text:0x8015C780; // type:function size:0xD0 +setupSailcloth__17dLytPauseDisp00_cFv = .text:0x8015C850; // type:function size:0x80 +setupWaterDragonScale__17dLytPauseDisp00_cFv = .text:0x8015C8D0; // type:function size:0xA0 +setupFireshieldEarrings__17dLytPauseDisp00_cFv = .text:0x8015C970; // type:function size:0x74 +setupSongsAndLifeTree__17dLytPauseDisp00_cFv = .text:0x8015C9F0; // type:function size:0x2DC +setupTabletTriforce__17dLytPauseDisp00_cFv = .text:0x8015CCD0; // type:function size:0x1B0 +setupSword__17dLytPauseDisp00_cFv = .text:0x8015CE80; // type:function size:0x284 +setupStoneOfTrials__17dLytPauseDisp00_cFv = .text:0x8015D110; // type:function size:0xC0 +setupRingIcons__17dLytPauseDisp00_cFl = .text:0x8015D1D0; // type:function size:0x130 +updateSelection__17dLytPauseDisp00_cFv = .text:0x8015D300; // type:function size:0xA04 +getPointerPane__17dLytPauseDisp00_cCFv = .text:0x8015DD10; // type:function size:0x160 fn_8015DE70 = .text:0x8015DE70; // type:function size:0x194 -fn_8015E010 = .text:0x8015E010; // type:function size:0x58 +hideItemIcons__17dLytPauseDisp00_cFv = .text:0x8015E010; // type:function size:0x58 fn_8015E070 = .text:0x8015E070; // type:function size:0x220 -fn_8015E290 = .text:0x8015E290; // type:function size:0xA4 -fn_8015E340 = .text:0x8015E340; // type:function size:0x54 -fn_8015E3A0 = .text:0x8015E3A0; // type:function size:0xF4 +executeCall__17dLytPauseDisp00_cFv = .text:0x8015E290; // type:function size:0xA4 +playOnOffTabAnim__17dLytPauseDisp00_cFv = .text:0x8015E340; // type:function size:0x54 +loadRingText__17dLytPauseDisp00_cFUl = .text:0x8015E3A0; // type:function size:0xF4 __dt__17dLytPauseDisp00_cFv = .text:0x8015E4A0; // type:function size:0x130 build__33sFStateFct_c<17dLytPauseDisp00_c>FRC12sStateIDIf_c = .text:0x8015E5D0; // type:function size:0x60 dispose__33sFStateFct_c<17dLytPauseDisp00_c>FRP10sStateIf_c = .text:0x8015E630; // type:function size:0xC @@ -9130,7 +9130,7 @@ isSameName__34sFStateID_c<19dLytSaveMsgWindow_c>CFPCc = .text:0x801668E0; // typ fn_80166970 = .text:0x80166970; // type:function size:0x58 fn_801669D0 = .text:0x801669D0; // type:function size:0x4 hasPouchSlot__Flb = .text:0x801669E0; // type:function size:0x50 -fn_80166A30 = .text:0x80166A30; // type:function size:0x5C +getPouchItemIdForIndex__Flb = .text:0x80166A30; // type:function size:0x5C getPouchItemForSlot__Flb = .text:0x80166A90; // type:function size:0x70 getPouchItemAmount__Flb = .text:0x80166B00; // type:function size:0x8C fn_80166B90 = .text:0x80166B90; // type:function size:0xBC @@ -9146,24 +9146,24 @@ fn_80166FC0 = .text:0x80166FC0; // type:function size:0x50 fn_80167010 = .text:0x80167010; // type:function size:0x54 fn_80167070 = .text:0x80167070; // type:function size:0xD4 fn_80167150 = .text:0x80167150; // type:function size:0xF0 -fn_80167240 = .text:0x80167240; // type:function size:0x24 +getBWheelItemIdForIndex__Fl = .text:0x80167240; // type:function size:0x24 fn_80167270 = .text:0x80167270; // type:function size:0x24 getSubtypeToDisplayInItemWheel = .text:0x801672A0; // type:function size:0x108 -fn_801673B0 = .text:0x801673B0; // type:function size:0x24 +getItemLevelForBWheelIndex__Fl = .text:0x801673B0; // type:function size:0x24 fn_801673E0 = .text:0x801673E0; // type:function size:0x88 -fn_80167470 = .text:0x80167470; // type:function size:0x24 +getNumberForBWheelIndex__Fl = .text:0x80167470; // type:function size:0x24 fn_801674A0 = .text:0x801674A0; // type:function size:0x88 fn_80167530 = .text:0x80167530; // type:function size:0x94 -fn_801675D0 = .text:0x801675D0; // type:function size:0x24 +getNumberColorForBWheelIndex__Fl = .text:0x801675D0; // type:function size:0x24 fn_80167600 = .text:0x80167600; // type:function size:0xA0 -fn_801676A0 = .text:0x801676A0; // type:function size:0x24 +getLytItemIdForBWheelIndex__Fl = .text:0x801676A0; // type:function size:0x24 fn_801676D0 = .text:0x801676D0; // type:function size:0x1C -fn_801676F0 = .text:0x801676F0; // type:function size:0x24 +isBWheelIndexWithNumber__Fl = .text:0x801676F0; // type:function size:0x24 fn_80167720 = .text:0x80167720; // type:function size:0x58 -fn_80167780 = .text:0x80167780; // type:function size:0x34 +isBWheelIndexBocoburinLocked__Flb = .text:0x80167780; // type:function size:0x34 getDowsingItemIdForIndex__Fl = .text:0x801677C0; // type:function size:0x30 dowsingSlotForIndex__Fl = .text:0x801677F0; // type:function size:0x24 -fn_80167820 = .text:0x80167820; // type:function size:0x34 +hasDowsingInIndex__Fl = .text:0x80167820; // type:function size:0x34 getLytIndexForDowsingIndex__Fl = .text:0x80167860; // type:function size:0x5C getItemLabel__FlR15SizedString<32> = .text:0x801678C0; // type:function size:0x2C fn_801678F0 = .text:0x801678F0; // type:function size:0x2C @@ -9178,25 +9178,25 @@ getCurrentWalletItemId = .text:0x80167B70; // type:function size:0x30 fn_80167BA0 = .text:0x80167BA0; // type:function size:0x8 hasSailcloth = .text:0x80167BB0; // type:function size:0x34 getSailclothItemId = .text:0x80167BF0; // type:function size:0x8 -getCurrentMittsType2 = .text:0x80167C00; // type:function size:0x4 +getCurrentMittsLevel__Fv = .text:0x80167C00; // type:function size:0x4 fn_80167C10 = .text:0x80167C10; // type:function size:0x44 -isDiggingMittsRestricted = .text:0x80167C60; // type:function size:0x8 +isMittsRestricted__Fv = .text:0x80167C60; // type:function size:0x8 fn_80167C70 = .text:0x80167C70; // type:function size:0x8 -checkWaterDragonScale = .text:0x80167C80; // type:function size:0x40 +hasWaterDragonScale__Fv = .text:0x80167C80; // type:function size:0x40 fn_80167CC0 = .text:0x80167CC0; // type:function size:0x30 -isWaterDragonScaleRestricted = .text:0x80167CF0; // type:function size:0x8 -hasGoddessHarp = .text:0x80167D00; // type:function size:0x34 +isWaterDragonScaleRestricted__Fv = .text:0x80167CF0; // type:function size:0x8 +hasGoddessHarp__Fv = .text:0x80167D00; // type:function size:0x34 getGoddessHarpId = .text:0x80167D40; // type:function size:0x8 harpRestricted = .text:0x80167D50; // type:function size:0x28 -fn_80167D80 = .text:0x80167D80; // type:function size:0x34 +hasSong__Fl = .text:0x80167D80; // type:function size:0x34 fn_80167DC0 = .text:0x80167DC0; // type:function size:0x14 getItemIdForTabletNum = .text:0x80167DE0; // type:function size:0x10 -currentSwordMaybe = .text:0x80167DF0; // type:function size:0x24 +getCurrentSwordLevel__Fv = .text:0x80167DF0; // type:function size:0x24 fn_80167E20 = .text:0x80167E20; // type:function size:0x30 fn_80167E50 = .text:0x80167E50; // type:function size:0x14 -swordRestrictedBokoBase = .text:0x80167E70; // type:function size:0x44 +isSwordRestrictedBokoBase__Fv = .text:0x80167E70; // type:function size:0x44 getItemIdForTriforcePieceNum = .text:0x80167EC0; // type:function size:0x10 -fn_80167ED0 = .text:0x80167ED0; // type:function size:0x88 +getSongLifeTreeStatus__Fv = .text:0x80167ED0; // type:function size:0x88 shouldUseSingular__Fl = .text:0x80167F60; // type:function size:0x74 __ct__17dLytCommonArrow_cFv = .text:0x80167FE0; // type:function size:0x148 __dt__56sFStateMgr_c<17dLytCommonArrow_c,20sStateMethodUsr_FI_c>Fv = .text:0x80168130; // type:function size:0xA4 scope:weak @@ -11994,7 +11994,7 @@ ActorLink__isPressingButtonMinus = .text:0x801E3C50; // type:function size:0xC ActorLink__isPressingButtonB = .text:0x801E3C60; // type:function size:0xC ActorLink__isPressingButtonB2 = .text:0x801E3C70; // type:function size:0x4 fn_801E3C80 = .text:0x801E3C80; // type:function size:0x1EC -fn_801E3E70 = .text:0x801E3E70; // type:function size:0x5C +calcItemWheelSelection__7dAcPy_cFbl = .text:0x801E3E70; // type:function size:0x5C fn_801E3ED0 = .text:0x801E3ED0; // type:function size:0x1C4 getSelectedPouchItem = .text:0x801E40A0; // type:function size:0x8C ActorLink__handlePouchWheel = .text:0x801E4130; // type:function size:0x354 @@ -13650,7 +13650,7 @@ getGratitudeCrystalCount__9dAcItem_cFv = .text:0x80252710; // type:function size increaseGratitudeCrystalCounter = .text:0x80252720; // type:function size:0xC ActorLink__hasLifeTreeSeeding = .text:0x80252730; // type:function size:0x38 AcItem__giveLifeTreeSeedling = .text:0x80252770; // type:function size:0x94 -getExtraWalletCounter = .text:0x80252810; // type:function size:0x8 +getExtraWalletCount__9dAcItem_cFv = .text:0x80252810; // type:function size:0x8 increaseExtraWalletCounter = .text:0x80252820; // type:function size:0xC getTotalRequiredKeyPieceCount = .text:0x80252830; // type:function size:0x8 hasAllKeyPieces = .text:0x80252840; // type:function size:0x44 @@ -28338,12 +28338,12 @@ lbl_804E8228 = .rodata:0x804E8228; // type:object size:0x20 data:4byte brlanMap = .rodata:0x804E8248; // type:object size:0x10 scope:local data:4byte lbl_804E8258 = .rodata:0x804E8258; // type:object size:0x128 lbl_804E8380 = .rodata:0x804E8380; // type:object size:0x128 -lbl_804E84A8 = .rodata:0x804E84A8; // type:object size:0x3F0 data:4byte +brlanMap = .rodata:0x804E84A8; // type:object size:0x3F0 data:4byte lbl_804E8898 = .rodata:0x804E8898; // type:object size:0x3C data:byte lbl_804E88D4 = .rodata:0x804E88D4; // type:object size:0xC lbl_804E88E0 = .rodata:0x804E88E0; // type:object size:0xC TRIFORCE_PAUSE_MENU_INDEX = .rodata:0x804E88EC; // type:object size:0xC data:4byte -lbl_804E88F8 = .rodata:0x804E88F8; // type:object size:0x20 +@LOCAL@setupSword__17dLytPauseDisp00_cFv@sSwordFrames@0 = .rodata:0x804E88F8; // type:object size:0x20 brlanMap = .rodata:0x804E8918; // type:object size:0x78 scope:local data:4byte sNavTable = .rodata:0x804E8990; // type:object size:0x110 scope:local @LOCAL@getInsectItemId__17dLytPauseDisp01_cCFl@sInsectItemTable = .rodata:0x804E8AA0; // type:object size:0x18 scope:local @@ -34465,7 +34465,7 @@ lbl_805258E4 = .data:0x805258E4; // type:object size:0x10 lbl_805258F4 = .data:0x805258F4; // type:object size:0x10 lbl_80525904 = .data:0x80525904; // type:object size:0x10 lbl_80525914 = .data:0x80525914; // type:object size:0x10 -lbl_80525924 = .data:0x80525924; // type:object size:0x94 data:4byte +sBoundingNames = .data:0x80525924; // type:object size:0x94 data:4byte lbl_805259B8 = .data:0x805259B8; // type:object size:0x10 lbl_805259C8 = .data:0x805259C8; // type:object size:0x10 lbl_805259D8 = .data:0x805259D8; // type:object size:0xC @@ -34481,7 +34481,7 @@ __vt__56sFStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c> = .data:0x80525 __vt__86sStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80525B10; // type:object size:0x30 __vt__33sFStateFct_c<17dLytPauseDisp00_c> = .data:0x80525B40; // type:object size:0x18 __vt__30sFState_c<17dLytPauseDisp00_c> = .data:0x80525B58; // type:object size:0x354 -lbl_80525EAC = .data:0x80525EAC; // type:object size:0x34 +__vt__32sFStateID_c<17dLytPauseDisp00_c> = .data:0x80525EAC; // type:object size:0x34 @22677 = .data:0x80525EE0; // type:object size:0x12 scope:local data:string ...data.0 = .data:0x80525EE0; // type:label scope:local @22678 = .data:0x80525EF4; // type:object size:0xB scope:local data:string diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index 669673f5..1a437a67 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -68,6 +68,7 @@ public: static s32 getRupeeCounter(); static u32 getCurrentWalletCapacity(); + static u32 getExtraWalletCount(); static u32 getHeartContainerHealthCount(); static u32 getGratitudeCrystalCount(); diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index 9050140b..4eb58674 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -58,6 +58,9 @@ public: void setBeetleBackAnim(); s32 getBeetleWarningTimeLeft(); + // Item Selection functions + static s32 calcItemWheelSelection(bool reset, s32 numOptions); + public: f32 getField_0x4564() const { return field_0x4564; diff --git a/include/d/lyt/d2d.h b/include/d/lyt/d2d.h index fc19bfb9..ed6994c7 100644 --- a/include/d/lyt/d2d.h +++ b/include/d/lyt/d2d.h @@ -79,6 +79,20 @@ protected: u32 mFlags; }; +/** + * A layout with some utility functions, and a system + * for integrating LibMS text into NW4R's LYT. + * + * * If a TextBox has an integer userdatum "embed", this sets the text identified by the + * LibMS label of the same name as the text box (e.g. `T_back_00`) + * * If the integer is non-zero (it always seems to be for Skyward Sword!), + * `:00` is appended to the label name (e.g. `T_back_00:00`). + * * Game code can call a function to reload this text with a custom integer to select + * a specific variant. E.g. `T_newFile_00:00` -> "New Adventure", `T_newFile_00:01` -> "Hero Mode" + * * If a TextBox has a string userdatum "copy", the value identifies another textbox + * whose name is used instead. This is often used for text shadow, where a separate + * textbox is used for the shadow. + */ class LytBase_c : public Multi_c { public: LytBase_c(); @@ -93,8 +107,8 @@ public: dWindow_c *getWindow(const char *name); nw4r::lyt::Group *findGroupByName(const char *name); - bool fn_800AB940(const char *name, int arg); - bool fn_800AB9A0(dTextBox_c *textbox, int arg); + bool loadTextVariant(const char *name, int arg); + bool loadTextVariant(dTextBox_c *textbox, int arg); bool fn_800ABE50(dTextBox_c *textbox, wchar_t *destBuf, u32 maxLen); @@ -102,16 +116,16 @@ private: void setPropertiesRecursive(nw4r::lyt::Pane *pane, f32, f32, f32, f32, f32); void setProperties(nw4r::lyt::Pane *pane, f32, f32, f32, f32, f32); dTextBox_c *getTextBoxViaUserData(nw4r::lyt::Pane *pane, const char *name); - bool fn_800ABB80(dTextBox_c *textbox1, dTextBox_c *textbox2, int arg); - bool fn_800ABCE0(const nw4r::lyt::res::ExtUserData *userDatum, dTextBox_c *textbox1, dTextBox_c *textbox2, int arg); + bool loadTextVariantCopy(dTextBox_c *targetTextBox, dTextBox_c *sourceTextBox, int arg); + bool setText(const nw4r::lyt::res::ExtUserData *userDatum, dTextBox_c *targetTextBox, dTextBox_c *sourceTextBox, int arg); - bool fn_800AC040(dTextBox_c *textbox1, dTextBox_c *textbox2, wchar_t *destBuf, u32 maxLen); + bool fn_800AC040(dTextBox_c *targetTextBox, dTextBox_c *sourceTextBox, wchar_t *destBuf, u32 maxLen); bool fn_800AC1AC( - const nw4r::lyt::res::ExtUserData *userDatum, dTextBox_c *textbox1, dTextBox_c *textbox2, wchar_t *destBuf, + const nw4r::lyt::res::ExtUserData *userDatum, dTextBox_c *targetTextBox, dTextBox_c *sourceTextBox, wchar_t *destBuf, u32 maxLen ); MsbtInfo *getMsbtInfo() const; - bool fn_800AB930(dTextBox_c *box); + bool loadText(dTextBox_c *box); /* 0x8C */ MsbtInfo *mpMsbtInfo; }; diff --git a/include/d/lyt/d_lyt_control_game.h b/include/d/lyt/d_lyt_control_game.h index 0278133a..fb7a60c3 100644 --- a/include/d/lyt/d_lyt_control_game.h +++ b/include/d/lyt/d_lyt_control_game.h @@ -25,6 +25,10 @@ public: return field_0x15C2C; } + s32 getPauseDisp00Tab() const { + return mPauseDisp00Tab; + } + u16 getItemForPauseDemo() const { return mItemForPauseDemo; } @@ -56,8 +60,9 @@ private: /* 0x000A4 */ u8 _0x000A4[0x15C2C - 0x000A4]; /* 0x15C2C */ s32 field_0x15C2C; + /* 0x15C30 */ s32 mPauseDisp00Tab; - /* 0x15C30 */ u8 _0x15C23[0x15C60 - 0x15C30]; + /* 0x15C34 */ u8 _0x15C34[0x15C60 - 0x15C34]; /* 0x15C60 */ u16 mItemForPauseDemo; diff --git a/include/d/lyt/d_lyt_pause.h b/include/d/lyt/d_lyt_pause.h index 6614007d..90094664 100644 --- a/include/d/lyt/d_lyt_pause.h +++ b/include/d/lyt/d_lyt_pause.h @@ -3,7 +3,7 @@ #include "d/lyt/d2d.h" #include "egg/gfx/eggCpuTexture.h" -#include "nw4r/lyt/lyt_pane.h" +#include "nw4r/lyt/lyt_bounding.h" class dLytPauseMgr_c { public: @@ -31,6 +31,10 @@ public: return field_0x0832; } + bool getField_0x0838() const { + return field_0x0838; + } + bool getField_0x083B() const { return field_0x083B; } @@ -45,7 +49,13 @@ public: bool isStateWait() const; + s32 getCurrentDisp00Tab() const { + return mCurrentDisp00Tab; + } + enum SelectionType_e { + SELECT_BWHEEL = 0, + SELECT_POUCH = 1, SELECT_DOWSING = 2, SELECT_INSECT = 4, SELECT_QUEST_MATERIAL = 5, @@ -69,8 +79,19 @@ public: return mCurrentSelectionId; } - nw4r::lyt::Pane *getArrowBounding(int idx) const; - nw4r::lyt::Pane *setSelectedArrowBounding(int idx) const; + u8 getCurrentSelectionTab() const { + return mCurrentSelectionTab; + } + + void setCurrentSelectionTab(u8 tab) { + mCurrentSelectionTab = tab; + } + + nw4r::lyt::Bounding *getArrowBounding(int idx) const; + void setSelectedArrowBounding(int idx) const; + + static f32 sDisp00ArrowRotation; + static f32 sDisp00ArrowLength; private: static dLytPauseMgr_c *sInstance; @@ -85,7 +106,9 @@ private: /* 0x0814 */ EGG::CpuTexture *mpBgTexture; /* 0x0818 */ SelectionType_e mCurrentSelectionType; - /* 0x081C */ u8 _0x081C[0x082C - 0x081C]; + /* 0x081C */ u8 _0x081C[0x0820 - 0x081C]; + /* 0x0820 */ s32 mCurrentDisp00Tab; + /* 0x0824 */ u8 _0x0824[0x082C - 0x0824]; /* 0x082C */ u16 mCurrentSelectionId; @@ -93,9 +116,14 @@ private: /* 0x0831 */ bool field_0x0831; /* 0x0832 */ bool field_0x0832; + /* 0x0833 */ u8 mCurrentSelectionTab; - /* 0x0832 */ u8 _0x0832[0x083B - 0x0833]; + /* 0x0834 */ u8 _0x0834[0x0838 - 0x0834]; + /* 0x0838 */ bool field_0x0838; + + /* 0x0839 */ u8 _0x0839[0x083B - 0x0839]; + /* 0x083B */ bool field_0x083B; /* 0x083C */ u8 _0x083C[0x083E - 0x083C]; diff --git a/include/d/lyt/d_lyt_pause_disp_00.h b/include/d/lyt/d_lyt_pause_disp_00.h index aaacf9dc..81e20caa 100644 --- a/include/d/lyt/d_lyt_pause_disp_00.h +++ b/include/d/lyt/d_lyt_pause_disp_00.h @@ -4,6 +4,7 @@ #include "d/d_cursor_hit_check.h" #include "d/lyt/d2d.h" #include "d/lyt/d_lyt_common_icon_item.h" +#include "nw4r/lyt/lyt_bounding.h" #include "s/s_State.hpp" class dLytPauseDisp00_c { @@ -11,7 +12,10 @@ public: dLytPauseDisp00_c(); virtual ~dLytPauseDisp00_c() {} - void init(); + bool build(); + bool remove(); + bool execute(); + bool draw(); STATE_FUNC_DECLARE(dLytPauseDisp00_c, None); STATE_FUNC_DECLARE(dLytPauseDisp00_c, In); @@ -22,15 +26,68 @@ public: STATE_FUNC_DECLARE(dLytPauseDisp00_c, Out); private: - void displayElement(int idx, float value); + void setAnm(int idx, f32 value); + void stopAnm(int idx); + void playBackwards(d2d::AnmGroup_c &anm); - STATE_MGR_DECLARE(dLytPauseDisp00_c); - d2d::LytBase_c mLytBase; - d2d::AnmGroup_c field_0x00D0[0x7E]; - dLytCommonIconItem_c field_0x2050[0x18]; - /* 0xE110 */ d2d::SubPaneList mSubpanes; - d2d::SubPaneListNode field_0xE11C[0x18]; - dCursorHitCheckLyt_c field_0xE29C; + // Initial setup + void setupDisp(); + void setupInventoryWheel(); + void setupHeartPieces(); + void setupWallets(); + void setupMitts(); + void setupSailcloth(); + void setupWaterDragonScale(); + void setupFireshieldEarrings(); + void setupSongsAndLifeTree(); + void setupTabletTriforce(); + void setupSword(); + void setupStoneOfTrials(); + + // Dynamic setup + void setupRingIcons(s32 tab); + + s32 updateSelection(); + s32 getPointerPane() const; + + void hideItemIcons(); + + enum LoadRingTextCmd_e { + RING_TEXT_RELEASE_TO_CONFIRM = 0, + RING_TEXT_INITIAL_TAB = 1, + RING_TEXT_CURRENT_TAB = 2, + }; + + void executeCall(); + void playOnOffTabAnim(); + void loadRingText(u32 cmd); + + /* 0x0004 */ STATE_MGR_DECLARE(dLytPauseDisp00_c); + /* 0x0040 */ d2d::LytBase_c mLyt; + /* 0x00D0 */ d2d::AnmGroup_c mAnm[126]; + /* 0x2050 */ dLytCommonIconItem_c mIcons[24]; + /* 0xE110 */ d2d::SubPaneList mSubpaneList; + /* 0xE11C */ d2d::SubPaneListNode mSubpanes[24]; + /* 0xE29C */ dCursorHitCheckLyt_c mCsHitCheck; + /* 0xE2C4 */ nw4r::lyt::Bounding *mpBoundings[37]; + + /* 0xE358 */ s32 mStep; + /* 0xE35C */ s32 mPrevNavTarget; + /* 0xE360 */ s32 mCurrentNavTarget; + /* 0xE364 */ s32 mCallTimerMaybe; + /* 0xE368 */ s32 mGetDemoTimer; + /* 0xE36C */ bool mInRequest; + /* 0xE36D */ bool mOutRequest; + /* 0xE36E */ bool field_0xE36E; + /* 0xE36F */ bool mIsVisible; + /* 0xE370 */ bool mDoScrollAnim; + /* 0xE371 */ bool field_0xE371; + /* 0xE372 */ bool mSelectToggleRequest; + /* 0xE373 */ bool mSelectGuideRequest; + /* 0xE374 */ bool mStopCallRequest; + /* 0xE375 */ bool mSelectMplsRequest; + /* 0xE376 */ bool field_0xE376; + /* 0xE377 */ bool mRingToggleRequest; }; #endif diff --git a/include/d/lyt/d_lyt_pause_disp_01.h b/include/d/lyt/d_lyt_pause_disp_01.h index 41d2e769..900f376d 100644 --- a/include/d/lyt/d_lyt_pause_disp_01.h +++ b/include/d/lyt/d_lyt_pause_disp_01.h @@ -67,7 +67,7 @@ private: /* 0x98BC */ s32 mStep; /* 0x98C0 */ s32 mPrevNavTarget; /* 0x98C4 */ s32 mCurrentNavTarget; - /* 0x98C8 */ s32 mTimer; + /* 0x98C8 */ s32 mGetDemoTimer; /* 0x98CC */ bool mInRequest; /* 0x98CD */ bool mOutRequest; /* 0x98CE */ bool field_0x98CE; diff --git a/include/d/lyt/d_lyt_util_items.h b/include/d/lyt/d_lyt_util_items.h index 657ff83d..f8e0a634 100644 --- a/include/d/lyt/d_lyt_util_items.h +++ b/include/d/lyt/d_lyt_util_items.h @@ -5,6 +5,41 @@ #include "sized_string.h" #include "toBeSorted/dowsing_target.h" +enum LytItemNumberColor_e { + LYT_ITEM_COLOR_GOLD = 0, + LYT_ITEM_COLOR_RED = 1, + LYT_ITEM_COLOR_GREEN = 2, + LYT_ITEM_COLOR_NONE = 3, +}; + +enum SongLifeTreeSeedStatus_e { + SONG_LIFETREE_NONE = 0, + SONG_LIFETREE_HAS_SOTH_PARTS_OR_SEED = 1, + SONG_LIFETREE_HAS_SOTH = 2, +}; + +u8 getSongLifeTreeStatus(); + +/** 0: no sword, 6: TMS */ +s32 getCurrentSwordLevel(); +bool isSwordRestrictedBokoBase(); + +u16 getTabletItemIdForIndex(s32 index); + +u16 getTriforceItemIdForIndex(s32 index); + +bool hasGoddessHarp(); + +bool hasSong(s32 index); + +bool hasWaterDragonScale(); +bool isWaterDragonScaleRestricted(); + +bool hasSailcloth(); + +s32 getCurrentMittsLevel(); +bool isMittsRestricted(); + void getItemLabel(s32 itemId, SizedString<32> &buf); void getCaptionItemLabel(s32 itemId, SizedString<32> &buf); void getDowsingLabel(s32 itemId, SizedString<32> &buf); @@ -17,15 +52,30 @@ const wchar_t *getPauseCategoryText(s32 itemId); bool isPouchBocoburinLocked(); +// TODO - these return types may require some work + u8 getPouchItemForSlot(s32 slot, bool unk); bool hasPouchSlot(s32 slot, bool unk); s32 getPouchItemAmount(s32 slot, bool unk); u8 getPouchItemNumberColor(s32 slot, bool unk); f32 getShieldDurability(s32 slot, bool unk); +u32 getPouchItemIdForIndex(s32 slot, bool unk); +// TODO - rename and make sense of these DowsingTarget::DowsingSlot dowsingSlotForIndex(s32 index); -s32 getLytIndexForDowsingIndex(s32 index); +u8 getLytIndexForDowsingIndex(s32 index); u16 getDowsingItemIdForIndex(s32 index); +bool hasDowsingInIndex(s32 index); + +// B-Wheel +s32 getBWheelSlotForIndex(s32 index); +bool isBWheelIndexWithNumber(s32 index); +s32 getNumberForBWheelIndex(s32 index); +s32 getItemLevelForBWheelIndex(s32 index); +u8 getLytItemIdForBWheelIndex(s32 index); +bool isBWheelIndexBocoburinLocked(s32 index, bool unk); +u8 getNumberColorForBWheelIndex(s32 index); +u16 getBWheelItemIdForIndex(s32 index); /** * FR: -1, 0, 1 singular, else plural diff --git a/include/d/lyt/meter/d_lyt_meter_item_select.h b/include/d/lyt/meter/d_lyt_meter_item_select.h index d64e7eae..18390b1d 100644 --- a/include/d/lyt/meter/d_lyt_meter_item_select.h +++ b/include/d/lyt/meter/d_lyt_meter_item_select.h @@ -213,8 +213,8 @@ private: void fn_800EF8C0(bool); bool isWheelBlockedByCurrentAction(); void setBtnText(s32); - bool fn_800F01B0(s32) const; - bool fn_800F01E0(s32) const; + bool hasBWheelItem(s32) const; + bool isBocoburinLocked(s32) const; bool isSlotBocoburinLocked(s32); void fn_800F0310(); bool fn_800F0030() const; diff --git a/include/sized_string.h b/include/sized_string.h index 3d67e74a..2bcec9b9 100644 --- a/include/sized_string.h +++ b/include/sized_string.h @@ -104,7 +104,7 @@ struct SizedString { template struct SizedWString { SizedWString() { - mChars[0] = '\0'; + mChars[0] = L'\0'; } wchar_t mChars[Size]; @@ -117,6 +117,10 @@ struct SizedWString { return mChars; } + void empty() { + mChars[0] = L'\0'; + } + int sprintf(const wchar_t *fmt, ...) { va_list args; va_start(args, fmt); diff --git a/src/d/lyt/d2d.cpp b/src/d/lyt/d2d.cpp index 8712443f..062f6234 100644 --- a/src/d/lyt/d2d.cpp +++ b/src/d/lyt/d2d.cpp @@ -500,23 +500,23 @@ void LytBase_c::setProperties(nw4r::lyt::Pane *pane, f32 posX, f32 posY, f32 sca textBox->SetCharSpace(textBox->GetCharSpace() + dLyt_HIO_c::getFn800B2020() + f6); textBox->SetLineSpace(textBox->GetLineSpace() + dLyt_HIO_c::getFn800B2000() + f4); - fn_800AB930(textBox); + loadText(textBox); } -bool LytBase_c::fn_800AB930(dTextBox_c *box) { - return fn_800AB9A0(box, -1); +bool LytBase_c::loadText(dTextBox_c *box) { + return loadTextVariant(box, -1); } -bool LytBase_c::fn_800AB940(const char *name, int arg) { +bool LytBase_c::loadTextVariant(const char *name, int arg) { dTextBox_c *box = getTextBox(name); if (box == nullptr) { return false; } - return fn_800AB9A0(box, arg); + return loadTextVariant(box, arg); } -bool LytBase_c::fn_800AB9A0(dTextBox_c *textbox, int arg) { +bool LytBase_c::loadTextVariant(dTextBox_c *textbox, int arg) { if (getMsbtInfo() == nullptr) { return false; } @@ -551,21 +551,21 @@ bool LytBase_c::fn_800AB9A0(dTextBox_c *textbox, int arg) { if (ty == 1) { dTextBox_c *otherBox = getTextBox(list->GetString()); if (otherBox != nullptr) { - return fn_800ABB80(textbox, otherBox, arg); + return loadTextVariantCopy(textbox, otherBox, arg); } } else { - return fn_800ABCE0(list, textbox, textbox, arg); + return setText(list, textbox, textbox, arg); } return false; } -bool LytBase_c::fn_800ABB80(dTextBox_c *textbox1, dTextBox_c *textbox2, int arg) { - u16 num = textbox2->GetExtUserDataNum(); +bool LytBase_c::loadTextVariantCopy(dTextBox_c *targetTextBox, dTextBox_c *sourceTextBox, int arg) { + u16 num = sourceTextBox->GetExtUserDataNum(); if (num == 0) { return false; } u32 found = 0; - const nw4r::lyt::res::ExtUserData *list = textbox2->GetExtUserData(); + const nw4r::lyt::res::ExtUserData *list = sourceTextBox->GetExtUserData(); for (int i = 0; i < num; i++) { SizedString<0x40> userDatName; userDatName = list->GetName(); @@ -579,17 +579,17 @@ bool LytBase_c::fn_800ABB80(dTextBox_c *textbox1, dTextBox_c *textbox2, int arg) if (found != 1) { return false; } - return fn_800ABCE0(list, textbox1, textbox2, arg); + return setText(list, targetTextBox, sourceTextBox, arg); } -bool LytBase_c::fn_800ABCE0( - const nw4r::lyt::res::ExtUserData *userDatum, dTextBox_c *textbox1, dTextBox_c *textbox2, int arg +bool LytBase_c::setText( + const nw4r::lyt::res::ExtUserData *userDatum, dTextBox_c *targetTextBox, dTextBox_c *sourceTextBox, int arg ) { s32 userDatInt = userDatum->GetInt(); SizedString<0x40> str1; SizedString<0x40> str2; - str1 = textbox2->GetName(); + str1 = sourceTextBox->GetName(); if (userDatInt != 0) { userDatInt = 0; if (arg != -1) { @@ -605,7 +605,7 @@ bool LytBase_c::fn_800ABCE0( return false; } - textbox1->setTextWithGlobalTextProcessor(dMessage_c::formatText(text)); + targetTextBox->setTextWithGlobalTextProcessor(dMessage_c::formatText(text)); return true; } @@ -652,13 +652,13 @@ bool LytBase_c::fn_800ABE50(dTextBox_c *textbox, wchar_t *destBuf, u32 maxLen) { return false; } -bool LytBase_c::fn_800AC040(dTextBox_c *textbox1, dTextBox_c *textbox2, wchar_t *destBuf, u32 maxLen) { - u16 num = textbox2->GetExtUserDataNum(); +bool LytBase_c::fn_800AC040(dTextBox_c *targetTextBox, dTextBox_c *sourceTextBox, wchar_t *destBuf, u32 maxLen) { + u16 num = sourceTextBox->GetExtUserDataNum(); if (num == 0) { return false; } u32 found = 0; - const nw4r::lyt::res::ExtUserData *list = textbox2->GetExtUserData(); + const nw4r::lyt::res::ExtUserData *list = sourceTextBox->GetExtUserData(); for (int i = 0; i < num; i++) { SizedString<0x40> userDatName; userDatName = list->GetName(); @@ -672,24 +672,24 @@ bool LytBase_c::fn_800AC040(dTextBox_c *textbox1, dTextBox_c *textbox2, wchar_t if (found != 1) { return false; } - return fn_800AC1AC(list, textbox1, textbox2, destBuf, maxLen); + return fn_800AC1AC(list, targetTextBox, sourceTextBox, destBuf, maxLen); } bool LytBase_c::fn_800AC1AC( - const nw4r::lyt::res::ExtUserData *userDatum, dTextBox_c *textbox1, dTextBox_c *textbox2, wchar_t *destBuf, u32 maxLen + const nw4r::lyt::res::ExtUserData *userDatum, dTextBox_c *targetTextBox, dTextBox_c *sourceTextBox, wchar_t *destBuf, u32 maxLen ) { s32 userDatInt = userDatum->GetInt(); SizedString<0x40> str1; SizedString<0x40> str2; - str1 = textbox2->GetName(); + str1 = sourceTextBox->GetName(); if (userDatInt != 0) { SizedString<0x40> &fmt = str2; fmt.sprintf(":%02d", 0); str1.append(fmt); } - textbox1->setMessageWithGlobalTextProcessorAndMsbtInfo(getMsbtInfo(), str1, destBuf, maxLen); + targetTextBox->setMessageWithGlobalTextProcessorAndMsbtInfo(getMsbtInfo(), str1, destBuf, maxLen); return true; } diff --git a/src/d/lyt/d_lyt_pause_disp_00.cpp b/src/d/lyt/d_lyt_pause_disp_00.cpp index 43c176cd..cb0f0e25 100644 --- a/src/d/lyt/d_lyt_pause_disp_00.cpp +++ b/src/d/lyt/d_lyt_pause_disp_00.cpp @@ -1,7 +1,26 @@ #include "d/lyt/d_lyt_pause_disp_00.h" +#include "d/a/d_a_item.h" +#include "d/a/d_a_itembase.h" +#include "d/a/d_a_player.h" +#include "d/d_cs_base.h" +#include "d/d_pad_nav.h" +#include "d/d_rumble.h" +#include "d/flag/itemflag_manager.h" +#include "d/flag/storyflag_manager.h" +#include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_common_icon_item_maps.h" +#include "d/lyt/d_lyt_control_game.h" +#include "d/lyt/d_lyt_pause.h" +#include "d/lyt/d_lyt_util_items.h" +#include "d/lyt/d_textbox.h" +#include "d/lyt/meter/d_lyt_meter.h" +#include "d/snd/d_snd_small_effect_mgr.h" +#include "d/snd/d_snd_wzsound.h" #include "nw4r/lyt/lyt_group.h" - +#include "nw4r/math/math_types.h" +#include "sized_string.h" +#include "toBeSorted/counters/counter.h" STATE_DEFINE(dLytPauseDisp00_c, None); STATE_DEFINE(dLytPauseDisp00_c, In); @@ -11,46 +30,1629 @@ STATE_DEFINE(dLytPauseDisp00_c, Ring); STATE_DEFINE(dLytPauseDisp00_c, GetDemo); STATE_DEFINE(dLytPauseDisp00_c, Out); -extern d2d::LytBrlanMapping S_MAPPINGS[]; -extern "C" char lbl_804E8898[]; +static const d2d::LytBrlanMapping brlanMap[] = { + { "pause_00_in.brlan", "G_inOut_00"}, + { "pause_00_have.brlan", "G_sekiban_00"}, + { "pause_00_have.brlan", "G_dauzingA_00"}, + { "pause_00_have.brlan", "G_dauzingB_00"}, + { "pause_00_have.brlan", "G_dauzingC_00"}, + { "pause_00_have.brlan", "G_dauzingD_00"}, + { "pause_00_have.brlan", "G_dauzingE_00"}, + { "pause_00_have.brlan", "G_dauzingF_00"}, + { "pause_00_have.brlan", "G_dauzingG_00"}, + { "pause_00_have.brlan", "G_dauzingH_00"}, + { "pause_00_have.brlan", "G_itemA_00"}, + { "pause_00_have.brlan", "G_itemB_00"}, + { "pause_00_have.brlan", "G_itemC_00"}, + { "pause_00_have.brlan", "G_itemD_00"}, + { "pause_00_have.brlan", "G_itemE_00"}, + { "pause_00_have.brlan", "G_itemF_00"}, + { "pause_00_have.brlan", "G_itemG_00"}, + { "pause_00_have.brlan", "G_itemH_00"}, + { "pause_00_have.brlan", "G_poachA_00"}, + { "pause_00_have.brlan", "G_poachB_00"}, + { "pause_00_have.brlan", "G_poachC_00"}, + { "pause_00_have.brlan", "G_poachD_00"}, + { "pause_00_have.brlan", "G_poachE_00"}, + { "pause_00_have.brlan", "G_poachF_00"}, + { "pause_00_have.brlan", "G_poachG_00"}, + { "pause_00_have.brlan", "G_poachH_00"}, + { "pause_00_have.brlan", "G_heart_00"}, + { "pause_00_have.brlan", "G_saifu_00"}, + { "pause_00_have.brlan", "G_parashoru_00"}, + { "pause_00_have.brlan", "G_mogura_00"}, + { "pause_00_have.brlan", "G_uroko_00"}, + { "pause_00_have.brlan", "G_ring_00"}, + { "pause_00_have.brlan", "G_muse_00"}, + { "pause_00_have.brlan", "G_muse_01"}, + { "pause_00_have.brlan", "G_muse_02"}, + { "pause_00_have.brlan", "G_muse_03"}, + { "pause_00_have.brlan", "G_muse_04"}, + { "pause_00_have.brlan", "G_muse_05"}, + { "pause_00_have.brlan", "G_muse_06"}, + { "pause_00_have.brlan", "G_muse_07"}, + { "pause_00_have.brlan", "G_musicSet_00"}, + { "pause_00_have.brlan", "G_harp_00"}, + { "pause_00_have.brlan", "G_UITypeBtn_00"}, + { "pause_00_have.brlan", "G_miToTane_00"}, + { "pause_00_have.brlan", "G_shiren_00"}, + { "pause_00_have.brlan", "G_force_00"}, + { "pause_00_have.brlan", "G_force_01"}, + { "pause_00_have.brlan", "G_force_02"}, + { "pause_00_have.brlan", "G_forceBg_00"}, + { "pause_00_onOff.brlan", "G_sekiban_00"}, + { "pause_00_onOff.brlan", "G_heart_00"}, + { "pause_00_onOff.brlan", "G_saifu_00"}, + { "pause_00_onOff.brlan", "G_parashoru_00"}, + { "pause_00_onOff.brlan", "G_mogura_00"}, + { "pause_00_onOff.brlan", "G_uroko_00"}, + { "pause_00_onOff.brlan", "G_ring_00"}, + { "pause_00_onOff.brlan", "G_muse_00"}, + { "pause_00_onOff.brlan", "G_muse_01"}, + { "pause_00_onOff.brlan", "G_muse_02"}, + { "pause_00_onOff.brlan", "G_muse_03"}, + { "pause_00_onOff.brlan", "G_muse_04"}, + { "pause_00_onOff.brlan", "G_muse_05"}, + { "pause_00_onOff.brlan", "G_muse_06"}, + { "pause_00_onOff.brlan", "G_muse_07"}, + { "pause_00_onOff.brlan", "G_harp_00"}, + { "pause_00_onOff.brlan", "G_sword_00"}, + { "pause_00_onOff.brlan", "G_dauzingA_00"}, + { "pause_00_onOff.brlan", "G_dauzingB_00"}, + { "pause_00_onOff.brlan", "G_dauzingC_00"}, + { "pause_00_onOff.brlan", "G_dauzingD_00"}, + { "pause_00_onOff.brlan", "G_dauzingE_00"}, + { "pause_00_onOff.brlan", "G_dauzingF_00"}, + { "pause_00_onOff.brlan", "G_dauzingG_00"}, + { "pause_00_onOff.brlan", "G_dauzingH_00"}, + { "pause_00_onOff.brlan", "G_itemA_00"}, + { "pause_00_onOff.brlan", "G_itemB_00"}, + { "pause_00_onOff.brlan", "G_itemC_00"}, + { "pause_00_onOff.brlan", "G_itemD_00"}, + { "pause_00_onOff.brlan", "G_itemE_00"}, + { "pause_00_onOff.brlan", "G_itemF_00"}, + { "pause_00_onOff.brlan", "G_itemG_00"}, + { "pause_00_onOff.brlan", "G_itemH_00"}, + { "pause_00_onOff.brlan", "G_poachA_00"}, + { "pause_00_onOff.brlan", "G_poachB_00"}, + { "pause_00_onOff.brlan", "G_poachC_00"}, + { "pause_00_onOff.brlan", "G_poachD_00"}, + { "pause_00_onOff.brlan", "G_poachE_00"}, + { "pause_00_onOff.brlan", "G_poachF_00"}, + { "pause_00_onOff.brlan", "G_poachG_00"}, + { "pause_00_onOff.brlan", "G_poachH_00"}, + { "pause_00_onOff.brlan", "G_tryForce_00"}, + { "pause_00_onOff.brlan", "G_shiren_00"}, + { "pause_00_onOff.brlan", "G_miToTane_00"}, + { "pause_00_onOff.brlan", "G_text_00"}, + { "pause_00_onOff.brlan", "G_calibBtn_00"}, + { "pause_00_bocoburin.brlan", "G_paraBoco_00"}, + { "pause_00_bocoburin.brlan", "G_moguraBoco_00"}, + { "pause_00_bocoburin.brlan", "G_urokoBoco_00"}, + { "pause_00_bocoburin.brlan", "G_harpBoco_00"}, + { "pause_00_bocoburin.brlan", "G_swordBoco_00"}, + { "pause_00_itemArrow.brlan", "G_itemArrow_00"}, + { "pause_00_toPoach.brlan", "G_ringChange_00"}, + { "pause_00_toSword.brlan", "G_ringChange_00"}, + { "pause_00_toItem.brlan", "G_ringChange_00"}, + { "pause_00_sword.brlan", "G_sword_00"}, + { "pause_00_sekiban.brlan", "G_sekiban_00"}, + { "pause_00_heart.brlan", "G_heart_00"}, + { "pause_00_saifu.brlan", "G_saifu_00"}, + { "pause_00_mogura.brlan", "G_mogura_00"}, + { "pause_00_out.brlan", "G_inOut_00"}, + { "pause_00_onOff.brlan", "G_UITypeBtn_00"}, + { "pause_00_btnDecide.brlan", "G_UITypeBtn_00"}, + { "pause_00_btnDecide.brlan", "G_calibBtn_00"}, + { "pause_00_UIType.brlan", "G_UIType_00"}, + { "pause_00_call.brlan", "G_UITypeCall_00"}, + { "pause_00_miToTane.brlan", "G_miToTane_00"}, + { "pause_00_loop.brlan", "G_loop_00"}, + { "pause_00_scrollRIn.brlan", "G_scroll_00"}, + {"pause_00_scrollROut.brlan", "G_scroll_00"}, + { "pause_00_scrollLIn.brlan", "G_scroll_00"}, + {"pause_00_scrollLOut.brlan", "G_scroll_00"}, + { "pause_00_dauzType.brlan", "G_dauzType_00"}, + { "pause_00_off.brlan", "G_leftTab_00"}, + { "pause_00_off.brlan", "G_centerTab_00"}, + { "pause_00_off.brlan", "G_rightTab_00"}, + { "pause_00_tabV.brlan", "G_tabV_00"}, +}; -extern const char *B_LIST[]; +#define PAUSE_DISP_00_ANIM_IN 0 +#define PAUSE_DISP_00_ANIM_HAVE_TABLET 1 +#define PAUSE_DISP_00_ANIM_HAVE_DOWSING_OFFSET 2 +#define PAUSE_DISP_00_ANIM_HAVE_ITEM_OFFSET 10 +#define PAUSE_DISP_00_ANIM_HAVE_POUCH_OFFSET 18 +#define PAUSE_DISP_00_ANIM_HAVE_HEART 26 +#define PAUSE_DISP_00_ANIM_HAVE_POUCH 27 +#define PAUSE_DISP_00_ANIM_HAVE_PARACHUTE 28 +#define PAUSE_DISP_00_ANIM_HAVE_MITTS 29 +#define PAUSE_DISP_00_ANIM_HAVE_SCALE 30 +#define PAUSE_DISP_00_ANIM_HAVE_RING 31 +#define PAUSE_DISP_00_ANIM_HAVE_MUSE_OFFSET 32 +#define PAUSE_DISP_00_ANIM_HAVE_MUSE_PART_OFFSET 36 +#define PAUSE_DISP_00_ANIM_HAVE_MUSE_07 39 +#define PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET 40 +#define PAUSE_DISP_00_ANIM_HAVE_HARP 41 +#define PAUSE_DISP_00_ANIM_HAVE_UITYPE_BTN 42 +#define PAUSE_DISP_00_ANIM_HAVE_MI_TO_TANE 43 +#define PAUSE_DISP_00_ANIM_HAVE_SHIREN 44 +#define PAUSE_DISP_00_ANIM_HAVE_FORCE_OFFSET 45 +#define PAUSE_DISP_00_ANIM_HAVE_FORCE_BG 48 +#define PAUSE_DISP_00_ANIM_ONOFF_TABLET 49 +#define PAUSE_DISP_00_ANIM_ONOFF_HEART 50 +#define PAUSE_DISP_00_ANIM_ONOFF_POUCH 51 +#define PAUSE_DISP_00_ANIM_ONOFF_PARACHUTE 52 +#define PAUSE_DISP_00_ANIM_ONOFF_MITTS 53 +#define PAUSE_DISP_00_ANIM_ONOFF_SCALE 54 +#define PAUSE_DISP_00_ANIM_ONOFF_RING 55 +#define PAUSE_DISP_00_ANIM_ONOFF_MUSE_OFFSET 56 +#define PAUSE_DISP_00_ANIM_ONOFF_HARP 64 +#define PAUSE_DISP_00_ANIM_ONOFF_SWORD 65 +#define PAUSE_DISP_00_ANIM_ONOFF_DOWSING_OFFSET 66 +#define PAUSE_DISP_00_ANIM_ONOFF_ITEM_OFFSET 74 +#define PAUSE_DISP_00_ANIM_ONOFF_POUCH_OFFSET 82 +#define PAUSE_DISP_00_ANIM_ONOFF_TRIFORCE 90 +#define PAUSE_DISP_00_ANIM_ONOFF_SHIREN 91 +#define PAUSE_DISP_00_ANIM_ONOFF_MI_TO_TANE 92 +#define PAUSE_DISP_00_ANIM_ONOFF_TEXT 93 +#define PAUSE_DISP_00_ANIM_ONOFF_CALIB_BTN 94 +#define PAUSE_DISP_00_ANIM_BOCO_PARACHUTE 95 +#define PAUSE_DISP_00_ANIM_BOCO_MITTS 96 +#define PAUSE_DISP_00_ANIM_BOCO_SCALE 97 +#define PAUSE_DISP_00_ANIM_BOCO_HARP 98 +#define PAUSE_DISP_00_ANIM_BOCO_SWORD 99 +#define PAUSE_DISP_00_ANIM_ITEM_ARROW 100 +#define PAUSE_DISP_00_ANIM_RING_TO_POUCH 101 +#define PAUSE_DISP_00_ANIM_RING_TO_SWORD 102 +#define PAUSE_DISP_00_ANIM_RING_TO_ITEM 103 +#define PAUSE_DISP_00_ANIM_SWORD 104 +#define PAUSE_DISP_00_ANIM_TABLETS 105 +#define PAUSE_DISP_00_ANIM_HEART 106 +#define PAUSE_DISP_00_ANIM_POUCH 107 +#define PAUSE_DISP_00_ANIM_MITTS 108 +#define PAUSE_DISP_00_ANIM_OUT 109 +#define PAUSE_DISP_00_ANIM_UI_TYPE_BTN 110 +#define PAUSE_DISP_00_ANIM_DECIDE_UI_TYPE_BTN 111 +#define PAUSE_DISP_00_ANIM_DECIDE_CALIB_BTN 112 +#define PAUSE_DISP_00_ANIM_UI_TYPE 113 +#define PAUSE_DISP_00_ANIM_CALL 114 +#define PAUSE_DISP_00_ANIM_MI_TO_TANE 115 +#define PAUSE_DISP_00_ANIM_LOOP 116 +#define PAUSE_DISP_00_ANIM_SCROLL_R_IN 117 +#define PAUSE_DISP_00_ANIM_SCROLL_R_OUT 118 +#define PAUSE_DISP_00_ANIM_SCROLL_L_IN 119 +#define PAUSE_DISP_00_ANIM_SCROLL_L_OUT 120 +#define PAUSE_DISP_00_ANIM_DOWSING_TYPE 121 +#define PAUSE_DISP_00_ANIM_OFF_LEFT_TAB 122 +#define PAUSE_DISP_00_ANIM_OFF_CENTER_TAB 123 +#define PAUSE_DISP_00_ANIM_OFF_RIGHT_TAB 124 +#define PAUSE_DISP_00_ANIM_TAB_V 125 -dLytPauseDisp00_c::dLytPauseDisp00_c() : mStateMgr(*this, sStateID::null) {} +#define PAUSE_DISP_00_NUM_ANIMS 126 -void dLytPauseDisp00_c::init() { - mLytBase.build("pause_00.brlyt", nullptr); - mLytBase.setPriority(0x86); +#define PAUSE_DISP_00_ANIM_RING_BASE PAUSE_DISP_00_ANIM_RING_TO_POUCH +#define PAUSE_DISP_00_ANIM_ITEM_OFFSET PAUSE_DISP_00_ANIM_ONOFF_DOWSING_OFFSET - for (int i = 0; i < 0x7E; i++) { - field_0x00D0[i].init(S_MAPPINGS[i].mFile, nullptr, mLytBase.getLayout(), S_MAPPINGS[i].mName); +#define PAUSE_DISP_00_NUM_SUBPANES 24 + +extern "C" u8 lbl_804E8898[]; + +static const char *sGroupName = "G_ref_00"; + +static const char *sBoundingNames[] = { + "B_sekiban_00", "B_heart_00", "B_saifu_00", "B_parashoru_00", "B_mogura_00", "B_uroko_00", + "B_ring_00", "B_muse_00", "B_muse_01", "B_muse_02", "B_muse_03", "B_muse_04", + "B_muse_05", "B_muse_06", "B_muse_07", "B_harp_00", "B_sword_00", "B_swordFire_00", + "B_swordFire_01", "B_swordFire_02", "B_shiren_00", "B_ringA_00", "B_ringB_00", "B_ringC_00", + "B_ringD_00", "B_ringE_00", "B_ringF_00", "B_ringG_00", "B_ringH_00", "B_UIType_00", + "B_calibBtn_00", "B_calibBtn_00", "B_calibBtn_00", "B_leftTab_00", "B_centerTab_00", "B_rightTab_00", + "B_calibBtn_00", +}; + +#define PAUSE_DISP_00_BOUNDING_TABLETS 0 +#define PAUSE_DISP_00_BOUNDING_HEART 1 +#define PAUSE_DISP_00_BOUNDING_POUCH 2 +#define PAUSE_DISP_00_BOUNDING_PARACHUTE 3 +#define PAUSE_DISP_00_BOUNDING_MITTS 4 +#define PAUSE_DISP_00_BOUNDING_SCALE 5 +#define PAUSE_DISP_00_BOUNDING_RING 6 +#define PAUSE_DISP_00_BOUNDING_MUSE_OFFSET 7 +#define PAUSE_DISP_00_BOUNDING_MUSE_07 14 +#define PAUSE_DISP_00_BOUNDING_HARP 15 +#define PAUSE_DISP_00_BOUNDING_SWORD 16 +#define PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET 17 +#define PAUSE_DISP_00_BOUNDING_SHIREN 20 +#define PAUSE_DISP_00_BOUNDING_RING_OFFSET 21 +#define PAUSE_DISP_00_BOUNDING_UI_TYPE 29 +#define PAUSE_DISP_00_BOUNDING_CALIB_BTN_0 30 +#define PAUSE_DISP_00_BOUNDING_ARROW_LEFT 31 +#define PAUSE_DISP_00_BOUNDING_ARROW_RIGHT 32 +#define PAUSE_DISP_00_BOUNDING_LEFT_TAB 33 +#define PAUSE_DISP_00_BOUNDING_CENTER_TAB 34 +#define PAUSE_DISP_00_BOUNDING_RIGHT_TAB 35 +#define PAUSE_DISP_00_BOUNDING_CALIB_BTN_3 36 + +#define PAUSE_DISP_00_BOUNDING_ARROW_OFFSET PAUSE_DISP_00_BOUNDING_ARROW_LEFT + +#define PAUSE_DISP_00_NUM_BOUNDINGS 37 + +// TODO - constants to maybe move elsewhere +#define PAUSE_DISP_00_NUM_SONG_PARTS 3 + +#define PAUSE_DISP_00_ICONS_B_WHEEL_OFFSET 0 +#define PAUSE_DISP_00_ICONS_DOWSING_OFFSET 8 +#define PAUSE_DISP_00_ICONS_POUCH_OFFSET 16 +#define PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL 8 + +dLytPauseDisp00_c::dLytPauseDisp00_c() : mStateMgr(*this) {} + +bool dLytPauseDisp00_c::build() { + dLytPauseMgr_c *pauseMgr = dLytPauseMgr_c::GetInstance(); + d2d::ResAccIf_c *resAcc = pauseMgr->getResAcc1(); + mLyt.setResAcc(resAcc); + mLyt.build("pause_00.brlyt", nullptr); + mLyt.setPriority(0x86); + + for (int i = 0; i < PAUSE_DISP_00_NUM_ANIMS; i++) { + mAnm[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName); } - for (int i = 0; i < 0x18; i++) { - field_0x2050[i].build(nullptr, lbl_804E8898[i]); - mSubpanes.PushBack(&field_0xE11C[i]); + resAcc = pauseMgr->getResAcc2(); + + for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) { + mIcons[i].build(resAcc, lbl_804E8898[i]); + mSubpanes[i].mpLytPane = &mIcons[i]; + mSubpaneList.PushBack(&mSubpanes[i]); } - if (mLytBase.getLayout()->GetGroupContainer() != nullptr) { - nw4r::lyt::Group *group = mLytBase.getLayout()->GetGroupContainer()->FindGroupByName("G_ref_00"); + if (mLyt.getLayout()->GetGroupContainer() != nullptr) { + nw4r::lyt::Group *group = mLyt.getLayout()->GetGroupContainer()->FindGroupByName(sGroupName); if (group != nullptr) { - d2d::dSubPane::linkMeters(group, &mSubpanes); + d2d::dSubPane::linkMeters(group, &mSubpaneList); } } - field_0xE29C.init(mLytBase.getLayout()->GetRootPane(), 1, 0, 0); - dCsMgr_c::GetInstance()->registCursorTarget(&field_0xE29C); - for (int i = 0; i < 0x25; i++) { - if (i != 0x1F && i != 0x20) { - nw4r::lyt::Bounding *b = mLytBase.findBounding(B_LIST[i]); - // TODO + mCsHitCheck.init(mLyt.getLayout()->GetRootPane(), 1, 0, 0); + dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitCheck); + for (int i = 0; i < PAUSE_DISP_00_NUM_BOUNDINGS; i++) { + if (i != PAUSE_DISP_00_BOUNDING_ARROW_LEFT && i != PAUSE_DISP_00_BOUNDING_ARROW_RIGHT) { + mpBoundings[i] = mLyt.findBounding(sBoundingNames[i]); + mpBoundings[i]->SetVisible(true); + } + } + + mpBoundings[PAUSE_DISP_00_BOUNDING_ARROW_LEFT] = pauseMgr->getArrowBounding(0); + mpBoundings[PAUSE_DISP_00_BOUNDING_ARROW_RIGHT] = pauseMgr->getArrowBounding(1); + + u8 songLifetreeStatus = getSongLifeTreeStatus(); + if (songLifetreeStatus == SONG_LIFETREE_HAS_SOTH) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_07, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET, 0.0f); + } else if (songLifetreeStatus != SONG_LIFETREE_NONE) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET, 1.0f); + for (int i = 0; i < PAUSE_DISP_00_NUM_SONG_PARTS; i++) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_PART_OFFSET + i, 1.0f); + } + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_07, 0.0f); + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET, 0.0f); + } + setAnm(PAUSE_DISP_00_ANIM_IN, 0.0f); + mAnm[PAUSE_DISP_00_ANIM_IN].setFrame(mAnm[PAUSE_DISP_00_ANIM_IN].getAnimDuration()); + + mLyt.calc(); + + stopAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_07); + stopAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET); + stopAnm(PAUSE_DISP_00_ANIM_IN); + for (int i = 0; i < PAUSE_DISP_00_NUM_SONG_PARTS; i++) { + stopAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_PART_OFFSET + i); + } + + mStateMgr.changeState(StateID_None); + + return true; +} + +bool dLytPauseDisp00_c::remove() { + dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitCheck); + for (d2d::SubPaneList::Iterator it = mSubpaneList.GetBeginIter(); it != mSubpaneList.GetEndIter(); ++it) { + if (!it->mpLytPane->LytMeter0x24()) { + continue; + } + // @bug checking nullptr after invoking virtual function on 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 < PAUSE_DISP_00_NUM_SUBPANES; i++) { + mSubpanes[i].mpLytPane->remove(); + } + + mLyt.unbindAnims(); + + for (int i = 0; i < PAUSE_DISP_00_NUM_ANIMS; i++) { + mAnm[i].remove(); + } + + return true; +} + +bool dLytPauseDisp00_c::execute() { + field_0xE371 = false; + mStateMgr.executeState(); + executeCall(); + for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) { + mSubpanes[i].mpLytPane->execute(); + } + mLyt.calc(); + mCsHitCheck.resetCachedHitboxes(); + mCsHitCheck.execute(); + if (!mStateMgr.getStateID()->isEqual(StateID_None)) { + mAnm[PAUSE_DISP_00_ANIM_LOOP].play(); + } + + return true; +} + +bool dLytPauseDisp00_c::draw() { + if (mIsVisible == true) { + mLyt.addToDrawList(); + } + return true; +} + +void dLytPauseDisp00_c::initializeState_None() { + for (int i = 0; i < PAUSE_DISP_00_NUM_ANIMS; i++) { + mAnm[i].unbind(); + } + + field_0xE36E = false; + mInRequest = false; + mOutRequest = false; + mIsVisible = false; + field_0xE371 = false; + mStopCallRequest = false; + + mCallTimerMaybe = 0; + mStep = 0; + mPrevNavTarget = 0; + mCurrentNavTarget = 0; + mGetDemoTimer = 0; + + for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) { + mIcons[i].reset(); + mIcons[i].setVisible(false); + } + + for (int i = 0; i < PAUSE_DISP_00_NUM_BOUNDINGS; i++) { + mpBoundings[i]->SetVisible(false); + } + + mpBoundings[PAUSE_DISP_00_BOUNDING_ARROW_LEFT]->SetVisible(true); + mpBoundings[PAUSE_DISP_00_BOUNDING_ARROW_RIGHT]->SetVisible(true); + + mLyt.findPane("N_itemArrow_00")->SetVisible(false); + setAnm(PAUSE_DISP_00_ANIM_ITEM_ARROW, 0.0f); + setAnm(PAUSE_DISP_00_ANIM_RING_BASE + dLytControlGame_c::getInstance()->getPauseDisp00Tab(), 0.0f); + + StoryflagManager *storyFlagmanager = StoryflagManager::sInstance; + + // Check which tabs are unlocked + if (storyFlagmanager->getFlag(789)) { + mpBoundings[PAUSE_DISP_00_BOUNDING_LEFT_TAB]->SetVisible(true); + } + + if (storyFlagmanager->getFlag(30)) { + mpBoundings[PAUSE_DISP_00_BOUNDING_CENTER_TAB]->SetVisible(true); + } + + if (storyFlagmanager->getFlag(58)) { + mpBoundings[PAUSE_DISP_00_BOUNDING_RIGHT_TAB]->SetVisible(true); + } + + setAnm(PAUSE_DISP_00_ANIM_LOOP, 0.0f); + mSelectGuideRequest = false; + mSelectToggleRequest = false; + field_0xE376 = false; + mRingToggleRequest = false; +} +void dLytPauseDisp00_c::executeState_None() { + if (mInRequest == true) { + mInRequest = false; + mStateMgr.changeState(StateID_In); + } +} +void dLytPauseDisp00_c::finalizeState_None() { + loadRingText(RING_TEXT_INITIAL_TAB); +} + +void dLytPauseDisp00_c::initializeState_In() { + if (mDoScrollAnim == true) { + dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); + setAnm(PAUSE_DISP_00_ANIM_IN, 0.0f); + mAnm[PAUSE_DISP_00_ANIM_IN].setFrame(mAnm[PAUSE_DISP_00_ANIM_IN].getAnimDuration()); + if (pause->getField_0x0831()) { + setAnm(PAUSE_DISP_00_ANIM_SCROLL_L_IN, 0.0f); + } else { + setAnm(PAUSE_DISP_00_ANIM_SCROLL_R_IN, 0.0f); + } + + if (pause->getField_0x0840()) { + if (pause->getField_0x0831()) { + mPrevNavTarget = PAUSE_DISP_00_BOUNDING_ARROW_LEFT + 1; + } else { + mPrevNavTarget = PAUSE_DISP_00_BOUNDING_ARROW_RIGHT + 1; + } + } + } else { + setAnm(PAUSE_DISP_00_ANIM_IN, 0.0f); + } + + for (int i = PAUSE_DISP_00_ANIM_ONOFF_TABLET; i < PAUSE_DISP_00_ANIM_ONOFF_CALIB_BTN + 1; i++) { + setAnm(i, 0.0f); + } + mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].setToEnd(); + + setupDisp(); + setupRingIcons(dLytControlGame_c::getInstance()->getPauseDisp00Tab()); + setAnm(PAUSE_DISP_00_ANIM_UI_TYPE_BTN, 0.0f); + + u8 mode = dLytMeter_c::GetMain()->getUiMode(); + setAnm(PAUSE_DISP_00_ANIM_UI_TYPE, mode); + StoryflagManager *storyflagManager = StoryflagManager::sInstance; + if (storyflagManager->getFlag(583)) { + setAnm(PAUSE_DISP_00_ANIM_DOWSING_TYPE, 1.0f); + } else { + setAnm(PAUSE_DISP_00_ANIM_DOWSING_TYPE, 0.0f); + } + + // Control tab visibility + f32 tabVFrame = 0.0f; + if (storyflagManager->getFlag(30)) { + tabVFrame = 1.0f; + } + if (storyflagManager->getFlag(789)) { + tabVFrame = 2.0f; + } + if (storyflagManager->getFlag(58)) { + tabVFrame = 3.0f; + } + + setAnm(PAUSE_DISP_00_ANIM_TAB_V, tabVFrame); + if (tabVFrame) { + mLyt.findPane("N_text_00")->SetVisible(true); + } else { + mLyt.findPane("N_text_00")->SetVisible(false); + } + + mIsVisible = true; +} +void dLytPauseDisp00_c::executeState_In() { + s32 anim = PAUSE_DISP_00_ANIM_IN; + if (mDoScrollAnim == true) { + dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); + anim = pause->getField_0x0831() ? PAUSE_DISP_00_ANIM_SCROLL_L_IN : PAUSE_DISP_00_ANIM_SCROLL_R_IN; + } + + d2d::AnmGroup_c &anm = mAnm[anim]; + + if (anm.isEndReached() == true) { + if (dLytControlGame_c::getInstance()->getField_0x15C67()) { + mStateMgr.changeState(StateID_GetDemo); + } else { + mStateMgr.changeState(StateID_Wait); + } + } else { + anm.play(); + } +} +void dLytPauseDisp00_c::finalizeState_In() { + dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); + if (pause->getField_0x0831()) { + stopAnm(PAUSE_DISP_00_ANIM_SCROLL_L_IN); + } else { + stopAnm(PAUSE_DISP_00_ANIM_SCROLL_R_IN); + } + + mDoScrollAnim = false; + if (pause->getField_0x083E()) { + if (!pause->getField_0x0832()) { + mCurrentNavTarget = PAUSE_DISP_00_BOUNDING_ARROW_RIGHT + 1; + } else { + mCurrentNavTarget = PAUSE_DISP_00_BOUNDING_ARROW_LEFT + 1; + } + mPrevNavTarget = mCurrentNavTarget; + } +} + +void dLytPauseDisp00_c::initializeState_Wait() { + mStep = 0; + field_0xE36E = true; +} +void dLytPauseDisp00_c::executeState_Wait() { + d2d::AnmGroup_c *anm; + if (field_0xE36E == true) { + field_0xE36E = false; + } + switch (mStep) { + case 0: { + if (mOutRequest == true) { + mOutRequest = false; + hideItemIcons(); + mStateMgr.changeState(StateID_Out); + return; + } + if (mSelectToggleRequest == true) { + mStateMgr.changeState(StateID_Select); + return; + } + if (mRingToggleRequest == true) { + mRingToggleRequest = false; + mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].setFrame(0.0f); + mStateMgr.changeState(StateID_Ring); + return; + } + + if (mSelectGuideRequest == true) { + mStep = 1; + setAnm(PAUSE_DISP_00_ANIM_DECIDE_UI_TYPE_BTN, 0.0f); + u8 uiMode = dLytMeter_c::GetMain()->getUiMode(); + f32 frame = uiMode + 1; + if (frame >= 3.0f) { + frame = 0.0f; + } + mAnm[PAUSE_DISP_00_ANIM_UI_TYPE].setFrame(frame); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_P1_SELECT_GUIDE); + } else if (mSelectMplsRequest == true) { + mStep = 2; + setAnm(PAUSE_DISP_00_ANIM_DECIDE_CALIB_BTN, 0.0f); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_P1_SELECT_MPLUS); + } else if (updateSelection() != 0) { + field_0xE371 = true; + } + break; + } + case 1: { + anm = &mAnm[PAUSE_DISP_00_ANIM_DECIDE_UI_TYPE_BTN]; + if (anm->isEndReached() == true) { + mStep = 0; + mSelectGuideRequest = false; + stopAnm(PAUSE_DISP_00_ANIM_DECIDE_UI_TYPE_BTN); + field_0xE36E = true; + } else { + anm->play(); + } + break; + } + case 2: { + anm = &mAnm[PAUSE_DISP_00_ANIM_DECIDE_CALIB_BTN]; + if (anm->isEndReached() == true) { + mStep = 0; + mSelectMplsRequest = false; + stopAnm(PAUSE_DISP_00_ANIM_DECIDE_CALIB_BTN); + field_0xE36E = true; + } else { + anm->play(); + } + break; + } + } + mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].play(); +} +void dLytPauseDisp00_c::finalizeState_Wait() {} + +void dLytPauseDisp00_c::initializeState_Select() { + static const s32 sTabOrder[] = { + 1, + 2, + 0, + }; + + static const s32 sTabAnim[] = { + 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[] = { + PAUSE_DISP_00_ANIM_RING_TO_ITEM, + PAUSE_DISP_00_ANIM_RING_TO_POUCH, + PAUSE_DISP_00_ANIM_RING_TO_SWORD, + }; + + dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); + mSelectToggleRequest = false; + mStep = 0; + if (pause->getField_0x0838() == true) { + mStep = 1; + stopAnm(PAUSE_DISP_00_ANIM_RING_TO_POUCH); + 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; + } else { + stopAnm(controlGameTab + PAUSE_DISP_00_ANIM_RING_BASE); + // TODO - nonmatching + setAnm(sTabAnim2[controlGameTab], 0.0f); + mAnm[sTabAnim2[controlGameTab]].setToEnd(); + field_0xE376 = true; + } + + for (int i = PAUSE_DISP_00_ANIM_ITEM_OFFSET; + i < PAUSE_DISP_00_ANIM_ITEM_OFFSET + 3 * PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { + mAnm[i].setFrame(0.0f); + } + } + mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].setFrame(0.0f); +} +void dLytPauseDisp00_c::executeState_Select() { + static const s32 sTabAnim2[] = { + 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[] = { + PAUSE_DISP_00_ANIM_RING_TO_SWORD, + PAUSE_DISP_00_ANIM_RING_TO_ITEM, + PAUSE_DISP_00_ANIM_RING_TO_POUCH, + }; + + switch (mStep) { + case 0: { + if (mSelectToggleRequest == true) { + mStateMgr.changeState(StateID_Wait); + } + break; + } + case 1: { + // TODO Regswaps - maybe enum types, maybe int, maybe the order of these lines... + s32 controlGameTab = dLytControlGame_c::getInstance()->getPauseDisp00Tab(); + s32 lytPauseTab = dLytPauseMgr_c::GetInstance()->getCurrentDisp00Tab(); + d2d::AnmGroup_c *anm; + if (field_0xE376) { + anm = &mAnm[sTabAnim2[controlGameTab]]; + if (cM::isZero(anm->getFrame()) == true) { + setupRingIcons(lytPauseTab); + mStateMgr.changeState(StateID_Wait); + } + playBackwards(*anm); + } else { + 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); + setupRingIcons(lytPauseTab); + mStateMgr.changeState(StateID_Wait); + } else { + anm->play(); + } + } + break; + } + } + playOnOffTabAnim(); +} +void dLytPauseDisp00_c::finalizeState_Select() { + mSelectToggleRequest = false; + if (mStep == 0) { + return; + } + loadRingText(RING_TEXT_CURRENT_TAB); +} + +void dLytPauseDisp00_c::initializeState_Ring() { + mStep = 0; + mLyt.findPane("N_itemArrow_00")->SetVisible(true); + dAcPy_c::calcItemWheelSelection(true, PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL); + mPrevNavTarget = 0; + loadRingText(RING_TEXT_RELEASE_TO_CONFIRM); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_P1_HOLD_POINTER); +} +void dLytPauseDisp00_c::executeState_Ring() { + dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); + f32 rot = dLytPauseMgr_c::sDisp00ArrowRotation; + f32 len = dLytPauseMgr_c::sDisp00ArrowLength; + if (len < 0.0f) { + len = 0.0f; + } + if (len > 1.0f) { + len = 1.0f; + } + // Length + len *= 99.0f; + mAnm[PAUSE_DISP_00_ANIM_ITEM_ARROW].setFrame(len); + // Rotate the arrow + mVec3_c t1(0.0f, 0.0f, 0.0f); + t1.z = rot; + mLyt.findPane("N_itemArrow_00")->SetRotate(t1); + // But rotate the button and the pointer back so that + // they point up + t1.z = -t1.z; + mLyt.findPane("N_arrowHand_00")->SetRotate(t1); + + if (mSelectToggleRequest == true) { + mStateMgr.changeState(StateID_Select); + } else if (mRingToggleRequest == true) { + mRingToggleRequest = false; + mStateMgr.changeState(StateID_Wait); + } else { + s32 idx = dAcPy_c::calcItemWheelSelection(false, PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL); + s32 navTarget = 0; + if (idx == -1) { + mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].setFrame(0.0f); + pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); + } else { + mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].play(); + static const u8 sButtonOrder[] = { + 0, 7, 6, 5, 4, 3, 2, 1, + }; + idx = sButtonOrder[idx]; + + u16 item; + dLytPauseMgr_c::SelectionType_e selectionType; + s32 b = PAUSE_DISP_00_BOUNDING_RING_OFFSET + idx; + if (mpBoundings[b]->IsVisible()) { + s32 tab = dLytControlGame_c::getInstance()->getPauseDisp00Tab(); + if (tab == 1) { + item = getPouchItemIdForIndex(idx, true); + if (item == 0) { + item = ITEM_POUCH_EXPANSION; + } + selectionType = dLytPauseMgr_c::SELECT_POUCH; + } else if (tab == 2) { + item = getDowsingItemIdForIndex(idx); + selectionType = dLytPauseMgr_c::SELECT_DOWSING; + } else { + item = getBWheelItemIdForIndex(idx); + selectionType = dLytPauseMgr_c::SELECT_BWHEEL; + } + pause->setSelection(selectionType, item, false); + navTarget = idx + 1; + mCurrentNavTarget = navTarget; + field_0xE371 = true; + } else { + idx = -1; + pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); + mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].setFrame(0.0f); + } + } + + if (mPrevNavTarget != navTarget && idx != -1) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_P1_POINT_ITEM); + dRumble_c::start(dRumble_c::sRumblePreset1, 1); + } + mPrevNavTarget = navTarget; + + s32 tab = dLytControlGame_c::getInstance()->getPauseDisp00Tab(); + s32 anmIdx = tab == 1 ? PAUSE_DISP_00_ANIM_ONOFF_POUCH_OFFSET : + tab == 2 ? PAUSE_DISP_00_ANIM_ONOFF_DOWSING_OFFSET : + PAUSE_DISP_00_ANIM_ONOFF_ITEM_OFFSET; + + int i; + d2d::AnmGroup_c *anm = &mAnm[anmIdx]; + for (i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { + if (idx == i) { + anm->play(); + } else { + playBackwards(*anm); + } + anm++; + } + playOnOffTabAnim(); + } +} +void dLytPauseDisp00_c::finalizeState_Ring() { + mLyt.findPane("N_itemArrow_00")->SetVisible(false); + loadRingText(RING_TEXT_INITIAL_TAB); +} + +void dLytPauseDisp00_c::initializeState_GetDemo() { + field_0xE36E = true; + mStep = 0; + mGetDemoTimer = 0; +} +void dLytPauseDisp00_c::executeState_GetDemo() { + switch (mStep) { + case 0: { + field_0xE36E = false; + if (mGetDemoTimer < 2) { + mGetDemoTimer++; + } else { + mGetDemoTimer = 0; + mStep = 1; + } + break; + } + case 1: { + mStep = 2; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_ITEM_SET_FX); + nw4r::math::MTX34 mtx = mLyt.findPane("N_saifuAll_00")->GetGlobalMtx(); + nw4r::math::VEC3 v(0.0f, 0.0f, 0.0f); + MTXMultVec(mtx, v, v); + mVec3_c v1; + v1.set(v.x, v.y, v.z); + dJEffManager_c::spawnUIEffect(PARTICLE_RESOURCE_ID_MAPPING_990_, v1, nullptr, nullptr, nullptr, nullptr); + break; + } + case 2: { + if (mGetDemoTimer < 35) { + mGetDemoTimer++; + } else { + mGetDemoTimer = 0; + mStep = 3; + dTextBox_c *box; + s32 count = dAcItem_c::getExtraWalletCount(); + box = mLyt.getTextBox("T_rupeeNum_00"); + box->SetVisible(true); + SizedWString<32> buf; + buf.sprintf(L"+%d", count * 300); + box->setTextWithGlobalTextProcessor(buf); + // Yes, the r is actually there in the Lyt files + box = mLyt.getTextBox("T_rupeeNumrS_00"); + box->SetVisible(true); + box->setTextWithGlobalTextProcessor(buf); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_ITEM_SET_COUNT_UP); + } + break; + } + case 3: { + if (mGetDemoTimer < 37) { + mGetDemoTimer++; + } else { + mGetDemoTimer = 0; + mStateMgr.changeState(StateID_Wait); + } + break; + } + } +} +void dLytPauseDisp00_c::finalizeState_GetDemo() {} + +void dLytPauseDisp00_c::initializeState_Out() { + stopAnm(PAUSE_DISP_00_ANIM_IN); + if (mDoScrollAnim == true) { + if (dLytPauseMgr_c::GetInstance()->getField_0x0831()) { + setAnm(PAUSE_DISP_00_ANIM_SCROLL_R_OUT, 0.0f); + } else { + setAnm(PAUSE_DISP_00_ANIM_SCROLL_L_OUT, 0.0f); + } + } else { + setAnm(PAUSE_DISP_00_ANIM_OUT, 0.0f); + } + mStep = 0; +} +void dLytPauseDisp00_c::executeState_Out() { + s32 anim = PAUSE_DISP_00_ANIM_OUT; + if (mDoScrollAnim == true) { + anim = dLytPauseMgr_c::GetInstance()->getField_0x0831() ? PAUSE_DISP_00_ANIM_SCROLL_R_OUT : + PAUSE_DISP_00_ANIM_SCROLL_L_OUT; + } + + d2d::AnmGroup_c &anm = mAnm[anim]; + + switch (mStep) { + case 0: { + if (anm.isEndReached() == true) { + mStep = 1; + field_0xE36E = true; + } + break; + } + case 1: { + mStateMgr.changeState(StateID_None); + return; + } + } + + anm.play(); +} +void dLytPauseDisp00_c::finalizeState_Out() {} + +void dLytPauseDisp00_c::setAnm(int idx, f32 value) { + d2d::AnmGroup_c &anm = mAnm[idx]; + anm.bind(false); + anm.setAnimEnable(true); + anm.setFrame(value); +} + +void dLytPauseDisp00_c::stopAnm(int idx) { + d2d::AnmGroup_c &anm = mAnm[idx]; + anm.unbind(); +} + +void dLytPauseDisp00_c::playBackwards(d2d::AnmGroup_c &anm) { + f32 frame = anm.getFrame(); + if (frame) { + frame -= 1.0f; + if (frame <= 0.0f) { + frame = 0.0f; + } + anm.setFrame(frame); + } +} + +void dLytPauseDisp00_c::setupDisp() { + setupInventoryWheel(); + setupHeartPieces(); + setupWallets(); + setupMitts(); + setupSailcloth(); + setupWaterDragonScale(); + setupFireshieldEarrings(); + setupSongsAndLifeTree(); + setupTabletTriforce(); + setupSword(); + setupStoneOfTrials(); + + mpBoundings[PAUSE_DISP_00_BOUNDING_CALIB_BTN_0]->SetVisible(true); + + dLytCommonIconItem_c *icon; + icon = &mIcons[PAUSE_DISP_00_ICONS_B_WHEEL_OFFSET]; + for (s32 i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) { + icon->setVisible(false); + icon++; + } + + if (StoryflagManager::sInstance->getFlag(358)) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_UITYPE_BTN, 1.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_UI_TYPE]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_UITYPE_BTN, 0.0f); + } + + if (StoryflagManager::sInstance->getFlag(570)) { + setAnm(PAUSE_DISP_00_ANIM_CALL, 0.0f); + mCallTimerMaybe = 1; + } +} + +void dLytPauseDisp00_c::setupInventoryWheel() { + dLytCommonIconItem_c *icon; + s32 animIndex; + f32 haveFrame; + + // B-wheel + icon = &mIcons[PAUSE_DISP_00_ICONS_B_WHEEL_OFFSET]; + for (s32 i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { + animIndex = i + PAUSE_DISP_00_ANIM_HAVE_ITEM_OFFSET; + haveFrame = 0.0f; + icon->setUnk(false); + if (isBWheelIndexWithNumber(i)) { + icon->setHasNumber(true); + icon->setNumber(getNumberForBWheelIndex(i)); + } else { + icon->setHasNumber(false); + } + + if (getItemLevelForBWheelIndex(i) != 0) { + u8 id = getLytItemIdForBWheelIndex(i); + if (id != LYT_CMN_ItemInvalid) { + if (isBWheelIndexBocoburinLocked(i, true)) { + icon->setBocoburinLocked(true); + icon->setHasNumber(false); + } + haveFrame = 1.0f; + icon->setItem(id); + } + } + if (isBWheelIndexWithNumber(i)) { + u8 color = getNumberColorForBWheelIndex(i); + if (color != LYT_ITEM_COLOR_NONE) { + icon->setNumberColor(color); + } + } + + setAnm(animIndex, haveFrame); + icon++; + } + + // Pouch + icon = &mIcons[PAUSE_DISP_00_ICONS_POUCH_OFFSET]; + for (s32 i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { + animIndex = i + PAUSE_DISP_00_ANIM_HAVE_POUCH_OFFSET; + haveFrame = 0.0f; + icon->setUnk(false); + s32 number = getPouchItemAmount(i, true); + if (number == -1) { + icon->setHasNumber(false); + } else { + icon->setHasNumber(true); + icon->setNumber(number); + } + + u32 item = getPouchItemForSlot(i, true); + if (item != LYT_CMN_PouchPotionHealthPlusPlusHalf) { + if (isPouchBocoburinLocked()) { + icon->setBocoburinLocked(true); + icon->setHasNumber(false); + } + haveFrame = 1.0f; + icon->setItem(item); + f32 durability = getShieldDurability(i, true); + if (durability >= 0.0f) { + icon->setShieldDurability(durability); + } + + u8 color = getPouchItemNumberColor(i, false); + if (color != LYT_ITEM_COLOR_NONE) { + icon->setNumberColor(color); + } + } + + setAnm(animIndex, haveFrame); + icon++; + } + + // Dowsing + icon = &mIcons[PAUSE_DISP_00_ICONS_DOWSING_OFFSET]; + for (s32 i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { + animIndex = i + PAUSE_DISP_00_ANIM_HAVE_DOWSING_OFFSET; + haveFrame = 0.0f; + icon->setUnk(false); + icon->setHasNumber(false); + + if (hasDowsingInIndex(i)) { + u32 item = getLytIndexForDowsingIndex(i); + if (item != LYT_CMN_DowsingInvalid) { + haveFrame = 1.0f; + icon->setItem(item); + } + } + + setAnm(animIndex, haveFrame); + icon++; + } + + setAnm(PAUSE_DISP_00_ANIM_OFF_LEFT_TAB, 0.0f); + mAnm[PAUSE_DISP_00_ANIM_OFF_LEFT_TAB].setToEnd(); + setAnm(PAUSE_DISP_00_ANIM_OFF_CENTER_TAB, 0.0f); + mAnm[PAUSE_DISP_00_ANIM_OFF_CENTER_TAB].setToEnd(); + setAnm(PAUSE_DISP_00_ANIM_OFF_RIGHT_TAB, 0.0f); + mAnm[PAUSE_DISP_00_ANIM_OFF_RIGHT_TAB].setToEnd(); +} + +void dLytPauseDisp00_c::setupHeartPieces() { + u32 heartPieceCount = getCounterByIndex(8); + u32 containerCount = dAcItem_c::getHeartContainerHealthCount(); + if (containerCount == 24) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_HEART, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_HEART, 3.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_HEART]->SetVisible(true); + } else if (heartPieceCount != 0) { + f32 frame = heartPieceCount; + frame -= 1.0f; + setAnm(PAUSE_DISP_00_ANIM_HAVE_HEART, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_HEART, frame); + mpBoundings[PAUSE_DISP_00_BOUNDING_HEART]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_HEART, 0.0f); + } +} + +void dLytPauseDisp00_c::setupWallets() { + setAnm(PAUSE_DISP_00_ANIM_HAVE_POUCH, 1.0f); + f32 frame = 0.0f; + if (dAcItem_c::checkFlag(ITEM_TYCOON_WALLET)) { + frame = 4.0f; + } else if (dAcItem_c::checkFlag(ITEM_GIANT_WALLET)) { + frame = 3.0f; + } else if (dAcItem_c::checkFlag(ITEM_BIG_WALLET)) { + frame = 2.0f; + } else if (dAcItem_c::checkFlag(ITEM_MEDIUM_WALLET)) { + frame = 1.0f; + } + setAnm(PAUSE_DISP_00_ANIM_POUCH, frame); + mpBoundings[PAUSE_DISP_00_BOUNDING_POUCH]->SetVisible(true); + s32 walletCount = dAcItem_c::getExtraWalletCount(); + SizedWString<32> buf; + if (walletCount != 0) { + bool bVisible = true; + // Apparently extra wallets are the ONLY thing that can cause + // the Gear screen to show the demo (dLytControlGame_c::openCollectionScreenDemo), + // so we don't have to check that an extra wallets are actually what cause the + // demo. + if (dLytControlGame_c::getInstance()->getField_0x15C67()) { + walletCount--; + if (walletCount == 0) { + bVisible = false; + } + } + dTextBox_c *box; + box = mLyt.getTextBox("T_rupeeNum_00"); + box->SetVisible(bVisible); + buf.empty(); + buf.sprintf(L"+%d", walletCount * 300); + box->setTextWithGlobalTextProcessor(buf); + box = mLyt.getTextBox("T_rupeeNumrS_00"); + box->SetVisible(bVisible); + box->setTextWithGlobalTextProcessor(buf); + } else { + mLyt.getTextBox("T_rupeeNum_00")->SetVisible(false); + mLyt.getTextBox("T_rupeeNumrS_00")->SetVisible(false); + } +} + +void dLytPauseDisp00_c::setupMitts() { + s32 mittsLevel = getCurrentMittsLevel(); + if (mittsLevel != 0) { + f32 mittsLevelF = 0.0f; + if (mittsLevel > 1) { + mittsLevelF = 1.0f; + } + setAnm(PAUSE_DISP_00_ANIM_HAVE_MITTS, 1.0f); + if (isMittsRestricted() == true) { + setAnm(PAUSE_DISP_00_ANIM_BOCO_MITTS, 1.0f); + } else { + setAnm(PAUSE_DISP_00_ANIM_BOCO_MITTS, 0.0f); + } + mpBoundings[PAUSE_DISP_00_BOUNDING_MITTS]->SetVisible(true); + setAnm(PAUSE_DISP_00_ANIM_MITTS, mittsLevelF); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MITTS, 0.0f); + } +} + +void dLytPauseDisp00_c::setupSailcloth() { + if (hasSailcloth()) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_PARACHUTE, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_BOCO_PARACHUTE, 0.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_PARACHUTE]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_PARACHUTE, 0.0f); + } +} + +void dLytPauseDisp00_c::setupWaterDragonScale() { + if (hasWaterDragonScale()) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_SCALE, 1.0f); + if (isWaterDragonScaleRestricted()) { + setAnm(PAUSE_DISP_00_ANIM_BOCO_SCALE, 1.0f); + } else { + setAnm(PAUSE_DISP_00_ANIM_BOCO_SCALE, 0.0f); + } + mpBoundings[PAUSE_DISP_00_BOUNDING_SCALE]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_SCALE, 0.0f); + } +} + +void dLytPauseDisp00_c::setupFireshieldEarrings() { + if (dAcItem_c::checkFlag(ITEM_FIRESHIELD_EARRINGS)) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_RING, 1.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_RING]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_RING, 0.0f); + } +} + +void dLytPauseDisp00_c::setupSongsAndLifeTree() { + if (hasGoddessHarp()) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_HARP, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_BOCO_HARP, 1.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_HARP]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_HARP, 0.0f); + } + + s32 anm; + for (int i = 0; i < 4; i++) { + anm = PAUSE_DISP_00_ANIM_HAVE_MUSE_OFFSET + i; + if (hasSong(i)) { + setAnm(anm, 1.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + i]->SetVisible(true); + } else { + setAnm(anm, 0.0f); + } + } + + u8 songLifetreeStatus = getSongLifeTreeStatus(); + if (songLifetreeStatus == SONG_LIFETREE_HAS_SOTH) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_07, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET, 0.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_MUSE_07]->SetVisible(true); + } else if (songLifetreeStatus != SONG_LIFETREE_NONE) { + for (int i = 0; i < PAUSE_DISP_00_NUM_SONG_PARTS; i++) { + if (hasSong(i + 4)) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_PART_OFFSET + i, 1.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + i + 4]->SetVisible(true); + if (i == 2) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MI_TO_TANE, 0.0f); + } + } else { + if (i == 2) { + if (dAcItem_c::checkFlag(ITEM_LIFE_TREE_FRUIT)) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MI_TO_TANE, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_MI_TO_TANE, 1.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + i + 4]->SetVisible(true); + } else if (dAcItem_c::checkFlag(ITEM_LIFE_TREE_SEED) && + ItemflagManager::sInstance->getFlagDirect(497)) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MI_TO_TANE, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_MI_TO_TANE, 0.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + i + 4]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MI_TO_TANE, 0.0f); + } + + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_PART_OFFSET + i, 0.0f); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_PART_OFFSET + i, 0.0f); + } + } + } + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET, 1.0f); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_07, 0.0f); + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET, 0.0f); + } +} + +void dLytPauseDisp00_c::setupTabletTriforce() { + static const s32 sTriforceHaveBoundings[] = { + PAUSE_DISP_00_ANIM_HAVE_FORCE_OFFSET + 1, + PAUSE_DISP_00_ANIM_HAVE_FORCE_OFFSET + 0, + PAUSE_DISP_00_ANIM_HAVE_FORCE_OFFSET + 2, + }; + + s32 tabletCount = 0; + for (int i = 0; i < 3; i++) { + if (dAcItem_c::checkFlag(getTabletItemIdForIndex(i))) { + tabletCount++; + } + } + + if (tabletCount != 0) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_TABLET, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_TABLETS, tabletCount - 1.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_TABLETS]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_TABLET, 0.0f); + } + + s32 triforceCount = 0; + for (int i = 0; i < 3; i++) { + if (dAcItem_c::checkFlag(getTriforceItemIdForIndex(i))) { + triforceCount++; + setAnm(sTriforceHaveBoundings[i], 1.0f); + } else { + setAnm(sTriforceHaveBoundings[i], 0.0f); + } + } + + if (triforceCount != 0) { + mpBoundings[PAUSE_DISP_00_BOUNDING_TABLETS]->SetVisible(true); + mAnm[PAUSE_DISP_00_ANIM_TABLETS].setFrame(3.0f); + setAnm(PAUSE_DISP_00_ANIM_HAVE_FORCE_BG, 1.0f); + // Hide tablets + mAnm[PAUSE_DISP_00_ANIM_HAVE_TABLET].setFrame(0.0f); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_FORCE_BG, 0.0f); + } +} + +void dLytPauseDisp00_c::setupSword() { + static const u8 sSwordFireBoundings[] = { + PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 1, + PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 0, + PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 2, + }; + + static const f32 sSwordFrames[] = {0.0f, 1.0f, 2.0f, 3.0f, 6.0f, 4.0f, 5.0f}; + + s32 currentSwordLevel = getCurrentSwordLevel(); + if (currentSwordLevel != 0) { + if (isSwordRestrictedBokoBase()) { + setAnm(PAUSE_DISP_00_ANIM_BOCO_SWORD, 1.0f); + } else { + setAnm(PAUSE_DISP_00_ANIM_BOCO_SWORD, 0.0f); + } + mpBoundings[PAUSE_DISP_00_BOUNDING_SWORD]->SetVisible(true); + } + + setAnm(PAUSE_DISP_00_ANIM_SWORD, sSwordFrames[currentSwordLevel]); + + s32 currentFire = currentSwordLevel - 2; + if (currentFire < 0) { + currentFire = 0; + } else if (currentFire > 3) { + currentFire = 3; + } + + // Note: Funny unrolled loop here, for a loop that's known to never + // have more than three iterations + for (int i = 0; i < currentFire; i++) { + mpBoundings[sSwordFireBoundings[i]]->SetVisible(true); + } +} + +void dLytPauseDisp00_c::setupStoneOfTrials() { + if (StoryflagManager::sInstance->getFlag(22)) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_SHIREN, 2.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_SHIREN]->SetVisible(true); + } else { + if (dAcItem_c::checkFlag(ITEM_STONE_OF_TRIALS)) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_SHIREN, 1.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_SHIREN]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_SHIREN, 0.0f); } } } -void dLytPauseDisp00_c::displayElement(int i, float frame) { - d2d::AnmGroup_c *s = &field_0x00D0[i]; - s->bind(false); - s->setAnimEnable(true); - s->setFrame(frame); +// A matrix controlling navigation with the Nunchuk stick. +// The row index is the currently selected target, and the row contains +// the list of targets, one entry per stick direction (starting up and going clockwise) +// +// If someone was really bored they could probably replace all of these +// with constants... +static const u8 sNavTable1[][8] = { + { 0, 2, 2, 6, 5, 5, 33, 0}, + { 0, 3, 3, 7, 6, 5, 1, 1}, + { 0, 4, 4, 8, 7, 6, 2, 2}, + { 0, 13, 13, 17, 8, 7, 3, 3}, + { 1, 2, 6, 10, 9, 33, 33, 1}, + { 2, 3, 7, 11, 10, 9, 5, 1}, + { 3, 4, 8, 12, 11, 10, 6, 2}, + { 4, 13, 17, 21, 12, 11, 7, 3}, + { 5, 6, 10, 30, 29, 29, 33, 33}, + { 6, 7, 11, 31, 30, 29, 9, 5}, + { 7, 8, 12, 32, 31, 30, 10, 6}, + { 8, 17, 21, 25, 32, 31, 11, 7}, + { 0, 14, 14, 18, 17, 8, 4, 4}, + { 0, 15, 15, 19, 18, 17, 13, 13}, + { 0, 16, 16, 20, 19, 18, 14, 14}, + { 0, 0, 34, 20, 20, 19, 15, 15}, + {13, 14, 18, 22, 21, 12, 8, 4}, + {14, 15, 19, 23, 22, 21, 17, 13}, + {15, 16, 20, 24, 23, 22, 18, 14}, + {16, 16, 34, 34, 24, 23, 19, 15}, + {17, 18, 22, 26, 25, 32, 12, 8}, + {18, 19, 23, 27, 26, 25, 21, 17}, + {19, 20, 24, 28, 27, 26, 22, 18}, + {20, 34, 34, 28, 28, 27, 23, 19}, + {21, 22, 26, 26, 0, 32, 32, 12}, + {22, 23, 27, 27, 0, 25, 25, 21}, + {23, 24, 28, 28, 0, 26, 26, 22}, + {24, 24, 34, 0, 0, 27, 27, 23}, + { 9, 10, 30, 30, 0, 0, 33, 9}, + {10, 11, 31, 31, 0, 29, 29, 9}, + {11, 12, 32, 32, 0, 30, 30, 10}, + {12, 21, 25, 25, 0, 31, 31, 11}, + { 1, 1, 5, 9, 9, 0, 0, 0}, + {16, 0, 0, 0, 24, 24, 20, 16}, +}; + +static const u8 sNavTable2[][8] = { + { 0, 2, 2, 6, 5, 5, 33, 0}, + { 0, 3, 3, 7, 6, 5, 1, 1}, + { 0, 4, 4, 8, 7, 6, 2, 2}, + { 0, 13, 13, 17, 8, 7, 3, 3}, + { 1, 2, 6, 10, 9, 33, 33, 1}, + { 2, 3, 7, 11, 10, 9, 5, 1}, + { 3, 4, 8, 12, 11, 10, 6, 2}, + { 4, 13, 17, 21, 12, 11, 7, 3}, + { 5, 6, 10, 30, 29, 29, 33, 33}, + { 6, 7, 11, 31, 30, 29, 9, 5}, + { 7, 8, 12, 32, 31, 30, 10, 6}, + { 8, 17, 21, 25, 32, 31, 11, 7}, + { 0, 14, 14, 18, 17, 8, 4, 4}, + { 0, 15, 15, 19, 18, 17, 13, 13}, + { 0, 16, 16, 20, 19, 18, 14, 14}, + { 0, 0, 34, 20, 20, 19, 15, 15}, + {13, 14, 18, 22, 21, 12, 8, 4}, + {14, 15, 19, 23, 22, 21, 17, 13}, + {15, 16, 20, 24, 23, 22, 18, 14}, + {16, 16, 34, 34, 24, 23, 19, 15}, + {17, 18, 22, 26, 25, 32, 12, 8}, + {18, 19, 23, 27, 26, 25, 21, 17}, + {19, 20, 24, 28, 27, 26, 22, 18}, + {20, 34, 34, 28, 28, 27, 23, 19}, + {21, 22, 26, 26, 0, 32, 32, 12}, + {22, 23, 27, 27, 0, 25, 25, 21}, + {23, 24, 28, 28, 0, 26, 26, 22}, + {24, 24, 34, 0, 0, 27, 27, 23}, + { 9, 10, 30, 30, 0, 0, 33, 9}, + {10, 11, 31, 31, 0, 29, 29, 9}, + {11, 12, 32, 32, 0, 30, 30, 10}, + {12, 21, 25, 25, 0, 31, 31, 11}, + { 1, 1, 5, 9, 9, 0, 0, 0}, + {16, 0, 0, 0, 24, 24, 20, 16}, +}; + +s32 dLytPauseDisp00_c::updateSelection() { + dLytControlGame_c *lytControl = dLytControlGame_c::getInstance(); + dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); + if (!pause->isStateWait()) { + pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); + return 0; + } + + s32 target = 0; + if (dPadNav::isPointerVisible()) { + target = getPointerPane(); + if (target != 0) { + mCurrentNavTarget = target; + } + } else { + if (mCurrentNavTarget != 0) { + if (!dPadNav::isPrevPointerVisible() && dPadNav::getFSStickNavDirection() != dPadNav::FS_STICK_NONE) { + const u8 *directions = sNavTable1[mCurrentNavTarget - 1]; + s32 nav = dPadNav::getFSStickNavDirection(); + s32 newTarget = directions[nav - 1]; + if (getSongLifeTreeStatus() == SONG_LIFETREE_HAS_SOTH_PARTS_OR_SEED) { + const u8 *directions = sNavTable2[mCurrentNavTarget - 1]; + newTarget = directions[nav - 1]; + } + if (newTarget != 0) { + mCurrentNavTarget = newTarget; + } + } + } else { + mCurrentNavTarget = PAUSE_DISP_00_BOUNDING_UI_TYPE + 1; + } + + if (mCurrentNavTarget != 0) { + s32 paneIdx = mCurrentNavTarget - 1; + dCsBase_c::GetInstance()->setCursorStickTargetPane(mpBoundings[paneIdx]); + } + + target = mCurrentNavTarget; + } + + if (target == 0) { + pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); + } else { + u8 tab; + // TODO mode IDs + switch (target - 1) { + case PAUSE_DISP_00_BOUNDING_UI_TYPE: + if (mpBoundings[PAUSE_DISP_00_BOUNDING_UI_TYPE]->IsVisible()) { + pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, 4, false); + } else { + pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); + } + break; + case PAUSE_DISP_00_BOUNDING_CALIB_BTN_0: + pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, 5, false); + break; + case PAUSE_DISP_00_BOUNDING_ARROW_LEFT: + case PAUSE_DISP_00_BOUNDING_ARROW_RIGHT: + pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); + pause->setSelectedArrowBounding(target - PAUSE_DISP_00_BOUNDING_ARROW_OFFSET - 1); + break; + case PAUSE_DISP_00_BOUNDING_LEFT_TAB: { + tab = 3; + goto anyTab; + } + case PAUSE_DISP_00_BOUNDING_CENTER_TAB: { + tab = 2; + goto anyTab; + } + case PAUSE_DISP_00_BOUNDING_RIGHT_TAB: { + tab = 1; + goto anyTab; + } + anyTab: + pause->setCurrentSelectionTab(tab); + if (mpBoundings[PAUSE_DISP_00_BOUNDING_LEFT_TAB + tab]->IsVisible()) { + pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, tab, false); + } else { + pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); + } + // TODO + break; + case PAUSE_DISP_00_BOUNDING_CALIB_BTN_3: + pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, 3, false); + break; + default: { + s32 id; + switch (target - 1) { + case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 0: id = 2; break; + case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 1: id = 1; break; + case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 2: id = 3; break; + case PAUSE_DISP_00_BOUNDING_TABLETS: + case PAUSE_DISP_00_BOUNDING_HEART: + case PAUSE_DISP_00_BOUNDING_POUCH: + case PAUSE_DISP_00_BOUNDING_PARACHUTE: + case PAUSE_DISP_00_BOUNDING_MITTS: + case PAUSE_DISP_00_BOUNDING_SCALE: + case PAUSE_DISP_00_BOUNDING_RING: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 0: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 1: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 2: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 3: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 4: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 5: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 6: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 7: + case PAUSE_DISP_00_BOUNDING_HARP: + case PAUSE_DISP_00_BOUNDING_SWORD: + // help + break; + } + } + } + } +} + +s32 dLytPauseDisp00_c::getPointerPane() const { + int idx = 0; + dCursorHitCheck_c *d = dCsBase_c::GetInstance()->getHitCheck(); + if (d != nullptr && d->getType() == 'lyt ') { + for (int i = 0; i < PAUSE_DISP_00_NUM_BOUNDINGS - 1; i++) { + if (static_cast(d)->getHitPane() == mpBoundings[i]) { + idx = i + 1; + // missed optimization: + // break; + } + } + } + return idx; +} + +void dLytPauseDisp00_c::hideItemIcons() { + for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) { + mIcons[i].setOff(); + mIcons[i].setVisible(false); + } +} + +void dLytPauseDisp00_c::executeCall() { + if (mCallTimerMaybe == 1) { + d2d::AnmGroup_c &anm = mAnm[PAUSE_DISP_00_ANIM_CALL]; + if (cM::isZero(anm.getFrame()) == true) { + if (mStopCallRequest == true) { + mStopCallRequest = false; + mCallTimerMaybe = 0; + stopAnm(PAUSE_DISP_00_ANIM_CALL); + } else { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_PLAY_GUIDE_BUTTON_BLINK); + } + } + anm.play(); + } +} + +void dLytPauseDisp00_c::playOnOffTabAnim() { + d2d::AnmGroup_c *anm = &mAnm[PAUSE_DISP_00_ANIM_OFF_LEFT_TAB]; + for (int i = 0; i < 3; i++) { + anm->play(); + anm++; + } +} + +void dLytPauseDisp00_c::loadRingText(u32 cmd) { + if (cmd == RING_TEXT_RELEASE_TO_CONFIRM) { + // "Release to confirm." + mLyt.loadTextVariant("T_decide_00", 0); + 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(); + } + if (tab == 1) { + msgIdx = 2; + } else if (tab == 2) { + msgIdx = 3; + } + // "Items"/"Pouch"/"Dowsing" + mLyt.loadTextVariant("T_decide_00", msgIdx); + mLyt.loadTextVariant("T_decideS_00", msgIdx); + } + + dWindow_c *window = mLyt.getWindow("W_bgP_01"); + window->UpdateSize(mLyt.getSizeBoxInWindow("W_bgP_01"), 32.0f); } diff --git a/src/d/lyt/d_lyt_pause_disp_01.cpp b/src/d/lyt/d_lyt_pause_disp_01.cpp index 5b315c2d..0b253a73 100644 --- a/src/d/lyt/d_lyt_pause_disp_01.cpp +++ b/src/d/lyt/d_lyt_pause_disp_01.cpp @@ -226,7 +226,7 @@ void dLytPauseDisp01_c::initializeState_None() { mStep = 0; mPrevNavTarget = 0; mCurrentNavTarget = 0; - mTimer = 0; + mGetDemoTimer = 0; for (int i = 0; i < PAUSE_DISP_01_NUM_SUBPANES; i++) { mIcons[i].reset(); @@ -309,11 +309,9 @@ void dLytPauseDisp01_c::finalizeState_In() { mDoScrollAnim = false; if (pause->getField_0x083E()) { if (!pause->getField_0x0832()) { - // TODO id - mCurrentNavTarget = 34; + mCurrentNavTarget = PAUSE_DISP_01_OFFSET_MY_PANES + PAUSE_DISP_01_PANE_RIGHT + 1; } else { - // TODO id - mCurrentNavTarget = 33; + mCurrentNavTarget = PAUSE_DISP_01_OFFSET_MY_PANES + PAUSE_DISP_01_PANE_LEFT + 1; } mPrevNavTarget = mCurrentNavTarget; } @@ -363,16 +361,16 @@ void dLytPauseDisp01_c::finalizeState_Select() { void dLytPauseDisp01_c::initializeState_GetDemo() { field_0x98CE = true; mStep = 0; - mTimer = 0; + mGetDemoTimer = 0; } void dLytPauseDisp01_c::executeState_GetDemo() { switch (mStep) { case 0: { field_0x98CE = false; - if (mTimer < 2) { - mTimer++; + if (mGetDemoTimer < 2) { + mGetDemoTimer++; } else { - mTimer = 0; + mGetDemoTimer = 0; mStep = 1; } break; @@ -448,10 +446,10 @@ void dLytPauseDisp01_c::executeState_GetDemo() { break; } case 2: { - if (mTimer < 35) { - mTimer++; + if (mGetDemoTimer < 35) { + mGetDemoTimer++; } else { - mTimer = 0; + mGetDemoTimer = 0; mStep = 3; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_ITEM_SET_COUNT_UP); u16 item = dLytControlGame_c::getInstance()->getItemForPauseDemo(); @@ -502,10 +500,10 @@ void dLytPauseDisp01_c::executeState_GetDemo() { break; } case 3: { - if (mTimer < 37) { - mTimer++; + if (mGetDemoTimer < 37) { + mGetDemoTimer++; } else { - mTimer = 0; + mGetDemoTimer = 0; mStateMgr.changeState(StateID_Wait); } break; diff --git a/src/d/lyt/meter/d_lyt_meter.cpp b/src/d/lyt/meter/d_lyt_meter.cpp index 5df7025f..aa48e102 100644 --- a/src/d/lyt/meter/d_lyt_meter.cpp +++ b/src/d/lyt/meter/d_lyt_meter.cpp @@ -146,8 +146,9 @@ bool dLytMeter1Button_c::build(d2d::ResAccIf_c *resAcc) { mAnm[i].setAnimEnable(false); } - mLyt.fn_800AB9A0(mLyt.getTextBox("T_sabBtnS_00"), 0); - mLyt.fn_800AB9A0(mLyt.getTextBox("T_sabBtn_00"), 0); + // "Gear" + mLyt.loadTextVariant(mLyt.getTextBox("T_sabBtnS_00"), 0); + mLyt.loadTextVariant(mLyt.getTextBox("T_sabBtn_00"), 0); for (int i = 0; i < 1; i++) { mpWindow[i] = mLyt.getWindow(sWindowName1[i]); mpSizeBox[i] = mLyt.getSizeBoxInWindow(sWindowName1[i]); diff --git a/src/d/lyt/meter/d_lyt_meter_event_skip.cpp b/src/d/lyt/meter/d_lyt_meter_event_skip.cpp index 5289b97e..3e70d630 100644 --- a/src/d/lyt/meter/d_lyt_meter_event_skip.cpp +++ b/src/d/lyt/meter/d_lyt_meter_event_skip.cpp @@ -25,11 +25,13 @@ void dLytMeterEventSkip_c::executeState_Invisible() { if (shouldPromptForSkip() || dLytMeter_c::GetInstance()->isHelpOpen()) { if (dLytMeter_c::GetInstance()->isHelpOpen()) { for (int i = 0; i < 2; i++) { - mLyt.fn_800AB9A0(mpTextBoxes[i], 1); + // "Close" + mLyt.loadTextVariant(mpTextBoxes[i], 1); } } else { for (int i = 0; i < 2; i++) { - mLyt.fn_800AB9A0(mpTextBoxes[i], 0); + // "Skip" + mLyt.loadTextVariant(mpTextBoxes[i], 0); } } diff --git a/src/d/lyt/meter/d_lyt_meter_item_select.cpp b/src/d/lyt/meter/d_lyt_meter_item_select.cpp index 30e858cb..28209883 100644 --- a/src/d/lyt/meter/d_lyt_meter_item_select.cpp +++ b/src/d/lyt/meter/d_lyt_meter_item_select.cpp @@ -12,6 +12,7 @@ #include "d/lyt/d_lyt_control_game.h" #include "d/lyt/d_lyt_do_button.h" #include "d/lyt/d_lyt_unknowns.h" +#include "d/lyt/d_lyt_util_items.h" #include "d/lyt/meter/d_lyt_meter.h" #include "d/snd/d_snd_small_effect_mgr.h" #include "m/m_vec.h" @@ -719,9 +720,9 @@ void dLytMeterItemSelect_c::initializeState_SelectIn() { mAnm[ITEM_SELECT_ANIM_DECIDE].setFrame(0.0f); for (int i = 0; i < ITEM_SELECT_NUM_ITEMS; i++) { - if (fn_800F01B0(i)) { + if (hasBWheelItem(i)) { mAnm[i + ITEM_SELECT_ANIM_HAVE_OFFSET].setFrame(0.0f); - if (fn_800F01E0(i)) { + if (isBocoburinLocked(i)) { mIsBocoburinLocked[i] = true; } } else { @@ -1345,7 +1346,7 @@ void dLytMeterItemSelect_c::initializeState_DemoMove() { } else { field_0x57A3[i] = true; } - } else if ((i == 0 || i == 2 || i == 3) && fn_800F01B0(i)) { + } else if ((i == 0 || i == 2 || i == 3) && hasBWheelItem(i)) { field_0x57A3[i] = false; field_0x575C++; } else { @@ -1355,8 +1356,8 @@ void dLytMeterItemSelect_c::initializeState_DemoMove() { } for (int i = 0; i < ITEM_SELECT_NUM_ITEMS; i++) { - if (fn_800F01B0(i)) { - if (fn_800F01E0(i) || field_0x57A3[i] == 0) { + if (hasBWheelItem(i)) { + if (isBocoburinLocked(i) || field_0x57A3[i] == 0) { if (isSlotBocoburinLocked(i)) { mIsBocoburinLocked[i] = true; mAnm[i + ITEM_SELECT_ANIM_HAVE_OFFSET].setFrame(0.0f); @@ -1399,7 +1400,7 @@ void dLytMeterItemSelect_c::executeState_DemoMove() { mDemoMoveTimer++; if (mDemoMoveTimer == 15) { for (int i = 0; i < ITEM_SELECT_NUM_ITEMS; i++) { - if (fn_800F01B0(i) && !field_0x57A3[i]) { + if (hasBWheelItem(i) && !field_0x57A3[i]) { mAnm[i + ITEM_SELECT_ANIM_HAVE_OFFSET].setFrame(0.0f); field_0x57A3[i] = true; @@ -2514,16 +2515,12 @@ u8 dLytMeterItemSelect_c::getInternalBaseItemForSlot(s32 slot) const { return sSlotToInternalItem[slot]; } -extern "C" s32 fn_801673B0(s32); - -bool dLytMeterItemSelect_c::fn_800F01B0(s32 arg) const { - return fn_801673B0(arg) != 0; +bool dLytMeterItemSelect_c::hasBWheelItem(s32 arg) const { + return getItemLevelForBWheelIndex(arg) != 0; } -extern "C" bool fn_80167780(s32, bool); - -bool dLytMeterItemSelect_c::fn_800F01E0(s32 arg) const { - return fn_80167780(arg, true); +bool dLytMeterItemSelect_c::isBocoburinLocked(s32 arg) const { + return isBWheelIndexBocoburinLocked(arg, true); } bool dLytMeterItemSelect_c::isSlotBocoburinLocked(s32 slot) { 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 a837e3e8..e4973458 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 @@ -217,7 +217,8 @@ void dLytMsgWindowSelectBtn_c::initializeState_In() { field_0x9A4 = 1; field_0x9B4 = -1; for (int i = 0; i < 2; i++) { - mLyt.fn_800AB9A0(mpDecideTextBoxes[i], 1); + // "Select" + mLyt.loadTextVariant(mpDecideTextBoxes[i], 1); } mpWindow->UpdateSize(mpSizeBox, 32.0f); @@ -317,7 +318,8 @@ void dLytMsgWindowSelectBtn_c::executeState_WaitSelect() { f32 f = mBtnHelper.fn_8011D690(mBtnHelper.field_0x50); // TODO for (int i = 0; i < 2; i++) { - mLyt.fn_800AB9A0(mpDecideTextBoxes[i], 0); + // "Confirm" + mLyt.loadTextVariant(mpDecideTextBoxes[i], 0); } mpWindow->UpdateSize(mpSizeBox, 32.0f); From dda24ef01a9ca14ef352c5b2f56579caaf761d60 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 9 Aug 2025 12:10:31 +0200 Subject: [PATCH 08/14] wip --- config/SOUE01/symbols.txt | 2 +- include/d/lyt/d_lyt_pause.h | 21 +- include/d/lyt/d_lyt_pause_disp_00.h | 10 + src/d/lyt/d_lyt_pause_disp_00.cpp | 360 +++++++++++++++++++++++++--- 4 files changed, 360 insertions(+), 33 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 0d7c709b..bacc82ba 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -14891,7 +14891,7 @@ fn_80280E80 = .text:0x80280E80; // type:function size:0xB0 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_elb = .text:0x80281000; // type:function size:0x3C +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 diff --git a/include/d/lyt/d_lyt_pause.h b/include/d/lyt/d_lyt_pause.h index 90094664..88978cd7 100644 --- a/include/d/lyt/d_lyt_pause.h +++ b/include/d/lyt/d_lyt_pause.h @@ -31,6 +31,10 @@ public: return field_0x0832; } + void setField_0x0837(bool b) { + field_0x0837 = b; + } + bool getField_0x0838() const { return field_0x0838; } @@ -39,6 +43,14 @@ public: return field_0x083B; } + void setField_0x083C(bool b) { + field_0x083C = b; + } + + void setField_0x083D(bool b) { + field_0x083D = b; + } + bool getField_0x083E() const { return field_0x083E; } @@ -66,7 +78,7 @@ public: SELECT_NONE = 10, }; - void setSelection(SelectionType_e type, s32 id, bool restricted); + void setSelection(SelectionType_e type, u16 id, bool restricted); bool isCurrentSelectionRestricted() const { return mCurrentSelectionIsRestricted; @@ -118,16 +130,17 @@ private: /* 0x0832 */ bool field_0x0832; /* 0x0833 */ u8 mCurrentSelectionTab; - /* 0x0834 */ u8 _0x0834[0x0838 - 0x0834]; + /* 0x0834 */ u8 _0x0834[0x0837 - 0x0834]; + /* 0x0837 */ bool field_0x0837; /* 0x0838 */ bool field_0x0838; /* 0x0839 */ u8 _0x0839[0x083B - 0x0839]; /* 0x083B */ bool field_0x083B; - /* 0x083C */ u8 _0x083C[0x083E - 0x083C]; - + /* 0x083C */ bool field_0x083C; + /* 0x083D */ bool field_0x083D; /* 0x083E */ bool field_0x083E; /* 0x083F */ bool field_0x083F; /* 0x0840 */ bool field_0x0840; diff --git a/include/d/lyt/d_lyt_pause_disp_00.h b/include/d/lyt/d_lyt_pause_disp_00.h index 81e20caa..3805c434 100644 --- a/include/d/lyt/d_lyt_pause_disp_00.h +++ b/include/d/lyt/d_lyt_pause_disp_00.h @@ -26,6 +26,14 @@ public: STATE_FUNC_DECLARE(dLytPauseDisp00_c, Out); private: + static s32 navTargetToBounding(s32 target) { + return target - 1; + } + + static s32 boundingToNavTarget(s32 target) { + return target + 1; + } + void setAnm(int idx, f32 value); void stopAnm(int idx); void playBackwards(d2d::AnmGroup_c &anm); @@ -49,8 +57,10 @@ private: s32 updateSelection(); s32 getPointerPane() const; + bool isPointingAtRingIcon(); void hideItemIcons(); + u16 getPointedItemSpecial(s32 paneIdx, bool *pLocked); enum LoadRingTextCmd_e { RING_TEXT_RELEASE_TO_CONFIRM = 0, diff --git a/src/d/lyt/d_lyt_pause_disp_00.cpp b/src/d/lyt/d_lyt_pause_disp_00.cpp index cb0f0e25..6ea81fb1 100644 --- a/src/d/lyt/d_lyt_pause_disp_00.cpp +++ b/src/d/lyt/d_lyt_pause_disp_00.cpp @@ -1,5 +1,6 @@ #include "d/lyt/d_lyt_pause_disp_00.h" +#include "c/c_math.h" #include "d/a/d_a_item.h" #include "d/a/d_a_itembase.h" #include "d/a/d_a_player.h" @@ -1485,24 +1486,26 @@ s32 dLytPauseDisp00_c::updateSelection() { } } else { if (mCurrentNavTarget != 0) { - if (!dPadNav::isPrevPointerVisible() && dPadNav::getFSStickNavDirection() != dPadNav::FS_STICK_NONE) { - const u8 *directions = sNavTable1[mCurrentNavTarget - 1]; + if (!dPadNav::isPrevPointerVisible()) { s32 nav = dPadNav::getFSStickNavDirection(); - s32 newTarget = directions[nav - 1]; - if (getSongLifeTreeStatus() == SONG_LIFETREE_HAS_SOTH_PARTS_OR_SEED) { - const u8 *directions = sNavTable2[mCurrentNavTarget - 1]; - newTarget = directions[nav - 1]; - } - if (newTarget != 0) { - mCurrentNavTarget = newTarget; + if (nav != dPadNav::FS_STICK_NONE) { + const u8 *directions = sNavTable1[navTargetToBounding(mCurrentNavTarget)]; + s32 newTarget = directions[nav - 1]; + if (getSongLifeTreeStatus() == SONG_LIFETREE_HAS_SOTH_PARTS_OR_SEED) { + const u8 *directions = sNavTable2[navTargetToBounding(mCurrentNavTarget)]; + newTarget = directions[nav - 1]; + } + if (newTarget != 0) { + mCurrentNavTarget = newTarget; + } } } } else { - mCurrentNavTarget = PAUSE_DISP_00_BOUNDING_UI_TYPE + 1; + mCurrentNavTarget = boundingToNavTarget(PAUSE_DISP_00_BOUNDING_UI_TYPE); } if (mCurrentNavTarget != 0) { - s32 paneIdx = mCurrentNavTarget - 1; + s32 paneIdx = navTargetToBounding(mCurrentNavTarget); dCsBase_c::GetInstance()->setCursorStickTargetPane(mpBoundings[paneIdx]); } @@ -1514,7 +1517,13 @@ s32 dLytPauseDisp00_c::updateSelection() { } else { u8 tab; // TODO mode IDs - switch (target - 1) { + switch (navTargetToBounding(target)) { + case PAUSE_DISP_00_BOUNDING_CALIB_BTN_3: + pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, 5, false); + break; + case PAUSE_DISP_00_BOUNDING_CALIB_BTN_0: + pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, 5, false); + break; case PAUSE_DISP_00_BOUNDING_UI_TYPE: if (mpBoundings[PAUSE_DISP_00_BOUNDING_UI_TYPE]->IsVisible()) { pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, 4, false); @@ -1522,13 +1531,10 @@ s32 dLytPauseDisp00_c::updateSelection() { pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); } break; - case PAUSE_DISP_00_BOUNDING_CALIB_BTN_0: - pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, 5, false); - break; case PAUSE_DISP_00_BOUNDING_ARROW_LEFT: case PAUSE_DISP_00_BOUNDING_ARROW_RIGHT: pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); - pause->setSelectedArrowBounding(target - PAUSE_DISP_00_BOUNDING_ARROW_OFFSET - 1); + pause->setSelectedArrowBounding(navTargetToBounding(target - PAUSE_DISP_00_BOUNDING_ARROW_OFFSET)); break; case PAUSE_DISP_00_BOUNDING_LEFT_TAB: { tab = 3; @@ -1542,24 +1548,72 @@ s32 dLytPauseDisp00_c::updateSelection() { tab = 1; goto anyTab; } - anyTab: + anyTab: { pause->setCurrentSelectionTab(tab); - if (mpBoundings[PAUSE_DISP_00_BOUNDING_LEFT_TAB + tab]->IsVisible()) { + s32 bounding = navTargetToBounding(target); + if (mpBoundings[bounding]->IsVisible()) { pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, tab, false); } else { pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); } - // TODO - break; - case PAUSE_DISP_00_BOUNDING_CALIB_BTN_3: - pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, 3, false); + static const u8 sTabLookup[] = { + PAUSE_DISP_00_BOUNDING_RIGHT_TAB, + PAUSE_DISP_00_BOUNDING_CENTER_TAB, + PAUSE_DISP_00_BOUNDING_LEFT_TAB, + }; + u8 pauseTab = pause->getCurrentSelectionTab() - 1; + if (pauseTab != lytControl->getPauseDisp00Tab() && mpBoundings[sTabLookup[pauseTab]]->IsVisible()) { + pause->setField_0x0837(true); + field_0xE371 = true; + } break; + } + default: { - s32 id; - switch (target - 1) { - case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 0: id = 2; break; - case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 1: id = 1; break; - case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 2: id = 3; break; + u16 id; + dLytPauseMgr_c::SelectionType_e selectionType; + bool locked = false; + s32 paneIdx = navTargetToBounding(target); + switch (paneIdx) { + default: { + s32 idx = navTargetToBounding(target) - PAUSE_DISP_00_BOUNDING_RING_OFFSET; + if (lytControl->getPauseDisp00Tab() == 1) { + id = getPouchItemForSlot(idx, true); + if (id == ITEM_NONE) { + id = ITEM_POUCH_EXPANSION; + } + selectionType = dLytPauseMgr_c::SELECT_POUCH; + if (isPouchBocoburinLocked()) { + locked = true; + } + } else if (lytControl->getPauseDisp00Tab() == 2) { + id = getDowsingItemIdForIndex(idx); + selectionType = dLytPauseMgr_c::SELECT_DOWSING; + } else { + id = getBWheelItemIdForIndex(idx); + selectionType = dLytPauseMgr_c::SELECT_BWHEEL; + if (isBWheelIndexBocoburinLocked(idx, true)) { + locked = true; + } + } + break; + } + case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 0: { + id = 2; + goto anyFire; + } + case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 1: { + id = 1; + goto anyFire; + } + case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 2: { + id = 3; + goto anyFire; + } + anyFire: { + selectionType = dLytPauseMgr_c::SELECT_FIRE; + break; + } case PAUSE_DISP_00_BOUNDING_TABLETS: case PAUSE_DISP_00_BOUNDING_HEART: case PAUSE_DISP_00_BOUNDING_POUCH: @@ -1577,12 +1631,262 @@ s32 dLytPauseDisp00_c::updateSelection() { case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 7: case PAUSE_DISP_00_BOUNDING_HARP: case PAUSE_DISP_00_BOUNDING_SWORD: - // help + case PAUSE_DISP_00_BOUNDING_SHIREN: { + id = getPointedItemSpecial(paneIdx, &locked); + selectionType = dLytPauseMgr_c::SELECT_ITEM; break; + } } + if (!dPadNav::isPrevPointerVisible()) { + s32 bounding = navTargetToBounding(target); + if (!mpBoundings[bounding]->IsVisible()) { + selectionType = dLytPauseMgr_c::SELECT_NONE; + id = 0; + } + } + pause->setSelection(selectionType, id, locked); } } } + + // TODO derive numbers from defines + { + d2d::AnmGroup_c *pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_TABLET]; + for (int i = 0; i < 15; i++) { + s32 anim = PAUSE_DISP_00_ANIM_ONOFF_TABLET + i; + if (target != 0 && navTargetToBounding(target) == i && + mpBoundings[navTargetToBounding(target)]->IsVisible()) { + pAnm->play(); + } else { + playBackwards(*pAnm); + } + + if (anim == 62) { + d2d::AnmGroup_c *museAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_MI_TO_TANE]; + if (target != 0 && navTargetToBounding(target) == i) { + museAnm->play(); + } else { + playBackwards(*museAnm); + } + } + pAnm++; + } + } + + { + d2d::AnmGroup_c *pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_HARP]; + for (int i = 15; i < 21; i++) { + if (target != 0 && navTargetToBounding(target) == i) { + pAnm->play(); + } else { + playBackwards(*pAnm); + } + pAnm++; + } + } + + { + d2d::AnmGroup_c *pAnm; + + pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_SWORD]; + if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_SWORD) { + pAnm->play(); + } else { + playBackwards(*pAnm); + } + + pAnm = &mAnm[PAUSE_DISP_00_ANIM_UI_TYPE_BTN]; + if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_UI_TYPE) { + pause->setField_0x083C(true); + pAnm->play(); + } else { + playBackwards(*pAnm); + } + + pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_CALIB_BTN]; + if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_CALIB_BTN_0) { + pause->setField_0x083D(true); + pAnm->play(); + } else { + playBackwards(*pAnm); + } + + pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_TRIFORCE]; + if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_TABLETS && + mpBoundings[PAUSE_DISP_00_BOUNDING_TABLETS]->IsVisible()) { + pAnm->play(); + } else { + playBackwards(*pAnm); + } + + pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_SHIREN]; + if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_SHIREN) { + pAnm->play(); + } else { + playBackwards(*pAnm); + } + } + + s32 tab = lytControl->getPauseDisp00Tab(); + s32 anmIdx = tab == 1 ? PAUSE_DISP_00_ANIM_ONOFF_POUCH_OFFSET : + tab == 2 ? PAUSE_DISP_00_ANIM_ONOFF_DOWSING_OFFSET : + PAUSE_DISP_00_ANIM_ONOFF_ITEM_OFFSET; + + d2d::AnmGroup_c *anm = &mAnm[anmIdx]; + for (int 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 = anm->getFrame(); + if (anm->getAnimDuration() - 1.0f > frame) { + anm->setFrame(frame + 1.0f); + } + } else { + f32 frame = anm->getFrame(); + if (frame) { + frame -= 1.0f; + if (frame <= 0.0f) { + frame = 0.0f; + } + anm->setFrame(frame); + } + } + anm++; + } + + s32 tab1 = lytControl->getPauseDisp00Tab(); + playOnOffTabAnim(); + switch (navTargetToBounding(target)) { + case PAUSE_DISP_00_BOUNDING_LEFT_TAB: { + if (tab1 != 2) { + mAnm[PAUSE_DISP_00_ANIM_OFF_LEFT_TAB].setFrame(0.0f); + } + break; + } + case PAUSE_DISP_00_BOUNDING_CENTER_TAB: { + if (tab1 != 1) { + mAnm[PAUSE_DISP_00_ANIM_OFF_CENTER_TAB].setFrame(0.0f); + } + break; + } + case PAUSE_DISP_00_BOUNDING_RIGHT_TAB: { + if (tab1 != 0) { + mAnm[PAUSE_DISP_00_ANIM_OFF_RIGHT_TAB].setFrame(0.0f); + } + break; + } + } + + if (target == 0 && isPointingAtRingIcon() == true) { + u16 tab = 1; + if (lytControl->getPauseDisp00Tab() == 1) { + tab = 2; + } else if (lytControl->getPauseDisp00Tab() == 2) { + tab = 3; + } + pause->setSelection(dLytPauseMgr_c::SELECT_RING, tab, false); + } + + dSndSmallEffectMgr_c *soundMgr = dSndSmallEffectMgr_c::GetInstance(); + if (target != 0 && mPrevNavTarget != target) { + s32 tab2 = lytControl->getPauseDisp00Tab(); + bool rumble = true; + switch (navTargetToBounding(target)) { + case PAUSE_DISP_00_BOUNDING_UI_TYPE: { + soundMgr->playSound(SE_S_MENU_P1_POINT_GUIDE); + break; + } + case PAUSE_DISP_00_BOUNDING_CALIB_BTN_0: { + soundMgr->playSound(SE_S_MENU_P1_POINT_MPLUS); + break; + } + case PAUSE_DISP_00_BOUNDING_LEFT_TAB: { + if (mpBoundings[PAUSE_DISP_00_BOUNDING_LEFT_TAB]->IsVisible()) { + if (cM::isZero(mAnm[PAUSE_DISP_00_ANIM_OFF_LEFT_TAB].getFrame())) { + soundMgr->playSound(SE_S_MENU_P1_POINT_C); + } + if (tab2 == 2) { + rumble = false; + } + } + break; + } + case PAUSE_DISP_00_BOUNDING_CENTER_TAB: { + if (mpBoundings[PAUSE_DISP_00_BOUNDING_CENTER_TAB]->IsVisible()) { + if (cM::isZero(mAnm[PAUSE_DISP_00_ANIM_OFF_CENTER_TAB].getFrame())) { + soundMgr->playSound(SE_S_MENU_P1_POINT_MINUS); + } + if (tab2 == 1) { + rumble = false; + } + } + break; + } + case PAUSE_DISP_00_BOUNDING_RIGHT_TAB: { + if (mpBoundings[PAUSE_DISP_00_BOUNDING_RIGHT_TAB]->IsVisible()) { + if (cM::isZero(mAnm[PAUSE_DISP_00_ANIM_OFF_RIGHT_TAB].getFrame())) { + soundMgr->playSound(SE_S_MENU_P1_POINT_B); + } + if (tab2 == 0) { + rumble = false; + } + } + break; + } + case PAUSE_DISP_00_BOUNDING_CALIB_BTN_3: { + soundMgr->playSound(SE_S_MENU_P1_POINT_TOGGLE); + break; + } + case PAUSE_DISP_00_BOUNDING_TABLETS: + case PAUSE_DISP_00_BOUNDING_HEART: + case PAUSE_DISP_00_BOUNDING_POUCH: + case PAUSE_DISP_00_BOUNDING_PARACHUTE: + case PAUSE_DISP_00_BOUNDING_MITTS: + case PAUSE_DISP_00_BOUNDING_SCALE: + case PAUSE_DISP_00_BOUNDING_RING: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 0: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 1: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 2: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 3: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 4: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 5: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 6: + case PAUSE_DISP_00_BOUNDING_MUSE_07: + case PAUSE_DISP_00_BOUNDING_HARP: + case PAUSE_DISP_00_BOUNDING_SWORD: + case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 0: + case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 1: + case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 2: + case PAUSE_DISP_00_BOUNDING_SHIREN: + case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 0: + case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 1: + case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 2: + case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 3: + case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 4: + case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 5: + case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 6: + case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 7: { + soundMgr->playSound(SE_S_MENU_P1_POINT_ITEM); + break; + } + } + + if (rumble == true) { + dRumble_c::start(dRumble_c::sRumblePreset0, 1); + } + } + + mPrevNavTarget = target; + if (target != 0 && navTargetToBounding(target) != PAUSE_DISP_00_BOUNDING_CALIB_BTN_3 && + !dPadNav::isPrevPointerVisible() && !mpBoundings[navTargetToBounding(target)]->IsVisible()) { + target = 0; + } + + if (navTargetToBounding(target) >= PAUSE_DISP_00_BOUNDING_ARROW_LEFT && + navTargetToBounding(target) <= PAUSE_DISP_00_BOUNDING_RIGHT_TAB) { + target = 0; + } + + return target; } s32 dLytPauseDisp00_c::getPointerPane() const { From 0847c40aa0ba0482e25e1e10a4718cf062432e63 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 9 Aug 2025 15:48:22 +0200 Subject: [PATCH 09/14] d_lyt_pause_disp_00 with a few nonmatching functions --- config/SOUE01/symbols.txt | 76 ++-- include/d/d_cs_base.h | 4 + include/d/lyt/d_lyt_pause_disp_00.h | 10 + include/d/lyt/d_lyt_util_items.h | 16 + include/m/m_vec.h | 4 + src/d/lyt/d_lyt_pause_disp_00.cpp | 590 ++++++++++++++++++---------- 6 files changed, 459 insertions(+), 241 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index bacc82ba..3dd520da 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -8792,14 +8792,14 @@ execute__17dLytPauseDisp00_cFv = .text:0x8015A640; // type:function size:0x10C executeState__86sStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8015A750; // type:function size:0x10 getStateID__86sStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8015A760; // type:function size:0x10 draw__17dLytPauseDisp00_cFv = .text:0x8015A770; // type:function size:0x38 -fn_8015A7B0 = .text:0x8015A7B0; // type:function size:0x14 -fn_8015A7D0 = .text:0x8015A7D0; // type:function size:0x14 -fn_8015A7F0 = .text:0x8015A7F0; // type:function size:0x14 -fn_8015A810 = .text:0x8015A810; // type:function size:0x10 -fn_8015A820 = .text:0x8015A820; // type:function size:0x10 -fn_8015A830 = .text:0x8015A830; // type:function size:0x10 -fn_8015A840 = .text:0x8015A840; // type:function size:0x68 -fn_8015A8B0 = .text:0x8015A8B0; // type:function size:0x28 +drawDirectly__17dLytPauseDisp00_cFv = .text:0x8015A7B0; // type:function size:0x14 +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 +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 initializeState_None__17dLytPauseDisp00_cFv = .text:0x8015A8E0; // type:function size:0x2B8 executeState_None__17dLytPauseDisp00_cFv = .text:0x8015ABA0; // type:function size:0x34 finalizeState_None__17dLytPauseDisp00_cFv = .text:0x8015ABE0; // type:function size:0x8 @@ -8839,9 +8839,9 @@ setupStoneOfTrials__17dLytPauseDisp00_cFv = .text:0x8015D110; // type:function s setupRingIcons__17dLytPauseDisp00_cFl = .text:0x8015D1D0; // type:function size:0x130 updateSelection__17dLytPauseDisp00_cFv = .text:0x8015D300; // type:function size:0xA04 getPointerPane__17dLytPauseDisp00_cCFv = .text:0x8015DD10; // type:function size:0x160 -fn_8015DE70 = .text:0x8015DE70; // type:function size:0x194 +isPointingAtRingIcon__17dLytPauseDisp00_cFv = .text:0x8015DE70; // type:function size:0x194 hideItemIcons__17dLytPauseDisp00_cFv = .text:0x8015E010; // type:function size:0x58 -fn_8015E070 = .text:0x8015E070; // type:function size:0x220 +getPointedItemSpecial__17dLytPauseDisp00_cFlPb = .text:0x8015E070; // type:function size:0x220 executeCall__17dLytPauseDisp00_cFv = .text:0x8015E290; // type:function size:0xA4 playOnOffTabAnim__17dLytPauseDisp00_cFv = .text:0x8015E340; // type:function size:0x54 loadRingText__17dLytPauseDisp00_cFUl = .text:0x8015E3A0; // type:function size:0xF4 @@ -9174,28 +9174,28 @@ getCaptionItemText__Fl = .text:0x801679E0; // type:function size:0x54 getDowsingText__Fl = .text:0x80167A40; // type:function size:0x40 getPauseCategoryText__Fl = .text:0x80167A80; // type:function size:0x5C getCurrentWalletType = .text:0x80167AE0; // type:function size:0x88 -getCurrentWalletItemId = .text:0x80167B70; // type:function size:0x30 -fn_80167BA0 = .text:0x80167BA0; // type:function size:0x8 -hasSailcloth = .text:0x80167BB0; // type:function size:0x34 -getSailclothItemId = .text:0x80167BF0; // type:function size:0x8 +getCurrentWalletItemId__Fv = .text:0x80167B70; // type:function size:0x30 +getCurrentHeartPieceItemId__Fv = .text:0x80167BA0; // type:function size:0x8 +hasSailcloth__Fv = .text:0x80167BB0; // type:function size:0x34 +getCurrentSailclothItemId__Fv = .text:0x80167BF0; // type:function size:0x8 getCurrentMittsLevel__Fv = .text:0x80167C00; // type:function size:0x4 -fn_80167C10 = .text:0x80167C10; // type:function size:0x44 +getCurrentMittsItemId__Fv = .text:0x80167C10; // type:function size:0x44 isMittsRestricted__Fv = .text:0x80167C60; // type:function size:0x8 -fn_80167C70 = .text:0x80167C70; // type:function size:0x8 +getCurrentEarringsItemId__Fv = .text:0x80167C70; // type:function size:0x8 hasWaterDragonScale__Fv = .text:0x80167C80; // type:function size:0x40 -fn_80167CC0 = .text:0x80167CC0; // type:function size:0x30 +getCurrentWaterDragonScaleItemId__Fv = .text:0x80167CC0; // type:function size:0x30 isWaterDragonScaleRestricted__Fv = .text:0x80167CF0; // type:function size:0x8 hasGoddessHarp__Fv = .text:0x80167D00; // type:function size:0x34 -getGoddessHarpId = .text:0x80167D40; // type:function size:0x8 -harpRestricted = .text:0x80167D50; // type:function size:0x28 +getCurrentGoddessHarpItemId__Fv = .text:0x80167D40; // type:function size:0x8 +isHarpRestrictedBokoBase__Fv = .text:0x80167D50; // type:function size:0x28 hasSong__Fl = .text:0x80167D80; // type:function size:0x34 -fn_80167DC0 = .text:0x80167DC0; // type:function size:0x14 -getItemIdForTabletNum = .text:0x80167DE0; // type:function size:0x10 +getSongItemIdForIndex__Fl = .text:0x80167DC0; // type:function size:0x14 +getTabletItemIdForIndex__Fl = .text:0x80167DE0; // type:function size:0x10 getCurrentSwordLevel__Fv = .text:0x80167DF0; // type:function size:0x24 -fn_80167E20 = .text:0x80167E20; // type:function size:0x30 +getCurrentSwordItemId__Fv = .text:0x80167E20; // type:function size:0x30 fn_80167E50 = .text:0x80167E50; // type:function size:0x14 isSwordRestrictedBokoBase__Fv = .text:0x80167E70; // type:function size:0x44 -getItemIdForTriforcePieceNum = .text:0x80167EC0; // type:function size:0x10 +getTriforceItemIdForIndex__Fl = .text:0x80167EC0; // type:function size:0x10 getSongLifeTreeStatus__Fv = .text:0x80167ED0; // type:function size:0x88 shouldUseSingular__Fl = .text:0x80167F60; // type:function size:0x74 __ct__17dLytCommonArrow_cFv = .text:0x80167FE0; // type:function size:0x148 @@ -28336,13 +28336,16 @@ lbl_804E8150 = .rodata:0x804E8150; // type:object size:0xC8 data:4byte lbl_804E8218 = .rodata:0x804E8218; // type:object size:0x10 data:4byte lbl_804E8228 = .rodata:0x804E8228; // type:object size:0x20 data:4byte brlanMap = .rodata:0x804E8248; // type:object size:0x10 scope:local data:4byte -lbl_804E8258 = .rodata:0x804E8258; // type:object size:0x128 -lbl_804E8380 = .rodata:0x804E8380; // type:object size:0x128 -brlanMap = .rodata:0x804E84A8; // type:object size:0x3F0 data:4byte -lbl_804E8898 = .rodata:0x804E8898; // type:object size:0x3C data:byte -lbl_804E88D4 = .rodata:0x804E88D4; // type:object size:0xC -lbl_804E88E0 = .rodata:0x804E88E0; // type:object size:0xC -TRIFORCE_PAUSE_MENU_INDEX = .rodata:0x804E88EC; // type:object size:0xC data:4byte +sNavTable1 = .rodata:0x804E8258; // type:object size:0x128 scope:local +sNavTable2 = .rodata:0x804E8380; // type:object size:0x128 scope:local +brlanMap = .rodata:0x804E84A8; // type:object size:0x3F0 scope:local data:4byte +iconVariants = .rodata:0x804E8898; // type:object size:0x18 scope:local data:byte +lbl_804E88B0 = .rodata:0x804E88B0; // type:object size:0xC +lbl_804E88BC = .rodata:0x804E88BC; // type:object size:0xC +lbl_804E88C8 = .rodata:0x804E88C8; // type:object size:0xC +@LOCAL@executeState_Select__17dLytPauseDisp00_cFv@sTabAnim2 = .rodata:0x804E88D4; // type:object size:0xC +@LOCAL@executeState_Select__17dLytPauseDisp00_cFv@sTabAnim3@0 = .rodata:0x804E88E0; // type:object size:0xC +@LOCAL@setupTabletTriforce__17dLytPauseDisp00_cFv@sTriforceHaveBoundings = .rodata:0x804E88EC; // type:object size:0xC data:4byte @LOCAL@setupSword__17dLytPauseDisp00_cFv@sSwordFrames@0 = .rodata:0x804E88F8; // type:object size:0x20 brlanMap = .rodata:0x804E8918; // type:object size:0x78 scope:local data:4byte sNavTable = .rodata:0x804E8990; // type:object size:0x110 scope:local @@ -34469,7 +34472,8 @@ sBoundingNames = .data:0x80525924; // type:object size:0x94 data:4byte lbl_805259B8 = .data:0x805259B8; // type:object size:0x10 lbl_805259C8 = .data:0x805259C8; // type:object size:0x10 lbl_805259D8 = .data:0x805259D8; // type:object size:0xC -lbl_805259E4 = .data:0x805259E4; // type:object size:0x20 +lbl_805259E4 = .data:0x805259E4; // type:object size:0x10 +lbl_805259F4 = .data:0x805259F4; // type:object size:0x10 lbl_80525A04 = .data:0x80525A04; // type:object size:0x14 lbl_80525A18 = .data:0x80525A18; // type:object size:0x10 data:string jumptable_80525A28 = .data:0x80525A28; // type:object size:0x20 scope:local @@ -42028,8 +42032,8 @@ sCurrentObtainingItemOarcName = .sbss:0x80575918; // type:object size:0x4 data:4 lbl_80575928 = .sbss:0x80575928; // type:object size:0x8 data:byte sInstance__12dTgMassObj_c = .sbss:0x80575930; // type:object size:0x4 data:4byte lbl_80575934 = .sbss:0x80575934; // type:object size:0x4 data:4byte -lbl_80575938 = .sbss:0x80575938; // type:object size:0x4 align:4 data:float -lbl_8057593C = .sbss:0x8057593C; // type:object size:0x4 align:4 data:float +sDisp00ArrowRotation__14dLytPauseMgr_c = .sbss:0x80575938; // type:object size:0x4 align:4 data:float +sDisp00ArrowLength__14dLytPauseMgr_c = .sbss:0x8057593C; // type:object size:0x4 align:4 data:float sInstance__14dLytPauseMgr_c = .sbss:0x80575940; // type:object size:0x8 data:4byte sInstance__17dLytGameOverMgr_c = .sbss:0x80575948; // type:object size:0x8 data:4byte sInstance__13dLytSaveMgr_c = .sbss:0x80575950; // type:object size:0x8 data:4byte @@ -51517,8 +51521,10 @@ lbl_805B1670 = .bss:0x805B1670; // type:object size:0x10 LytPauseDisp00__STATE_NONE = .bss:0x805B1680; // type:object size:0x40 data:4byte LytPauseDisp00__STATE_IN = .bss:0x805B16C0; // type:object size:0x40 data:4byte LytPauseDisp00__STATE_WAIT = .bss:0x805B1700; // type:object size:0x40 data:4byte -LytPauseDisp00__STATE_SELECT = .bss:0x805B1740; // type:object size:0x80 data:4byte -LytPauseDisp00__STATE_GET_DEMO = .bss:0x805B17C0; // type:object size:0x70 data:4byte +LytPauseDisp00__STATE_SELECT = .bss:0x805B1740; // type:object size:0x40 data:4byte +LytPauseDisp00__STATE_RING = .bss:0x805B1780; // type:object size:0x40 data:4byte +LytPauseDisp00__STATE_GET_DEMO = .bss:0x805B17C0; // type:object size:0x40 data:4byte +LytPauseDisp00__STATE_OUT = .bss:0x805B1800; // type:object size:0x30 data:4byte @22656 = .bss:0x805B1830; // type:object size:0xC scope:local ...bss.0 = .bss:0x805B1830; // type:label scope:local StateID_None__17dLytPauseDisp01_c = .bss:0x805B1840; // type:object size:0x30 data:4byte diff --git a/include/d/d_cs_base.h b/include/d/d_cs_base.h index 7bce9e41..8c7972c8 100644 --- a/include/d/d_cs_base.h +++ b/include/d/d_cs_base.h @@ -40,6 +40,10 @@ public: return mCursorIf.getHit(); } + dCursorInterface_c *getCursorIf() { + return &mCursorIf; + } + static dCsBase_c *GetInstance() { return sInstance; } diff --git a/include/d/lyt/d_lyt_pause_disp_00.h b/include/d/lyt/d_lyt_pause_disp_00.h index 3805c434..38a07923 100644 --- a/include/d/lyt/d_lyt_pause_disp_00.h +++ b/include/d/lyt/d_lyt_pause_disp_00.h @@ -17,6 +17,16 @@ public: bool execute(); bool draw(); + void drawDirectly(); + void requestIn(bool scroll); + void requestOut(bool scroll); + void requestSelect(); + void requestRing(); + void requestUnselect(); + + bool requestSelectGuide(); + bool requestSelectMpls(); + STATE_FUNC_DECLARE(dLytPauseDisp00_c, None); STATE_FUNC_DECLARE(dLytPauseDisp00_c, In); STATE_FUNC_DECLARE(dLytPauseDisp00_c, Wait); diff --git a/include/d/lyt/d_lyt_util_items.h b/include/d/lyt/d_lyt_util_items.h index f8e0a634..12f029a5 100644 --- a/include/d/lyt/d_lyt_util_items.h +++ b/include/d/lyt/d_lyt_util_items.h @@ -22,24 +22,40 @@ u8 getSongLifeTreeStatus(); /** 0: no sword, 6: TMS */ s32 getCurrentSwordLevel(); +u16 getCurrentSwordItemId(); bool isSwordRestrictedBokoBase(); +u16 getCurrentGoddessHarpItemId(); +bool isHarpRestrictedBokoBase(); + +u16 getCurrentEarringsItemId(); + u16 getTabletItemIdForIndex(s32 index); u16 getTriforceItemIdForIndex(s32 index); +u16 getSongItemIdForIndex(s32 index); + bool hasGoddessHarp(); bool hasSong(s32 index); bool hasWaterDragonScale(); +u16 getCurrentWaterDragonScaleItemId(); bool isWaterDragonScaleRestricted(); bool hasSailcloth(); s32 getCurrentMittsLevel(); +u16 getCurrentMittsItemId(); bool isMittsRestricted(); +u16 getCurrentSailclothItemId(); + +u16 getCurrentWalletItemId(); + +u16 getCurrentHeartPieceItemId(); + void getItemLabel(s32 itemId, SizedString<32> &buf); void getCaptionItemLabel(s32 itemId, SizedString<32> &buf); void getDowsingLabel(s32 itemId, SizedString<32> &buf); diff --git a/include/m/m_vec.h b/include/m/m_vec.h index f5dd02ef..401c04c3 100644 --- a/include/m/m_vec.h +++ b/include/m/m_vec.h @@ -315,6 +315,10 @@ public: mVec2_c operator-(const mVec2_c &v) const { return mVec2_c(x - v.x, y - v.y); } + + f32 squareDistanceTo(const mVec2_c &other) const { + return (*this - other).squaredLength(); + } }; #endif diff --git a/src/d/lyt/d_lyt_pause_disp_00.cpp b/src/d/lyt/d_lyt_pause_disp_00.cpp index 6ea81fb1..c2ab10bf 100644 --- a/src/d/lyt/d_lyt_pause_disp_00.cpp +++ b/src/d/lyt/d_lyt_pause_disp_00.cpp @@ -18,11 +18,16 @@ #include "d/lyt/meter/d_lyt_meter.h" #include "d/snd/d_snd_small_effect_mgr.h" #include "d/snd/d_snd_wzsound.h" +#include "m/m_vec.h" #include "nw4r/lyt/lyt_group.h" +#include "nw4r/lyt/lyt_pane.h" +#include "nw4r/lyt/lyt_types.h" #include "nw4r/math/math_types.h" #include "sized_string.h" #include "toBeSorted/counters/counter.h" +#include + STATE_DEFINE(dLytPauseDisp00_c, None); STATE_DEFINE(dLytPauseDisp00_c, In); STATE_DEFINE(dLytPauseDisp00_c, Wait); @@ -31,6 +36,92 @@ STATE_DEFINE(dLytPauseDisp00_c, Ring); STATE_DEFINE(dLytPauseDisp00_c, GetDemo); STATE_DEFINE(dLytPauseDisp00_c, Out); +// A matrix controlling navigation with the Nunchuk stick. +// The row index is the currently selected target, and the row contains +// the list of targets, one entry per stick direction (starting up and going clockwise) +// +// If someone was really bored they could probably replace all of these +// with constants... +static const u8 sNavTable1[][8] = { + {0x00, 0x15, 0x15, 0x0F, 0x08, 0x18, 0x24, 0x24}, + {0x12, 0x11, 0x03, 0x1E, 0x1E, 0x1E, 0x20, 0x20}, + {0x13, 0x1C, 0x1B, 0x1F, 0x1F, 0x1E, 0x02, 0x11}, + {0x08, 0x0A, 0x0A, 0x06, 0x06, 0x00, 0x19, 0x18}, + {0x09, 0x21, 0x21, 0x00, 0x07, 0x07, 0x0B, 0x0B}, + {0x0A, 0x0B, 0x07, 0x07, 0x00, 0x00, 0x1F, 0x04}, + {0x0B, 0x05, 0x05, 0x00, 0x00, 0x06, 0x06, 0x0A}, + {0x01, 0x0F, 0x10, 0x0A, 0x0A, 0x04, 0x18, 0x24}, + {0x15, 0x21, 0x21, 0x05, 0x0B, 0x0B, 0x10, 0x0F}, + {0x08, 0x10, 0x0B, 0x07, 0x06, 0x04, 0x04, 0x08}, + {0x09, 0x09, 0x05, 0x05, 0x07, 0x06, 0x0A, 0x10}, + {0x01, 0x0E, 0x0D, 0x10, 0x08, 0x08, 0x18, 0x01}, + {0x15, 0x15, 0x00, 0x09, 0x09, 0x10, 0x0C, 0x0E}, + {0x00, 0x15, 0x0D, 0x0D, 0x10, 0x0C, 0x0C, 0x01}, + {0x01, 0x15, 0x09, 0x09, 0x10, 0x08, 0x08, 0x01}, + {0x0F, 0x09, 0x09, 0x0B, 0x0A, 0x0A, 0x08, 0x08}, + {0x14, 0x14, 0x13, 0x03, 0x02, 0x02, 0x12, 0x14}, + {0x14, 0x14, 0x11, 0x11, 0x02, 0x20, 0x20, 0x20}, + {0x14, 0x22, 0x1D, 0x1C, 0x03, 0x11, 0x11, 0x14}, + {0x00, 0x22, 0x22, 0x13, 0x11, 0x12, 0x12, 0x00}, + {0x00, 0x00, 0x21, 0x21, 0x09, 0x0F, 0x01, 0x01}, + {0x23, 0x24, 0x17, 0x17, 0x1A, 0x1D, 0x1D, 0x22}, + {0x24, 0x01, 0x01, 0x18, 0x18, 0x1B, 0x16, 0x16}, + {0x17, 0x01, 0x08, 0x04, 0x19, 0x19, 0x1C, 0x17}, + {0x18, 0x18, 0x04, 0x06, 0x1A, 0x1A, 0x1A, 0x1D}, + {0x16, 0x19, 0x19, 0x06, 0x00, 0x1F, 0x1B, 0x00}, + {0x1C, 0x17, 0x1A, 0x1A, 0x1A, 0x1F, 0x03, 0x1C}, + {0x1D, 0x1D, 0x18, 0x1B, 0x1B, 0x03, 0x13, 0x13}, + {0x22, 0x16, 0x16, 0x19, 0x1C, 0x1C, 0x13, 0x14}, + {0x02, 0x03, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x02}, + {0x03, 0x1B, 0x06, 0x00, 0x00, 0x1E, 0x1E, 0x03}, + {0x14, 0x12, 0x12, 0x02, 0x02, 0x00, 0x00, 0x00}, + {0x15, 0x00, 0x00, 0x00, 0x05, 0x05, 0x09, 0x15}, + {0x00, 0x23, 0x23, 0x16, 0x1D, 0x13, 0x14, 0x14}, + {0x00, 0x24, 0x24, 0x17, 0x16, 0x1D, 0x22, 0x22}, + {0x00, 0x01, 0x01, 0x08, 0x17, 0x16, 0x23, 0x23}, + {0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D}, +}; + +static const u8 sNavTable2[][8] = { + {0x00, 0x15, 0x15, 0x0E, 0x0C, 0x18, 0x24, 0x24}, + {0x12, 0x11, 0x03, 0x1E, 0x1E, 0x1E, 0x20, 0x20}, + {0x13, 0x1C, 0x1B, 0x1F, 0x1F, 0x1E, 0x02, 0x11}, + {0x08, 0x0A, 0x0A, 0x06, 0x06, 0x00, 0x19, 0x18}, + {0x09, 0x21, 0x21, 0x00, 0x07, 0x07, 0x0B, 0x0B}, + {0x0A, 0x0B, 0x07, 0x07, 0x00, 0x00, 0x1F, 0x04}, + {0x0B, 0x05, 0x05, 0x00, 0x00, 0x06, 0x06, 0x0A}, + {0x0C, 0x0C, 0x10, 0x0A, 0x0A, 0x04, 0x18, 0x24}, + {0x0D, 0x21, 0x21, 0x05, 0x0B, 0x0B, 0x10, 0x0D}, + {0x08, 0x10, 0x0B, 0x07, 0x06, 0x04, 0x04, 0x08}, + {0x09, 0x09, 0x05, 0x05, 0x07, 0x06, 0x0A, 0x10}, + {0x01, 0x0E, 0x0D, 0x10, 0x08, 0x08, 0x18, 0x01}, + {0x15, 0x15, 0x21, 0x09, 0x09, 0x10, 0x0C, 0x0E}, + {0x01, 0x15, 0x0D, 0x0D, 0x10, 0x0C, 0x0C, 0x01}, + {0x00, 0x15, 0x00, 0x09, 0x10, 0x08, 0x08, 0x01}, + {0x0E, 0x0D, 0x09, 0x0B, 0x0A, 0x0A, 0x08, 0x0C}, + {0x14, 0x14, 0x13, 0x03, 0x02, 0x02, 0x12, 0x14}, + {0x14, 0x14, 0x11, 0x11, 0x02, 0x20, 0x20, 0x20}, + {0x14, 0x22, 0x1D, 0x1C, 0x03, 0x11, 0x11, 0x14}, + {0x00, 0x22, 0x1D, 0x13, 0x11, 0x12, 0x12, 0x00}, + {0x00, 0x00, 0x21, 0x21, 0x0D, 0x0E, 0x01, 0x01}, + {0x23, 0x24, 0x17, 0x17, 0x1A, 0x1D, 0x1D, 0x22}, + {0x24, 0x01, 0x01, 0x18, 0x18, 0x1B, 0x16, 0x16}, + {0x17, 0x01, 0x08, 0x04, 0x19, 0x19, 0x1C, 0x17}, + {0x18, 0x18, 0x04, 0x06, 0x1A, 0x1A, 0x1A, 0x1D}, + {0x16, 0x19, 0x19, 0x06, 0x00, 0x1F, 0x1B, 0x00}, + {0x1C, 0x17, 0x1A, 0x1A, 0x1A, 0x1F, 0x03, 0x1C}, + {0x1D, 0x1D, 0x18, 0x1B, 0x1B, 0x03, 0x13, 0x13}, + {0x22, 0x16, 0x16, 0x19, 0x1C, 0x1C, 0x13, 0x14}, + {0x02, 0x03, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x02}, + {0x03, 0x1B, 0x06, 0x00, 0x00, 0x1E, 0x1E, 0x03}, + {0x14, 0x12, 0x12, 0x02, 0x02, 0x00, 0x00, 0x00}, + {0x15, 0x00, 0x00, 0x00, 0x05, 0x05, 0x09, 0x15}, + {0x00, 0x23, 0x23, 0x16, 0x1D, 0x13, 0x14, 0x14}, + {0x00, 0x24, 0x24, 0x17, 0x16, 0x1D, 0x22, 0x22}, + {0x00, 0x01, 0x01, 0x08, 0x17, 0x16, 0x23, 0x23}, + {0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D}, +}; + static const d2d::LytBrlanMapping brlanMap[] = { { "pause_00_in.brlan", "G_inOut_00"}, { "pause_00_have.brlan", "G_sekiban_00"}, @@ -238,7 +329,16 @@ static const d2d::LytBrlanMapping brlanMap[] = { #define PAUSE_DISP_00_NUM_SUBPANES 24 -extern "C" u8 lbl_804E8898[]; +// clang-format off +static const u8 iconVariants[] = { + // Wheel + 0, 0, 0, 0, 0, 0, 0, 0, + // Dowsing + 2, 2, 2, 2, 2, 2, 2, 2, + // Pouch + 1, 1, 1, 1, 1, 1, 1, 1, +}; +// clang-format on static const char *sGroupName = "G_ref_00"; @@ -303,7 +403,7 @@ bool dLytPauseDisp00_c::build() { resAcc = pauseMgr->getResAcc2(); for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) { - mIcons[i].build(resAcc, lbl_804E8898[i]); + mIcons[i].build(resAcc, iconVariants[i]); mSubpanes[i].mpLytPane = &mIcons[i]; mSubpaneList.PushBack(&mSubpanes[i]); } @@ -384,7 +484,11 @@ bool dLytPauseDisp00_c::remove() { } bool dLytPauseDisp00_c::execute() { + dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); field_0xE371 = false; + pause->setField_0x083C(false); + pause->setField_0x083D(false); + pause->setField_0x0837(false); mStateMgr.executeState(); executeCall(); for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) { @@ -407,6 +511,54 @@ bool dLytPauseDisp00_c::draw() { return true; } +void dLytPauseDisp00_c::drawDirectly() { + mLyt.draw(); +} + +void dLytPauseDisp00_c::requestIn(bool scroll) { + mInRequest = true; + mDoScrollAnim = scroll; +} + +void dLytPauseDisp00_c::requestOut(bool scroll) { + mOutRequest = true; + mDoScrollAnim = scroll; +} + +void dLytPauseDisp00_c::requestSelect() { + mSelectToggleRequest = true; +} + +void dLytPauseDisp00_c::requestRing() { + mRingToggleRequest = true; +} + +void dLytPauseDisp00_c::requestUnselect() { + mSelectToggleRequest = true; +} + +bool dLytPauseDisp00_c::requestSelectGuide() { + if (mSelectGuideRequest == true) { + return 0; + } + + mSelectGuideRequest = true; + if (mCallTimerMaybe != 0) { + mStopCallRequest = true; + StoryflagManager::sInstance->unsetFlag(570); + } + return true; +} + +bool dLytPauseDisp00_c::requestSelectMpls() { + if (mSelectMplsRequest == true) { + return 0; + } + + mSelectMplsRequest = true; + return true; +} + void dLytPauseDisp00_c::initializeState_None() { for (int i = 0; i < PAUSE_DISP_00_NUM_ANIMS; i++) { mAnm[i].unbind(); @@ -1240,7 +1392,7 @@ void dLytPauseDisp00_c::setupFireshieldEarrings() { void dLytPauseDisp00_c::setupSongsAndLifeTree() { if (hasGoddessHarp()) { setAnm(PAUSE_DISP_00_ANIM_HAVE_HARP, 1.0f); - setAnm(PAUSE_DISP_00_ANIM_BOCO_HARP, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_BOCO_HARP, 0.0f); mpBoundings[PAUSE_DISP_00_BOUNDING_HARP]->SetVisible(true); } else { setAnm(PAUSE_DISP_00_ANIM_HAVE_HARP, 0.0f); @@ -1305,32 +1457,32 @@ void dLytPauseDisp00_c::setupTabletTriforce() { PAUSE_DISP_00_ANIM_HAVE_FORCE_OFFSET + 2, }; - s32 tabletCount = 0; + s32 count = 0; for (int i = 0; i < 3; i++) { if (dAcItem_c::checkFlag(getTabletItemIdForIndex(i))) { - tabletCount++; + count++; } } - if (tabletCount != 0) { + if (count != 0) { setAnm(PAUSE_DISP_00_ANIM_HAVE_TABLET, 1.0f); - setAnm(PAUSE_DISP_00_ANIM_TABLETS, tabletCount - 1.0f); + setAnm(PAUSE_DISP_00_ANIM_TABLETS, count - 1.0f); mpBoundings[PAUSE_DISP_00_BOUNDING_TABLETS]->SetVisible(true); } else { setAnm(PAUSE_DISP_00_ANIM_HAVE_TABLET, 0.0f); } - s32 triforceCount = 0; + count = 0; for (int i = 0; i < 3; i++) { if (dAcItem_c::checkFlag(getTriforceItemIdForIndex(i))) { - triforceCount++; + count++; setAnm(sTriforceHaveBoundings[i], 1.0f); } else { setAnm(sTriforceHaveBoundings[i], 0.0f); } } - if (triforceCount != 0) { + if (count != 0) { mpBoundings[PAUSE_DISP_00_BOUNDING_TABLETS]->SetVisible(true); mAnm[PAUSE_DISP_00_ANIM_TABLETS].setFrame(3.0f); setAnm(PAUSE_DISP_00_ANIM_HAVE_FORCE_BG, 1.0f); @@ -1390,89 +1542,53 @@ void dLytPauseDisp00_c::setupStoneOfTrials() { } } -// A matrix controlling navigation with the Nunchuk stick. -// The row index is the currently selected target, and the row contains -// the list of targets, one entry per stick direction (starting up and going clockwise) -// -// If someone was really bored they could probably replace all of these -// with constants... -static const u8 sNavTable1[][8] = { - { 0, 2, 2, 6, 5, 5, 33, 0}, - { 0, 3, 3, 7, 6, 5, 1, 1}, - { 0, 4, 4, 8, 7, 6, 2, 2}, - { 0, 13, 13, 17, 8, 7, 3, 3}, - { 1, 2, 6, 10, 9, 33, 33, 1}, - { 2, 3, 7, 11, 10, 9, 5, 1}, - { 3, 4, 8, 12, 11, 10, 6, 2}, - { 4, 13, 17, 21, 12, 11, 7, 3}, - { 5, 6, 10, 30, 29, 29, 33, 33}, - { 6, 7, 11, 31, 30, 29, 9, 5}, - { 7, 8, 12, 32, 31, 30, 10, 6}, - { 8, 17, 21, 25, 32, 31, 11, 7}, - { 0, 14, 14, 18, 17, 8, 4, 4}, - { 0, 15, 15, 19, 18, 17, 13, 13}, - { 0, 16, 16, 20, 19, 18, 14, 14}, - { 0, 0, 34, 20, 20, 19, 15, 15}, - {13, 14, 18, 22, 21, 12, 8, 4}, - {14, 15, 19, 23, 22, 21, 17, 13}, - {15, 16, 20, 24, 23, 22, 18, 14}, - {16, 16, 34, 34, 24, 23, 19, 15}, - {17, 18, 22, 26, 25, 32, 12, 8}, - {18, 19, 23, 27, 26, 25, 21, 17}, - {19, 20, 24, 28, 27, 26, 22, 18}, - {20, 34, 34, 28, 28, 27, 23, 19}, - {21, 22, 26, 26, 0, 32, 32, 12}, - {22, 23, 27, 27, 0, 25, 25, 21}, - {23, 24, 28, 28, 0, 26, 26, 22}, - {24, 24, 34, 0, 0, 27, 27, 23}, - { 9, 10, 30, 30, 0, 0, 33, 9}, - {10, 11, 31, 31, 0, 29, 29, 9}, - {11, 12, 32, 32, 0, 30, 30, 10}, - {12, 21, 25, 25, 0, 31, 31, 11}, - { 1, 1, 5, 9, 9, 0, 0, 0}, - {16, 0, 0, 0, 24, 24, 20, 16}, -}; - -static const u8 sNavTable2[][8] = { - { 0, 2, 2, 6, 5, 5, 33, 0}, - { 0, 3, 3, 7, 6, 5, 1, 1}, - { 0, 4, 4, 8, 7, 6, 2, 2}, - { 0, 13, 13, 17, 8, 7, 3, 3}, - { 1, 2, 6, 10, 9, 33, 33, 1}, - { 2, 3, 7, 11, 10, 9, 5, 1}, - { 3, 4, 8, 12, 11, 10, 6, 2}, - { 4, 13, 17, 21, 12, 11, 7, 3}, - { 5, 6, 10, 30, 29, 29, 33, 33}, - { 6, 7, 11, 31, 30, 29, 9, 5}, - { 7, 8, 12, 32, 31, 30, 10, 6}, - { 8, 17, 21, 25, 32, 31, 11, 7}, - { 0, 14, 14, 18, 17, 8, 4, 4}, - { 0, 15, 15, 19, 18, 17, 13, 13}, - { 0, 16, 16, 20, 19, 18, 14, 14}, - { 0, 0, 34, 20, 20, 19, 15, 15}, - {13, 14, 18, 22, 21, 12, 8, 4}, - {14, 15, 19, 23, 22, 21, 17, 13}, - {15, 16, 20, 24, 23, 22, 18, 14}, - {16, 16, 34, 34, 24, 23, 19, 15}, - {17, 18, 22, 26, 25, 32, 12, 8}, - {18, 19, 23, 27, 26, 25, 21, 17}, - {19, 20, 24, 28, 27, 26, 22, 18}, - {20, 34, 34, 28, 28, 27, 23, 19}, - {21, 22, 26, 26, 0, 32, 32, 12}, - {22, 23, 27, 27, 0, 25, 25, 21}, - {23, 24, 28, 28, 0, 26, 26, 22}, - {24, 24, 34, 0, 0, 27, 27, 23}, - { 9, 10, 30, 30, 0, 0, 33, 9}, - {10, 11, 31, 31, 0, 29, 29, 9}, - {11, 12, 32, 32, 0, 30, 30, 10}, - {12, 21, 25, 25, 0, 31, 31, 11}, - { 1, 1, 5, 9, 9, 0, 0, 0}, - {16, 0, 0, 0, 24, 24, 20, 16}, -}; +void dLytPauseDisp00_c::setupRingIcons(s32 tab) { + switch (tab) { + case 1: { + s32 offset = PAUSE_DISP_00_BOUNDING_RING_OFFSET; + for (int i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { + bool visible = false; + if (getPouchItemForSlot(i, true) != LYT_CMN_PouchPotionHealthPlusPlusHalf) { + visible = true; + } + mpBoundings[offset]->SetVisible(visible); + offset++; + } + break; + } + case 2: { + s32 offset = PAUSE_DISP_00_BOUNDING_RING_OFFSET; + for (int i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { + bool visible = false; + if (hasDowsingInIndex(i)) { + visible = true; + } + mpBoundings[offset]->SetVisible(visible); + offset++; + } + break; + } + case 0: + default: { + s32 offset = PAUSE_DISP_00_BOUNDING_RING_OFFSET; + for (int i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { + bool visible = false; + if (getItemLevelForBWheelIndex(i) != 0) { + visible = true; + } + mpBoundings[offset]->SetVisible(visible); + offset++; + } + break; + } + } +} s32 dLytPauseDisp00_c::updateSelection() { dLytControlGame_c *lytControl = dLytControlGame_c::getInstance(); dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); + d2d::AnmGroup_c *pAnm; + if (!pause->isStateWait()) { pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); return 0; @@ -1578,7 +1694,7 @@ s32 dLytPauseDisp00_c::updateSelection() { default: { s32 idx = navTargetToBounding(target) - PAUSE_DISP_00_BOUNDING_RING_OFFSET; if (lytControl->getPauseDisp00Tab() == 1) { - id = getPouchItemForSlot(idx, true); + id = getPouchItemIdForIndex(idx, true); if (id == ITEM_NONE) { id = ITEM_POUCH_EXPANSION; } @@ -1614,24 +1730,9 @@ s32 dLytPauseDisp00_c::updateSelection() { selectionType = dLytPauseMgr_c::SELECT_FIRE; break; } - case PAUSE_DISP_00_BOUNDING_TABLETS: - case PAUSE_DISP_00_BOUNDING_HEART: - case PAUSE_DISP_00_BOUNDING_POUCH: - case PAUSE_DISP_00_BOUNDING_PARACHUTE: - case PAUSE_DISP_00_BOUNDING_MITTS: - case PAUSE_DISP_00_BOUNDING_SCALE: - case PAUSE_DISP_00_BOUNDING_RING: - case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 0: - case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 1: - case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 2: - case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 3: - case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 4: - case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 5: - case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 6: - case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 7: - case PAUSE_DISP_00_BOUNDING_HARP: - case PAUSE_DISP_00_BOUNDING_SWORD: - case PAUSE_DISP_00_BOUNDING_SHIREN: { + // yes + case INT_MIN ... PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET - 1: + case PAUSE_DISP_00_BOUNDING_SHIREN: { id = getPointedItemSpecial(paneIdx, &locked); selectionType = dLytPauseMgr_c::SELECT_ITEM; break; @@ -1648,83 +1749,73 @@ s32 dLytPauseDisp00_c::updateSelection() { } } } - - // TODO derive numbers from defines - { - d2d::AnmGroup_c *pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_TABLET]; - for (int i = 0; i < 15; i++) { - s32 anim = PAUSE_DISP_00_ANIM_ONOFF_TABLET + i; - if (target != 0 && navTargetToBounding(target) == i && - mpBoundings[navTargetToBounding(target)]->IsVisible()) { - pAnm->play(); - } else { - playBackwards(*pAnm); - } - if (anim == 62) { - d2d::AnmGroup_c *museAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_MI_TO_TANE]; - if (target != 0 && navTargetToBounding(target) == i) { - museAnm->play(); - } else { - playBackwards(*museAnm); - } - } - pAnm++; + pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_TABLET]; + for (int 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(); + } else { + playBackwards(*pAnm); } - } - { - d2d::AnmGroup_c *pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_HARP]; - for (int i = 15; i < 21; i++) { + if (anim == PAUSE_DISP_00_ANIM_ONOFF_MUSE_OFFSET + 6) { + d2d::AnmGroup_c *museAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_MI_TO_TANE]; if (target != 0 && navTargetToBounding(target) == i) { - pAnm->play(); + museAnm->play(); } else { - playBackwards(*pAnm); + playBackwards(*museAnm); } - pAnm++; } + pAnm++; } - { - d2d::AnmGroup_c *pAnm; - - pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_SWORD]; - if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_SWORD) { + pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_HARP]; + for (int i = PAUSE_DISP_00_BOUNDING_HARP; i < PAUSE_DISP_00_BOUNDING_SHIREN + 1; i++) { + if (target != 0 && navTargetToBounding(target) == i) { pAnm->play(); } else { playBackwards(*pAnm); } + pAnm++; + } - pAnm = &mAnm[PAUSE_DISP_00_ANIM_UI_TYPE_BTN]; - if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_UI_TYPE) { - pause->setField_0x083C(true); - pAnm->play(); - } else { - playBackwards(*pAnm); - } + pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_SWORD]; + if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_SWORD) { + pAnm->play(); + } else { + playBackwards(*pAnm); + } - pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_CALIB_BTN]; - if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_CALIB_BTN_0) { - pause->setField_0x083D(true); - pAnm->play(); - } else { - playBackwards(*pAnm); - } + pAnm = &mAnm[PAUSE_DISP_00_ANIM_UI_TYPE_BTN]; + if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_UI_TYPE) { + pause->setField_0x083C(true); + pAnm->play(); + } else { + playBackwards(*pAnm); + } - pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_TRIFORCE]; - if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_TABLETS && - mpBoundings[PAUSE_DISP_00_BOUNDING_TABLETS]->IsVisible()) { - pAnm->play(); - } else { - playBackwards(*pAnm); - } + pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_CALIB_BTN]; + if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_CALIB_BTN_0) { + pause->setField_0x083D(true); + pAnm->play(); + } else { + playBackwards(*pAnm); + } - pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_SHIREN]; - if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_SHIREN) { - pAnm->play(); - } else { - playBackwards(*pAnm); - } + pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_TRIFORCE]; + if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_TABLETS && + mpBoundings[PAUSE_DISP_00_BOUNDING_TABLETS]->IsVisible()) { + pAnm->play(); + } else { + playBackwards(*pAnm); + } + + pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_SHIREN]; + if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_SHIREN) { + pAnm->play(); + } else { + playBackwards(*pAnm); } s32 tab = lytControl->getPauseDisp00Tab(); @@ -1732,25 +1823,25 @@ s32 dLytPauseDisp00_c::updateSelection() { tab == 2 ? PAUSE_DISP_00_ANIM_ONOFF_DOWSING_OFFSET : PAUSE_DISP_00_ANIM_ONOFF_ITEM_OFFSET; - d2d::AnmGroup_c *anm = &mAnm[anmIdx]; + pAnm = &mAnm[anmIdx]; for (int 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 = anm->getFrame(); - if (anm->getAnimDuration() - 1.0f > frame) { - anm->setFrame(frame + 1.0f); + f32 frame = pAnm->getFrame(); + if (pAnm->getAnimDuration() - 1.0f > frame) { + pAnm->setFrame(frame + 1.0f); } } else { - f32 frame = anm->getFrame(); + f32 frame = pAnm->getFrame(); if (frame) { frame -= 1.0f; if (frame <= 0.0f) { frame = 0.0f; } - anm->setFrame(frame); + pAnm->setFrame(frame); } } - anm++; + pAnm++; } s32 tab1 = lytControl->getPauseDisp00Tab(); @@ -1836,48 +1927,21 @@ s32 dLytPauseDisp00_c::updateSelection() { soundMgr->playSound(SE_S_MENU_P1_POINT_TOGGLE); break; } - case PAUSE_DISP_00_BOUNDING_TABLETS: - case PAUSE_DISP_00_BOUNDING_HEART: - case PAUSE_DISP_00_BOUNDING_POUCH: - case PAUSE_DISP_00_BOUNDING_PARACHUTE: - case PAUSE_DISP_00_BOUNDING_MITTS: - case PAUSE_DISP_00_BOUNDING_SCALE: - case PAUSE_DISP_00_BOUNDING_RING: - case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 0: - case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 1: - case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 2: - case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 3: - case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 4: - case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 5: - case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 6: - case PAUSE_DISP_00_BOUNDING_MUSE_07: - case PAUSE_DISP_00_BOUNDING_HARP: - case PAUSE_DISP_00_BOUNDING_SWORD: - case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 0: - case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 1: - case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 2: - case PAUSE_DISP_00_BOUNDING_SHIREN: - case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 0: - case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 1: - case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 2: - case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 3: - case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 4: - case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 5: - case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 6: - case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 7: { + // yes + case INT_MIN ... PAUSE_DISP_00_BOUNDING_UI_TYPE - 1: { soundMgr->playSound(SE_S_MENU_P1_POINT_ITEM); break; } } if (rumble == true) { - dRumble_c::start(dRumble_c::sRumblePreset0, 1); + dRumble_c::start(dRumble_c::sRumblePreset1, 1); } } mPrevNavTarget = target; if (target != 0 && navTargetToBounding(target) != PAUSE_DISP_00_BOUNDING_CALIB_BTN_3 && - !dPadNav::isPrevPointerVisible() && !mpBoundings[navTargetToBounding(target)]->IsVisible()) { + !dPadNav::isPointerVisible() && !mpBoundings[navTargetToBounding(target)]->IsVisible()) { target = 0; } @@ -1904,6 +1968,28 @@ s32 dLytPauseDisp00_c::getPointerPane() const { return idx; } +bool dLytPauseDisp00_c::isPointingAtRingIcon() { + if (!mLyt.findPane("N_text_00")->IsVisible()) { + return false; + } + + bool ret = false; + nw4r::lyt::Size sz = mLyt.findPane("N_ringIcon_00")->GetSize(); + f32 radiusSq = sz.width * 0.5f; + radiusSq *= radiusSq; + mVec2_c csPos = dCsBase_c::GetInstance()->getCursorIf()->getCursorPos(); + nw4r::math::MTX34 mtx = mLyt.findPane("N_ringIcon_00")->GetGlobalMtx(); + nw4r::math::VEC3 v(0.0f, 0.0f, 0.0f); + MTXMultVec(mtx, v, v); + // TODO I hate vectors + mVec2_c pos(v.x, v.y); + if (pos.squareDistanceTo(csPos) < radiusSq) { + ret = true; + } + + return ret; +} + void dLytPauseDisp00_c::hideItemIcons() { for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) { mIcons[i].setOff(); @@ -1911,6 +1997,98 @@ void dLytPauseDisp00_c::hideItemIcons() { } } +u16 dLytPauseDisp00_c::getPointedItemSpecial(s32 paneIdx, bool *pLocked) { + u16 id = 0; + switch (paneIdx) { + case PAUSE_DISP_00_BOUNDING_TABLETS: { + s32 count = 0; + for (int i = 0; i < 3; i++) { + if (dAcItem_c::checkFlag(getTabletItemIdForIndex(i))) { + count++; + } + } + if (count != 0) { + count--; + } + id = getTabletItemIdForIndex(count); + count = 0; + for (int i = 0; i < 3; i++) { + if (dAcItem_c::checkFlag(getTriforceItemIdForIndex(i))) { + count++; + } + } + if (count != 0) { + id = getTriforceItemIdForIndex(count - 1); + } + break; + } + case PAUSE_DISP_00_BOUNDING_HEART: { + id = getCurrentHeartPieceItemId(); + break; + } + case PAUSE_DISP_00_BOUNDING_POUCH: { + id = getCurrentWalletItemId(); + break; + } + case PAUSE_DISP_00_BOUNDING_PARACHUTE: { + id = getCurrentSailclothItemId(); + break; + } + case PAUSE_DISP_00_BOUNDING_MITTS: { + id = getCurrentMittsItemId(); + if (isMittsRestricted() == true) { + *pLocked = true; + } + break; + } + case PAUSE_DISP_00_BOUNDING_SCALE: { + id = getCurrentWaterDragonScaleItemId(); + if (isWaterDragonScaleRestricted()) { + *pLocked = true; + } + break; + } + case PAUSE_DISP_00_BOUNDING_RING: { + id = getCurrentEarringsItemId(); + break; + } + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET ... PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 7: { + s32 song = paneIdx - PAUSE_DISP_00_BOUNDING_MUSE_OFFSET; + if (paneIdx == PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 6) { + if (StoryflagManager::sInstance->getFlag(462)) { + id = getSongItemIdForIndex(song); + } else if (dAcItem_c::checkFlag(ITEM_LIFE_TREE_FRUIT)) { + id = ITEM_LIFE_TREE_FRUIT; + } else if (dAcItem_c::checkFlag(ITEM_LIFE_TREE_SEED)) { + id = ITEM_LIFE_TREE_SEED; + } + } else { + id = getSongItemIdForIndex(song); + } + } break; + case PAUSE_DISP_00_BOUNDING_HARP: { + id = getCurrentGoddessHarpItemId(); + if (isHarpRestrictedBokoBase()) { + *pLocked = true; + } + break; + } + case PAUSE_DISP_00_BOUNDING_SWORD: { + id = getCurrentSwordItemId(); + if (isSwordRestrictedBokoBase()) { + *pLocked = true; + } + break; + } + case PAUSE_DISP_00_BOUNDING_SHIREN: { + id = ITEM_STONE_OF_TRIALS; + break; + } + } + + return id; +} + void dLytPauseDisp00_c::executeCall() { if (mCallTimerMaybe == 1) { d2d::AnmGroup_c &anm = mAnm[PAUSE_DISP_00_ANIM_CALL]; From e08d120f0bd0e5df3d3c173130d485dcdddb22d4 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 9 Aug 2025 18:04:48 +0200 Subject: [PATCH 10/14] small cleanup --- include/d/lyt/d_lyt_pause_disp_00.h | 8 -------- src/d/lyt/d_lyt_pause_disp_00.cpp | 16 ++++++++++------ 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/include/d/lyt/d_lyt_pause_disp_00.h b/include/d/lyt/d_lyt_pause_disp_00.h index 38a07923..aa77d651 100644 --- a/include/d/lyt/d_lyt_pause_disp_00.h +++ b/include/d/lyt/d_lyt_pause_disp_00.h @@ -36,14 +36,6 @@ public: STATE_FUNC_DECLARE(dLytPauseDisp00_c, Out); private: - static s32 navTargetToBounding(s32 target) { - return target - 1; - } - - static s32 boundingToNavTarget(s32 target) { - return target + 1; - } - void setAnm(int idx, f32 value); void stopAnm(int idx); void playBackwards(d2d::AnmGroup_c &anm); diff --git a/src/d/lyt/d_lyt_pause_disp_00.cpp b/src/d/lyt/d_lyt_pause_disp_00.cpp index c2ab10bf..153cb74b 100644 --- a/src/d/lyt/d_lyt_pause_disp_00.cpp +++ b/src/d/lyt/d_lyt_pause_disp_00.cpp @@ -329,6 +329,9 @@ static const d2d::LytBrlanMapping brlanMap[] = { #define PAUSE_DISP_00_NUM_SUBPANES 24 +#define navTargetToBounding(n) (s32)(n - 1) +#define boundingToNavTarget(n) (s32)(n + 1) + // clang-format off static const u8 iconVariants[] = { // Wheel @@ -1621,8 +1624,7 @@ s32 dLytPauseDisp00_c::updateSelection() { } if (mCurrentNavTarget != 0) { - s32 paneIdx = navTargetToBounding(mCurrentNavTarget); - dCsBase_c::GetInstance()->setCursorStickTargetPane(mpBoundings[paneIdx]); + dCsBase_c::GetInstance()->setCursorStickTargetPane(mpBoundings[navTargetToBounding(mCurrentNavTarget)]); } target = mCurrentNavTarget; @@ -1666,8 +1668,7 @@ s32 dLytPauseDisp00_c::updateSelection() { } anyTab: { pause->setCurrentSelectionTab(tab); - s32 bounding = navTargetToBounding(target); - if (mpBoundings[bounding]->IsVisible()) { + if (mpBoundings[navTargetToBounding(target)]->IsVisible()) { pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, tab, false); } else { pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); @@ -1739,8 +1740,7 @@ s32 dLytPauseDisp00_c::updateSelection() { } } if (!dPadNav::isPrevPointerVisible()) { - s32 bounding = navTargetToBounding(target); - if (!mpBoundings[bounding]->IsVisible()) { + if (!mpBoundings[navTargetToBounding(target)]->IsVisible()) { selectionType = dLytPauseMgr_c::SELECT_NONE; id = 0; } @@ -1750,6 +1750,10 @@ 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++) { s32 anim = PAUSE_DISP_00_ANIM_ONOFF_TABLET + i; From de8cc996c6e8cdf4ba117ac0b9f4d87d7cb02dfb Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 10 Aug 2025 02:47:49 +0200 Subject: [PATCH 11/14] 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(); From 9eeb9c1238b286357d41a7c158a82e5168a18e36 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 10 Aug 2025 14:39:27 +0200 Subject: [PATCH 12/14] d_lyt_pause OK --- config/SOUE01/symbols.txt | 192 +++++++++++----- configure.py | 2 +- include/d/d_pad_nav.h | 12 + include/d/lyt/d_lyt_common_arrow.h | 28 ++- include/d/lyt/d_lyt_control_game.h | 23 +- include/d/lyt/d_lyt_pause.h | 49 +++- include/d/lyt/d_lyt_pause_back.h | 6 +- include/d/lyt/d_lyt_pause_disp_00.h | 12 +- include/d/lyt/d_lyt_pause_disp_01.h | 12 +- include/d/lyt/d_lyt_pause_info.h | 6 +- include/d/lyt/d_lyt_pause_text.h | 6 +- src/d/lyt/d_lyt_common_arrow.cpp | 62 +++--- src/d/lyt/d_lyt_common_title.cpp | 2 +- src/d/lyt/d_lyt_pause.cpp | 331 +++++++++++++++++++++------- src/d/lyt/d_lyt_pause_back.cpp | 8 +- src/d/lyt/d_lyt_pause_disp_00.cpp | 111 +++++----- src/d/lyt/d_lyt_pause_disp_01.cpp | 44 ++-- src/d/lyt/d_lyt_pause_info.cpp | 19 +- src/d/lyt/d_lyt_pause_text.cpp | 8 +- 19 files changed, 632 insertions(+), 301 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 4b9f11bb..02776db9 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -9218,7 +9218,7 @@ fn_80168760__17dLytCommonArrow_cFv = .text:0x80168760; // type:function size:0x2 displayElement__17dLytCommonArrow_cFlf = .text:0x80168790; // type:function size:0x68 unbindAt__17dLytCommonArrow_cFl = .text:0x80168800; // type:function size:0x10 tickDown__17dLytCommonArrow_cFPQ23d2d10AnmGroup_c = .text:0x80168810; // type:function size:0x64 -fn_80168880__17dLytCommonArrow_cFv = .text:0x80168880; // type:function size:0xC4 +checkPointAtPane__17dLytCommonArrow_cFv = .text:0x80168880; // type:function size:0xC4 initializeState_None__17dLytCommonArrow_cFv = .text:0x80168950; // type:function size:0x74 executeState_None__17dLytCommonArrow_cFv = .text:0x801689D0; // type:function size:0x28 finalizeState_None__17dLytCommonArrow_cFv = .text:0x80168A00; // type:function size:0x14 @@ -14802,19 +14802,19 @@ fn_8027E950 = .text:0x8027E950; // type:function size:0x30 fn_8027E980 = .text:0x8027E980; // type:function size:0x30 fn_8027E9B0 = .text:0x8027E9B0; // type:function size:0x30 __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 +__dt__54sFStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c>Fv = .text:0x8027EAA0; // type:function size:0xA4 scope:weak +__dt__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8027EB50; // type:function size:0xA0 scope:weak +__dt__31sFStateFct_c<15dLytPauseMain_c>Fv = .text:0x8027EBF0; // type:function size:0x6C scope:weak +__dt__28sFState_c<15dLytPauseMain_c>Fv = .text:0x8027EC60; // type:function size:0x58 scope:weak 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 +changeState__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8027EDF0; // type:function size:0x10 scope:weak 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 +executeState__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8027F010; // type:function size:0x10 scope:weak 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 +loadBgTextureUnused__15dLytPauseMain_cFv = .text:0x8027F0D0; // type:function size:0x4 +loadBgTexture__15dLytPauseMain_cFv = .text:0x8027F0E0; // type:function size:0x14 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 @@ -14848,18 +14848,18 @@ executeState_Out__15dLytPauseMain_cFv = .text:0x8027FB40; // type:function size: 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__15dLytPauseMain_cFv = .text:0x8027FD90; // type:function size:0xB4 scope:weak +__dt__27sFState_c<14dLytPauseMgr_c>Fv = .text:0x8027FE50; // type:function size:0x58 scope:weak +__dt__30sFStateFct_c<14dLytPauseMgr_c>Fv = .text:0x8027FEB0; // type:function size:0x6C scope:weak +__dt__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8027FF20; // type:function size:0xA0 scope:weak +__dt__53sFStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c>Fv = .text:0x8027FFC0; // type:function size:0xA4 scope:weak __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 +changeState__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x80280260; // type:function size:0x10 scope:weak 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 +executeState__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80280370; // type:function size:0x10 scope:weak +getStateID__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80280380; // type:function size:0x10 scope:weak 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 @@ -14885,17 +14885,17 @@ finalizeState_GetDemo__14dLytPauseMgr_cFv = .text:0x80280DA0; // type:function s 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 +inRequest__14dLytPauseMgr_cFv = .text:0x80280E20; // type:function size:0x10 isStateWait__14dLytPauseMgr_cCFv = .text:0x80280E30; // type:function size:0x44 -fn_80280E80 = .text:0x80280E80; // type:function size:0xB0 -fn_80280F30 = .text:0x80280F30; // type:function size:0x9C +preDrawStage__14dLytPauseMgr_cFv = .text:0x80280E80; // type:function size:0xB0 +postDrawStage__14dLytPauseMgr_cFv = .text:0x80280F30; // type:function size:0x9C getArrowBounding__14dLytPauseMgr_cCFi = .text:0x80280FD0; // type:function size:0x14 -setSelectedArrowBounding__14dLytPauseMgr_cCFi = .text:0x80280FF0; // type:function size:0xC +setSelectedArrowBounding__14dLytPauseMgr_cFi = .text:0x80280FF0; // type:function size:0xC setSelection__14dLytPauseMgr_cFQ214dLytPauseMgr_c15SelectionType_eUsb = .text:0x80281000; // type:function size:0x3C 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 +checkChangeDisp__14dLytPauseMgr_cFv = .text:0x80281220; // type:function size:0x134 +changeSavedDisp__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 @@ -16846,7 +16846,7 @@ openCollectionScreenDemo__17dLytControlGame_cFv = .text:0x802D02C0; // type:func fn_802D0360 = .text:0x802D0360; // type:function size:0xA0 fn_802D0400 = .text:0x802D0400; // type:function size:0xC fn_802D0410 = .text:0x802D0410; // type:function size:0xD4 -fn_802D04F0 = .text:0x802D04F0; // type:function size:0x10 +fn_802D04F0__17dLytControlGame_cFv = .text:0x802D04F0; // type:function size:0x10 fn_802D0500 = .text:0x802D0500; // type:function size:0x9C fn_802D05A0 = .text:0x802D05A0; // type:function size:0x148 fn_802D06F0 = .text:0x802D06F0; // type:function size:0xC @@ -36218,20 +36218,85 @@ g_profile_NPC_STR = .data:0x80537010; // type:object size:0x10 AcNpcStr__vtable = .data:0x80537020; // type:object size:0x288 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 +...data.0 = .data:0x80537310; // type:label scope:local +@39544 = .data:0x8053731C; // type:object size:0xA scope:local data:string +@39546 = .data:0x80537328; // type:object size:0x9 scope:local data:string __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 +__vt__53sFStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c> = .data:0x80537388; // type:object size:0x30 scope:weak +__vt__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x805373B8; // type:object size:0x30 scope:weak +__vt__30sFStateFct_c<14dLytPauseMgr_c> = .data:0x805373E8; // type:object size:0x14 scope:weak +__vt__27sFState_c<14dLytPauseMgr_c> = .data:0x80537400; // type:object size:0x18 scope:weak +__vt__15dLytPauseMain_c = .data:0x80537418; // type:object size:0xC scope:weak +__vt__54sFStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c> = .data:0x80537428; // type:object size:0x30 scope:weak +__vt__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80537458; // type:object size:0x30 scope:weak +__vt__31sFStateFct_c<15dLytPauseMain_c> = .data:0x80537488; // type:object size:0x14 scope:weak +__vt__28sFState_c<15dLytPauseMain_c> = .data:0x805374A0; // type:object size:0x18 scope:weak +@39698 = .data:0x805374CC; // type:object size:0xC scope:local +@39699 = .data:0x805374D8; // type:object size:0xC scope:local +@39700 = .data:0x805374E4; // type:object size:0xC scope:local +@39701 = .data:0x805374F0; // type:object size:0xC scope:local +@39702 = .data:0x805374FC; // type:object size:0xC scope:local +@39703 = .data:0x80537508; // type:object size:0xC scope:local +@39704 = .data:0x80537514; // type:object size:0xC scope:local +@39705 = .data:0x80537520; // type:object size:0xC scope:local +@39706 = .data:0x8053752C; // type:object size:0xC scope:local +@39707 = .data:0x80537538; // type:object size:0xC scope:local +@39708 = .data:0x80537544; // type:object size:0xC scope:local +@39709 = .data:0x80537550; // type:object size:0xC scope:local +@39710 = .data:0x8053755C; // type:object size:0xC scope:local +@39711 = .data:0x80537568; // type:object size:0xC scope:local +@39712 = .data:0x80537574; // type:object size:0xC scope:local +@39713 = .data:0x80537580; // type:object size:0xC scope:local +@39714 = .data:0x8053758C; // type:object size:0xC scope:local +@39715 = .data:0x80537598; // type:object size:0xC scope:local +@39716 = .data:0x805375A4; // type:object size:0xC scope:local +@39717 = .data:0x805375B0; // type:object size:0xC scope:local +@39718 = .data:0x805375BC; // type:object size:0xC scope:local +@39719 = .data:0x805375C8; // type:object size:0xC scope:local +@39720 = .data:0x805375D4; // type:object size:0xC scope:local +@39721 = .data:0x805375E0; // type:object size:0xC scope:local +@39722 = .data:0x805375EC; // type:object size:0xC scope:local +@39723 = .data:0x805375F8; // type:object size:0xC scope:local +@39724 = .data:0x80537604; // type:object size:0xC scope:local +@39725 = .data:0x80537610; // type:object size:0xC scope:local +@39726 = .data:0x8053761C; // type:object size:0xC scope:local +@39727 = .data:0x80537628; // type:object size:0xC scope:local +@39728 = .data:0x80537634; // type:object size:0xC scope:local +@39729 = .data:0x80537640; // type:object size:0xC scope:local +@39730 = .data:0x8053764C; // type:object size:0xC scope:local +@39731 = .data:0x80537658; // type:object size:0xC scope:local +@39732 = .data:0x80537664; // type:object size:0xC scope:local +@39733 = .data:0x80537670; // type:object size:0xC scope:local +@39734 = .data:0x8053767C; // type:object size:0xC scope:local +@39735 = .data:0x80537688; // type:object size:0xC scope:local +@39736 = .data:0x80537694; // type:object size:0xC scope:local +@39737 = .data:0x805376A0; // type:object size:0xC scope:local +@39738 = .data:0x805376AC; // type:object size:0xC scope:local +@39739 = .data:0x805376B8; // type:object size:0xC scope:local +@39740 = .data:0x805376C4; // type:object size:0xC scope:local +@39741 = .data:0x805376D0; // type:object size:0xC scope:local +@39742 = .data:0x805376DC; // type:object size:0xC scope:local +@39743 = .data:0x805376E8; // type:object size:0xC scope:local +@39744 = .data:0x805376F4; // type:object size:0xC scope:local +@39745 = .data:0x80537700; // type:object size:0xC scope:local +@39747 = .data:0x8053770C; // type:object size:0x1E scope:local data:string +@39748 = .data:0x8053772C; // type:object size:0x1C scope:local data:string +@39749 = .data:0x80537748; // type:object size:0x1E scope:local data:string +@39750 = .data:0x80537768; // type:object size:0x20 scope:local data:string +@39751 = .data:0x80537788; // type:object size:0x20 scope:local data:string +@39752 = .data:0x805377A8; // type:object size:0x1E scope:local data:string +@39753 = .data:0x805377C8; // type:object size:0x21 scope:local data:string +@39754 = .data:0x805377EC; // type:object size:0x1D scope:local data:string +@39755 = .data:0x8053780C; // type:object size:0x1D scope:local data:string +@39756 = .data:0x8053782C; // type:object size:0x1B scope:local data:string +@39757 = .data:0x80537848; // type:object size:0x1D scope:local data:string +@39758 = .data:0x80537868; // type:object size:0x1F scope:local data:string +@39759 = .data:0x80537888; // type:object size:0x1F scope:local data:string +@39760 = .data:0x805378A8; // type:object size:0x1D scope:local data:string +@39761 = .data:0x805378C8; // type:object size:0x20 scope:local data:string +@39762 = .data:0x805378E8; // type:object size:0x1C scope:local data:string +__vt__29sFStateID_c<14dLytPauseMgr_c> = .data:0x80537904; // type:object size:0x34 scope:weak +__vt__30sFStateID_c<15dLytPauseMain_c> = .data:0x80537938; // type:object size:0x34 scope:weak lbl_80537970 = .data:0x80537970; // type:object size:0x1C lbl_8053798C = .data:0x8053798C; // type:object size:0x10 lbl_8053799C = .data:0x8053799C; // type:object size:0x18 @@ -40705,8 +40770,8 @@ lbl_80573B28 = .sdata:0x80573B28; // type:object size:0x8 data:string lbl_80573B30 = .sdata:0x80573B30; // type:object size:0x8 lbl_80573B38 = .sdata:0x80573B38; // type:object size:0x8 lbl_80573B40 = .sdata:0x80573B40; // type:object size:0x8 data:4byte -lbl_80573B48 = .sdata:0x80573B48; // type:object size:0x8 -lbl_80573B50 = .sdata:0x80573B50; // type:object size:0x8 +@39260 = .sdata:0x80573B48; // type:object size:0x6 scope:local data:string +@39545 = .sdata:0x80573B50; // type:object size:0x1 scope:local lbl_80573B58 = .sdata:0x80573B58; // type:object size:0x4 data:4byte lbl_80573B5C = .sdata:0x80573B5C; // type:object size:0x4 lbl_80573B60 = .sdata:0x80573B60; // type:object size:0x5 data:string @@ -42036,8 +42101,8 @@ sInstance__12dTgMassObj_c = .sbss:0x80575930; // type:object size:0x4 data:4byte lbl_80575934 = .sbss:0x80575934; // type:object size:0x4 data:4byte sDisp00ArrowRotation__14dLytPauseMgr_c = .sbss:0x80575938; // type:object size:0x4 align:4 data:float sDisp00ArrowLength__14dLytPauseMgr_c = .sbss:0x8057593C; // type:object size:0x4 align:4 data:float -sInstance__14dLytPauseMgr_c = .sbss:0x80575940; // type:object size:0x8 data:4byte -sInstance__17dLytGameOverMgr_c = .sbss:0x80575948; // type:object size:0x8 data:4byte +sInstance__14dLytPauseMgr_c = .sbss:0x80575940; // type:object size:0x4 data:4byte +sInstance__17dLytGameOverMgr_c = .sbss:0x80575948; // type:object size:0x4 data:4byte sInstance__13dLytSaveMgr_c = .sbss:0x80575950; // type:object size:0x8 data:4byte lbl_80575958 = .sbss:0x80575958; // type:object size:0x1 data:byte lbl_80575959 = .sbss:0x80575959; // type:object size:0x1 data:byte @@ -51811,18 +51876,39 @@ lbl_805B5840 = .bss:0x805B5840; // type:object size:0xC AcNpcTke__STATE_WAIT = .bss:0x805B584C; // type:object size:0x74 data:4byte lbl_805B58C0 = .bss:0x805B58C0; // type:object size:0xC AcNpcStr__STATE_WAIT = .bss:0x805B58CC; // type:object size:0x74 data:4byte -lbl_805B5940 = .bss:0x805B5940; // type:object size:0x10 -LytPauseMain__STATE_NONE = .bss:0x805B5950; // type:object size:0x40 data:4byte -LytPauseMain__STATE_IN = .bss:0x805B5990; // type:object size:0x40 data:4byte -LytPauseMain__STATE_WAIT = .bss:0x805B59D0; // type:object size:0x80 data:4byte -LytPauseMain__STATE_SELECT = .bss:0x805B5A50; // type:object size:0x80 data:4byte -LytPauseMain__STATE_GET_DEMO = .bss:0x805B5AD0; // type:object size:0x80 data:4byte -LytPauseMgr__STATE_NONE = .bss:0x805B5B50; // type:object size:0x40 data:4byte -LytPauseMgr__STATE_IN = .bss:0x805B5B90; // type:object size:0x40 data:4byte -LytPauseMgr__STATE_WAIT = .bss:0x805B5BD0; // type:object size:0x80 data:4byte -LytPauseMgr__STATE_SELECT = .bss:0x805B5C50; // type:object size:0x80 data:4byte -LytPauseMgr__STATE_GET_DEMO = .bss:0x805B5CD0; // type:object size:0x40 data:4byte -LytPauseMgr__STATE_OUT = .bss:0x805B5D10; // type:object size:0x30 data:4byte +@31850 = .bss:0x805B5940; // type:object size:0xC scope:local +...bss.0 = .bss:0x805B5940; // type:label scope:local +StateID_None__15dLytPauseMain_c = .bss:0x805B5950; // type:object size:0x30 data:4byte +@31854 = .bss:0x805B5980; // type:object size:0xC scope:local +StateID_In__15dLytPauseMain_c = .bss:0x805B5990; // type:object size:0x30 data:4byte +@31858 = .bss:0x805B59C0; // type:object size:0xC scope:local +StateID_Wait__15dLytPauseMain_c = .bss:0x805B59D0; // type:object size:0x30 data:4byte +@31862 = .bss:0x805B5A00; // type:object size:0xC scope:local +StateID_Change__15dLytPauseMain_c = .bss:0x805B5A10; // type:object size:0x30 scope:global +@31866 = .bss:0x805B5A40; // type:object size:0xC scope:local +StateID_Select__15dLytPauseMain_c = .bss:0x805B5A50; // type:object size:0x30 data:4byte +@31870 = .bss:0x805B5A80; // type:object size:0xC scope:local +StateID_Ring__15dLytPauseMain_c = .bss:0x805B5A90; // type:object size:0x30 scope:global +@31874 = .bss:0x805B5AC0; // type:object size:0xC scope:local +StateID_GetDemo__15dLytPauseMain_c = .bss:0x805B5AD0; // type:object size:0x30 data:4byte +@31878 = .bss:0x805B5B00; // type:object size:0xC scope:local +StateID_Out__15dLytPauseMain_c = .bss:0x805B5B10; // type:object size:0x30 scope:global +@31882 = .bss:0x805B5B40; // type:object size:0xC scope:local +StateID_None__14dLytPauseMgr_c = .bss:0x805B5B50; // type:object size:0x30 data:4byte +@31886 = .bss:0x805B5B80; // type:object size:0xC scope:local +StateID_In__14dLytPauseMgr_c = .bss:0x805B5B90; // type:object size:0x30 data:4byte +@31890 = .bss:0x805B5BC0; // type:object size:0xC scope:local +StateID_Wait__14dLytPauseMgr_c = .bss:0x805B5BD0; // type:object size:0x30 data:4byte +@31894 = .bss:0x805B5C00; // type:object size:0xC scope:local +StateID_Change__14dLytPauseMgr_c = .bss:0x805B5C10; // type:object size:0x30 scope:global +@31898 = .bss:0x805B5C40; // type:object size:0xC scope:local +StateID_Select__14dLytPauseMgr_c = .bss:0x805B5C50; // type:object size:0x30 data:4byte +@31902 = .bss:0x805B5C80; // type:object size:0xC scope:local +StateID_Ring__14dLytPauseMgr_c = .bss:0x805B5C90; // type:object size:0x30 scope:global +@31906 = .bss:0x805B5CC0; // type:object size:0xC scope:local +StateID_GetDemo__14dLytPauseMgr_c = .bss:0x805B5CD0; // type:object size:0x30 data:4byte +@31910 = .bss:0x805B5D00; // type:object size:0xC scope:local +StateID_Out__14dLytPauseMgr_c = .bss:0x805B5D10; // type:object size:0x30 data:4byte lbl_805B5D40 = .bss:0x805B5D40; // type:object size:0x10 LytGameOver__STATE_INIT = .bss:0x805B5D50; // type:object size:0x40 data:4byte LytGameOver__STATE_IN = .bss:0x805B5D90; // type:object size:0x40 data:4byte diff --git a/configure.py b/configure.py index bc7d98a3..566a8346 100644 --- a/configure.py +++ b/configure.py @@ -624,7 +624,7 @@ config.libs = [ Object(NonMatching, "toBeSorted/d_a_npc_inv.cpp"), Object(NonMatching, "toBeSorted/d_a_npc_tke.cpp"), Object(NonMatching, "toBeSorted/d_a_npc_str.cpp"), - Object(NonMatching, "d/lyt/d_lyt_pause.cpp"), + Object(Matching, "d/lyt/d_lyt_pause.cpp"), Object(NonMatching, "d/lyt/d_lyt_game_over.cpp"), Object(NonMatching, "d/lyt/d_lyt_save_mgr.cpp"), Object(NonMatching, "d/lyt/d_lyt_drop_line.cpp"), diff --git a/include/d/d_pad_nav.h b/include/d/d_pad_nav.h index 84b330f8..882ec64e 100644 --- a/include/d/d_pad_nav.h +++ b/include/d/d_pad_nav.h @@ -50,6 +50,18 @@ inline s32 getFSStickNavDirection() { return sFSStickNavDirection; } +inline bool isMplsNavLeftGesture() { + return sIsMplsNavLeftGesture; +} + +inline bool isMplsNavRightGesture() { + return sIsMplsNavRightGesture; +} + +inline bool isMplsNavGesture() { + return isMplsNavLeftGesture() || isMplsNavRightGesture(); +} + void init(); void calc(); void setNavEnabled(bool navEnabled, bool disableAutoReturnToPointerNav); diff --git a/include/d/lyt/d_lyt_common_arrow.h b/include/d/lyt/d_lyt_common_arrow.h index 58cc00a0..ccab07b9 100644 --- a/include/d/lyt/d_lyt_common_arrow.h +++ b/include/d/lyt/d_lyt_common_arrow.h @@ -14,6 +14,12 @@ public: dLytCommonArrow_c(); virtual ~dLytCommonArrow_c() {} + enum Arrow_e { + ARROW_LEFT = 0, + ARROW_RIGHT = 1, + ARROW_NONE = 2, + }; + bool build(); STATE_FUNC_DECLARE(dLytCommonArrow_c, None); @@ -30,20 +36,32 @@ public: bool requestOut(); void unk() { - field_0x6B8 = mTargetedBounding; + field_0x6B8 = mPointedAtArrow; + } + + s32 getField_0x6B8() const { + return field_0x6B8; + } + + nw4r::lyt::Bounding *getArrowBounding(s32 idx) const { + return mpBoundings[idx]; + } + + void setField_0x6B8(s32 v) { + field_0x6B8 = v; } void setBackwards(bool b) { mBackwards = b; } + bool fn_80168760(); private: void setTranslate(const Vec *); - bool fn_80168760(); void displayElement(s32, f32); void unbindAt(s32); void tickDown(d2d::AnmGroup_c *); - void fn_80168880(); + void checkPointAtPane(); /* 0x04 */ UI_STATE_MGR_DECLARE(dLytCommonArrow_c); /* 0x40 */ d2d::LytBase_c mLytBase; @@ -52,14 +70,14 @@ private: dCursorHitCheckLyt_c mCsHitCheck; /* 0x6A8 */ nw4r::lyt::Bounding *mpBoundings[2]; /* 0x6B0 */ s32 mType; - /* 0x6B4 */ s32 mTargetedBounding; + /* 0x6B4 */ s32 mPointedAtArrow; /* 0x6B8 */ s32 field_0x6B8; /* 0x6BC */ s32 field_0x6BC; /* 0x6C0 */ s32 field_0x6C0; /* 0x6C4 */ s32 mTimer; /* 0x6C8 */ bool mInRequested; /* 0x6C9 */ bool mOutRequested; - /* 0x6CA */ u8 field_0x6CA; + /* 0x6CA */ bool mIsChangingState; /* 0x6CB */ bool mVisible; /* 0x6CC */ bool mBackwards; }; diff --git a/include/d/lyt/d_lyt_control_game.h b/include/d/lyt/d_lyt_control_game.h index 8948f6a3..52098e3c 100644 --- a/include/d/lyt/d_lyt_control_game.h +++ b/include/d/lyt/d_lyt_control_game.h @@ -16,17 +16,18 @@ public: void somehowRelatedToEnteringLightPillars(s32, s32, s32); void fn_802CCD40(bool); + void fn_802D04F0(); static dLytControlGame_c *getInstance() { return sInstance; } - s32 getField_0x15C2C() const { - return field_0x15C2C; + s32 getCurrentPauseDisp() const { + return mCurrentPauseDisp; } - void setField_0x15C2C(s32 value) { - field_0x15C2C = value; + void setCurrentPauseDisp(s32 value) { + mCurrentPauseDisp = value; } void setPauseDisp00Tab(s32 tab) { @@ -45,12 +46,12 @@ public: return mItemCountForPauseDemo; } - bool getField_0x15C67() const { - return field_0x15C67; + bool isPauseDemo() const { + return mIsPauseDemo; } - bool getField_0x15C68() const { - return field_0x15C68; + u8 getPauseDemoDisp() const { + return mPauseDemoDisp; } STATE_FUNC_DECLARE(dLytControlGame_c, Normal); @@ -71,7 +72,7 @@ private: /* 0x00068 */ UI_STATE_MGR_DECLARE(dLytControlGame_c); /* 0x000A4 */ u8 _0x000A4[0x15C2C - 0x000A4]; - /* 0x15C2C */ s32 field_0x15C2C; + /* 0x15C2C */ s32 mCurrentPauseDisp; /* 0x15C30 */ s32 mPauseDisp00Tab; /* 0x15C34 */ u8 _0x15C34[0x15C60 - 0x15C34]; @@ -82,8 +83,8 @@ private: /* 0x15C64 */ u16 mItemCountForPauseDemo; /* 0x15C66 */ u8 field_0x15C66; - /* 0x15C67 */ bool field_0x15C67; - /* 0x15C68 */ bool field_0x15C68; + /* 0x15C67 */ bool mIsPauseDemo; + /* 0x15C68 */ u8 mPauseDemoDisp; static dLytControlGame_c *sInstance; }; diff --git a/include/d/lyt/d_lyt_pause.h b/include/d/lyt/d_lyt_pause.h index 0b69a363..033ee400 100644 --- a/include/d/lyt/d_lyt_pause.h +++ b/include/d/lyt/d_lyt_pause.h @@ -27,6 +27,9 @@ public: bool draw(); void drawDirectly(); + void loadBgTextureUnused(); + void loadBgTexture(); + void requestIn(); void requestOut(); void requestChange(); @@ -36,8 +39,12 @@ public: bool hasSelection() const; void updateTitle(); - bool getField_0x63() const { - return field_0x63; + bool isChangingState() const { + return mIsChangingState; + } + + dLytCommonArrow_c *getArrow() const { + return mpArrow; } private: @@ -62,7 +69,7 @@ private: /* 0x60 */ u8 mPartStateChangeFlags; /* 0x61 */ bool mInRequest; /* 0x62 */ bool mOutRequest; - /* 0x63 */ bool field_0x63; + /* 0x63 */ bool mIsChangingState; /* 0x64 */ bool mChangeRequest; /* 0x65 */ bool mSelectRequest; /* 0x66 */ bool mRingToggleRequest; @@ -73,6 +80,21 @@ public: dLytPauseMgr_c(); ~dLytPauseMgr_c(); + enum Disp_e { + DISP_00_INVENTORY = 0, + DISP_01_COLLECTION = 1, + + DISP_MAX, + }; + + enum Tab_e { + TAB_ITEM = 0, + TAB_POUCH = 1, + TAB_DOWSING = 2, + + TAB_MAX = 3, + }; + /* 0x08 */ virtual int create() override; /* 0x14 */ virtual int doDelete() override; /* 0x20 */ virtual int execute() override; @@ -95,8 +117,8 @@ public: return mpBgTexture; } - bool getField_0x0831() const { - return field_0x0831; + bool isNavLeft() const { + return mIsNavLeft; } bool getField_0x0832() const { @@ -184,18 +206,23 @@ public: } nw4r::lyt::Bounding *getArrowBounding(int idx) const; - void setSelectedArrowBounding(int idx) const; + void setSelectedArrowBounding(int idx); static void setSelectHand(f32 rotation, f32 length); + void preDrawStage(); + void postDrawStage(); + + void inRequest(); + static f32 sDisp00ArrowRotation; static f32 sDisp00ArrowLength; private: bool checkSelectRing(); - bool checkChangeGesture(); + bool checkChangeDisp(); bool checkRing(); - void saveDispFlag(); + void changeSavedDisp(); void saveTabFlag(); STATE_FUNC_DECLARE(dLytPauseMgr_c, None); @@ -219,12 +246,12 @@ private: /* 0x0818 */ SelectionType_e mCurrentSelectionType; /* 0x081C */ SelectionType_e mPrevSelectionType; /* 0x0820 */ s32 mCurrentDisp00Tab; - /* 0x0824 */ UNKWORD field_0x0824; - /* 0x0828 */ UNKWORD field_0x0828; + /* 0x0824 */ s32 mCurrentDisp00HeldRing; + /* 0x0828 */ s32 mSavedPauseDisp; /* 0x082C */ u16 mCurrentSelectionId; /* 0x082E */ u16 mPrevSelectionId; /* 0x0830 */ bool mInRequest; - /* 0x0831 */ bool field_0x0831; + /* 0x0831 */ bool mIsNavLeft; /* 0x0832 */ bool field_0x0832; /* 0x0833 */ u8 mCurrentSelectionTab; /* 0x0834 */ u8 mTimer; diff --git a/include/d/lyt/d_lyt_pause_back.h b/include/d/lyt/d_lyt_pause_back.h index 858dcc4e..fc556a73 100644 --- a/include/d/lyt/d_lyt_pause_back.h +++ b/include/d/lyt/d_lyt_pause_back.h @@ -19,8 +19,8 @@ public: void requestIn(); void requestOut(); - bool getField_0x156() const { - return field_0x156; + bool isChangingState() const { + return mIsChangingState; } private: @@ -39,7 +39,7 @@ private: /* 0x150 */ s32 mOutStep; /* 0x154 */ bool mInRequest; /* 0x155 */ bool mOutRequest; - /* 0x156 */ bool field_0x156; + /* 0x156 */ bool mIsChangingState; /* 0x157 */ bool mVisible; }; diff --git a/include/d/lyt/d_lyt_pause_disp_00.h b/include/d/lyt/d_lyt_pause_disp_00.h index 2ed2f451..d0892bb4 100644 --- a/include/d/lyt/d_lyt_pause_disp_00.h +++ b/include/d/lyt/d_lyt_pause_disp_00.h @@ -35,8 +35,12 @@ public: STATE_FUNC_DECLARE(dLytPauseDisp00_c, GetDemo); STATE_FUNC_DECLARE(dLytPauseDisp00_c, Out); - bool getField_0xE36E() const { - return field_0xE36E; + bool isChangingState() const { + return mIsChangingState; + } + + bool hasSelection() const { + return mHasSelection; } private: @@ -94,10 +98,10 @@ private: /* 0xE368 */ s32 mGetDemoTimer; /* 0xE36C */ bool mInRequest; /* 0xE36D */ bool mOutRequest; - /* 0xE36E */ bool field_0xE36E; + /* 0xE36E */ bool mIsChangingState; /* 0xE36F */ bool mIsVisible; /* 0xE370 */ bool mDoScrollAnim; - /* 0xE371 */ bool field_0xE371; + /* 0xE371 */ bool mHasSelection; /* 0xE372 */ bool mSelectToggleRequest; /* 0xE373 */ bool mSelectGuideRequest; /* 0xE374 */ bool mStopCallRequest; diff --git a/include/d/lyt/d_lyt_pause_disp_01.h b/include/d/lyt/d_lyt_pause_disp_01.h index 90567be4..c1c8fe49 100644 --- a/include/d/lyt/d_lyt_pause_disp_01.h +++ b/include/d/lyt/d_lyt_pause_disp_01.h @@ -31,8 +31,12 @@ public: STATE_FUNC_DECLARE(dLytPauseDisp01_c, GetDemo); STATE_FUNC_DECLARE(dLytPauseDisp01_c, Out); - bool getField_0x98CE() const { - return field_0x98CE; + bool isChangingState() const { + return mIsChangingState; + } + + bool hasSelection() const { + return mHasSelection; } private: @@ -74,10 +78,10 @@ private: /* 0x98C8 */ s32 mGetDemoTimer; /* 0x98CC */ bool mInRequest; /* 0x98CD */ bool mOutRequest; - /* 0x98CE */ bool field_0x98CE; + /* 0x98CE */ bool mIsChangingState; /* 0x98CF */ bool mIsVisible; /* 0x98D0 */ bool mDoScrollAnim; - /* 0x98D1 */ bool field_0x98D1; + /* 0x98D1 */ bool mHasSelection; /* 0x98D2 */ bool mSelectToggle; }; diff --git a/include/d/lyt/d_lyt_pause_info.h b/include/d/lyt/d_lyt_pause_info.h index 91cffbc0..eae38963 100644 --- a/include/d/lyt/d_lyt_pause_info.h +++ b/include/d/lyt/d_lyt_pause_info.h @@ -23,8 +23,8 @@ public: void setInputInOut(bool inOut); - bool getField_0x19A() const { - return field_0x19A; + bool isChangingState() const { + return mIsChangingState; } private: @@ -45,7 +45,7 @@ private: /* 0x194 */ s32 mStep; /* 0x198 */ bool mInRequest; /* 0x199 */ bool mOutRequest; - /* 0x19A */ bool field_0x19A; + /* 0x19A */ bool mIsChangingState; /* 0x19B */ bool field_0x19B; /* 0x19C */ bool mInputInOut; }; diff --git a/include/d/lyt/d_lyt_pause_text.h b/include/d/lyt/d_lyt_pause_text.h index 428fa8b8..83961c1e 100644 --- a/include/d/lyt/d_lyt_pause_text.h +++ b/include/d/lyt/d_lyt_pause_text.h @@ -25,8 +25,8 @@ public: void requestIn(); void requestOut(); - bool getField_0x6D7() const { - return field_0x6D7; + bool isChangingState() const { + return mIsChangingState; } private: @@ -54,7 +54,7 @@ private: /* 0x6D4 */ u8 mNumTextLines; /* 0x6D5 */ bool mInRequest; /* 0x6D6 */ bool mOutRequest; - /* 0x6D7 */ bool field_0x6D7; + /* 0x6D7 */ bool mIsChangingState; /* 0x6D8 */ bool field_0x6D8; }; diff --git a/src/d/lyt/d_lyt_common_arrow.cpp b/src/d/lyt/d_lyt_common_arrow.cpp index 138d8b97..8801b033 100644 --- a/src/d/lyt/d_lyt_common_arrow.cpp +++ b/src/d/lyt/d_lyt_common_arrow.cpp @@ -39,10 +39,6 @@ static const d2d::LytBrlanMapping brlanMap[] = { #define NUM_ANIMS 9 -#define PANE_BOUNDING_L 0 -#define PANE_BOUNDING_R 1 -#define PANE_BOUNDING_NONE 2 - dLytCommonArrow_c::dLytCommonArrow_c() : mStateMgr(*this, sStateID::null) {} bool dLytCommonArrow_c::build() { @@ -56,8 +52,8 @@ bool dLytCommonArrow_c::build() { } mCsHitCheck.init(mLytBase.getLayout()->GetRootPane(), 1, 0, 0); dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitCheck); - mpBoundings[PANE_BOUNDING_L] = mLytBase.findBounding("B_arrowL_00"); - mpBoundings[PANE_BOUNDING_R] = mLytBase.findBounding("B_arrowR_00"); + mpBoundings[ARROW_LEFT] = mLytBase.findBounding("B_arrowL_00"); + mpBoundings[ARROW_RIGHT] = mLytBase.findBounding("B_arrowR_00"); mStateMgr.changeState(StateID_None); setState(0); return true; @@ -123,7 +119,7 @@ bool dLytCommonArrow_c::requestOut() { } bool dLytCommonArrow_c::fn_80168760() { - if (field_0x6C0 == 2 && field_0x6B8 != 2) { + if (field_0x6C0 == ARROW_NONE && field_0x6B8 != ARROW_NONE) { field_0x6C0 = field_0x6B8; return true; } @@ -151,26 +147,26 @@ void dLytCommonArrow_c::tickDown(d2d::AnmGroup_c *ctrl) { } } -void dLytCommonArrow_c::fn_80168880() { +void dLytCommonArrow_c::checkPointAtPane() { int i = -1; if (!dPadNav::isPointerVisible()) { - mTargetedBounding = PANE_BOUNDING_NONE; + mPointedAtArrow = ARROW_NONE; return; } dCursorHitCheck_c *d = dCsBase_c::GetInstance()->getHitCheck(); if (d != nullptr && d->getType() == 'lyt ') { - if (static_cast(d)->getHitPane() == mpBoundings[PANE_BOUNDING_L]) { - i = 0; - } else if (static_cast(d)->getHitPane() == mpBoundings[PANE_BOUNDING_R]) { - i = 1; + if (static_cast(d)->getHitPane() == mpBoundings[ARROW_LEFT]) { + i = ARROW_LEFT; + } else if (static_cast(d)->getHitPane() == mpBoundings[ARROW_RIGHT]) { + i = ARROW_RIGHT; } } if (i >= 0) { - mTargetedBounding = i; + mPointedAtArrow = i; } else { - mTargetedBounding = PANE_BOUNDING_NONE; + mPointedAtArrow = ARROW_NONE; } } @@ -178,12 +174,12 @@ void dLytCommonArrow_c::initializeState_None() { mLytBase.unbindAnims(); mInRequested = false; mOutRequested = false; - field_0x6CA = 0; + mIsChangingState = false; mVisible = false; - mTargetedBounding = PANE_BOUNDING_NONE; - field_0x6B8 = 2; - field_0x6BC = 2; - field_0x6C0 = 2; + mPointedAtArrow = ARROW_NONE; + field_0x6B8 = ARROW_NONE; + field_0x6BC = ARROW_NONE; + field_0x6C0 = ARROW_NONE; mTimer = 0; displayElement(ANIM_IN, 0.0f); mBackwards = true; @@ -214,15 +210,15 @@ void dLytCommonArrow_c::executeState_In() { switch (mTimer) { case 0: { d2d::AnmGroup_c *s = &mAnmGroups[ANIM_IN]; - if (s->isEndReached() == 1) { + if (s->isEndReached() == true) { mTimer += 1; - field_0x6CA = 1; + mIsChangingState = true; } else { s->play(); } } break; case 1: - field_0x6CA = 0; + mIsChangingState = false; mStateMgr.changeState(StateID_Wait); break; } @@ -241,12 +237,12 @@ void dLytCommonArrow_c::executeState_Wait() { return; } - fn_80168880(); - if (field_0x6B8 == 0) { + checkPointAtPane(); + if (field_0x6B8 == ARROW_LEFT) { d2d::AnmGroup_c &g = mAnmGroups[ANIM_ONOFF_L]; g.play(); tickDown(&mAnmGroups[ANIM_ONOFF_R]); - } else if (field_0x6B8 == 1) { + } else if (field_0x6B8 == ARROW_RIGHT) { d2d::AnmGroup_c &g = mAnmGroups[ANIM_ONOFF_R]; g.play(); tickDown(&mAnmGroups[ANIM_ONOFF_L]); @@ -264,7 +260,7 @@ void dLytCommonArrow_c::executeState_Wait() { switch (mTimer) { case 0: - if (field_0x6C0 != 2) { + if (field_0x6C0 != ARROW_NONE) { displayElement(field_0x6C0 + ANIM_DECIDE_OFFSET, 0.0f); if (field_0x6C0 == 0) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_SELECT_TURN_PAGE_LEFT); @@ -278,20 +274,20 @@ void dLytCommonArrow_c::executeState_Wait() { d2d::AnmGroup_c &g = mAnmGroups[field_0x6C0 + ANIM_DECIDE_OFFSET]; if (g.isEndReached() == true) { mTimer++; - field_0x6CA = 1; + mIsChangingState = true; } g.play(); } break; case 2: unbindAt(field_0x6C0 + ANIM_DECIDE_OFFSET); mTimer = 0; - field_0x6CA = 0; - field_0x6C0 = 2; + mIsChangingState = false; + field_0x6C0 = ARROW_NONE; break; } - if (field_0x6BC != field_0x6B8 && field_0x6B8 != 2) { - if (field_0x6B8 == 0) { + if (field_0x6BC != field_0x6B8 && field_0x6B8 != ARROW_NONE) { + if (field_0x6B8 == ARROW_LEFT) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_POINT_TURN_PAGE_LEFT); } else { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_POINT_TURN_PAGE_RIGHT); @@ -311,7 +307,7 @@ void dLytCommonArrow_c::executeState_Out() { d2d::AnmGroup_c *s = &mAnmGroups[ANIM_OUT]; if (s->isEndReached() == true) { mTimer = 1; - field_0x6CA = 1; + mIsChangingState = 1; } s->play(); } break; diff --git a/src/d/lyt/d_lyt_common_title.cpp b/src/d/lyt/d_lyt_common_title.cpp index dd1453c0..7dddc626 100644 --- a/src/d/lyt/d_lyt_common_title.cpp +++ b/src/d/lyt/d_lyt_common_title.cpp @@ -156,7 +156,7 @@ void dLytCommonTitle_c::initializeState_None() { mTitle.empty(); mCaption.empty(); field_0x68F = 0; - if (dLytControlGame_c::getInstance()->getField_0x15C67()) { + if (dLytControlGame_c::getInstance()->isPauseDemo()) { mLyt.findPane("N_next_01")->SetVisible(false); } else { mLyt.findPane("N_next_01")->SetVisible(true); diff --git a/src/d/lyt/d_lyt_pause.cpp b/src/d/lyt/d_lyt_pause.cpp index 626c56cb..e139e48f 100644 --- a/src/d/lyt/d_lyt_pause.cpp +++ b/src/d/lyt/d_lyt_pause.cpp @@ -3,6 +3,8 @@ #include "common.h" #include "d/d_base.h" #include "d/d_cs_game.h" +#include "d/d_d2d.h" +#include "d/d_gfx.h" #include "d/d_heap.h" #include "d/d_pad.h" #include "d/d_pad_nav.h" @@ -22,6 +24,7 @@ #include "d/snd/d_snd_wzsound.h" #include "egg/gfx/eggTextureBuffer.h" #include "m/m_pad.h" +#include "m/m_video.h" #include "toBeSorted/arc_managers/layout_arc_manager.h" STATE_DEFINE(dLytPauseMain_c, None); @@ -42,6 +45,10 @@ STATE_DEFINE(dLytPauseMgr_c, Ring); STATE_DEFINE(dLytPauseMgr_c, GetDemo); STATE_DEFINE(dLytPauseMgr_c, Out); +f32 dLytPauseMgr_c::sDisp00ArrowRotation; +f32 dLytPauseMgr_c::sDisp00ArrowLength; +dLytPauseMgr_c *dLytPauseMgr_c::sInstance; + dLytPauseMain_c::dLytPauseMain_c() : mStateMgr(*this), mpPauseBack(nullptr), @@ -130,7 +137,7 @@ bool dLytPauseMain_c::draw() { if (mpDisp01 != nullptr) { mpDisp01->draw(); } - if (!dLytControlGame_c::getInstance()->getField_0x15C67()) { + if (!dLytControlGame_c::getInstance()->isPauseDemo()) { mpArrow->draw(); } mpPauseText->draw(); @@ -139,13 +146,23 @@ bool dLytPauseMain_c::draw() { } void dLytPauseMain_c::drawDirectly() { - if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + if (dLytControlGame_c::getInstance()->getCurrentPauseDisp() == dLytPauseMgr_c::DISP_00_INVENTORY) { mpDisp00->drawDirectly(); } else { mpDisp01->drawDirectly(); } } +void dLytPauseMain_c::loadBgTextureUnused() { + // no-op +} + +void dLytPauseMain_c::loadBgTexture() { + if (mpPauseBack != nullptr) { + mpPauseBack->loadBgTexture(); + } +} + void dLytPauseMain_c::requestIn() { mInRequest = true; } @@ -166,8 +183,22 @@ void dLytPauseMain_c::requestRingToggle() { mRingToggleRequest = true; } +bool dLytPauseMain_c::hasSelection() const { + if (dLytControlGame_c::getInstance()->getCurrentPauseDisp() != dLytPauseMgr_c::DISP_00_INVENTORY) { + return mpDisp01->hasSelection(); + } else { + return mpDisp00->hasSelection(); + } +} + +void dLytPauseMain_c::updateTitle() { + if (mpPauseInfo != nullptr) { + mpPauseInfo->updateTitle(); + } +} + void dLytPauseMain_c::initializeState_None() { - field_0x63 = false; + mIsChangingState = false; mInRequest = false; mOutRequest = false; mChangeRequest = false; @@ -181,7 +212,7 @@ void dLytPauseMain_c::executeState_None() { if (mInRequest == true) { mInRequest = false; mpPauseBack->requestIn(); - if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + if (dLytControlGame_c::getInstance()->getCurrentPauseDisp() == dLytPauseMgr_c::DISP_00_INVENTORY) { mpDisp00->requestIn(false); } else { mpDisp01->requestIn(false); @@ -202,26 +233,26 @@ void dLytPauseMain_c::executeState_In() { } mTimer++; - if (mpPauseBack->getField_0x156() == true) { + if (mpPauseBack->isChangingState() == true) { mPartStateChangeFlags |= 0x1; } - if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { - if (mpDisp00->getField_0xE36E() == true) { + if (dLytControlGame_c::getInstance()->getCurrentPauseDisp() == dLytPauseMgr_c::DISP_00_INVENTORY) { + if (mpDisp00->isChangingState() == true) { mPartStateChangeFlags |= 0x2; } } else { - if (mpDisp01->getField_0x98CE() == true) { + if (mpDisp01->isChangingState() == true) { mPartStateChangeFlags |= 0x2; } } - if (mpPauseInfo->getField_0x19A() == true) { + if (mpPauseInfo->isChangingState() == true) { mPartStateChangeFlags |= 0x4; } if (mPartStateChangeFlags == (0x1 | 0x2 | 0x4)) { - if (dLytControlGame_c::getInstance()->getField_0x15C67()) { + if (dLytControlGame_c::getInstance()->isPauseDemo()) { mStateMgr.changeState(StateID_GetDemo); } else { mStateMgr.changeState(StateID_Wait); @@ -235,14 +266,14 @@ void dLytPauseMain_c::finalizeState_In() { void dLytPauseMain_c::initializeState_Wait() { mStep = 0; mPartStateChangeFlags = 0; - field_0x63 = true; + mIsChangingState = true; } void dLytPauseMain_c::executeState_Wait() { - field_0x63 = false; + mIsChangingState = false; if (mOutRequest == true) { mOutRequest = false; mpPauseBack->requestOut(); - if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + if (dLytControlGame_c::getInstance()->getCurrentPauseDisp() == dLytPauseMgr_c::DISP_00_INVENTORY) { mpDisp00->requestOut(false); } else { mpDisp01->requestOut(false); @@ -266,7 +297,7 @@ void dLytPauseMain_c::finalizeState_Wait() {} void dLytPauseMain_c::initializeState_Change() { mStep = 0; - if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + if (dLytControlGame_c::getInstance()->getCurrentPauseDisp() == dLytPauseMgr_c::DISP_00_INVENTORY) { mpDisp01->requestIn(true); mpDisp00->requestOut(true); } else { @@ -280,12 +311,12 @@ void dLytPauseMain_c::executeState_Change() { } bool change = false; - if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { - if (mpDisp01->getField_0x98CE()) { + if (dLytControlGame_c::getInstance()->getCurrentPauseDisp() == dLytPauseMgr_c::DISP_00_INVENTORY) { + if (mpDisp01->isChangingState()) { change = true; } } else { - if (mpDisp00->getField_0xE36E()) { + if (mpDisp00->isChangingState()) { change = true; } } @@ -318,7 +349,7 @@ void dLytPauseMain_c::initializeState_Select() { } else { mpArrow->setBackwards(false); mpPauseInfo->setInputInOut(false); - if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + if (dLytControlGame_c::getInstance()->getCurrentPauseDisp() == dLytPauseMgr_c::DISP_00_INVENTORY) { mpDisp00->requestSelect(); dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_P1_SELECT_ITEM); } else { @@ -331,7 +362,7 @@ extern "C" void fn_80059F40(void *); void dLytPauseMain_c::executeState_Select() { switch (mStep) { case 0: { - if (mpPauseText->getField_0x6D7()) { + if (mpPauseText->isChangingState()) { mStep = 1; } break; @@ -344,8 +375,8 @@ void dLytPauseMain_c::executeState_Select() { break; } case 2: { - if (mpPauseText->getField_0x6D7()) { - if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + if (mpPauseText->isChangingState()) { + if (dLytControlGame_c::getInstance()->getCurrentPauseDisp() == dLytPauseMgr_c::DISP_00_INVENTORY) { mpDisp00->requestUnselect(); } else { mpDisp01->requestUnselect(); @@ -355,13 +386,13 @@ void dLytPauseMain_c::executeState_Select() { break; } case 10: { - if (mpDisp00->getField_0xE36E() == true) { + if (mpDisp00->isChangingState() == true) { mStateMgr.changeState(StateID_Wait); } break; } case 100: { - if (mpDisp00->getField_0xE36E() == true) { + if (mpDisp00->isChangingState() == true) { mStateMgr.changeState(StateID_Wait); u8 uiMode = dLytMeter_c::GetMain()->getUiMode() + 1; if (uiMode >= 3) { @@ -376,7 +407,7 @@ void dLytPauseMain_c::executeState_Select() { break; } case 300: { - if (mpDisp00->getField_0xE36E() == true) { + if (mpDisp00->isChangingState() == true) { mStep++; // TODO - dPadManager_c fn_80059F40(dPauseManager_c::GetInstance()); @@ -395,7 +426,7 @@ void dLytPauseMain_c::finalizeState_Select() { } void dLytPauseMain_c::initializeState_Ring() { - if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + if (dLytControlGame_c::getInstance()->getCurrentPauseDisp() == dLytPauseMgr_c::DISP_00_INVENTORY) { mpDisp00->requestRingToggle(); } } @@ -404,7 +435,7 @@ void dLytPauseMain_c::executeState_Ring() { mStateMgr.changeState(StateID_Select); } else if (mRingToggleRequest == true) { mRingToggleRequest = false; - if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + if (dLytControlGame_c::getInstance()->getCurrentPauseDisp() == dLytPauseMgr_c::DISP_00_INVENTORY) { mpDisp00->requestRingToggle(); } mStateMgr.changeState(StateID_Wait); @@ -413,16 +444,16 @@ void dLytPauseMain_c::executeState_Ring() { void dLytPauseMain_c::finalizeState_Ring() {} void dLytPauseMain_c::initializeState_GetDemo() { - field_0x63 = true; + mIsChangingState = true; } void dLytPauseMain_c::executeState_GetDemo() { - field_0x63 = false; - if (dLytControlGame_c::getInstance()->getField_0x15C68()) { - if (mpDisp01->getField_0x98CE() == true) { + mIsChangingState = false; + if (dLytControlGame_c::getInstance()->getPauseDemoDisp()) { + if (mpDisp01->isChangingState() == true) { mStateMgr.changeState(StateID_Wait); } } else { - if (mpDisp00->getField_0xE36E() == true) { + if (mpDisp00->isChangingState() == true) { mStateMgr.changeState(StateID_Wait); } } @@ -438,25 +469,25 @@ void dLytPauseMain_c::initializeState_Out() { void dLytPauseMain_c::executeState_Out() { switch (mStep) { case 0: { - if (mpPauseBack->getField_0x156() == true) { + if (mpPauseBack->isChangingState() == true) { mPartStateChangeFlags |= 0x1; } - if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { - if (mpDisp00->getField_0xE36E() == true) { + if (dLytControlGame_c::getInstance()->getCurrentPauseDisp() == dLytPauseMgr_c::DISP_00_INVENTORY) { + if (mpDisp00->isChangingState() == true) { mPartStateChangeFlags |= 0x2; } } else { - if (mpDisp01->getField_0x98CE() == true) { + if (mpDisp01->isChangingState() == true) { mPartStateChangeFlags |= 0x2; } } - if (mpPauseInfo->getField_0x19A() == true) { + if (mpPauseInfo->isChangingState() == true) { mPartStateChangeFlags |= 0x4; } if (mPartStateChangeFlags == (0x1 | 0x2 | 0x4)) { - field_0x63 = true; + mIsChangingState = true; mStep = 1; } break; @@ -532,14 +563,14 @@ void dLytPauseMgr_c::initializeState_None() { field_0x0836 = false; field_0x0837 = false; field_0x0838 = false; - field_0x0831 = false; + mIsNavLeft = false; field_0x0832 = false; field_0x083E = false; field_0x083F = false; field_0x0840 = false; - mCurrentDisp00Tab = 0; - field_0x0824 = 3; - mCurrentSelectionTab = 0; + mCurrentDisp00Tab = TAB_ITEM; + mCurrentDisp00HeldRing = TAB_MAX; + mCurrentSelectionTab = 0; // "-1 + 1" mCurrentSelectionIsRestricted = false; mTimer = 0; field_0x0835 = 0; @@ -553,9 +584,9 @@ void dLytPauseMgr_c::executeState_None() { 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()); + if (lytControl->isPauseDemo()) { + mSavedPauseDisp = lytControl->getCurrentPauseDisp(); + lytControl->setCurrentPauseDisp(lytControl->getPauseDemoDisp()); } else { StoryflagManager::sInstance->unsetFlag(571); } @@ -565,8 +596,8 @@ 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()) { + if (mMain.isChangingState() == true) { + if (dLytControlGame_c::getInstance()->isPauseDemo()) { mStateMgr.changeState(StateID_GetDemo); } else { mStateMgr.changeState(StateID_Wait); @@ -594,14 +625,16 @@ 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())) { + + if (dPad::getDownTrig1() || + (dLytControlGame_c::getInstance()->getCurrentPauseDisp() != dLytPauseMgr_c::DISP_00_INVENTORY && + dPad::getDownTrigB())) { dSndPlayerMgr_c::GetInstance()->leaveMenu(); mMain.requestOut(); (void)getLinkPtr(); // yes @@ -609,7 +642,7 @@ void dLytPauseMgr_c::executeState_Wait() { return; } - if (dLytControlGame_c::getInstance()->getField_0x15C2C() == 0) { + if (dLytControlGame_c::getInstance()->getCurrentPauseDisp() == dLytPauseMgr_c::DISP_00_INVENTORY) { bool b = false; if (!StoryflagManager::sInstance->getFlag(58)) { if (dPad::getDownTrigB()) { @@ -639,7 +672,7 @@ void dLytPauseMgr_c::executeState_Wait() { return; } - if (checkChangeGesture()) { + if (checkChangeDisp()) { mStateMgr.changeState(StateID_Change); return; } @@ -667,7 +700,6 @@ void dLytPauseMgr_c::executeState_Wait() { } else { field_0x0835 = 0; } - } void dLytPauseMgr_c::finalizeState_Wait() { dPadNav::setNavEnabled(false, false); @@ -676,7 +708,7 @@ void dLytPauseMgr_c::finalizeState_Wait() { void dLytPauseMgr_c::initializeState_Change() { mMain.requestChange(); mMain.updateTitle(); - if (field_0x0831) { + if (mIsNavLeft) { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_TURN_PAGE_RIGHT); } else { dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_TURN_PAGE_LEFT); @@ -687,8 +719,8 @@ void dLytPauseMgr_c::executeState_Change() { dCsGame_c::GetInstance()->setCursorTypePointer(); } - if (mMain.getField_0x63() == true) { - saveDispFlag(); + if (mMain.isChangingState() == true) { + changeSavedDisp(); mStateMgr.changeState(StateID_Wait); } } @@ -699,7 +731,7 @@ void dLytPauseMgr_c::initializeState_Select() { field_0x0838 = field_0x0837; } void dLytPauseMgr_c::executeState_Select() { - if (mMain.getField_0x63() == true) { + if (mMain.isChangingState() == true) { if (field_0x0838) { saveTabFlag(); field_0x0838 = false; @@ -708,13 +740,13 @@ void dLytPauseMgr_c::executeState_Select() { } else if (field_0x0838) { s32 tab = mCurrentDisp00Tab; bool buttonHeld = false; - if (dPad::getDownB() && tab == 0) { + if (dPad::getDownB() && tab == TAB_ITEM) { buttonHeld = true; } - if (dPad::getDownMinus() && tab == 1) { + if (dPad::getDownMinus() && tab == TAB_POUCH) { buttonHeld = true; } - if (dPad::getDownC() && tab == 2) { + if (dPad::getDownC() && tab == TAB_DOWSING) { buttonHeld = true; } @@ -729,12 +761,12 @@ 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; + if (controlGameTab == TAB_ITEM) { + mCurrentDisp00HeldRing = TAB_ITEM; + } else if (controlGameTab == TAB_POUCH) { + mCurrentDisp00HeldRing = TAB_POUCH; } else { - field_0x0824 = 2; + mCurrentDisp00HeldRing = TAB_DOWSING; } mMain.requestRingToggle(); } @@ -743,11 +775,11 @@ void dLytPauseMgr_c::executeState_Ring() { mPrevSelectionId = mCurrentSelectionId; mPrevSelectionType = mCurrentSelectionType; bool buttonHeld = false; - if (field_0x0824 == 0) { + if (mCurrentDisp00HeldRing == TAB_ITEM) { if (!dPad::getDownB()) { buttonHeld = true; } - } else if (field_0x0824 == 1) { + } else if (mCurrentDisp00HeldRing == TAB_POUCH) { if (!dPad::getDownMinus()) { buttonHeld = true; } @@ -772,7 +804,7 @@ void dLytPauseMgr_c::finalizeState_Ring() { void dLytPauseMgr_c::initializeState_GetDemo() {} void dLytPauseMgr_c::executeState_GetDemo() { - if (mMain.getField_0x63() == true) { + if (mMain.isChangingState() == true) { dSndPlayerMgr_c::GetInstance()->leaveMenu(); mMain.requestOut(); (void)getLinkPtr(); @@ -785,32 +817,183 @@ void dLytPauseMgr_c::initializeState_Out() { dCsGame_c::GetInstance()->offNextCursor(); } void dLytPauseMgr_c::executeState_Out() { - if (mMain.getField_0x63() == true) { + if (mMain.isChangingState() == 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); + if (dLytControlGame_c::getInstance()->isPauseDemo()) { + dLytControlGame_c::getInstance()->setCurrentPauseDisp(mSavedPauseDisp); } } +void dLytPauseMgr_c::inRequest() { + mInRequest = true; + field_0x0836 = 1; +} + bool dLytPauseMgr_c::isStateWait() const { return mStateMgr.getStateID()->isEqual(StateID_Wait); } +void dLytPauseMgr_c::preDrawStage() { + if (field_0x0839 == true) { + field_0x0839 = false; + d2d::defaultSet(); + if (mpTexture0x0810 != nullptr) { + mpTexture0x0810->free(); + mpTexture0x0810 = nullptr; + } + mMain.drawDirectly(); + mpTexture0x0810 = EGG::TextureBuffer::alloc( + mVideo::m_video->pRenderMode->fbWidth / 2, dGfx_c::getEFBHeight() / 2, GX_TF_RGBA8 + ); + mpTexture0x0810->capture(0, dGfx_c::getLetterboxAmount(), true, -1); + mMain.loadBgTextureUnused(); + } +} + +void dLytPauseMgr_c::postDrawStage() { + if (field_0x083A == true) { + field_0x083A = false; + d2d::defaultSet(); + if (dLytControlGame_c::getInstance() != nullptr) { + dLytControlGame_c::getInstance()->fn_802D04F0(); + } + mpBgTexture = EGG::TextureBuffer::alloc( + mVideo::m_video->pRenderMode->fbWidth / 2, dGfx_c::getEFBHeight() / 2, GX_TF_RGBA8 + ); + mpBgTexture->capture(0, dGfx_c::getLetterboxAmount(), true, -1); + mMain.loadBgTexture(); + } +} + +nw4r::lyt::Bounding *dLytPauseMgr_c::getArrowBounding(int idx) const { + return mMain.getArrow()->getArrowBounding(idx); +} + +void dLytPauseMgr_c::setSelectedArrowBounding(int idx) { + mMain.getArrow()->setField_0x6B8(idx); +} + +void dLytPauseMgr_c::setSelection(dLytPauseMgr_c::SelectionType_e type, u16 id, bool restricted) { + if (type != mPrevSelectionType || id != getCurrentSelectionId()) { + field_0x083B = true; + } else { + field_0x083B = false; + } + mCurrentSelectionType = type; + mCurrentSelectionId = id; + mCurrentSelectionIsRestricted = restricted; +} + +bool dLytPauseMgr_c::checkSelectRing() { + dLytControlGame_c *lytControl = dLytControlGame_c::getInstance(); + if (lytControl == nullptr) { + mCurrentDisp00Tab = TAB_ITEM; + return false; + } + + if (lytControl->getCurrentPauseDisp() != DISP_00_INVENTORY) { + return false; + } + + s32 tab = lytControl->getPauseDisp00Tab(); + + if (dPad::getDownTrigB()) { + mCurrentDisp00Tab = TAB_ITEM; + if (tab != TAB_ITEM && StoryflagManager::sInstance->getFlag(58)) { + return true; + } else { + return false; + } + } else if (dPad::getDownTrigMinus()) { + mCurrentDisp00Tab = TAB_POUCH; + if (tab != TAB_POUCH && StoryflagManager::sInstance->getFlag(30)) { + return true; + } else { + return false; + } + } else if (dPad::getDownTrigC()) { + mCurrentDisp00Tab = TAB_DOWSING; + if (tab != TAB_DOWSING && StoryflagManager::sInstance->getFlag(789)) { + return true; + } else { + return false; + } + } + + mCurrentDisp00Tab = mCurrentSelectionTab - 1; + return true; +} + bool dLytPauseMgr_c::build() { void *data; data = LayoutArcManager::GetInstance()->getLoadedData("MenuPause"); mResAcc1.attach(data, ""); data = LayoutArcManager::GetInstance()->getLoadedData("DoButton"); mResAcc2.attach(data, ""); - mMain.build(); + mMain.build(); return true; } +bool dLytPauseMgr_c::checkChangeDisp() { + bool nav = false; + if (dPadNav::isMplsNavGesture() == true) { + if (dPadNav::isMplsNavLeftGesture()) { + mIsNavLeft = true; + } else { + mIsNavLeft = false; + } + nav = true; + } + + if (dPad::getDownTrigLeft() | dPad::getDownTrigRight()) { + if (dPad::getDownTrigLeft()) { + mIsNavLeft = true; + } else { + mIsNavLeft = false; + } + nav = true; + } + s32 arrowPane = mMain.getArrow()->getField_0x6B8(); + if (arrowPane != dLytCommonArrow_c::ARROW_NONE && dPad::getDownTrigA() && mMain.getArrow()->fn_80168760()) { + if (arrowPane == dLytCommonArrow_c::ARROW_LEFT) { + mIsNavLeft = true; + } else { + mIsNavLeft = false; + } + + if (!dPadNav::isPointerVisible()) { + field_0x083E = true; + field_0x0832 = mIsNavLeft; + } else { + field_0x0840 = true; + } + nav = true; + } + return nav; +} + +void dLytPauseMgr_c::changeSavedDisp() { + dLytControlGame_c *lytControl = dLytControlGame_c::getInstance(); + if (lytControl == nullptr) { + return; + } + s32 disp = lytControl->getCurrentPauseDisp() + 1; + if (disp >= DISP_MAX) { + disp = 0; + } + lytControl->setCurrentPauseDisp(disp); + if (disp != 0) { + StoryflagManager::sInstance->setFlag(847); + } else { + StoryflagManager::sInstance->unsetFlag(847); + } +} + void dLytPauseMgr_c::saveTabFlag() { dLytControlGame_c::getInstance()->setPauseDisp00Tab(mCurrentDisp00Tab); StoryflagManager::sInstance->setFlagOrCounterToValue(846, mCurrentDisp00Tab); @@ -818,7 +1001,7 @@ void dLytPauseMgr_c::saveTabFlag() { bool dLytPauseMgr_c::checkRing() { dLytControlGame_c *lytControl = dLytControlGame_c::getInstance(); - if (lytControl->getField_0x15C2C() != 0) { + if (lytControl->getCurrentPauseDisp() != DISP_00_INVENTORY) { return false; } if (!StoryflagManager::sInstance->getFlag(30)) { @@ -828,7 +1011,7 @@ bool dLytPauseMgr_c::checkRing() { s32 tab = lytControl->getPauseDisp00Tab(); if (dPad::getDownB() && tab == 0) { - return true; + return true; } else if (dPad::getDownMinus() && tab == 1) { return true; } else if (dPad::getDownC() && tab == 2) { diff --git a/src/d/lyt/d_lyt_pause_back.cpp b/src/d/lyt/d_lyt_pause_back.cpp index c2070a61..5ac365df 100644 --- a/src/d/lyt/d_lyt_pause_back.cpp +++ b/src/d/lyt/d_lyt_pause_back.cpp @@ -68,7 +68,7 @@ void dLytPauseBack_c::requestOut() { void dLytPauseBack_c::initializeState_None() { mLyt.unbindAnims(); - field_0x156 = false; + mIsChangingState = false; mInRequest = false; mOutRequest = false; mVisible = false; @@ -103,10 +103,10 @@ void dLytPauseBack_c::executeState_In() { void dLytPauseBack_c::finalizeState_In() {} void dLytPauseBack_c::initializeState_Wait() { - field_0x156 = true; + mIsChangingState = true; } void dLytPauseBack_c::executeState_Wait() { - field_0x156 = false; + mIsChangingState = false; if (mOutRequest == true) { mOutRequest = false; mStateMgr.changeState(StateID_Out); @@ -125,7 +125,7 @@ void dLytPauseBack_c::executeState_Out() { case 0: { if (anm.isEndReached() == true) { mOutStep = 1; - field_0x156 = true; + mIsChangingState = true; } break; } diff --git a/src/d/lyt/d_lyt_pause_disp_00.cpp b/src/d/lyt/d_lyt_pause_disp_00.cpp index 124190c6..c4c43033 100644 --- a/src/d/lyt/d_lyt_pause_disp_00.cpp +++ b/src/d/lyt/d_lyt_pause_disp_00.cpp @@ -488,7 +488,7 @@ bool dLytPauseDisp00_c::remove() { bool dLytPauseDisp00_c::execute() { dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); - field_0xE371 = false; + mHasSelection = false; pause->setField_0x083C(false); pause->setField_0x083D(false); pause->setField_0x0837(false); @@ -567,11 +567,11 @@ void dLytPauseDisp00_c::initializeState_None() { mAnm[i].unbind(); } - field_0xE36E = false; + mIsChangingState = false; mInRequest = false; mOutRequest = false; mIsVisible = false; - field_0xE371 = false; + mHasSelection = false; mStopCallRequest = false; mCallTimerMaybe = 0; @@ -632,14 +632,14 @@ void dLytPauseDisp00_c::initializeState_In() { dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); setAnm(PAUSE_DISP_00_ANIM_IN, 0.0f); mAnm[PAUSE_DISP_00_ANIM_IN].setFrame(mAnm[PAUSE_DISP_00_ANIM_IN].getAnimDuration()); - if (pause->getField_0x0831()) { + if (pause->isNavLeft()) { setAnm(PAUSE_DISP_00_ANIM_SCROLL_L_IN, 0.0f); } else { setAnm(PAUSE_DISP_00_ANIM_SCROLL_R_IN, 0.0f); } if (pause->getField_0x0840()) { - if (pause->getField_0x0831()) { + if (pause->isNavLeft()) { mPrevNavTarget = PAUSE_DISP_00_BOUNDING_ARROW_LEFT + 1; } else { mPrevNavTarget = PAUSE_DISP_00_BOUNDING_ARROW_RIGHT + 1; @@ -692,13 +692,13 @@ void dLytPauseDisp00_c::executeState_In() { s32 anim = PAUSE_DISP_00_ANIM_IN; if (mDoScrollAnim == true) { dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); - anim = pause->getField_0x0831() ? PAUSE_DISP_00_ANIM_SCROLL_L_IN : PAUSE_DISP_00_ANIM_SCROLL_R_IN; + anim = pause->isNavLeft() ? PAUSE_DISP_00_ANIM_SCROLL_L_IN : PAUSE_DISP_00_ANIM_SCROLL_R_IN; } d2d::AnmGroup_c &anm = mAnm[anim]; if (anm.isEndReached() == true) { - if (dLytControlGame_c::getInstance()->getField_0x15C67()) { + if (dLytControlGame_c::getInstance()->isPauseDemo()) { mStateMgr.changeState(StateID_GetDemo); } else { mStateMgr.changeState(StateID_Wait); @@ -709,7 +709,7 @@ void dLytPauseDisp00_c::executeState_In() { } void dLytPauseDisp00_c::finalizeState_In() { dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); - if (pause->getField_0x0831()) { + if (pause->isNavLeft()) { stopAnm(PAUSE_DISP_00_ANIM_SCROLL_L_IN); } else { stopAnm(PAUSE_DISP_00_ANIM_SCROLL_R_IN); @@ -728,12 +728,12 @@ void dLytPauseDisp00_c::finalizeState_In() { void dLytPauseDisp00_c::initializeState_Wait() { mStep = 0; - field_0xE36E = true; + mIsChangingState = true; } void dLytPauseDisp00_c::executeState_Wait() { d2d::AnmGroup_c *anm; - if (field_0xE36E == true) { - field_0xE36E = false; + if (mIsChangingState == true) { + mIsChangingState = false; } switch (mStep) { case 0: { @@ -769,7 +769,7 @@ void dLytPauseDisp00_c::executeState_Wait() { setAnm(PAUSE_DISP_00_ANIM_DECIDE_CALIB_BTN, 0.0f); dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_P1_SELECT_MPLUS); } else if (updateSelection() != 0) { - field_0xE371 = true; + mHasSelection = true; } break; } @@ -779,7 +779,7 @@ void dLytPauseDisp00_c::executeState_Wait() { mStep = 0; mSelectGuideRequest = false; stopAnm(PAUSE_DISP_00_ANIM_DECIDE_UI_TYPE_BTN); - field_0xE36E = true; + mIsChangingState = true; } else { anm->play(); } @@ -791,7 +791,7 @@ void dLytPauseDisp00_c::executeState_Wait() { mStep = 0; mSelectMplsRequest = false; stopAnm(PAUSE_DISP_00_ANIM_DECIDE_CALIB_BTN); - field_0xE36E = true; + mIsChangingState = true; } else { anm->play(); } @@ -815,9 +815,9 @@ void dLytPauseDisp00_c::initializeState_Select() { // For a given tab index, what's the natural next tab index? static const s32 sNaturalTabOrder[] = { - 1, - 2, - 0, + /* TAB_ITEM -> */ dLytPauseMgr_c::TAB_POUCH, + /* TAB_POUCH -> */ dLytPauseMgr_c::TAB_DOWSING, + /* TAB_DOWSING -> */ dLytPauseMgr_c::TAB_ITEM, }; // For a given tab index, what's the change anim when changing to the natural next tab? @@ -830,7 +830,7 @@ void dLytPauseDisp00_c::initializeState_Select() { // 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[] = { @@ -852,7 +852,7 @@ void dLytPauseDisp00_c::initializeState_Select() { s32 oldTab = dLytControlGame_c::getInstance()->getPauseDisp00Tab(); if (sNaturalTabOrder[oldTab] == pause->getCurrentDisp00Tab()) { - // Natural + // Natural setAnm(sNaturalTabChangeAnim[oldTab], 0.0f); mReverseTabChangeAnim = false; } else { @@ -984,13 +984,13 @@ void dLytPauseDisp00_c::executeState_Ring() { s32 b = PAUSE_DISP_00_BOUNDING_RING_OFFSET + idx; if (mpBoundings[b]->IsVisible()) { s32 tab = dLytControlGame_c::getInstance()->getPauseDisp00Tab(); - if (tab == 1) { + if (tab == dLytPauseMgr_c::TAB_POUCH) { item = getPouchItemIdForIndex(idx, true); if (item == 0) { item = ITEM_POUCH_EXPANSION; } selectionType = dLytPauseMgr_c::SELECT_POUCH; - } else if (tab == 2) { + } else if (tab == dLytPauseMgr_c::TAB_DOWSING) { item = getDowsingItemIdForIndex(idx); selectionType = dLytPauseMgr_c::SELECT_DOWSING; } else { @@ -1000,7 +1000,7 @@ void dLytPauseDisp00_c::executeState_Ring() { pause->setSelection(selectionType, item, false); navTarget = idx + 1; mCurrentNavTarget = navTarget; - field_0xE371 = true; + mHasSelection = true; } else { idx = -1; pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); @@ -1015,9 +1015,9 @@ void dLytPauseDisp00_c::executeState_Ring() { mPrevNavTarget = navTarget; s32 tab = dLytControlGame_c::getInstance()->getPauseDisp00Tab(); - s32 anmIdx = tab == 1 ? PAUSE_DISP_00_ANIM_ONOFF_POUCH_OFFSET : - tab == 2 ? PAUSE_DISP_00_ANIM_ONOFF_DOWSING_OFFSET : - PAUSE_DISP_00_ANIM_ONOFF_ITEM_OFFSET; + s32 anmIdx = tab == dLytPauseMgr_c::TAB_POUCH ? PAUSE_DISP_00_ANIM_ONOFF_POUCH_OFFSET : + tab == dLytPauseMgr_c::TAB_DOWSING ? PAUSE_DISP_00_ANIM_ONOFF_DOWSING_OFFSET : + PAUSE_DISP_00_ANIM_ONOFF_ITEM_OFFSET; int i; d2d::AnmGroup_c *anm = &mAnm[anmIdx]; @@ -1038,14 +1038,14 @@ void dLytPauseDisp00_c::finalizeState_Ring() { } void dLytPauseDisp00_c::initializeState_GetDemo() { - field_0xE36E = true; + mIsChangingState = true; mStep = 0; mGetDemoTimer = 0; } void dLytPauseDisp00_c::executeState_GetDemo() { switch (mStep) { case 0: { - field_0xE36E = false; + mIsChangingState = false; if (mGetDemoTimer < 2) { mGetDemoTimer++; } else { @@ -1102,7 +1102,7 @@ void dLytPauseDisp00_c::finalizeState_GetDemo() {} void dLytPauseDisp00_c::initializeState_Out() { stopAnm(PAUSE_DISP_00_ANIM_IN); if (mDoScrollAnim == true) { - if (dLytPauseMgr_c::GetInstance()->getField_0x0831()) { + if (dLytPauseMgr_c::GetInstance()->isNavLeft()) { setAnm(PAUSE_DISP_00_ANIM_SCROLL_R_OUT, 0.0f); } else { setAnm(PAUSE_DISP_00_ANIM_SCROLL_L_OUT, 0.0f); @@ -1115,8 +1115,8 @@ void dLytPauseDisp00_c::initializeState_Out() { void dLytPauseDisp00_c::executeState_Out() { s32 anim = PAUSE_DISP_00_ANIM_OUT; if (mDoScrollAnim == true) { - anim = dLytPauseMgr_c::GetInstance()->getField_0x0831() ? PAUSE_DISP_00_ANIM_SCROLL_R_OUT : - PAUSE_DISP_00_ANIM_SCROLL_L_OUT; + anim = dLytPauseMgr_c::GetInstance()->isNavLeft() ? PAUSE_DISP_00_ANIM_SCROLL_R_OUT : + PAUSE_DISP_00_ANIM_SCROLL_L_OUT; } d2d::AnmGroup_c &anm = mAnm[anim]; @@ -1125,7 +1125,7 @@ void dLytPauseDisp00_c::executeState_Out() { case 0: { if (anm.isEndReached() == true) { mStep = 1; - field_0xE36E = true; + mIsChangingState = true; } break; } @@ -1342,7 +1342,7 @@ void dLytPauseDisp00_c::setupWallets() { // the Gear screen to show the demo (dLytControlGame_c::openCollectionScreenDemo), // so we don't have to check that an extra wallets are actually what cause the // demo. - if (dLytControlGame_c::getInstance()->getField_0x15C67()) { + if (dLytControlGame_c::getInstance()->isPauseDemo()) { walletCount--; if (walletCount == 0) { bVisible = false; @@ -1571,7 +1571,7 @@ void dLytPauseDisp00_c::setupStoneOfTrials() { void dLytPauseDisp00_c::setupRingIcons(s32 tab) { switch (tab) { - case 1: { + case dLytPauseMgr_c::TAB_POUCH: { s32 offset = PAUSE_DISP_00_BOUNDING_RING_OFFSET; for (int i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { bool visible = false; @@ -1583,7 +1583,7 @@ void dLytPauseDisp00_c::setupRingIcons(s32 tab) { } break; } - case 2: { + case dLytPauseMgr_c::TAB_DOWSING: { s32 offset = PAUSE_DISP_00_BOUNDING_RING_OFFSET; for (int i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { bool visible = false; @@ -1595,8 +1595,8 @@ void dLytPauseDisp00_c::setupRingIcons(s32 tab) { } break; } - case 0: - default: { + case dLytPauseMgr_c::TAB_ITEM: + default: { s32 offset = PAUSE_DISP_00_BOUNDING_RING_OFFSET; for (int i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { bool visible = false; @@ -1659,7 +1659,6 @@ s32 dLytPauseDisp00_c::updateSelection() { pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); } else { u8 tab; - // TODO mode IDs switch (navTargetToBounding(target)) { case PAUSE_DISP_00_BOUNDING_CALIB_BTN_3: pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, 5, false); @@ -1680,15 +1679,15 @@ s32 dLytPauseDisp00_c::updateSelection() { pause->setSelectedArrowBounding(navTargetToBounding(target - PAUSE_DISP_00_BOUNDING_ARROW_OFFSET)); break; case PAUSE_DISP_00_BOUNDING_LEFT_TAB: { - tab = 3; + tab = dLytPauseMgr_c::TAB_DOWSING + 1; goto anyTab; } case PAUSE_DISP_00_BOUNDING_CENTER_TAB: { - tab = 2; + tab = dLytPauseMgr_c::TAB_POUCH + 1; goto anyTab; } case PAUSE_DISP_00_BOUNDING_RIGHT_TAB: { - tab = 1; + tab = dLytPauseMgr_c::TAB_ITEM + 1; goto anyTab; } anyTab: { @@ -1706,7 +1705,7 @@ s32 dLytPauseDisp00_c::updateSelection() { u8 pauseTab = pause->getCurrentSelectionTab() - 1; if (pauseTab != lytControl->getPauseDisp00Tab() && mpBoundings[sTabLookup[pauseTab]]->IsVisible()) { pause->setField_0x0837(true); - field_0xE371 = true; + mHasSelection = true; } break; } @@ -1719,7 +1718,7 @@ s32 dLytPauseDisp00_c::updateSelection() { switch (paneIdx) { default: { s32 idx = navTargetToBounding(target) - PAUSE_DISP_00_BOUNDING_RING_OFFSET; - if (lytControl->getPauseDisp00Tab() == 1) { + if (lytControl->getPauseDisp00Tab() == dLytPauseMgr_c::TAB_POUCH) { id = getPouchItemIdForIndex(idx, true); if (id == ITEM_NONE) { id = ITEM_POUCH_EXPANSION; @@ -1728,7 +1727,7 @@ s32 dLytPauseDisp00_c::updateSelection() { if (isPouchBocoburinLocked()) { locked = true; } - } else if (lytControl->getPauseDisp00Tab() == 2) { + } else if (lytControl->getPauseDisp00Tab() == dLytPauseMgr_c::TAB_DOWSING) { id = getDowsingItemIdForIndex(idx); selectionType = dLytPauseMgr_c::SELECT_DOWSING; } else { @@ -1847,9 +1846,9 @@ s32 dLytPauseDisp00_c::updateSelection() { } s32 tab = lytControl->getPauseDisp00Tab(); - s32 anmIdx = tab == 1 ? PAUSE_DISP_00_ANIM_ONOFF_POUCH_OFFSET : - tab == 2 ? PAUSE_DISP_00_ANIM_ONOFF_DOWSING_OFFSET : - PAUSE_DISP_00_ANIM_ONOFF_ITEM_OFFSET; + s32 anmIdx = tab == dLytPauseMgr_c::TAB_POUCH ? PAUSE_DISP_00_ANIM_ONOFF_POUCH_OFFSET : + tab == dLytPauseMgr_c::TAB_DOWSING ? PAUSE_DISP_00_ANIM_ONOFF_DOWSING_OFFSET : + PAUSE_DISP_00_ANIM_ONOFF_ITEM_OFFSET; pAnm = &mAnm[anmIdx]; for (i = PAUSE_DISP_00_BOUNDING_RING_OFFSET; @@ -1896,11 +1895,11 @@ s32 dLytPauseDisp00_c::updateSelection() { } if (target == 0 && isPointingAtRingIcon() == true) { - u16 tab = 1; - if (lytControl->getPauseDisp00Tab() == 1) { - tab = 2; - } else if (lytControl->getPauseDisp00Tab() == 2) { - tab = 3; + u16 tab = dLytPauseMgr_c::TAB_ITEM + 1; + if (lytControl->getPauseDisp00Tab() == dLytPauseMgr_c::TAB_POUCH) { + tab = dLytPauseMgr_c::TAB_POUCH + 1; + } else if (lytControl->getPauseDisp00Tab() == dLytPauseMgr_c::TAB_DOWSING) { + tab = dLytPauseMgr_c::TAB_DOWSING + 1; } pause->setSelection(dLytPauseMgr_c::SELECT_RING, tab, false); } @@ -1923,7 +1922,7 @@ s32 dLytPauseDisp00_c::updateSelection() { if (cM::isZero(mAnm[PAUSE_DISP_00_ANIM_OFF_LEFT_TAB].getFrame())) { soundMgr->playSound(SE_S_MENU_P1_POINT_C); } - if (tab2 == 2) { + if (tab2 == dLytPauseMgr_c::TAB_DOWSING) { rumble = false; } } @@ -1934,7 +1933,7 @@ s32 dLytPauseDisp00_c::updateSelection() { if (cM::isZero(mAnm[PAUSE_DISP_00_ANIM_OFF_CENTER_TAB].getFrame())) { soundMgr->playSound(SE_S_MENU_P1_POINT_MINUS); } - if (tab2 == 1) { + if (tab2 == dLytPauseMgr_c::TAB_POUCH) { rumble = false; } } @@ -1945,7 +1944,7 @@ s32 dLytPauseDisp00_c::updateSelection() { if (cM::isZero(mAnm[PAUSE_DISP_00_ANIM_OFF_RIGHT_TAB].getFrame())) { soundMgr->playSound(SE_S_MENU_P1_POINT_B); } - if (tab2 == 0) { + if (tab2 == dLytPauseMgr_c::TAB_ITEM) { rumble = false; } } @@ -2152,9 +2151,9 @@ void dLytPauseDisp00_c::loadRingText(u32 cmd) { if (cmd == RING_TEXT_CURRENT_TAB) { tab = dLytPauseMgr_c::GetInstance()->getCurrentDisp00Tab(); } - if (tab == 1) { + if (tab == dLytPauseMgr_c::TAB_POUCH) { msgIdx = 2; - } else if (tab == 2) { + } else if (tab == dLytPauseMgr_c::TAB_DOWSING) { msgIdx = 3; } // "Items"/"Pouch"/"Dowsing" diff --git a/src/d/lyt/d_lyt_pause_disp_01.cpp b/src/d/lyt/d_lyt_pause_disp_01.cpp index 0b253a73..84a3b2bf 100644 --- a/src/d/lyt/d_lyt_pause_disp_01.cpp +++ b/src/d/lyt/d_lyt_pause_disp_01.cpp @@ -169,7 +169,7 @@ bool dLytPauseDisp01_c::remove() { } bool dLytPauseDisp01_c::execute() { - field_0x98D1 = false; + mHasSelection = false; mStateMgr.executeState(); for (int i = 0; i < PAUSE_DISP_01_NUM_SUBPANES; i++) { mSubpanes[i].mpLytPane->execute(); @@ -218,11 +218,11 @@ void dLytPauseDisp01_c::initializeState_None() { mAnm[i].unbind(); } - field_0x98CE = false; + mIsChangingState = false; mInRequest = false; mOutRequest = false; mIsVisible = false; - field_0x98D1 = false; + mHasSelection = false; mStep = 0; mPrevNavTarget = 0; mCurrentNavTarget = 0; @@ -259,14 +259,14 @@ void dLytPauseDisp01_c::initializeState_In() { if (mDoScrollAnim == true) { setAnm(PAUSE_DISP_01_ANIM_IN, 0.0f); mAnm[PAUSE_DISP_01_ANIM_IN].setFrame(mAnm[PAUSE_DISP_01_ANIM_IN].getAnimDuration()); - if (pause->getField_0x0831()) { + if (pause->isNavLeft()) { setAnm(PAUSE_DISP_01_ANIM_SCROLL_L_IN, 0.0f); } else { setAnm(PAUSE_DISP_01_ANIM_SCROLL_R_IN, 0.0f); } if (pause->getField_0x0840()) { - if (pause->getField_0x0831()) { + if (pause->isNavLeft()) { mPrevNavTarget = PAUSE_DISP_01_OFFSET_MY_PANES + PAUSE_DISP_01_PANE_LEFT + 1; } else { mPrevNavTarget = PAUSE_DISP_01_OFFSET_MY_PANES + PAUSE_DISP_01_PANE_RIGHT + 1; @@ -283,13 +283,13 @@ void dLytPauseDisp01_c::executeState_In() { s32 anim = PAUSE_DISP_01_ANIM_IN; if (mDoScrollAnim == true) { - anim = pause->getField_0x0831() ? PAUSE_DISP_01_ANIM_SCROLL_L_IN : PAUSE_DISP_01_ANIM_SCROLL_R_IN; + anim = pause->isNavLeft() ? PAUSE_DISP_01_ANIM_SCROLL_L_IN : PAUSE_DISP_01_ANIM_SCROLL_R_IN; } d2d::AnmGroup_c &anm = mAnm[anim]; if (anm.isEndReached() == true) { - if (dLytControlGame_c::getInstance()->getField_0x15C67()) { + if (dLytControlGame_c::getInstance()->isPauseDemo()) { mStateMgr.changeState(StateID_GetDemo); } else { mStateMgr.changeState(StateID_Wait); @@ -300,7 +300,7 @@ void dLytPauseDisp01_c::executeState_In() { } void dLytPauseDisp01_c::finalizeState_In() { dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); - if (pause->getField_0x0831()) { + if (pause->isNavLeft()) { stopAnm(PAUSE_DISP_01_ANIM_SCROLL_L_IN); } else { stopAnm(PAUSE_DISP_01_ANIM_SCROLL_R_IN); @@ -318,11 +318,11 @@ void dLytPauseDisp01_c::finalizeState_In() { } void dLytPauseDisp01_c::initializeState_Wait() { - field_0x98CE = true; + mIsChangingState = true; showInsectsAndMaterials(); } void dLytPauseDisp01_c::executeState_Wait() { - field_0x98CE = false; + mIsChangingState = false; if (mOutRequest == true) { mOutRequest = false; hideInsectsAndMaterials(); @@ -341,7 +341,7 @@ void dLytPauseDisp01_c::executeState_Wait() { } } else if (updateSelection() != 0) { - field_0x98D1 = true; + mHasSelection = true; } } void dLytPauseDisp01_c::finalizeState_Wait() {} @@ -359,14 +359,14 @@ void dLytPauseDisp01_c::finalizeState_Select() { } void dLytPauseDisp01_c::initializeState_GetDemo() { - field_0x98CE = true; + mIsChangingState = true; mStep = 0; mGetDemoTimer = 0; } void dLytPauseDisp01_c::executeState_GetDemo() { switch (mStep) { case 0: { - field_0x98CE = false; + mIsChangingState = false; if (mGetDemoTimer < 2) { mGetDemoTimer++; } else { @@ -515,7 +515,7 @@ void dLytPauseDisp01_c::finalizeState_GetDemo() {} void dLytPauseDisp01_c::initializeState_Out() { stopAnm(PAUSE_DISP_01_ANIM_IN); if (mDoScrollAnim == true) { - if (dLytPauseMgr_c::GetInstance()->getField_0x0831()) { + if (dLytPauseMgr_c::GetInstance()->isNavLeft()) { setAnm(PAUSE_DISP_01_ANIM_SCROLL_R_OUT, 0.0f); } else { setAnm(PAUSE_DISP_01_ANIM_SCROLL_L_OUT, 0.0f); @@ -528,8 +528,8 @@ void dLytPauseDisp01_c::initializeState_Out() { void dLytPauseDisp01_c::executeState_Out() { s32 anim = PAUSE_DISP_01_ANIM_OUT; if (mDoScrollAnim == true) { - anim = dLytPauseMgr_c::GetInstance()->getField_0x0831() ? PAUSE_DISP_01_ANIM_SCROLL_R_OUT : - PAUSE_DISP_01_ANIM_SCROLL_L_OUT; + anim = dLytPauseMgr_c::GetInstance()->isNavLeft() ? PAUSE_DISP_01_ANIM_SCROLL_R_OUT : + PAUSE_DISP_01_ANIM_SCROLL_L_OUT; } d2d::AnmGroup_c &anm = mAnm[anim]; @@ -538,7 +538,7 @@ void dLytPauseDisp01_c::executeState_Out() { case 0: { if (anm.isEndReached() == true) { mStep = 1; - field_0x98CE = true; + mIsChangingState = true; } break; } @@ -617,7 +617,7 @@ void dLytPauseDisp01_c::setupDisp() { u32 crystalCount = dAcItem_c::getGratitudeCrystalCount(); if (crystalCount != 0) { bool isDemo = false; - if (lytControl->getField_0x15C67() && (demoItem == ITEM_1_CRYSTAL || demoItem == ITEM_5_CRYSTALS)) { + if (lytControl->isPauseDemo() && (demoItem == ITEM_1_CRYSTAL || demoItem == ITEM_5_CRYSTALS)) { isDemo = true; crystalCount = demoItem == ITEM_1_CRYSTAL ? crystalCount - 1 : crystalCount - 5; } @@ -665,7 +665,7 @@ void dLytPauseDisp01_c::setupInsects() { } s32 count = getInsectCountByIndex(insectIdx); - if (lytControl->getField_0x15C67() && lytControl->getItemForPauseDemo() == getInsectItemId(insectIdx)) { + if (lytControl->isPauseDemo() && lytControl->getItemForPauseDemo() == getInsectItemId(insectIdx)) { count = lytControl->getItemCountForPauseDemo(); } @@ -692,7 +692,7 @@ void dLytPauseDisp01_c::setupMaterials() { } s32 count = getMaterialCountByIndex(materialIdx); - if (lytControl->getField_0x15C67() && lytControl->getItemForPauseDemo() == getMaterialItemId(materialIdx)) { + if (lytControl->isPauseDemo() && lytControl->getItemForPauseDemo() == getMaterialItemId(materialIdx)) { count = lytControl->getItemCountForPauseDemo(); } @@ -945,7 +945,7 @@ void dLytPauseDisp01_c::hideInsectsAndMaterials() { } bool dLytPauseDisp01_c::shouldInsectBeDisplayed(s32 insectIdx) const { - if (dLytControlGame_c::getInstance()->getField_0x15C67() && + if (dLytControlGame_c::getInstance()->isPauseDemo() && dLytControlGame_c::getInstance()->getItemForPauseDemo() == getInsectItemId(insectIdx) && dAcItem_c::isPerformingInitialCollection()) { return false; @@ -989,7 +989,7 @@ u16 dLytPauseDisp01_c::getQuestItemId(s32 questItemIndex) const { } bool dLytPauseDisp01_c::shouldMaterialBeDisplayed(s32 materialIdx) const { - if (dLytControlGame_c::getInstance()->getField_0x15C67() && + if (dLytControlGame_c::getInstance()->isPauseDemo() && dLytControlGame_c::getInstance()->getItemForPauseDemo() == getMaterialItemId(materialIdx) && dAcItem_c::isPerformingInitialCollection()) { return false; diff --git a/src/d/lyt/d_lyt_pause_info.cpp b/src/d/lyt/d_lyt_pause_info.cpp index 4500d9fc..13467f00 100644 --- a/src/d/lyt/d_lyt_pause_info.cpp +++ b/src/d/lyt/d_lyt_pause_info.cpp @@ -84,7 +84,7 @@ bool dLytPauseInfo_c::draw() { if (mpTitle != nullptr) { mpTitle->draw(); } - if (!dLytControlGame_c::getInstance()->getField_0x15C67()) { + if (!dLytControlGame_c::getInstance()->isPauseDemo()) { mLyt.addToDrawList(); } } @@ -100,7 +100,8 @@ void dLytPauseInfo_c::requestOut() { } void dLytPauseInfo_c::updateTitle() { - if (dLytControlGame_c::getInstance()->getField_0x15C2C()) { + // Change the title before the transition is finished, so the logic here is correctly inverted + if (dLytControlGame_c::getInstance()->getCurrentPauseDisp() != dLytPauseMgr_c::DISP_00_INVENTORY) { // "Gear" mpTitle->set(dLytCommonTitle_c::SET_01, mpTitle->setSubTitle(1), nullptr); } else { @@ -119,7 +120,7 @@ void dLytPauseInfo_c::setInputInOut(bool inOut) { void dLytPauseInfo_c::initializeState_None() { mLyt.unbindAnims(); - field_0x19A = false; + mIsChangingState = false; mInRequest = false; mOutRequest = false; field_0x19B = false; @@ -139,10 +140,10 @@ void dLytPauseInfo_c::initializeState_In() { field_0x19B = true; s32 msgIdx = 1; // "Gear" - if (dLytControlGame_c::getInstance()->getField_0x15C2C() != 0) { + if (dLytControlGame_c::getInstance()->getCurrentPauseDisp() != dLytPauseMgr_c::DISP_00_INVENTORY) { msgIdx = 2; // "Collection" } - if (dLytControlGame_c::getInstance()->getField_0x15C67()) { + if (dLytControlGame_c::getInstance()->isPauseDemo()) { SizedString<32> label; if (dLytControlGame_c::getInstance()->getItemForPauseDemo() == ITEM_5_CRYSTALS) { getItemLabel(ITEM_1_CRYSTAL, label); @@ -173,11 +174,11 @@ void dLytPauseInfo_c::executeState_In() { void dLytPauseInfo_c::finalizeState_In() {} void dLytPauseInfo_c::initializeState_Wait() { - field_0x19A = true; + mIsChangingState = true; } void dLytPauseInfo_c::executeState_Wait() { updateCaption(); - field_0x19A = false; + mIsChangingState = false; if (mOutRequest == true) { mOutRequest = false; mStateMgr.changeState(StateID_Out); @@ -197,7 +198,7 @@ void dLytPauseInfo_c::executeState_Out() { case 0: { if (anm.isEndReached() == true) { mStep = 1; - field_0x19A = true; + mIsChangingState = true; } break; } @@ -233,7 +234,7 @@ void dLytPauseInfo_c::playBackwards(d2d::AnmGroup_c &anm) { } void dLytPauseInfo_c::updateCaption() { - if (dLytControlGame_c::getInstance()->getField_0x15C67() != true && + if (dLytControlGame_c::getInstance()->isPauseDemo() != true && dLytPauseMgr_c::GetInstance()->getField_0x083B() == true) { SizedString<32> buf; const char *label = dLytPauseText_c::getCurrentPauseLabel(buf); diff --git a/src/d/lyt/d_lyt_pause_text.cpp b/src/d/lyt/d_lyt_pause_text.cpp index 0a806bc1..968de4b4 100644 --- a/src/d/lyt/d_lyt_pause_text.cpp +++ b/src/d/lyt/d_lyt_pause_text.cpp @@ -116,7 +116,7 @@ void dLytPauseText_c::requestOut() { void dLytPauseText_c::initializeState_None() { mLyt.unbindAnims(); - field_0x6D7 = false; + mIsChangingState = false; mInRequest = false; mOutRequest = false; field_0x6D8 = false; @@ -152,11 +152,11 @@ void dLytPauseText_c::executeState_In() { void dLytPauseText_c::finalizeState_In() {} void dLytPauseText_c::initializeState_Wait() { - field_0x6D7 = true; + mIsChangingState = true; } void dLytPauseText_c::executeState_Wait() { mAnm[PAUSE_TEXT_ANIM_LOOP].play(); - field_0x6D7 = false; + mIsChangingState = false; if (mOutRequest == true && mABtn.requestOut(false)) { mOutRequest = false; mStateMgr.changeState(StateID_Out); @@ -181,7 +181,7 @@ void dLytPauseText_c::executeState_Out() { case 1: { if (anm.isEndReached() == true) { mStep = 2; - field_0x6D7 = true; + mIsChangingState = true; } break; } From 2c1ac8de86ed0e944dc5ce40067ee5145f2d6029 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 13 Sep 2025 10:19:06 +0200 Subject: [PATCH 13/14] Rebase fixes --- config/SOUE01/symbols.txt | 70 +++++++++++++++++++-------------------- src/d/lyt/d_lyt_pause.cpp | 5 ++- 2 files changed, 37 insertions(+), 38 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 02776db9..d3e51b77 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -14899,40 +14899,40 @@ changeSavedDisp__14dLytPauseMgr_cFv = .text:0x80281360; // type:function size:0x 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 +build__30sFStateFct_c<14dLytPauseMgr_c>FRC12sStateIDIf_c = .text:0x802814F0; // type:function size:0x60 scope:weak +dispose__30sFStateFct_c<14dLytPauseMgr_c>FRP10sStateIf_c = .text:0x80281550; // type:function size:0xC scope:weak +build__31sFStateFct_c<15dLytPauseMain_c>FRC12sStateIDIf_c = .text:0x80281560; // type:function size:0x60 scope:weak +dispose__31sFStateFct_c<15dLytPauseMain_c>FRP10sStateIf_c = .text:0x802815C0; // type:function size:0xC scope:weak +initialize__27sFState_c<14dLytPauseMgr_c>Fv = .text:0x802815D0; // type:function size:0x1C scope:weak +execute__27sFState_c<14dLytPauseMgr_c>Fv = .text:0x802815F0; // type:function size:0x1C scope:weak +finalize__27sFState_c<14dLytPauseMgr_c>Fv = .text:0x80281610; // type:function size:0x1C scope:weak +initialize__28sFState_c<15dLytPauseMain_c>Fv = .text:0x80281630; // type:function size:0x1C scope:weak +execute__28sFState_c<15dLytPauseMain_c>Fv = .text:0x80281650; // type:function size:0x1C scope:weak +finalize__28sFState_c<15dLytPauseMain_c>Fv = .text:0x80281670; // type:function size:0x1C scope:weak +initializeState__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80281690; // type:function size:0x10 scope:weak +finalizeState__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802816A0; // type:function size:0x10 scope:weak +refreshState__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802816B0; // type:function size:0x10 scope:weak +getState__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x802816C0; // type:function size:0x10 scope:weak +getNewStateID__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x802816D0; // type:function size:0x10 scope:weak +getOldStateID__83sStateMgr_c<14dLytPauseMgr_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x802816E0; // type:function size:0x10 scope:weak +initializeState__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802816F0; // type:function size:0x10 scope:weak +finalizeState__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80281700; // type:function size:0x10 scope:weak +refreshState__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80281710; // type:function size:0x10 scope:weak +getState__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80281720; // type:function size:0x10 scope:weak +getNewStateID__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80281730; // type:function size:0x10 scope:weak +getStateID__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80281740; // type:function size:0x10 scope:weak +getOldStateID__84sStateMgr_c<15dLytPauseMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x80281750; // type:function size:0x10 scope:weak +finalizeState__30sFStateID_c<15dLytPauseMain_c>CFR15dLytPauseMain_c = .text:0x80281760; // type:function size:0x30 scope:weak +executeState__30sFStateID_c<15dLytPauseMain_c>CFR15dLytPauseMain_c = .text:0x80281790; // type:function size:0x30 scope:weak +initializeState__30sFStateID_c<15dLytPauseMain_c>CFR15dLytPauseMain_c = .text:0x802817C0; // type:function size:0x30 scope:weak +finalizeState__29sFStateID_c<14dLytPauseMgr_c>CFR14dLytPauseMgr_c = .text:0x802817F0; // type:function size:0x30 scope:weak +executeState__29sFStateID_c<14dLytPauseMgr_c>CFR14dLytPauseMgr_c = .text:0x80281820; // type:function size:0x30 scope:weak +initializeState__29sFStateID_c<14dLytPauseMgr_c>CFR14dLytPauseMgr_c = .text:0x80281850; // type:function size:0x30 scope:weak +__sinit_\d_lyt_pause_cpp = .text:0x80281880; // type:function size:0xC14 scope:local +__dt__30sFStateID_c<15dLytPauseMain_c>Fv = .text:0x802824A0; // type:function size:0x58 scope:weak +__dt__29sFStateID_c<14dLytPauseMgr_c>Fv = .text:0x80282500; // type:function size:0x58 scope:weak +isSameName__29sFStateID_c<14dLytPauseMgr_c>CFPCc = .text:0x80282560; // type:function size:0x88 scope:weak +isSameName__30sFStateID_c<15dLytPauseMain_c>CFPCc = .text:0x802825F0; // type:function size:0x88 scope:weak __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 @@ -30905,7 +30905,7 @@ __vt__22CurrentStageArcManager = .data:0x8050E004; // type:object size:0xC @4271 = .data:0x8050E010; // type:object size:0x10 scope:local data:string @4278 = .data:0x8050E020; // type:object size:0xC scope:local data:string __vt__11OarcManager = .data:0x8050E02C; // type:object size:0xC -__vt__16ObjectArcControl = .data:0x8050E038; // type:object size:0x10 +__vt__16ObjectArcControl = .data:0x8050E038; // type:object size:0xC __vt__16LayoutArcManager = .data:0x8050E048; // type:object size:0xC __vt__16LayoutArcControl = .data:0x8050E054; // type:object size:0xC lbl_8050E060 = .data:0x8050E060; // type:object size:0x30 diff --git a/src/d/lyt/d_lyt_pause.cpp b/src/d/lyt/d_lyt_pause.cpp index e139e48f..afc09d73 100644 --- a/src/d/lyt/d_lyt_pause.cpp +++ b/src/d/lyt/d_lyt_pause.cpp @@ -7,8 +7,8 @@ #include "d/d_gfx.h" #include "d/d_heap.h" #include "d/d_pad.h" +#include "d/d_pad_manager.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" @@ -409,8 +409,7 @@ void dLytPauseMain_c::executeState_Select() { case 300: { if (mpDisp00->isChangingState() == true) { mStep++; - // TODO - dPadManager_c - fn_80059F40(dPauseManager_c::GetInstance()); + dPadManager_c::GetInstance()->requestMplsCalibration(); } break; } From 0a4acf1dc838f4a10629d1e5b64cc442e5fcedc6 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 13 Sep 2025 10:30:36 +0200 Subject: [PATCH 14/14] Review feedback --- include/d/a/d_a_player.h | 2 +- src/d/lyt/d_lyt_pause.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index 4eb58674..2672af43 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -58,7 +58,7 @@ public: void setBeetleBackAnim(); s32 getBeetleWarningTimeLeft(); - // Item Selection functions + // Item select/equip/use functions [0x801E3160 - 0x801E7AD0] ? static s32 calcItemWheelSelection(bool reset, s32 numOptions); public: diff --git a/src/d/lyt/d_lyt_pause.cpp b/src/d/lyt/d_lyt_pause.cpp index afc09d73..eb53e5ee 100644 --- a/src/d/lyt/d_lyt_pause.cpp +++ b/src/d/lyt/d_lyt_pause.cpp @@ -1009,11 +1009,11 @@ bool dLytPauseMgr_c::checkRing() { s32 tab = lytControl->getPauseDisp00Tab(); - if (dPad::getDownB() && tab == 0) { + if (dPad::getDownB() && tab == TAB_ITEM) { return true; - } else if (dPad::getDownMinus() && tab == 1) { + } else if (dPad::getDownMinus() && tab == TAB_POUCH) { return true; - } else if (dPad::getDownC() && tab == 2) { + } else if (dPad::getDownC() && tab == TAB_DOWSING) { return true; } return false;