diff --git a/config/YFEE01/arm9/overlays/ov000/delinks.txt b/config/YFEE01/arm9/overlays/ov000/delinks.txt index 422023b..23f2c1e 100644 --- a/config/YFEE01/arm9/overlays/ov000/delinks.txt +++ b/config/YFEE01/arm9/overlays/ov000/delinks.txt @@ -32,6 +32,9 @@ src/ov000/map_unit_menu.cpp: .text start:0x021bfa60 end:0x021c1e18 .data start:0x021de3a8 end:0x021dfc20 +src/ov000/guide_menu.cpp: + .text start:0x021c669c end:0x021c6a9c + src/ov000/map.cpp: .text start:0x021d708c end:0x021d7c90 .data start:0x021e2c30 end:0x021e2c88 diff --git a/config/YFEE01/arm9/overlays/ov000/symbols.txt b/config/YFEE01/arm9/overlays/ov000/symbols.txt index 9dbebff..7c63ab4 100644 --- a/config/YFEE01/arm9/overlays/ov000/symbols.txt +++ b/config/YFEE01/arm9/overlays/ov000/symbols.txt @@ -253,7 +253,7 @@ func_ov000_021adbf0 kind:function(arm,size=0xa8) addr:0x021adbf0 func_ov000_021adc98 kind:function(arm,size=0x84) addr:0x021adc98 func_ov000_021add1c kind:function(arm,size=0x98) addr:0x021add1c func_ov000_021addb4 kind:function(arm,size=0x38) addr:0x021addb4 -func_ov000_021addec kind:function(arm,size=0x40) addr:0x021addec +PlayerPhase_StartGuide kind:function(arm,size=0x40) addr:0x021addec func_ov000_021ade2c kind:function(arm,size=0x24) addr:0x021ade2c func_ov000_021ade50 kind:function(arm,size=0x38) addr:0x021ade50 func_ov000_021ade88 kind:function(arm,size=0x64) addr:0x021ade88 @@ -808,14 +808,14 @@ func_ov000_021c6298 kind:function(arm,size=0x64) addr:0x021c6298 func_ov000_021c62fc kind:function(arm,size=0x6c) addr:0x021c62fc func_ov000_021c6368 kind:function(arm,size=0x90) addr:0x021c6368 func_ov000_021c63f8 kind:function(arm,size=0x2a4) addr:0x021c63f8 -func_ov000_021c669c kind:function(arm,size=0x290) addr:0x021c669c -func_ov000_021c692c kind:function(arm,size=0x40) addr:0x021c692c -func_ov000_021c696c kind:function(arm,size=0x28) addr:0x021c696c -func_ov000_021c6994 kind:function(arm,size=0x88) addr:0x021c6994 -func_ov000_021c6a1c kind:function(arm,size=0x28) addr:0x021c6a1c -func_ov000_021c6a44 kind:function(arm,size=0x18) addr:0x021c6a44 -func_ov000_021c6a5c kind:function(arm,size=0x8) addr:0x021c6a5c -func_ov000_021c6a64 kind:function(arm,size=0x38) addr:0x021c6a64 +StartGuideMenu kind:function(arm,size=0x290) addr:0x021c669c +_ZN15TutListMenuItem8vfunc_1cEll kind:function(arm,size=0x40) addr:0x021c692c +_ZN15TutListMenuItem8vfunc_48El kind:function(arm,size=0x28) addr:0x021c696c +_ZN15TutListMenuItem8vfunc_10Elllllll kind:function(arm,size=0x88) addr:0x021c6994 +_ZN15TutListMenuItem8vfunc_00El kind:function(arm,size=0x28) addr:0x021c6a1c +_ZN15TutListMenuItem8vfunc_04Ev kind:function(arm,size=0x18) addr:0x021c6a44 +_ZN15TutListMenuItem8vfunc_08Ev kind:function(arm,size=0x8) addr:0x021c6a5c +_ZN11TutListMenu8vfunc_4cEl kind:function(arm,size=0x38) addr:0x021c6a64 func_ov000_021c6a9c kind:function(arm,size=0x24) addr:0x021c6a9c func_ov000_021c6ac0 kind:function(arm,size=0x50) addr:0x021c6ac0 func_ov000_021c6b10 kind:function(arm,size=0x3c) addr:0x021c6b10 @@ -2276,7 +2276,7 @@ data_ov000_021e34bc kind:bss addr:0x021e34bc data_ov000_021e34cc kind:bss addr:0x021e34cc data_ov000_021e34d0 kind:bss addr:0x021e34d0 data_ov000_021e34d8 kind:bss addr:0x021e34d8 -data_ov000_021e34e0 kind:bss addr:0x021e34e0 +sGuideMenuItems kind:bss addr:0x021e34e0 data_ov000_021e34e4 kind:bss addr:0x021e34e4 data_ov000_021e34e8 kind:bss addr:0x021e34e8 data_ov000_021e34ec kind:bss addr:0x021e34ec diff --git a/include/unknown_data.h b/include/unknown_data.h index bf45ec8..155c5f4 100644 --- a/include/unknown_data.h +++ b/include/unknown_data.h @@ -4245,7 +4245,7 @@ extern struct UnkStruct_021e3340 * data_ov000_021e3340; // extern ??? data_ov000_021e34cc // extern ??? data_ov000_021e34d0 // extern ??? data_ov000_021e34d8 -// extern ??? data_ov000_021e34e0 +// extern ??? sGuideMenuItems // extern ??? data_ov000_021e34e4 // extern ??? data_ov000_021e34e8 // extern ??? data_ov000_021e34ec diff --git a/include/unknown_funcs.h b/include/unknown_funcs.h index 197424d..cefb765 100644 --- a/include/unknown_funcs.h +++ b/include/unknown_funcs.h @@ -5935,7 +5935,7 @@ EC BOOL func_ov000_021abf30(void); // EC ??? func_ov000_021adc98 // EC ??? func_ov000_021add1c // EC ??? func_ov000_021addb4 -// EC ??? func_ov000_021addec +// EC ??? PlayerPhase_StartGuide // EC ??? func_ov000_021ade2c // EC ??? func_ov000_021ade50 // EC ??? func_ov000_021ade88 @@ -6490,14 +6490,14 @@ EC void func_ov000_021c52fc(ProcPtr, struct Unit *); // EC ??? func_ov000_021c62fc // EC ??? func_ov000_021c6368 EC void func_ov000_021c63f8(void); -EC void func_ov000_021c669c(ProcPtr); -// EC ??? func_ov000_021c692c -// EC ??? func_ov000_021c696c -// EC ??? func_ov000_021c6994 -// EC ??? func_ov000_021c6a1c -// EC ??? func_ov000_021c6a44 -// EC ??? func_ov000_021c6a5c -// EC ??? func_ov000_021c6a64 +EC void StartGuideMenu(ProcPtr); +// EC ??? _ZN15TutListMenuItem8vfunc_1cEll +// EC ??? _ZN15TutListMenuItem8vfunc_48El +// EC ??? _ZN15TutListMenuItem8vfunc_10Elllllll +// EC ??? _ZN15TutListMenuItem8vfunc_00El +// EC ??? _ZN15TutListMenuItem8vfunc_04Ev +// EC ??? _ZN15TutListMenuItem8vfunc_08Ev +// EC ??? _ZN11TutListMenu8vfunc_4cEl // EC ??? func_ov000_021c6a9c // EC ??? func_ov000_021c6ac0 // EC ??? func_ov000_021c6b10 diff --git a/src/ov000/guide_menu.cpp b/src/ov000/guide_menu.cpp new file mode 100644 index 0000000..4fa1b98 --- /dev/null +++ b/src/ov000/guide_menu.cpp @@ -0,0 +1,300 @@ +#include "global.h" + +#include "database.hpp" +#include "hardware.hpp" +#include "map.hpp" +#include "menu.hpp" + +#include "unknown_funcs.h" +#include "unknown_types.hpp" + +extern struct UnkStruct_02196f20 * data_02196f20; + +EC BOOL func_0204b1e0(void); +EC BOOL func_02050304(s32); + +struct UnkStruct_021970c4 +{ + void * unk_00; + void * unk_04; + void * unk_08; +}; + +extern struct UnkStruct_021970c4 * data_021970c4; + +EC s32 func_020295ec(struct UnkStruct_021970c4 *, char *, void *, void *, u32, u32, u32, u32, u32, u32); + +namespace menu +{ +class ScrollMenu +{ +public: + /* 00 */ // vtable + /* 04 */ void * unk_04; + /* 08 */ void * unk_08; + /* 0C */ u32 unk_0c; + /* 10 */ void * unk_10; + /* 14 */ void * unk_14; + /* 18 */ ProcEx * unk_18; + /* 1C */ u32 unk_1c; + /* 20 */ u32 unk_20; + /* 24 */ u32 unk_24; + /* 28 */ u32 unk_28; + /* 2C */ u32 unk_2c; + /* 30 */ u32 unk_30; + /* 34 */ u32 unk_34; + /* 38 */ u32 unk_38; + /* 3C */ u32 unk_3c; + /* 40 */ u32 unk_40; + /* 44 */ u32 unk_44; + /* 48 */ u32 unk_48; + /* 4C */ s8 unk_4c; + /* 4D */ s8 unk_4d; + /* 4E */ s8 unk_4e; + /* 4F */ s8 unk_4f; + /* 50 */ u16 unk_50; + /* 52 */ u16 unk_52; + /* 54 */ u16 unk_54; + /* 56 */ u8 unk_56; + /* 57 */ u8 unk_57; + /* 58 */ s8 unk_58; + STRUCT_PAD(0x59, 0x5C); + /* 5C */ s8 unk_5c; + /* 5D */ s8 unk_5d; + /* 5E */ u8 unk_5e; + /* 5F */ s8 unk_5f; + STRUCT_PAD(0x60, 0x61); + /* 61 */ u8 unk_61; + /* 62 */ u8 unk_62; + /* 63 */ u8 unk_63; + STRUCT_PAD(0x64, 0x6A); + /* 6A */ s16 unk_6a; + STRUCT_PAD(0x6C, 0x7B); + /* 7B */ u8 unk_7b; + /* 7C */ u8 unk_7c; + /* 7D */ s8 unk_7d; + /* 7E */ u8 unk_7e; + /* 7F */ u8 unk_7f; + + virtual void vfunc_00(/* ? */); // func_020336d4 + virtual void vfunc_04(/* ? */); // func_020337c8 + virtual void vfunc_08(/* ? */); // func_020338fc + virtual void vfunc_0c(/* ? */); // func_02033990 + virtual void vfunc_10(/* ? */); // func_02003f84 + virtual void vfunc_14(/* ? */); // func_020316a4 + virtual void vfunc_18(/* ? */); // func_02032f14 + virtual s32 vfunc_1c(void); // func_02033b84 + virtual void vfunc_20(/* ? */); // func_02033b8c + virtual void vfunc_24(/* ? */); // func_02033bd8 + virtual void vfunc_28(/* ? */); // func_02033d0c + virtual void vfunc_2c(/* ? */); // func_02033df0 + virtual void vfunc_30(/* ? */); // func_02033dac + virtual void vfunc_34(/* ? */); // func_02033e38 + virtual void vfunc_38(s32, s32, s32, s32, s32); // func_02033ec0 + virtual void vfunc_3c(/* ? */); // func_02033e7c + virtual s32 vfunc_40(void); // func_02032ff8 + virtual void vfunc_44(/* ? */); // func_02033004 + virtual void vfunc_48(void); // func_02032ff4 + virtual void vfunc_4c(s32); // func_02003f80 + virtual s32 vfunc_50(void); // func_02032fc4 + virtual void vfunc_54(void); // func_02033c20 + virtual void vfunc_58(void); // func_02033d38 + virtual void vfunc_5c(/* ? */); // func_02031c6c + virtual void vfunc_60(/* ? */); // func_02031ccc + virtual void vfunc_64(/* ? */); // func_02031d74 + virtual void vfunc_68(/* ? */); // func_02031d2c + virtual void vfunc_6c(s32); // func_02031dd4 + virtual void vfunc_70(/* ? */); // func_02031dec + virtual void vfunc_74(/* ? */); // func_02003f60 + virtual void vfunc_78(/* ? */); // func_02003f68 + virtual void vfunc_7c(/* ? */); // func_02003f40 + virtual void vfunc_80(/* ? */); // func_02003f48 + virtual void vfunc_84(/* ? */); // func_02003f20 + virtual void vfunc_88(/* ? */); // func_02003f28 + virtual void vfunc_8c(/* ? */); // func_02003f18 + virtual void vfunc_90(/* ? */); // func_02003ef8 + virtual void vfunc_94(s32, s32); // func_02003f00 + virtual void vfunc_98(/* ? */); // func_02003ed8 + virtual void vfunc_9c(/* ? */); // func_02003ee0 + virtual void vfunc_a0(/* ? */); // func_02003ed0 + virtual void vfunc_a4(/* ? */); // func_02003ea0 + virtual void vfunc_a8(/* ? */); // func_02003e98 + virtual void vfunc_ac(/* ? */); // func_02003e90 + virtual void vfunc_b0(/* ? */); // func_02003e88 + virtual void vfunc_b4(/* ? */); // func_02003e80 + virtual void vfunc_b8(/* ? */); // func_02003e78 + virtual void vfunc_bc(/* ? */); // func_02003e70 + virtual void vfunc_c0(/* ? */); // func_02032800 + virtual void vfunc_c4(/* ? */); // func_0203288c + virtual void vfunc_c8(/* ? */); // func_02032918 + virtual void vfunc_cc(/* ? */); // func_020329a4 + virtual void vfunc_d0(void); // func_02033aa4 + virtual void vfunc_d4(void); // func_02033b14 + virtual void vfunc_d8(/* ? */); // func_02032c00 + virtual void vfunc_dc(/* ? */); // func_02003e6c + virtual void vfunc_e0(/* ? */); // func_02032e98 + virtual void vfunc_e4(/* ? */); // func_02031040 + virtual void vfunc_e8(void); // func_02033efc + virtual void vfunc_ec(/* ? */); // func_02030fb4 + virtual void vfunc_f0(); // func_02031044 + virtual ~ScrollMenu(); + + ScrollMenu(); + void func_02031944(); +}; + +class ScrollMenuItem +{ +public: + virtual char * vfunc_00(s32); // func_020340d8 + virtual s32 vfunc_04(void); // func_0205b454 + virtual s32 vfunc_08(void); // func_0205b464 + virtual void vfunc_0c(/* ? */); // func_0205b45c + virtual void vfunc_10(s32, s32, s32, s32, s32, s32, s32); // func_02034054 + virtual void vfunc_14(/* ? */); // func_0205b46c + virtual void vfunc_18(/* ? */); // func_02031cc4 + virtual s32 vfunc_1c(s32, s32); // func_0205ae94 + virtual s32 vfunc_20(s32); // func_02031d24 + virtual s32 vfunc_24(s32, s32); // func_02031d0c + virtual s32 vfunc_28(s32); // func_02031dcc + virtual s32 vfunc_2c(s32, s32); // func_02031db4 + virtual void vfunc_30(/* ? */); // func_02031d6c + virtual void vfunc_34(/* ? */); // func_0205af88 + virtual void vfunc_38(/* ? */); // func_0203127c + virtual void vfunc_3c(/* ? */); // func_0205af00 + virtual void vfunc_40(/* ? */); // func_020311ec + virtual void vfunc_44(/* ? */); // func_020327fc + virtual s32 vfunc_48(s32); // func_0205aef8 + virtual s32 vfunc_4c(s32, s32); // func_020340e0 +}; +} // namespace menu + +namespace map +{ +class BMapScrollMenu : public menu::ScrollMenu +{ +public: + // 10 func_ov000_021be768 + // AC func_ov000_021be8f0 + // BC func_ov000_021be8d8 + + BMapScrollMenu() + { + gpActiveScreenSt->dispIo->bldcnt.effect = 1; + + gpActiveScreenSt->dispIo->blend_coeff_a = 0xe; + gpActiveScreenSt->dispIo->blend_coeff_b = 2; + + gpActiveScreenSt->dispIo->bldcnt.target1_bg0_on = 0; + gpActiveScreenSt->dispIo->bldcnt.target1_bg1_on = 0; + gpActiveScreenSt->dispIo->bldcnt.target1_bg2_on = 1; + gpActiveScreenSt->dispIo->bldcnt.target1_bg3_on = 0; + gpActiveScreenSt->dispIo->bldcnt.target1_obj_on = 0; + gpActiveScreenSt->dispIo->bldcnt.target1_bd_on = 0; + + gpActiveScreenSt->dispIo->bldcnt.target2_bg0_on = 1; + gpActiveScreenSt->dispIo->bldcnt.target2_bg1_on = 0; + gpActiveScreenSt->dispIo->bldcnt.target2_bg2_on = 0; + gpActiveScreenSt->dispIo->bldcnt.target2_bg3_on = 0; + gpActiveScreenSt->dispIo->bldcnt.target2_obj_on = 0; + gpActiveScreenSt->dispIo->bldcnt.target2_bd_on = 1; + } + + virtual ~BMapScrollMenu() + { + gpActiveScreenSt->dispIo->bldcnt.effect = 0; + } +}; +} // namespace map + +class TutListMenu : public map::BMapScrollMenu +{ +public: + /* 4C */ virtual void vfunc_4c(s32 param_2) + { + gMapStateManager->unk_14->unk_25 = Interpolate(0, 0, -16, param_2, 4); + return; + } + + // d1 func_ov000_021c6be4 + // d0 func_ov000_021c6c38 +}; + +class TutListMenuItem : public menu::ScrollMenuItem +{ +public: + /* 08 */ virtual s32 vfunc_08(void) + { + return 0x10; + } + + /* 04 */ virtual s32 vfunc_04(void) + { + return this->vfunc_08() << 1; + } + + /* 00 */ virtual char * vfunc_00(s32 param_2) + { + return func_02039e10(gFE11Database->unk_3c[param_2].unk_00); + } + + /* 10 */ virtual void vfunc_10(s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7) + { + char * str = this->vfunc_00(arg1); + + if (str == NULL) + { + return; + } + + func_020295ec( + data_021970c4, str, gpActiveScreenSt->bgTiles[arg2], (void *)arg3, arg4 + 1, arg5, arg6, arg7, 0, 0); + + return; + } + + /* 48 */ virtual s32 vfunc_48(s32 arg1) + { + if (!data_02196f20->flagMgr->GetById(arg1)) + { + return MENU_NOTSHOWN; + } + + return MENU_ENABLED; + } + + /* 1C */ virtual s32 vfunc_1c(s32 param_2, s32 param_3) + { + if (func_0204b1e0()) + { + return 0; + } + + if (func_02050304(param_3)) + { + return 0; + } + + func_0205038c(param_3, -1); + + return 0x40; + } +}; + +EC void func_02031594(menu::ScrollMenu *, menu::ScrollMenuItem **, s32, s32, s32, ProcPtr, s32); + +EC void StartGuideMenu(ProcPtr parent) +{ + static TutListMenuItem sTutListMenuItem; + + // clang-format off + static menu::ScrollMenuItem * sGuideMenuItems[] = + { + &sTutListMenuItem, + }; + // clang-format on + + func_02031594(new TutListMenu(), sGuideMenuItems, 0x22, 1, 8, parent, 1); + + return; +} diff --git a/src/ov000/playerphase.cpp b/src/ov000/playerphase.cpp index 5e54c4c..1835318 100644 --- a/src/ov000/playerphase.cpp +++ b/src/ov000/playerphase.cpp @@ -1324,9 +1324,9 @@ EC void func_ov000_021addb4(void) return; } -EC void func_ov000_021addec(ProcPtr proc) +EC void PlayerPhase_StartGuide(ProcPtr proc) { - func_ov000_021c669c(proc); + StartGuideMenu(proc); Proc_Goto(data_ov000_021e332c.unk_00[4], 10, 0); data_ov000_021e3340->unk_02 = -1; data_ov000_021e3340->unk_03 = 0; @@ -1557,7 +1557,7 @@ PROC_LABEL(L_PLAYERPHASE_UNIT_LIST), PROC_CALL(func_ov000_021addb4), PROC_LABEL(L_PLAYERPHASE_GUIDE), - PROC_CALL(func_ov000_021addec), + PROC_CALL(PlayerPhase_StartGuide), PROC_LABEL(L_PLAYERPHASE_CONFIG), PROC_CALL(func_ov000_021ae2c4),