diff --git a/config/rel_slices.yml b/config/rel_slices.yml index 0824f3ee..0df80d8d 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -1055,6 +1055,11 @@ m_cpedit_ovl.c: .text: [0x805CC1F4, 0x805CC3E8] .data: [0x806CB838, 0x806CB850] .bss: [0x8133E210, 0x8133E218] +m_cpwarning_ovl.c: + .text: [0x805CEC68, 0x805CF458] + .rodata: [0x8064B130, 0x8064B198] + .data: [0x806CBA18, 0x806CBA70] + .bss: [0x8133EE78, 0x8133EE88] m_editEndChk_ovl.c: .text: [0x805D7A64, 0x805D8498] .rodata: [0x8064B2C0, 0x8064B300] diff --git a/include/m_bank_ovl_h.h b/include/m_bank_ovl_h.h index 879dd6b1..443b49e3 100644 --- a/include/m_bank_ovl_h.h +++ b/include/m_bank_ovl_h.h @@ -7,7 +7,7 @@ extern "C" { #endif -typedef struct bank_ovl_s mBN_Overlay_c; +typedef struct bank_ovl_s mBN_Ovl_c; #ifdef __cplusplus } diff --git a/include/m_cpwarning_ovl.h b/include/m_cpwarning_ovl.h index 8315626b..52d84b5f 100644 --- a/include/m_cpwarning_ovl.h +++ b/include/m_cpwarning_ovl.h @@ -2,11 +2,25 @@ #define M_CPWARNING_OVL_H #include "types.h" +#include "m_cpwarning_ovl_h.h" +#include "m_submenu.h" #ifdef __cplusplus extern "C" { #endif +struct cpwarning_ovl_s { + u8 _00; + u8 _01; + u8 move_dir; + u8 _03; + u8 _04; + u8 diary_edit_mode; + s16 _06; + f32 scale; + f32 _0C; +}; + extern void mCW_cpwarning_ovl_construct(Submenu* submenu); extern void mCW_cpwarning_ovl_destruct(Submenu* submenu); extern void mCW_cpwarning_ovl_set_proc(Submenu* submenu); diff --git a/include/m_cpwarning_ovl_h.h b/include/m_cpwarning_ovl_h.h index 08aa6d22..2621c914 100644 --- a/include/m_cpwarning_ovl_h.h +++ b/include/m_cpwarning_ovl_h.h @@ -7,6 +7,8 @@ extern "C" { #endif +typedef struct cpwarning_ovl_s mCW_Ovl_c; + #ifdef __cplusplus } #endif diff --git a/include/m_submenu_ovl.h b/include/m_submenu_ovl.h index f71f3e33..4bf0053b 100644 --- a/include/m_submenu_ovl.h +++ b/include/m_submenu_ovl.h @@ -36,6 +36,7 @@ #include "m_needlework_ovl_h.h" #include "m_gba_ovl_h.h" #include "m_cpedit_ovl_h.h" +#include "m_cpwarning_ovl_h.h" #ifdef __cplusplus extern "C" { @@ -191,11 +192,11 @@ struct submenu_overlay_s { /* 0x9B8 */ mNT_Ovl_c* notice_ovl; /* 0x9BC */ mBR_Ovl_c* birthday_ovl; /* 0x9C0 */ mCM_Ovl_c* cpmail_ovl; - /* 0x9C4 */ void* _9C4; + /* 0x9C4 */ mCW_Ovl_c* cpwarning_ovl; /* 0x9C8 */ mCE_Ovl_c* cpedit_ovl; /* 0x9CC */ mCL_Ovl_c* catalog_ovl; /* 0x9D0 */ mMU_Ovl_c* music_ovl; - /* 0x9D4 */ mBN_Overlay_c* bank_ovl; + /* 0x9D4 */ mBN_Ovl_c* bank_ovl; /* 0x9D8 */ mNW_Ovl_c* needlework_ovl; /* 0x9DC */ mCO_Ovl_c* cporiginal_ovl; /* 0x9E0 */ void* _9E0; diff --git a/src/m_bank_ovl.c b/src/m_bank_ovl.c index 5da26139..33501177 100644 --- a/src/m_bank_ovl.c +++ b/src/m_bank_ovl.c @@ -21,7 +21,7 @@ static mActor_name_t aNSM_itemNo[MONEY_NUM] = { ITM_MONEY_30000 }; -static void mBN_now_bell_2_bell(mBN_Overlay_c* bank_ovl) { +static void mBN_now_bell_2_bell(mBN_Ovl_c* bank_ovl) { int diff = bank_ovl->now_bell - bank_ovl->player_bell; bank_ovl->bell = ABS(diff); } @@ -50,7 +50,7 @@ static int mBN_total_item_bell() { return total_item_bell; } -static void mBN_bank_ok(Submenu* submenu, mSM_MenuInfo_c* menu, mBN_Overlay_c* bank_ovl) { +static void mBN_bank_ok(Submenu* submenu, mSM_MenuInfo_c* menu, mBN_Ovl_c* bank_ovl) { if (bank_ovl->bank_bell < 0) { bank_ovl->bank_bell = 0; } @@ -135,7 +135,7 @@ static void mBN_move_Move(Submenu* submenu, mSM_MenuInfo_c* menu) { static void mBN_move_Play(Submenu* submenu, mSM_MenuInfo_c* menu) { Submenu_Overlay_c* overlay = submenu->overlay; int trigger = overlay->menu_control.trigger; - mBN_Overlay_c* bank_ovl = overlay->bank_ovl; + mBN_Ovl_c* bank_ovl = overlay->bank_ovl; if (trigger & BUTTON_B) { (*overlay->move_chg_base_proc)(menu, mSM_MOVE_OUT_TOP); @@ -243,7 +243,7 @@ extern Gfx tyo_win_moji3T_model[]; static void mBN_set_frame_dl(Submenu* submenu, GAME* game, mSM_MenuInfo_c* menu) { GRAPH* g = game->graph; - mBN_Overlay_c* bank_ovl = submenu->overlay->bank_ovl; + mBN_Ovl_c* bank_ovl = submenu->overlay->bank_ovl; Gfx* gfx; u8 s; u8 t; @@ -316,7 +316,7 @@ static void mBN_set_character_dl(Submenu* submenu, GAME* game, mSM_MenuInfo_c* m static rgba_t bank_bell_col = { 170, 60, 145, 255 }; static rgba_t now_bell_col = { 115, 50, 215, 255 }; - mBN_Overlay_c* bank_ovl; + mBN_Ovl_c* bank_ovl; int cursol; f32 width; f32 digit_x; @@ -401,7 +401,7 @@ extern void mBN_bank_ovl_set_proc(Submenu* submenu) { static void mBN_bank_ovl_init(Submenu* submenu) { Submenu_Overlay_c* overlay = submenu->overlay; - mBN_Overlay_c* bank_ovl = overlay->bank_ovl; + mBN_Ovl_c* bank_ovl = overlay->bank_ovl; int i; overlay->menu_control.animation_flag = FALSE; @@ -431,13 +431,13 @@ static void mBN_bank_ovl_init(Submenu* submenu) { bank_ovl->cursol = 0; } -static mBN_Overlay_c bn_ovl_data; +static mBN_Ovl_c bn_ovl_data; extern void mBN_bank_ovl_construct(Submenu* submenu) { Submenu_Overlay_c* overlay = submenu->overlay; if (overlay->bank_ovl == NULL) { - mem_clear((u8*)&bn_ovl_data, sizeof(mBN_Overlay_c), 0); + mem_clear((u8*)&bn_ovl_data, sizeof(mBN_Ovl_c), 0); overlay->bank_ovl = &bn_ovl_data; } diff --git a/src/m_cpwarning_ovl.c b/src/m_cpwarning_ovl.c new file mode 100644 index 00000000..fd27fb26 --- /dev/null +++ b/src/m_cpwarning_ovl.c @@ -0,0 +1,194 @@ +#include "m_cpwarning_ovl.h" + +#include "m_submenu_ovl.h" +#include "sys_matrix.h" +#include "m_common_data.h" +#include "m_font.h" + +static mCW_Ovl_c cpwarning_ovl_data; + +static u8 mCW_mes0[18] = "Do you want to let"; +static u8 mCW_mes1[27] = "anyone else see this diary?"; +static u8 mCW_yes_mes[3] = "Yes"; +static u8 mCW_no_mes[2] = "No"; + +enum { + mCW_MOVE_OUT, + mCW_MOVE_IN, + + mCW_MOVE_NUM +}; + +static void mCW_move_Move(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mCW_Ovl_c* cpwarning_ovl = submenu->overlay->cpwarning_ovl; + + if (cpwarning_ovl->move_dir == mCW_MOVE_IN) { + cpwarning_ovl->scale += 0.2f; + + if (cpwarning_ovl->scale > 1.0f) { + cpwarning_ovl->scale = 1.0f; + menu_info->proc_status = menu_info->next_proc_status; + cpwarning_ovl->_00 = 0; + cpwarning_ovl->_01 = 0; + } + } else if (cpwarning_ovl->move_dir == mCW_MOVE_OUT) { + cpwarning_ovl->scale -= 0.2f; + + if (cpwarning_ovl->scale < 0.0f) { + cpwarning_ovl->scale = 0.0f; + menu_info->proc_status = menu_info->next_proc_status; + menu_info->next_proc_status = mSM_OVL_PROC_WAIT; + } + } +} + +static void mCW_move_Play(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + u32 trigger = submenu->overlay->menu_control.trigger; + mCW_Ovl_c* cpwarning_ovl = submenu->overlay->cpwarning_ovl; + + if ((trigger & BUTTON_A) != 0) { + menu_info->next_proc_status = mSM_OVL_PROC_END; + cpwarning_ovl->move_dir = mCW_MOVE_OUT; + menu_info->proc_status = mSM_OVL_PROC_MOVE; + cpwarning_ovl->scale = 1.0f; + cpwarning_ovl->_0C = 1.0f; + Now_Private->calendar.edit = cpwarning_ovl->diary_edit_mode; + } else if ((trigger & BUTTON_CLEFT) != 0) { + if (cpwarning_ovl->diary_edit_mode == 1) { + cpwarning_ovl->diary_edit_mode = 0; + sAdo_SysTrgStart(NA_SE_CURSOL); + } + } else if ((trigger & BUTTON_CRIGHT) != 0) { + if (cpwarning_ovl->diary_edit_mode == 0) { + cpwarning_ovl->diary_edit_mode = 1; + sAdo_SysTrgStart(NA_SE_CURSOL); + } + } + + cpwarning_ovl->_00 = (cpwarning_ovl->_00 + 1) % 30; + if (cpwarning_ovl->_00 < 15) { + cpwarning_ovl->_01 = (int)(((f32)cpwarning_ovl->_00 * 255.0f) / 15.0f); + } else { + cpwarning_ovl->_01 = (int)(((f32)(30 - cpwarning_ovl->_00) * 255.0f) / 15.0f); + } +} + +static void mCW_move_End(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + submenu->overlay->move_End_proc(submenu, menu_info); +} + +typedef void (*mCW_OVL_PROC)(Submenu*, mSM_MenuInfo_c*); + +static void mCW_cpwarning_ovl_move(Submenu* submenu) { + static mCW_OVL_PROC ovl_move_proc[] = { + &mCW_move_Move, &mCW_move_Play, (mCW_OVL_PROC)&none_proc1, (mCW_OVL_PROC)&none_proc1, &mCW_move_End, + }; + + mSM_Control_c* control = &submenu->overlay->menu_control; + mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_CPWARNING]; + + menu_info->pre_move_func(submenu); + (*ovl_move_proc[menu_info->proc_status])(submenu, menu_info); +} + +extern Gfx dia_att_winT_model[]; +extern Gfx dia_att_cursor_model[]; + +static void mCW_set_frame_dl(Submenu* submenu, GAME* game, mSM_MenuInfo_c* menu_info) { + GRAPH* graph = game->graph; + mCW_Ovl_c* cpwarning_ovl = submenu->overlay->cpwarning_ovl; + + Matrix_scale(16.0f * cpwarning_ovl->scale, 16.0f * cpwarning_ovl->scale, 1.0f, 0); + Matrix_translate(menu_info->position[0], menu_info->position[1], 140.0f, 1); + + OPEN_POLY_OPA_DISP(graph); + + gSPMatrix(POLY_OPA_DISP++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gDPSetBlendColor(POLY_OPA_DISP++, 255, 255, 255, 40); + gSPDisplayList(POLY_OPA_DISP++, dia_att_winT_model); + + if (cpwarning_ovl->diary_edit_mode) { + Matrix_translate(19.0f, -29.0f, 0.0f, 1); + } else { + Matrix_translate(-19.0f, -29.0f, 0.0f, 1); + } + gSPMatrix(POLY_OPA_DISP++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, dia_att_cursor_model); + + CLOSE_POLY_OPA_DISP(graph); +} + +static void mCW_set_character_dl(Submenu* submenu, GAME* game, mSM_MenuInfo_c* menu_info) { + static u8 color_table[2][3] = { { 30, 30, 215 }, { 110, 110, 140 } }; + + GRAPH* graph = game->graph; + mCW_Ovl_c* cpwarning_ovl = submenu->overlay->cpwarning_ovl; + f32 scale = cpwarning_ovl->scale; + f32 x = 160.0f - 112.0f * scale; + f32 y = 120.0f - 56.0f * scale; + u8* color; + + submenu->overlay->set_char_matrix_proc(game->graph); + + y += 28.0f * scale; + mFont_SetLineStrings(game, mCW_mes0, sizeof(mCW_mes0), x + 54.0f * scale, y, 95, 20, 20, 255, FALSE, TRUE, scale, + scale, mFont_MODE_POLY); + + y += 24.0f * scale; + mFont_SetLineStrings(game, mCW_mes1, sizeof(mCW_mes1), x + 30.0f * scale, y, 95, 20, 20, 255, FALSE, TRUE, scale, + scale, mFont_MODE_POLY); + + y += 24.0f * scale; + color = color_table[cpwarning_ovl->diary_edit_mode]; + mFont_SetLineStrings(game, mCW_yes_mes, sizeof(mCW_yes_mes), x + 94.0f * scale, y, color[0], color[1], color[2], + 255, FALSE, TRUE, scale, scale, mFont_MODE_POLY); + color = color_table[!cpwarning_ovl->diary_edit_mode]; + mFont_SetLineStrings(game, mCW_no_mes, sizeof(mCW_no_mes), x + 133.0f * scale, y, color[0], color[1], color[2], 255, + FALSE, TRUE, scale, scale, mFont_MODE_POLY); +} + +static void mCW_cpwarning_ovl_draw(Submenu* submenu, GAME* game) { + mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_CPWARNING]; + + menu_info->pre_draw_func(submenu, game); + mCW_set_frame_dl(submenu, game, menu_info); + mCW_set_character_dl(submenu, game, menu_info); +} + +extern void mCW_cpwarning_ovl_set_proc(Submenu* submenu) { + Submenu_Overlay_c* overlay = submenu->overlay; + + overlay->menu_control.menu_move_func = &mCW_cpwarning_ovl_move; + overlay->menu_control.menu_draw_func = &mCW_cpwarning_ovl_draw; +} + +static void mCW_cpwarning_ovl_init(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mCW_Ovl_c* cpwarning_ovl = submenu->overlay->cpwarning_ovl; + + submenu->overlay->menu_control.animation_flag = FALSE; + menu_info->proc_status = mSM_OVL_PROC_MOVE; + menu_info->next_proc_status = mSM_OVL_PROC_PLAY; + cpwarning_ovl->_06 = 30; + cpwarning_ovl->scale = 0.0f; + cpwarning_ovl->_0C = 0.0f; + cpwarning_ovl->move_dir = mCW_MOVE_IN; + sAdo_SysTrgStart(MONO(NA_SE_3)); + cpwarning_ovl->diary_edit_mode = Now_Private->calendar.edit; +} + +extern void mCW_cpwarning_ovl_construct(Submenu* submenu) { + Submenu_Overlay_c* overlay = submenu->overlay; + mSM_MenuInfo_c* menu_info = &overlay->menu_info[mSM_OVL_CPWARNING]; + + if (overlay->cpwarning_ovl == NULL) { + mem_clear((u8*)&cpwarning_ovl_data, sizeof(cpwarning_ovl_data), 0); + overlay->cpwarning_ovl = &cpwarning_ovl_data; + } + + mCW_cpwarning_ovl_init(submenu, menu_info); + mCW_cpwarning_ovl_set_proc(submenu); +} + +extern void mCW_cpwarning_ovl_destruct(Submenu* submenu) { + submenu->overlay->cpwarning_ovl = NULL; +}