diff --git a/config/rel_slices.yml b/config/rel_slices.yml index 8e17e56a..0824f3ee 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -1051,6 +1051,10 @@ m_catalog_ovl.c: .text: [0x805C9254, 0x805CC1F4] .rodata: [0x8064AF90, 0x8064B090] .data: [0x806C8AB0, 0x806CB838] +m_cpedit_ovl.c: + .text: [0x805CC1F4, 0x805CC3E8] + .data: [0x806CB838, 0x806CB850] + .bss: [0x8133E210, 0x8133E218] m_editEndChk_ovl.c: .text: [0x805D7A64, 0x805D8498] .rodata: [0x8064B2C0, 0x8064B300] diff --git a/include/m_cpedit_ovl.h b/include/m_cpedit_ovl.h index a2c2f5d6..f4a514f8 100644 --- a/include/m_cpedit_ovl.h +++ b/include/m_cpedit_ovl.h @@ -2,11 +2,17 @@ #define M_CPEDIT_OVL_H #include "types.h" +#include "m_cpedit_ovl_h.h" +#include "m_submenu.h" #ifdef __cplusplus extern "C" { #endif +struct cpedit_ovl_s { + u8 pad; +}; + extern void mCE_cpedit_ovl_construct(Submenu* submenu); extern void mCE_cpedit_ovl_destruct(Submenu* submenu); extern void mCE_cpedit_ovl_set_proc(Submenu* submenu); diff --git a/include/m_cpedit_ovl_h.h b/include/m_cpedit_ovl_h.h index e5af438e..449f3937 100644 --- a/include/m_cpedit_ovl_h.h +++ b/include/m_cpedit_ovl_h.h @@ -7,6 +7,8 @@ extern "C" { #endif +typedef struct cpedit_ovl_s mCE_Ovl_c; + #ifdef __cplusplus } #endif diff --git a/include/m_submenu_ovl.h b/include/m_submenu_ovl.h index 129aa51b..f71f3e33 100644 --- a/include/m_submenu_ovl.h +++ b/include/m_submenu_ovl.h @@ -35,6 +35,7 @@ #include "m_mailbox_ovl_h.h" #include "m_needlework_ovl_h.h" #include "m_gba_ovl_h.h" +#include "m_cpedit_ovl_h.h" #ifdef __cplusplus extern "C" { @@ -191,7 +192,7 @@ struct submenu_overlay_s { /* 0x9BC */ mBR_Ovl_c* birthday_ovl; /* 0x9C0 */ mCM_Ovl_c* cpmail_ovl; /* 0x9C4 */ void* _9C4; - /* 0x9C8 */ void* _9C8; + /* 0x9C8 */ mCE_Ovl_c* cpedit_ovl; /* 0x9CC */ mCL_Ovl_c* catalog_ovl; /* 0x9D0 */ mMU_Ovl_c* music_ovl; /* 0x9D4 */ mBN_Overlay_c* bank_ovl; diff --git a/src/m_cpedit_ovl.c b/src/m_cpedit_ovl.c new file mode 100644 index 00000000..f830965c --- /dev/null +++ b/src/m_cpedit_ovl.c @@ -0,0 +1,82 @@ +#include "m_cpedit_ovl.h" + +#include "m_submenu_ovl.h" + +static mCE_Ovl_c cpedit_ovl_data; + +static void mCE_move_Move(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + submenu->overlay->move_Move_proc(submenu, menu_info); +} + +static void mCE_move_Play(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + // empty +} + +static void mCE_move_Wait(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + // empty +} + +static void mCE_move_Obey(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + // empty +} + +static void mCE_move_End(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + submenu->overlay->move_End_proc(submenu, menu_info); +} + +typedef void (*mCE_OVL_PROC)(Submenu*, mSM_MenuInfo_c*); + +static void mCE_cpedit_ovl_move(Submenu* submenu) { + static mCE_OVL_PROC ovl_move_proc[] = { + &mCE_move_Move, + &mCE_move_Play, + &mCE_move_Wait, + &mCE_move_Obey, + &mCE_move_End, + }; + + mSM_Control_c* control = &submenu->overlay->menu_control; + mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_CPEDIT]; + + menu_info->pre_move_func(submenu); + (*ovl_move_proc[menu_info->proc_status])(submenu, menu_info); + if (menu_info->proc_status == mSM_OVL_PROC_PLAY) { + control->animation_flag = TRUE; + } else { + control->animation_flag = FALSE; + } +} + +static void mCE_cpedit_ovl_draw(Submenu* submenu, GAME* game) { + mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_CPEDIT]; + + menu_info->pre_draw_func(submenu, game); +} + +extern void mCE_cpedit_ovl_set_proc(Submenu* submenu) { + Submenu_Overlay_c* overlay = submenu->overlay; + + overlay->menu_control.menu_move_func = &mCE_cpedit_ovl_move; + overlay->menu_control.menu_draw_func = &mCE_cpedit_ovl_draw; +} + +static void mCE_cpedit_ovl_init(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + submenu->overlay->move_chg_base_proc(menu_info, mSM_MOVE_IN_TOP); +} + +extern void mCE_cpedit_ovl_construct(Submenu* submenu) { + Submenu_Overlay_c* overlay = submenu->overlay; + mSM_MenuInfo_c* menu_info = &overlay->menu_info[mSM_OVL_CPEDIT]; + + if (overlay->cpedit_ovl == NULL) { + mem_clear((u8*)&cpedit_ovl_data, sizeof(cpedit_ovl_data), 0); + overlay->cpedit_ovl = &cpedit_ovl_data; + } + + mCE_cpedit_ovl_init(submenu, menu_info); + mCE_cpedit_ovl_set_proc(submenu); +} + +extern void mCE_cpedit_ovl_destruct(Submenu* submenu) { + submenu->overlay->cpedit_ovl = NULL; +}